code wiki / _hdl_build / nx_pardl_gate.nx

nx_pardl_gate.nx source

↩ module page · 63 lines · 3644 B

1import "nx_gate_base.nx" 2// nx_pardl_gate.nx -- proves PARALLEL download AND MEASURES it (the performance axis, not a checkbox): time 3// the same 12-fragment download serial (concurrency=1) vs parallel (concurrency=4) and REPORT the speedup; 4// assert >=2x (real parallelism) AND that every fragment is downloaded + integrity-verified either way. This 5// is what "capturing performance as an axis" looks like: a measured number, and a regression bound. license_tier: ORIGINAL expect_exit: 0 6import "nx_syscalls.nx" 7import "nx_robust_dl.nx" 8import "nx_pardl.nx" 9import "nx_gate_verdict.nx" 10 11func grow(name: *u8, ok: i64) -> i64 { if ok==1 { gw(" PASS " as *u8) } else { gw(" FAIL " as *u8) } gw(name); gw(" 12" as *u8); return ok } 13func gn(v: i64) -> i64 { let b: *u8=sys_mmap(24); var m: i64=v; if m<0{gw("-" as *u8);m=0-m} let t: *u8=sys_mmap(24); var k: i64=0; if m==0{t[0]=48 as u8;k=1} while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1} var i: i64=0; while i<k{b[i]=t[k-1-i];i=i+1} sys_write(1,b,k); return 0 } 14 15func main() -> i64 { 16 gw("pardl SOVEREIGN gate (parallel fragment download -- MEASURED serial vs 4-way speedup + integrity)\n" as *u8) 17 var pass: i64 = 0 18 var ttl: i64 = 0 19 20 let nfrags: i64 = 12 21 let fragcap: i64 = 512 22 let latency: i64 = 50 23 let sharedbuf: *u8 = sys_mmap_shared(nfrags * fragcap) // children write here (MAP_SHARED) 24 let state1: *u8 = sys_mmap(64) 25 let state2: *u8 = sys_mmap(64) 26 var z: i64 = 0; while z < 64 { state1[z] = 0 as u8; state2[z] = 0 as u8; z = z + 1 } 27 28 // SERIAL (concurrency 1) 29 let t0: i64 = sys_clock_now_us() 30 let d1: i64 = pdl_download(nfrags, fragcap, 1, latency, sharedbuf, state1) 31 let t1: i64 = sys_clock_now_us() 32 let serial_us: i64 = t1 - t0 33 34 // PARALLEL (concurrency 4) 35 let t2: i64 = sys_clock_now_us() 36 let d2: i64 = pdl_download(nfrags, fragcap, 4, latency, sharedbuf, state2) 37 let t3: i64 = sys_clock_now_us() 38 let par_us: i64 = t3 - t2 39 40 gw(" MEASURED: serial=" as *u8); gn(serial_us / 1000); gw("ms parallel(4)=" as *u8); gn(par_us / 1000); gw("ms\n" as *u8) 41 var sx: i64 = 0 42 if par_us > 0 { sx = (serial_us * 100) / par_us } 43 gw(" SPEEDUP = " as *u8); gn(sx / 100); gw("." as *u8); let frac: i64 = sx - (sx/100)*100; if frac < 10 { gw("0" as *u8) } gn(frac); gw("x (12 frags @ " as *u8); gn(latency); gw("ms, 4-way)\n" as *u8) 44 45 ttl=ttl+1; pass=pass+grow("C1 serial downloaded all 12 (integrity-ok)\x00" as *u8, (d1 == 12) as i64) 46 ttl=ttl+1; pass=pass+grow("C2 parallel downloaded all 12 (integrity-ok)\x00" as *u8, (d2 == 12) as i64) 47 ttl=ttl+1; pass=pass+grow("C3 parallel >= 2x faster than serial (real parallelism)\x00" as *u8, ((par_us * 2) < serial_us) as i64) 48 // C4: resume-state fully marked under parallelism (composes with resume) 49 var s4: i64 = 1; var i4: i64 = 0 50 while i4 < nfrags { if (state2[i4] & 0xff) != 1 { s4 = 0 } i4 = i4 + 1 } 51 ttl=ttl+1; pass=pass+grow("C4 resume-state all 12 marked (parallel + resume compose)\x00" as *u8, s4) 52 53 gw("pass=" as *u8); gn(pass); gw("/" as *u8); gn(ttl); gw("\n" as *u8) 54 // MIGRATED onto nx_gate_verdict by nx_gate_dry_apply (D001, minimal form): every check 55 // row above is untouched, so the PASS/FAIL vector cannot change; only the hand-rolled 56 // verdict emission is replaced by the ONE shared base class. Proven by nx_gate_migrate verify. 57 let ctr__dry: *i64 = gv_ctr() 58 ctr__dry[0] = pass 59 ctr__dry[1] = ttl 60 let rc__dry: i64 = gv_verdict("PARDL-GATE" as *u8, ctr__dry, "parallelism MEASURED as a speedup axis; integrity+resume intact)" as *u8) 61 sys_exit(rc__dry) 62 return rc__dry 63}