diff --git a/Cargo.toml b/Cargo.toml
index ebeda0f..e063398 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -38,7 +38,7 @@ crossbeam-queue = { version = "0.3", default-features = false, features = ["allo
mutants = "0.0.3"
criterion = { version = "0.5", features = ["html_reports"] }
libc = "0.2"
-nebu = { path = "../strata/nebu/rs", package = "strata-nebu" }
+nebu = { path = "../strata/nebu/rs", package = "strata-nebu", version = "0.1.1" }
objc2 = "0.6"
objc2-metal = { version = "0.3", features = ["MTLDevice", "MTLCommandQueue", "MTLCommandBuffer", "MTLComputeCommandEncoder", "MTLComputePipeline", "MTLResource", "MTLBuffer", "MTLLibrary"] }
objc2-foundation = { version = "0.3", features = ["NSString", "NSError"] }
diff --git a/acpu/bench/cores.rs b/acpu/bench/cores.rs
index 6aeaed9..e67752e 100644
--- a/acpu/bench/cores.rs
+++ b/acpu/bench/cores.rs
@@ -84,7 +84,8 @@ fn main() {
);
eprintln!(" {}", "β".repeat(50));
- let workloads: Vec<(&str, Arc<dyn Fn() + Send + Sync>)> = vec![
+ type Workload = (&'static str, Arc<dyn Fn() + Send + Sync>);
+ let workloads: Vec<Workload> = vec![
(
"sum 1M",
Arc::new({
diff --git a/acpu/bench/crypto.rs b/acpu/bench/crypto.rs
index 0844334..002d655 100644
--- a/acpu/bench/crypto.rs
+++ b/acpu/bench/crypto.rs
@@ -62,7 +62,7 @@ fn aes128_key_expand(key: &[u8; 16]) -> Vec<[u8; 16]> {
S[b[3] as usize],
])
}
- let mut w = vec![0u32; 44];
+ let mut w = [0u32; 44];
for i in 0..4 {
w[i] = u32::from_be_bytes([key[4 * i], key[4 * i + 1], key[4 * i + 2], key[4 * i + 3]]);
}
diff --git a/acpu/bench/elementwise.rs b/acpu/bench/elementwise.rs
index f3b90ac..4f6af71 100644
--- a/acpu/bench/elementwise.rs
+++ b/acpu/bench/elementwise.rs
@@ -100,7 +100,7 @@ fn main() {
// x + 0.044715*x^3
vDSP_vadd(pos.as_ptr(), 1, tmp.as_ptr(), 1, tmp.as_mut_ptr(), 1, nu);
// sqrt(2/pi) * (...)
- let s2pi = 0.7978845608f32;
+ let s2pi = 0.797_884_6_f32;
vDSP_vsmul(tmp.as_ptr(), 1, &s2pi, tmp.as_mut_ptr(), 1, nu);
// tanh
vvtanhf(out.as_mut_ptr(), tmp.as_ptr(), &ni);
diff --git a/acpu/bench/memory.rs b/acpu/bench/memory.rs
index fc33446..3460bc8 100644
--- a/acpu/bench/memory.rs
+++ b/acpu/bench/memory.rs
@@ -281,7 +281,7 @@ fn main() {
let b_arr: Vec<f32> = (0..STREAM_N).map(|i| (i % 997) as f32 * 0.001).collect();
let mut c_arr = vec![0f32; STREAM_N];
let mut d_arr = vec![0f32; STREAM_N];
- let scalar = 3.14159f32;
+ let scalar = f32::from_bits(0x4049_0fd0); // Preserve the original 3.14159f32 value.
let bytes = STREAM_N as f64 * 4.0;
let specs: [(&str, f64, f64); 4] = [
@@ -304,8 +304,8 @@ fn main() {
let iters_per = 20;
let mut all_times: [[Vec<u64>; 4]; 1] = [Default::default()];
let times = &mut all_times[0];
- for k in 0..4 {
- times[k] = Vec::with_capacity(rounds * iters_per);
+ for time in times.iter_mut() {
+ *time = Vec::with_capacity(rounds * iters_per);
}
for _ in 0..rounds {
diff --git a/acpu/bench/sgemm.rs b/acpu/bench/sgemm.rs
index 780e67a..7beb479 100644
--- a/acpu/bench/sgemm.rs
+++ b/acpu/bench/sgemm.rs
@@ -109,7 +109,7 @@ fn bench_mixed() {
}
let ns = best_of(οΏΏοΏΏ acpu::matmul_f16(&a16, &b16, &mut c, n, n, n), 100);
let gf = flops / ns as f64;
- println!("{:<28} {:>8.1} GF {}", "hgemm fp16", gf, "convert+sgemm");
+ println!("{:<28} {:>8.1} GF convert+sgemm", "hgemm fp16", gf);
}
// bf16
@@ -124,7 +124,7 @@ fn bench_mixed() {
}
let ns = best_of(οΏΏοΏΏ acpu::matmul_bf16(&a16, &b16, &mut c, n, n, n), 100);
let gf = flops / ns as f64;
- println!("{:<28} {:>8.1} GF {}", "bgemm bf16", gf, "convert+sgemm");
+ println!("{:<28} {:>8.1} GF convert+sgemm", "bgemm bf16", gf);
}
// i8
@@ -142,7 +142,7 @@ fn bench_mixed() {
100,
);
let gf = flops / ns as f64;
- println!("{:<28} {:>8.1} GF {}", "qgemm i8", gf, "deq+sgemm");
+ println!("{:<28} {:>8.1} GF deq+sgemm", "qgemm i8", gf);
}
}
diff --git a/acpu/bench/summary.rs b/acpu/bench/summary.rs
index 51f1465..e312add 100644
--- a/acpu/bench/summary.rs
+++ b/acpu/bench/summary.rs
@@ -224,8 +224,8 @@ fn main() {
// thermal warmup: light work to stabilize clocks
let mut warmup_buf = vec![0f32; 4096];
for _ in 0..1000 {
- for i in 0..4096 {
- warmup_buf[i] = (warmup_buf[i] + 1.0).sqrt();
+ for value in &mut warmup_buf {
+ *value = (*value + 1.0).sqrt();
}
}
std::hint::black_box(&warmup_buf);
@@ -533,7 +533,7 @@ fn main() {
let c = 0.044715f32;
vDSP_vsmul(tmp.as_ptr(), 1, &c, tmp.as_mut_ptr(), 1, nu);
vDSP_vadd(pos.as_ptr(), 1, tmp.as_ptr(), 1, tmp.as_mut_ptr(), 1, nu);
- let s2pi = 0.7978845608f32;
+ let s2pi = 0.797_884_6_f32;
vDSP_vsmul(tmp.as_ptr(), 1, &s2pi, tmp.as_mut_ptr(), 1, nu);
vvtanhf(out2.as_mut_ptr(), tmp.as_ptr(), &nn);
vDSP_vsadd(out2.as_ptr(), 1, &one, out2.as_mut_ptr(), 1, nu);
@@ -1190,7 +1190,8 @@ fn main() {
});
let t_b = ns(οΏΏοΏΏ {
for i in 0..n {
- i8_buf[i] = (conv_src[i] / 0.1).round().max(-128.0).min(127.0) as i8;
+ let lower_bounded = (conv_src[i] / 0.1).round().max(-128.0);
+ i8_buf[i] = lower_bounded.min(127.0) as i8;
}
for i in 0..n {
f32_dst[i] = i8_buf[i] as f32 * 0.1;
@@ -1455,7 +1456,7 @@ fn main() {
let dim = n;
for i in 0..dim / 2 {
let freq = ai_freqs[i];
- let (sin_v, cos_v) = (freq * 42.0 as f32).sin_cos();
+ let (sin_v, cos_v) = (freq * 42.0_f32).sin_cos();
ai_out2[2 * i] = ai_x[2 * i] * cos_v - ai_x[2 * i + 1] * sin_v;
ai_out2[2 * i + 1] = ai_x[2 * i] * sin_v + ai_x[2 * i + 1] * cos_v;
}
@@ -2315,7 +2316,7 @@ fn main() {
});
// scale (read + write = 2Γ bytes) β NEON + STNP
- let scalar = 3.14159f32;
+ let scalar = f32::from_bits(0x4049_0fd0); // Preserve the original 3.14159f32 value.
for _ in 0..10 {
neon_stream_scale(&sa, &mut sc, scalar);
}
@@ -2377,7 +2378,7 @@ fn main() {
// ββββββββββ PRINT TABLE ββββββββββ
let _ = acpu::sync::affinity::pin_any();
- print_table(&caps, &rows);
+ print_table(caps, &rows);
}
// ββ NEON STREAM kernels with STNP (non-temporal stores) ββ
@@ -2497,12 +2498,8 @@ fn neon_stream_triad(a: &[f32], b: &[f32], d: &mut [f32], scalar: f32) {
}
fn fmt_val(v: f64) -> String {
- if v >= 1_000_000.0 {
+ if v >= 10_000.0 {
format!("{:.0}", v)
- } else if v >= 10_000.0 {
- format!("{:.0}", v)
- } else if v >= 100.0 {
- format!("{:.1}", v)
} else if v >= 1.0 {
format!("{:.1}", v)
} else {
@@ -2633,7 +2630,7 @@ fn aes128_expand(key: &[u8; 16]) -> Vec<[u8; 16]> {
S[b[3] as usize],
])
}
- let mut w = vec![0u32; 44];
+ let mut w = [0u32; 44];
for i in 0..4 {
w[i] = u32::from_be_bytes([key[4 * i], key[4 * i + 1], key[4 * i + 2], key[4 * i + 3]]);
}
diff --git a/acpu/bench/zk.rs b/acpu/bench/zk.rs
index 4dc1175..82b0a19 100644
--- a/acpu/bench/zk.rs
+++ b/acpu/bench/zk.rs
@@ -284,7 +284,7 @@ fn main() {
// Merkle path: log2(n) hashes per verification
for &tree_size in &[1024u64, 1_000_000, 1_000_000_000] {
let depth = 64 - tree_size.leading_zeros();
- let path_ns = perm_ns as u64 * depth as u64;
+ let path_ns = perm_ns * depth as u64;
println!(
" Merkle path (n={:>10}): {:>5}ns ({} hashes, depth {})",
tree_size, path_ns, depth, depth
diff --git a/acpu/examples/amx_opcode_scan.rs b/acpu/examples/amx_opcode_scan.rs
index 14f02e9..4af23fb 100644
--- a/acpu/examples/amx_opcode_scan.rs
+++ b/acpu/examples/amx_opcode_scan.rs
@@ -40,8 +40,8 @@ fn main() {
}
// Load X[0] and Y[0].
- amx_op::<OP_LDX>((x_buf as u64) | (0u64 << 56));
- amx_op::<OP_LDY>((y_buf as u64) | (0u64 << 56));
+ amx_op::<OP_LDX>(x_buf as u64);
+ amx_op::<OP_LDY>(y_buf as u64);
// Try this opcode with operand 0 (simplest).
// Catch SIGILL β if opcode doesn't exist, it will crash.
diff --git a/acpu/examples/amx_smoke.rs b/acpu/examples/amx_smoke.rs
index 87b8bf5..3f1e42b 100644
--- a/acpu/examples/amx_smoke.rs
+++ b/acpu/examples/amx_smoke.rs
@@ -44,8 +44,8 @@ fn main() {
for row in 0u8..64 {
amx_op::<OP_LDZ>((zero_buf as u64) | ((row as u64) << 56));
}
- amx_op::<OP_LDX>((x_buf as u64) | (0u64 << 56));
- amx_op::<OP_LDY>((y_buf as u64) | (0u64 << 56));
+ amx_op::<OP_LDX>(x_buf as u64);
+ amx_op::<OP_LDY>(y_buf as u64);
let op = fma_first(XRow::new_unchecked(0), YRow::new_unchecked(0), 0);
amx_op::<OP_FMA32>(op);
@@ -157,11 +157,11 @@ fn main() {
for i in 0..16 {
*x_buf.add(i) = 7.0;
}
- amx_op::<OP_LDX>((x_buf as u64) | (0u64 << 56));
+ amx_op::<OP_LDX>(x_buf as u64);
for j in 0..16 {
*y_buf.add(j) = 3.0;
}
- amx_op::<OP_LDY>((y_buf as u64) | (0u64 << 56));
+ amx_op::<OP_LDY>(y_buf as u64);
let op4 = fma_first(XRow::new_unchecked(0), YRow::new_unchecked(0), 1);
amx_op::<OP_FMA32>(op4);
diff --git a/acpu/examples/decompose.rs b/acpu/examples/decompose.rs
index a366a0b..6493a13 100644
--- a/acpu/examples/decompose.rs
+++ b/acpu/examples/decompose.rs
@@ -106,7 +106,7 @@ fn decompose(n: usize) {
#[repr(align(64))]
struct APack([MaybeUninit<f32>; 256 * 256]);
- let t = median_ns(|| {
+ median_ns(|| {
let mut buf: APack = unsafe { MaybeUninit::uninit().assume_init() };
let ap = &mut buf.0[..];
for s in 0..n_mr {
@@ -126,8 +126,7 @@ fn decompose(n: usize) {
}
}
std::hint::black_box(&buf);
- });
- t
+ })
};
// --- A pack: NEON (pack_a_strip_neon style) ---
@@ -135,7 +134,7 @@ fn decompose(n: usize) {
#[repr(align(64))]
struct APack([f32; 256 * 256]);
- let t = median_ns(|| {
+ median_ns(|| {
let mut buf = APack([0.0f32; 256 * 256]);
let dst = &mut buf.0[..];
for s in 0..n_mr {
@@ -190,8 +189,7 @@ fn decompose(n: usize) {
}
}
std::hint::black_box(&buf);
- });
- t
+ })
};
// --- AMX compute: per-instruction LDX+LDY+FMA (small.rs inner loop) ---
@@ -295,7 +293,7 @@ fn decompose(n: usize) {
#[repr(align(64))]
struct BPack([MaybeUninit<f32>; 256 * 256]);
- let t = median_ns(|| {
+ median_ns(|| {
let mut buf: BPack = unsafe { MaybeUninit::uninit().assume_init() };
let bp = &mut buf.0[..];
for s in 0..n_mr {
@@ -311,8 +309,7 @@ fn decompose(n: usize) {
}
}
std::hint::black_box(&buf);
- });
- t
+ })
};
// --- Preload + compute + store (new path) ---
diff --git a/acpu/examples/matmul.rs b/acpu/examples/matmul.rs
index f8b9783..6f3c493 100644
--- a/acpu/examples/matmul.rs
+++ b/acpu/examples/matmul.rs
@@ -23,8 +23,8 @@ fn main() {
// Verify: C should equal A (all ones) since B is identity.
let mut max_err = 0.0f32;
- for i in 0..N * N {
- let err = (c[i] - 1.0).abs();
+ for value in &c {
+ let err = (*value - 1.0).abs();
if err > max_err {
max_err = err;
}
diff --git a/acpu/examples/neon_vs_amx.rs b/acpu/examples/neon_vs_amx.rs
index 2a243d8..e9022e1 100644
--- a/acpu/examples/neon_vs_amx.rs
+++ b/acpu/examples/neon_vs_amx.rs
@@ -18,11 +18,11 @@ fn main() {
acpu::matmul_f32(&a, &b, &mut c, sz, sz, sz);
let mut t = vec![0u64; iters];
- for i in 0..iters {
+ for time in &mut t {
c.fill(0.0);
let s = Instant::now();
acpu::matmul_f32(&a, &b, &mut c, sz, sz, sz);
- t[i] = s.elapsed().as_nanos() as u64;
+ *time = s.elapsed().as_nanos() as u64;
}
let ns = median_of(&mut t);
let ops = 2.0 * (sz as f64).powi(3);
diff --git a/acpu/examples/pair_test.rs b/acpu/examples/pair_test.rs
index 0686fcd..22bf72b 100644
--- a/acpu/examples/pair_test.rs
+++ b/acpu/examples/pair_test.rs
@@ -22,8 +22,8 @@ fn main() {
// Test pair LDX at different alignments
let buf = A128({
let mut a = [0.0f32; 64];
- for i in 0..64 {
- a[i] = (i + 1) as f32;
+ for (i, value) in a.iter_mut().enumerate() {
+ *value = (i + 1) as f32;
}
a
});
diff --git a/acpu/examples/phase_time.rs b/acpu/examples/phase_time.rs
index 85219be..aecc6fd 100644
--- a/acpu/examples/phase_time.rs
+++ b/acpu/examples/phase_time.rs
@@ -18,20 +18,20 @@ fn main() {
// Total sgemm time
let mut t = vec![0u64; iters];
- for i in 0..iters {
+ for time in &mut t {
c.fill(0.0);
let s = Instant::now();
acpu::matmul_f32(&a, &b, &mut c, sz, sz, sz);
- t[i] = s.elapsed().as_nanos() as u64;
+ *time = s.elapsed().as_nanos() as u64;
}
let total = median_of(&mut t);
// Time just c.fill(0.0) to subtract
- for i in 0..iters {
+ for time in &mut t {
let s = Instant::now();
c.fill(0.0);
std::hint::black_box(&c);
- t[i] = s.elapsed().as_nanos() as u64;
+ *time = s.elapsed().as_nanos() as u64;
}
let fill = median_of(&mut t);
diff --git a/acpu/examples/profile64.rs b/acpu/examples/profile64.rs
index a5853e9..f3cca0b 100644
--- a/acpu/examples/profile64.rs
+++ b/acpu/examples/profile64.rs
@@ -17,11 +17,11 @@ fn main() {
// Full sgemm (includes pack + preload + compute + store)
acpu::matmul_f32(&a, &b, &mut c, n, n, k);
let mut t = vec![0u64; iters];
- for i in 0..iters {
+ for time in &mut t {
c.fill(0.0);
let s = Instant::now();
acpu::matmul_f32(&a, &b, &mut c, n, n, k);
- t[i] = s.elapsed().as_nanos() as u64;
+ *time = s.elapsed().as_nanos() as u64;
}
eprintln!(
"full sgemm 64Γ64: {:>5} ns {:.1} GFLOPS",
@@ -36,11 +36,11 @@ fn main() {
let b2: Vec<f32> = (0..kk * n).map(|i| (i % 11) as f32 * 0.1).collect();
let mut c2 = vec![0.0f32; n * n];
acpu::matmul_f32(&a2, &b2, &mut c2, n, n, kk);
- for i in 0..iters {
+ for time in &mut t {
c2.fill(0.0);
let s = Instant::now();
acpu::matmul_f32(&a2, &b2, &mut c2, n, n, kk);
- t[i] = s.elapsed().as_nanos() as u64;
+ *time = s.elapsed().as_nanos() as u64;
}
let ns = median(&mut t);
let gf = 2.0 * n as f64 * n as f64 * kk as f64 / ns as f64;
diff --git a/acpu/examples/single_vs_par.rs b/acpu/examples/single_vs_par.rs
index a5c2a69..7d45241 100644
--- a/acpu/examples/single_vs_par.rs
+++ b/acpu/examples/single_vs_par.rs
@@ -14,11 +14,11 @@ fn main() {
acpu::matmul_f32(&a, &b, &mut c, sz, sz, sz);
let iters = if sz >= 1024 { 5 } else { 10 };
let mut t = vec![0u64; iters];
- for i in 0..iters {
+ for time in &mut t {
c.fill(0.0);
let s = Instant::now();
acpu::matmul_f32(&a, &b, &mut c, sz, sz, sz);
- t[i] = s.elapsed().as_nanos() as u64;
+ *time = s.elapsed().as_nanos() as u64;
}
let ns = median(&mut t);
let gf = 2.0 * (sz as f64).powi(3) / ns as f64;
diff --git a/acpu/examples/trace64.rs b/acpu/examples/trace64.rs
index 29e340e..acd7501 100644
--- a/acpu/examples/trace64.rs
+++ b/acpu/examples/trace64.rs
@@ -176,8 +176,8 @@ fn main() {
// Β΅kernel 16Γ64
acpu::matrix::tile::microkernel_16x64_acc(
ap,
- b_pack.0.as_ptr().add(0 * N * NR) as *const u8,
- b_pack.0.as_ptr().add(1 * N * NR) as *const u8,
+ b_pack.0.as_ptr() as *const u8,
+ b_pack.0.as_ptr().add(N * NR) as *const u8,
b_pack.0.as_ptr().add(2 * N * NR) as *const u8,
b_pack.0.as_ptr().add(3 * N * NR) as *const u8,
N,
@@ -220,8 +220,8 @@ fn main() {
}
acpu::matrix::tile::microkernel_16x64_acc(
a_ptr,
- bp.as_ptr().add(0 * N * NR) as *const u8,
- bp.as_ptr().add(1 * N * NR) as *const u8,
+ bp.as_ptr() as *const u8,
+ bp.as_ptr().add(N * NR) as *const u8,
bp.as_ptr().add(2 * N * NR) as *const u8,
bp.as_ptr().add(3 * N * NR) as *const u8,
N,
@@ -421,8 +421,8 @@ fn main() {
}
acpu::matrix::tile::microkernel_16x64_acc(
ap,
- sb.0.as_ptr().add(0 * N * NR) as *const u8,
- sb.0.as_ptr().add(1 * N * NR) as *const u8,
+ sb.0.as_ptr() as *const u8,
+ sb.0.as_ptr().add(N * NR) as *const u8,
sb.0.as_ptr().add(2 * N * NR) as *const u8,
sb.0.as_ptr().add(3 * N * NR) as *const u8,
N,
@@ -508,8 +508,8 @@ fn main() {
}
acpu::matrix::tile::microkernel_16x64_acc(
ap,
- sb_slice.as_ptr().add(0 * N * NR) as *const u8,
- sb_slice.as_ptr().add(1 * N * NR) as *const u8,
+ sb_slice.as_ptr() as *const u8,
+ sb_slice.as_ptr().add(N * NR) as *const u8,
sb_slice.as_ptr().add(2 * N * NR) as *const u8,
sb_slice.as_ptr().add(3 * N * NR) as *const u8,
N,
@@ -539,8 +539,8 @@ fn main() {
}
acpu::matrix::tile::microkernel_16x64_acc(
ap,
- b_pack.0.as_ptr().add(0 * N * NR) as *const u8,
- b_pack.0.as_ptr().add(1 * N * NR) as *const u8,
+ b_pack.0.as_ptr() as *const u8,
+ b_pack.0.as_ptr().add(N * NR) as *const u8,
b_pack.0.as_ptr().add(2 * N * NR) as *const u8,
b_pack.0.as_ptr().add(3 * N * NR) as *const u8,
N,