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}