code wiki / (root) / nx_pteam_gate.nx

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}