code wiki / _hdl_build / nx_optimize_suite_test.nx

nx_optimize_suite_test.nx source

↩ module page · 101 lines · 5148 B

1// nx_optimize_suite_test.nx -- the Nishi TEAM optimizing a SUITE autonomously 2// (the mechanism for grinding benchmarks). For each kernel the loop: SEARCHES for 3// a cheaper equivalent (e-graph superopt), MEASURES the cost gain, VERIFIES the 4// candidate still evaluates equal (1:1), and the crew GOVERNS the swap -- absorbing 5// real wins, correctly leaving already-optimal kernels alone. No hand-optimizing: 6// the loop builds + optimizes. This is point-and-deliver in miniature. 7// 8// Suite: mul x K for K in {3,4,8,16,32}. K=2^k strength-reduces (mul->shl, cost 9// 3->1, ABSORBED); K=3 has no cheaper equivalent (cost stays 3, DEFERRED -- the 10// loop honestly banks no false win). Known answer: "absorbed=4 deferred=1 gain=8". 11 12import "nx_superopt.nx" // e-graph search + nx_superopt_eval_emit 13import "nx_crew_council.nx" // governance 14 15// optimize one kernel (mul x K): returns the cost gain (before-after); writes the 16// council verdict to vd_out[0]. Verifies the cheaper form still computes x*K. 17func opt_one(K: i64, nodes: *NxENode, classes: *NxEClass, g: *NxEGraph, 18 cand_out: *NxEmitNode, env: *i64, val: *i64, a: *CrewAction, why: *i64, vd_out: *i64) -> i64 { 19 if nx_eqsat_init(g, nodes, 256, classes, 256) != NX_EQSAT_OK { return 0 - 1 } 20 let x: i64 = nx_eqsat_add_var(g, 0) 21 let ck: i64 = nx_eqsat_add_const(g, K) 22 let cls: i64 = nx_eqsat_add_binary(g, NX_EQ_OP_MUL, x, ck) 23 let before: i64 = nx_eqsat_class_cost(g, cls) 24 nx_eqsat_saturate(g, 16) 25 if nx_eqsat_recompute_best(g) != NX_EQSAT_OK { return 0 - 1 } 26 let after: i64 = nx_eqsat_best_cost(g, cls) 27 let cnt: *i64 = sys_mmap(8) as *i64 28 cnt[0] = 0 29 let root: i64 = nx_eqsat_emit(g, cls, cand_out, 64, cnt) 30 if root < 0 { return 0 - 1 } 31 32 // VERIFY equivalent: the emitted candidate evaluates == x*K over a battery. 33 var equiv: i64 = 1 34 var xv: i64 = 0 - 64 35 while xv <= 64 { 36 env[0] = xv 37 if nx_superopt_eval_emit(cand_out, cnt[0], root, env, val) != (xv * K) { equiv = 0 } 38 xv = xv + 1 39 } 40 var cheaper: i64 = 0 41 if after < before { cheaper = 1 } 42 43 cc_set(a, "superopt kernel" as *u8, equiv, 1, cheaper, 1, 1) // verifies=equiv, worth=cheaper 44 let vd: i64 = cc_council(a, why) 45 vd_out[0] = vd 46 if vd == CC_ACT { return before - after } 47 return 0 48} 49 50func main() -> i64 { 51 let nodes: *NxENode = sys_mmap(256 * 128) as *NxENode 52 let classes: *NxEClass = sys_mmap(256 * 64) as *NxEClass 53 let g: *NxEGraph = sys_mmap(256) as *NxEGraph 54 let cand_out: *NxEmitNode = sys_mmap(64 * 40) as *NxEmitNode 55 let env: *i64 = sys_mmap(8 * 8) as *i64 56 let val: *i64 = sys_mmap(64 * 8) as *i64 57 let a: *CrewAction = sys_mmap(64) as *CrewAction 58 let why: *i64 = sys_mmap(8) as *i64 59 let vd: *i64 = sys_mmap(8) as *i64 60 61 cc_puts("================================================================\n" as *u8) 62 cc_puts(" NISHI TEAM optimizing a suite -- search -> measure -> verify ->\n" as *u8) 63 cc_puts(" govern -> bank. (the benchmark-grinding loop, autonomous)\n" as *u8) 64 cc_puts("================================================================\n" as *u8) 65 66 let ks: *i64 = sys_mmap(8 * 5) as *i64 67 ks[0] = 3; ks[1] = 4; ks[2] = 8; ks[3] = 16; ks[4] = 32 68 var absorbed: i64 = 0 69 var deferred: i64 = 0 70 var gain: i64 = 0 71 72 var i: i64 = 0 73 while i < 5 { 74 let g1: i64 = opt_one(ks[i], nodes, classes, g, cand_out, env, val, a, why, vd) 75 if g1 < 0 { sys_exit(40); return 40 } 76 cc_puts(" mul x " as *u8) 77 let kb: *u8 = sys_mmap(4); var kk: i64 = ks[i]; var kn: i64 = 0 78 if kk == 0 { kb[0] = 48; kn = 1 } 79 let kt: *u8 = sys_mmap(4); var ktn: i64 = 0 80 while kk > 0 { kt[ktn] = 48 + (kk % 10); kk = kk / 10; ktn = ktn + 1 } 81 var z: i64 = 0; while z < ktn { kb[z] = kt[ktn - 1 - z]; z = z + 1 } 82 if ktn == 0 { ktn = kn } 83 sys_write(1, kb, ktn) 84 if vd[0] == CC_ACT { cc_puts(" -> OPTIMIZED (cost -" as *u8); let gb: *u8 = sys_mmap(2); gb[0] = 48 + g1; sys_write(1, gb, 1); cc_puts(", absorbed)\n" as *u8); absorbed = absorbed + 1; gain = gain + g1 } 85 if vd[0] != CC_ACT { cc_puts(" -> already optimal (no cheaper equivalent, deferred)\n" as *u8); deferred = deferred + 1 } 86 i = i + 1 87 } 88 89 cc_puts("----------------------------------------------------------------\n" as *u8) 90 cc_puts(" suite: absorbed=" as *u8); let ab: *u8 = sys_mmap(2); ab[0] = 48 + absorbed; sys_write(1, ab, 1) 91 cc_puts(" deferred=" as *u8); let df: *u8 = sys_mmap(2); df[0] = 48 + deferred; sys_write(1, df, 1) 92 cc_puts(" gain=" as *u8); let gn: *u8 = sys_mmap(2); gn[0] = 48 + gain; sys_write(1, gn, 1) 93 cc_puts("\n the loop optimized the suite itself -- searched, proved equivalent,\n" as *u8) 94 cc_puts(" governed, banked the wins; left the optimal kernel alone. no human.\n" as *u8) 95 cc_puts("----------------------------------------------------------------\n" as *u8) 96 97 if absorbed != 4 { sys_exit(1); return 1 } 98 if deferred != 1 { sys_exit(2); return 2 } 99 if gain != 8 { sys_exit(3); return 3 } 100 sys_exit(0); return 0 101}