Documentation
#[cfg(target_arch = "x86_64")]
use std::arch::x86_64::*;

#[target_feature(enable = "avx2")]
pub unsafe fn gemm_f32(a: &[f32], b: &[f32], c: &mut [f32], m: usize, n: usize, k: usize) {
    for i in 0..m {
        for j in 0..n {
            let mut sum = _mm256_setzero_ps();
            let mut l = 0;
            while l + 8 <= k {
                let va = _mm256_loadu_ps(&a[i * k + l]);
                let vb = _mm256_loadu_ps(&b[j * k + l]);
                sum = _mm256_fmadd_ps(va, vb, sum);
                l += 8;
            }
            let mut tmp = [0f32; 8];
            _mm256_storeu_ps(&mut tmp[0], sum);
            let mut res = tmp.iter().sum::<f32>();
            while l < k {
                res += a[i * k + l] * b[j * k + l];
                l += 1;
            }
            c[i * n + j] = res;
        }
    }
}