cyb/honeycrisp/acpu/examples/sme_oneshot.rs

use std::time::Instant;
fn main() {
    let caps = acpu::scan();
    if !caps.has_sme {
        return;
    }
    for &n in &[64usize, 128, 256, 512] {
        let len = n * n;
        let a = vec![0.1f32; len];
        let b = vec![0.2f32; len];
        let mut c = vec![0.0f32; len];
        for _ in 0..3 {
            acpu::sme::matmul_f32_sme_set(&a, &b, &mut c, n, n, n).unwrap();
        }
        let iters = 20;
        let s = Instant::now();
        for _ in 0..iters {
            acpu::sme::matmul_f32_sme_set(&a, &b, &mut c, n, n, n).unwrap();
        }
        let elapsed_ns = s.elapsed().as_nanos() as u64;
        let per_call_ns = elapsed_ns / iters;
        let flops = 2u64 * n as u64 * n as u64 * n as u64;
        let gf = (flops as f64) / (per_call_ns as f64);
        println!("n={n:4} per_call={per_call_ns:8}ns  {gf:6.1} GF/s");
    }
}

Homonyms

cyb/honeycrisp/.claude/worktrees/agent-ad6c77c38e86bc291/acpu/examples/sme_oneshot.rs

Graph