code wiki / (root) / nx_bench_matmul.nx

nx_bench_matmul.nx source

↩ module page · 69 lines · 2520 B

1// nx_bench_matmul.nx -- NishiLang twin of bench/xlang/matmul.c. Memory-bound 2// integer matmul checksum (64-bit wrapping). Prints checksum then elapsed_us. 3// Cm[r % (N*N)] === Cm[r] since r<REP<N*N, written directly. Checksum bit-exact 4// vs gcc AND clang (3rd-party oracles). license_tier: ORIGINAL No hw writes. 5// (nx_syscalls_x86_64.nx import REMOVED 2026-07-31, debt 1785528831: this file already 6// gets the canonical syscall layer via nx_clock.nx -> syscalls.nx, so importing the raw-x86 7// module too put TWO syscall layers in one TU -- every wrapper twice, numbering picked by 8// definition ORDER, silently.) 9import "nx_clock.nx" 10const K_MAGIC_6364136223846793005: i64 = 6364136223846793005 11const K_MAGIC_1442695040888963407: i64 = 1442695040888963407 12 13func bm_emit_i64(fd: i64, n: i64) -> i64 { 14 let scratch: *u8 = sys_mmap(32) 15 var v: i64 = n 16 var neg: i64 = 0 17 if v < 0 { neg = 1; v = 0 - v } 18 var k: i64 = 0 19 if v == 0 { scratch[0] = 0x30 as u8; k = 1 } 20 while v > 0 { scratch[k] = (0x30 + (v - (v / 10) * 10)) as u8; v = v / 10; k = k + 1 } 21 let rev: *u8 = sys_mmap(48) 22 var ro: i64 = 0 23 if neg == 1 { rev[0] = 0x2D as u8; ro = 1 } 24 var j: i64 = 0 25 while j < k { rev[ro + j] = scratch[k - 1 - j]; j = j + 1 } 26 rev[ro + k] = 0x0A as u8 27 sys_write(fd, rev, ro + k + 1) 28 return 0 29} 30 31func main() -> i64 { 32 let N: i64 = 192 33 let REP: i64 = 40 34 let a: *i64 = sys_mmap(N * N * 8) as *i64 35 let b: *i64 = sys_mmap(N * N * 8) as *i64 36 let cm: *i64 = sys_mmap(N * N * 8) as *i64 37 var x: i64 = 1 38 var f: i64 = 0 39 while f < N * N { x = x * K_MAGIC_6364136223846793005 + K_MAGIC_1442695040888963407; a[f] = x; f = f + 1 } 40 f = 0 41 while f < N * N { x = x * K_MAGIC_6364136223846793005 + K_MAGIC_1442695040888963407; b[f] = x; f = f + 1 } 42 let start: i64 = nx_clock_monotonic_ns() 43 var chk: i64 = 0 44 var r: i64 = 0 45 while r < REP { 46 var i: i64 = 0 47 while i < N { 48 var j: i64 = 0 49 while j < N { 50 var s: i64 = 0 51 var k: i64 = 0 52 while k < N { 53 s = s + a[i * N + k] * b[k * N + j] 54 k = k + 1 55 } 56 cm[i * N + j] = s 57 j = j + 1 58 } 59 i = i + 1 60 } 61 chk = chk ^ (cm[r] + r) 62 r = r + 1 63 } 64 let end: i64 = nx_clock_monotonic_ns() 65 let us: i64 = (end - start) / 1000 66 bm_emit_i64(1, chk) 67 bm_emit_i64(1, us) 68 return 0 69}