mul/
mul.rs

1//
2// Copyright (c) 2025 Ɓukasz Szpakowski
3//
4// This Source Code Form is subject to the terms of the Mozilla Public
5// License, v. 2.0. If a copy of the MPL was not distributed with this
6// file, You can obtain one at https://mozilla.org/MPL/2.0/.
7//
8use std::env;
9use std::process::exit;
10use std::time::Instant;
11use unmtx_gpu::*;
12
13fn create_matrix(n: usize, m: usize) -> Matrix
14{
15    let mut elems: Vec<f32> = vec![0.0f32; n * m];
16    for i in 0..n {
17        for j in 0..m {
18            elems[m * i + j] = (m * i + j) as f32;
19        }
20    }
21    Matrix::new_with_elems(n, m, elems.as_slice())
22}
23
24fn main()
25{
26    let args: Vec<String> = env::args().collect();
27    let n: usize = match args.get(1) {
28        Some(s) => {
29            match s.parse::<usize>() {
30                Ok(tmp_n) => tmp_n,
31                Err(err) => {
32                    eprintln!("{}", err);
33                    exit(1);
34                },
35            }
36        },
37        None => 100,
38    };
39    let m: usize = match args.get(2) {
40        Some(s) => {
41            match s.parse::<usize>() {
42                Ok(tmp_m) => tmp_m,
43                Err(err) => {
44                    eprintln!("{}", err);
45                    exit(1);
46                },
47            }
48        },
49        None => 100,
50    };
51    let l: usize = match args.get(3) {
52        Some(s) => {
53            match s.parse::<usize>() {
54                Ok(tmp_l) => tmp_l,
55                Err(err) => {
56                    eprintln!("{}", err);
57                    exit(1);
58                },
59            }
60        },
61        None => 100,
62    };
63    let frontend = match Frontend::new() {
64        Ok(tmp_frontend) => tmp_frontend,
65        Err(err) => {
66            eprintln!("{}", err);
67            exit(1);
68        },
69    };
70    println!("backend: {}", frontend.backend().name());
71    let a = create_matrix(n, l);
72    let b = create_matrix(l, m);
73    let now = Instant::now();
74    let c = a * b;
75    let duration = now.elapsed();
76    let elems = c.elems();
77    let sum = elems.iter().fold(0.0f32, |x, y| x + y);
78    println!("sum: {}", sum);
79    println!("time: {}.{:06}", duration.as_secs(), duration.as_micros() % 1000000);
80    match finalize_default_backend() {
81        Ok(()) => (),
82        Err(err) => {
83            eprintln!("{}", err);
84            exit(1);
85        },
86    }
87}