nx_pteam_gate.nx source
↩ module page · 67 lines · 2256 B
1// nx_pteam_gate.nx -- correctness + stress gate for the persistent barrier
2// team. Parallel band-sum of an array vs the serial sum, repeated 1000x to
3// shake out races / lost-wakeups / hangs. Also a self-test-shaped exit.
4// expect_exit: 0 (77 = wrong sum, hang = the run's 2e9 guard returns -1 -> 78)
5import "nx_syscalls.nx"
6import "nx_tier.nx"
7import "nx_pteam.nx"
8import "nx_fmt.nx"
9
10struct PtCtx { arr: i64, n: i64, res: i64, cpb: i64 }
11
12func pg_sum_band(band: i64, ctx: i64) -> i64 {
13 let c: *PtCtx = ctx as *PtCtx
14 let arr: *i64 = c.arr as *i64
15 let res: *i64 = c.res as *i64
16 let lo: i64 = band * c.cpb
17 var hi: i64 = (band + 1) * c.cpb
18 if hi > c.n { hi = c.n }
19 var s: i64 = 0
20 var i: i64 = lo
21 while i < hi {
22 s = s + arr[i]
23 i = i + 1
24 }
25 res[band] = s
26 return 0
27}
28
29func main() -> i64 {
30 let N: i64 = 100000
31 let arr: *i64 = sys_mmap(N * 8) as *i64
32 var i: i64 = 0
33 var serial: i64 = 0
34 while i < N { arr[i] = (i % 97) + 1; serial = serial + arr[i]; i = i + 1 }
35
36 let team: *NxPTeam = nx_pteam_new(0) // hw-sized
37 let W: i64 = team.n_workers
38 let res: *i64 = sys_mmap(W * 8) as *i64
39 let cpb: i64 = (N + W - 1) / W
40
41 let ctx: *PtCtx = sys_mmap(32) as *PtCtx
42 ctx.arr = arr as i64
43 ctx.n = N
44 ctx.res = res as i64
45 ctx.cpb = cpb
46
47 fmt_puts("PTEAM workers="); fmt_putn(W); fmt_puts(" cpb="); fmt_putn(cpb); fmt_puts("\n" as *u8)
48
49 // 1000 runs, each must reproduce the serial sum exactly.
50 var round: i64 = 0
51 while round < 1000 {
52 let rv: i64 = nx_pteam_run(team, pg_sum_band, ctx as i64)
53 if rv != 0 { fmt_puts("RUN HANG/err at round "); fmt_putn(round); fmt_puts("\n" as *u8); return 78 }
54 var tot: i64 = 0
55 var b: i64 = 0
56 while b < W { tot = tot + res[b]; b = b + 1 }
57 if tot != serial {
58 fmt_puts("MISMATCH round="); fmt_putn(round); fmt_puts(" got="); fmt_putn(tot); fmt_puts(" want="); fmt_putn(serial); fmt_puts("\n" as *u8)
59 return 77
60 }
61 round = round + 1
62 }
63 fmt_puts("PTEAM 1000 runs BIT-EXACT vs serial (sum="); fmt_putn(serial); fmt_puts(")\n" as *u8)
64 nx_pteam_shutdown(team)
65 fmt_puts("PTEAM_GATE DONE\n" as *u8)
66 return 0
67}