use tessl::{gemm, GemmBackend, GpuRuntime};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let rt = GpuRuntime::new()?;
println!("device: {}", rt.device_name());
let (m, k, n) = (512, 256, 128);
let a = rt.alloc_tensor_f32(&[m, k])?;
let b = rt.alloc_tensor_f32(&[k, n])?;
let c = rt.alloc_tensor_f32(&[m, n])?;
a.buffer.write_f32(&vec![1.0f32; m * k]);
b.buffer.write_f32(&vec![2.0f32; k * n]);
gemm(&a, &b, &c, GemmBackend::TensorOps)?;
rt.synchronize()?;
let out = c.buffer.read_f32();
let expected = 2.0 * k as f32;
assert!(
(out[0] - expected).abs() < 1e-3,
"C[0] = {} but every element should be {expected}",
out[0]
);
println!(
"C[0] = {} (expected {expected}) over {m}x{k} @ {k}x{n}",
out[0]
);
Ok(())
}