use std::env;
use std::time::Instant;
use rustnum as np;
fn read_positive_usize(name: &str, default: usize) -> usize {
match env::var(name) {
Ok(value) => value
.parse()
.unwrap_or_else(|_| panic!("{name} must be a positive integer")),
Err(_) => default,
}
}
fn main() {
let size = read_positive_usize("SIZE", 8192);
let iterations = read_positive_usize("ITERATIONS", 12);
let scale = (size as f64).sqrt();
let mut rng = np::random::Rng::seed(42);
let mut a = rng.standard_normal(&[size, size]);
let mut b = rng.standard_normal(&[size, size]);
println!(
"workload: {size}x{size}, {iterations} iterations ({} matmuls)",
iterations * 2
);
let start = Instant::now();
for _ in 0..iterations {
a = (a.matmul(&b) / scale).tanh();
b = (b.matmul(&a) / scale).tanh();
}
let elapsed = start.elapsed();
println!("elapsed: {:.3}s", elapsed.as_secs_f64());
println!(
"checksums: a.mean() = {:.9}, b.mean() = {:.9}",
a.mean(),
b.mean()
);
}