code wiki / _hdl_build / _gpu_matmul_gate.nx
_gpu_matmul_gate.nx source
↩ module page · 185 lines · 10220 B
1// _gpu_matmul_gate.nx -- GPU 2x2 int8 MATMUL bit-identical CPU-vs-GPU gate (V-RAM-005 / X-DRV-003,
2// the CUDA-moat-escape matmul primitive on the sovereign GPU-class device). Proves:
3// (1) GPU-MATMUL -- the canonical op-list emitter nx_drv_proto_emit, driven by gpu_matmul_virt.spec
4// alone, authors a SPIR-V-gated MATMUL2 driver; the sovereign emu (+ rv64im_min_gpu) runs it:
5// the device computes C=A*B for A=[[1,2],[3,4]] B=[[5,6],[7,8]] -> C=[[19,22],[43,50]], packs the
6// four int8 outputs into RESULTPEEK=0x322b1613, the driver reads it back. Golden "GPUENRINGCMDMM".
7// (2) BIT-IDENTICAL -- the gate computes the SAME 2x2 matmul on the CPU (independent), packs it, and
8// asserts == the value the GPU round-trip verified. CPU lane == GPU lane, MEASURED.
9// (3) INPUT-TAMPER -- bump A00 (1->2) in the spec, re-emit, re-run: the device computes a DIFFERENT C
10// so the RESULTPEEK read-back verify fails -> golden drops (real matmul, not a stuck constant).
11// (4) DISTINCT -- the SAME emitter binary on the DOT8 op-list yields a different golden.
12// HONEST SCOPE: this proves CORRECTNESS (bit-identical) of a small int8 matmul tile on the sovereign
13// emu. The throughput EXCEED vs cuBLAS is a SEPARATE real-RTX-5080 measurement, NOT claimed here.
14//
15// Verdict from a PRINTED marker off a REAL sovereign run; raw bytes read SOVEREIGNLY. NO qemu/gcc.
16// Marker -> knowledge/status/driver_spec.log (GPUMATMULGATE row). license_tier: ORIGINAL
17import "nx_syscalls.nx"
18
19const EMIT_ELF: *u8 = "_offc/nx_drv_proto_emit.elf"
20const SOV_ELF: *u8 = "_offc/_gpu_run.elf"
21
22func q_p(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
23func q_fp(fd: i64, s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(fd,s,n); return 0 }
24func q_fn(fd: i64, v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m}; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48;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{bb[i]=t[k-1-i];i=i+1}; sys_write(fd,bb,k); return 0 }
25
26func q_run1(prog: *u8, a1: *u8, outpath: *u8) -> i64 {
27 let pid: i64 = sys_fork()
28 if pid == 0 {
29 let ofd: i64 = sys_openat_wr(outpath, 0x1a4)
30 if ofd >= 0 { sys_dup3(ofd, 1, 0); sys_dup3(ofd, 2, 0) }
31 let argv: *i64 = sys_mmap(32) as *i64
32 argv[0] = prog as i64
33 argv[1] = a1 as i64
34 argv[2] = 0
35 let envp: *i64 = sys_mmap(16) as *i64
36 envp[0] = "PATH=/usr/bin:/bin" as *u8 as i64; envp[1] = 0
37 sys_execve(prog, argv, envp)
38 sys_exit(127)
39 }
40 let st: *i64 = sys_mmap(16) as *i64
41 sys_wait4(pid, st, 0)
42 let sig: i64 = st[0] & 0x7f
43 if sig != 0 { return 128 + sig }
44 return (st[0] >> 8) & 0xff
45}
46
47func q_read(path: *u8, buf: *u8, cap: i64) -> i64 {
48 let fd: i64 = sys_openat_rd(path)
49 if fd < 0 { return 0 }
50 var n: i64 = 0
51 var go: i64 = 1
52 while go == 1 { let r: i64 = sys_read(fd, (buf as i64 + n) as *u8, cap - 1 - n); if r <= 0 { go = 0 } else { n = n + r } if n >= cap - 1 { go = 0 } }
53 sys_close(fd)
54 return n
55}
56
57func q_buf_has(buf: *u8, n: i64, pat: *u8, pl: i64) -> i64 {
58 if pl <= 0 { return 0 }
59 var i: i64 = 0
60 while i + pl <= n {
61 var k: i64 = 0; var hit: i64 = 1
62 while k < pl { if buf[i+k] != pat[k] { hit = 0; k = pl } else { k = k + 1 } }
63 if hit == 1 { return 1 }
64 i = i + 1
65 }
66 return 0
67}
68
69func q_strlen(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} return n }
70
71func q_streq(a: *u8, b: *u8) -> i64 {
72 var i: i64 = 0
73 while a[i] != (0 as u8) { if a[i] != b[i] { return 0 } i = i + 1 }
74 if b[i] != (0 as u8) { return 0 }
75 return 1
76}
77
78func q_emit_run(spec: *u8, out: *u8, goldout: *u8, gbuf: *u8, gcap: i64, serialpath: *u8) -> i64 {
79 let est: i64 = q_run1(EMIT_ELF, spec, "/tmp/_gpumm_emit.out" as *u8)
80 if est != 0 { return 0 }
81 let gn: i64 = q_read(goldout, gbuf, gcap)
82 if gn <= 0 { return 0 }
83 gbuf[gn] = 0 as u8
84 let rst: i64 = q_run1(SOV_ELF, out, serialpath)
85 let sbuf: *u8 = sys_mmap(65536)
86 let sbn: i64 = q_read(serialpath, sbuf, 65536)
87 let has: i64 = q_buf_has(sbuf, sbn, gbuf, gn)
88 let halt: i64 = q_buf_has(sbuf, sbn, "BOOTSOV verdict=GREEN" as *u8, 21)
89 if rst == 0 { if has == 1 { if halt == 1 { return 1 } } }
90 return 0
91}
92
93func main() -> i64 {
94 q_p("=== GPU 2x2 int8 MATMUL bit-identical gate (V-RAM-005: SPIR-V-gated matmul tile, CPU lane == GPU lane, sovereign emu, no qemu) ===\n" as *u8)
95 let lfd: i64 = sys_openat_append("knowledge/status/driver_spec.log" as *u8, 0x1a4)
96
97 let mm_out: *u8 = "runtime/_hdl_build/_gpu_matmul.bin" as *u8
98 let mm_gold: *u8 = "runtime/_hdl_build/_gpu_matmul.bin.gold" as *u8
99 let dot_gold: *u8 = "runtime/_hdl_build/_gpu_compute.bin.gold" as *u8
100
101 let gM: *u8 = sys_mmap(2048)
102 let gD: *u8 = sys_mmap(2048)
103
104 // ---- (2) CPU reference: the SAME 2x2 int8 matmul, independently, packed the same way ----
105 let A: *i64 = sys_mmap(64) as *i64
106 let B: *i64 = sys_mmap(64) as *i64
107 A[0]=1; A[1]=2; A[2]=3; A[3]=4 // [[1,2],[3,4]] row-major
108 B[0]=5; B[1]=6; B[2]=7; B[3]=8 // [[5,6],[7,8]] row-major
109 let c00: i64 = (A[0]*B[0]) + (A[1]*B[2])
110 let c01: i64 = (A[0]*B[1]) + (A[1]*B[3])
111 let c10: i64 = (A[2]*B[0]) + (A[3]*B[2])
112 let c11: i64 = (A[2]*B[1]) + (A[3]*B[3])
113 let cpu_packed: i64 = (c00 & 0xff) | ((c01 & 0xff) << 8) | ((c10 & 0xff) << 16) | ((c11 & 0xff) << 24)
114 let GPU_EXPECT: i64 = 0x322b1613 // the value the driver's read-back verifies (baked in the spec)
115 var bit_identical: i64 = 0
116 if cpu_packed == GPU_EXPECT { bit_identical = 1 }
117
118 // ---- (1) GPU round-trip: the device computed the matmul, the driver read RESULTPEEK back == expect ----
119 let gpu_ok: i64 = q_emit_run("knowledge/specs/gpu_matmul_virt.spec" as *u8, mm_out, mm_gold, gM, 2048, "/tmp/_gpumm_serial.txt" as *u8)
120
121 // ---- (4) DISTINCT vs the DOT8 op-list (golden only) ----
122 q_run1(EMIT_ELF, "knowledge/specs/gpu_compute_virt.spec" as *u8, "/tmp/_gpumm_dot.out" as *u8)
123 let dgn: i64 = q_read(dot_gold, gD, 2048)
124 if dgn > 0 { gD[dgn] = 0 as u8 }
125 var distinct: i64 = 0
126 if q_strlen(gM) > 0 { if q_strlen(gD) > 0 { if q_streq(gM, gD) == 0 { distinct = 1 } } }
127
128 // ---- (3) INPUT-TAMPER: bump A00 1->2 in the spec (A-word 0x04030201 -> 0x04030202), re-emit, re-run.
129 // C changes -> the RESULTPEEK read-back verify fails -> golden drops. ----
130 let sbuf: *u8 = sys_mmap(8192)
131 let sn: i64 = q_read("knowledge/specs/gpu_matmul_virt.spec" as *u8, sbuf, 8192)
132 let pat: *u8 = "memstore 16 2 0x04030201" as *u8
133 let pl: i64 = q_strlen(pat)
134 var ppos: i64 = 0 - 1
135 var si: i64 = 0
136 while si + pl <= sn {
137 var kk: i64 = 0; var hh: i64 = 1
138 while kk < pl { if sbuf[si+kk] != pat[kk] { hh = 0; kk = pl } else { kk = kk + 1 } }
139 if hh == 1 { ppos = si; si = sn } else { si = si + 1 }
140 }
141 var input_tamper: i64 = 0
142 if ppos >= 0 {
143 sbuf[ppos + pl - 1] = 50 as u8 // last char '1' -> '2' (A00 1 -> 2)
144 let tfd: i64 = sys_openat_wr("/tmp/_gpumm_tamper.spec" as *u8, 0x1a4)
145 if tfd >= 0 { sys_write(tfd, sbuf, sn); sys_close(tfd) }
146 let tet: i64 = q_run1(EMIT_ELF, "/tmp/_gpumm_tamper.spec" as *u8, "/tmp/_gpumm_temit.out" as *u8)
147 let trst: i64 = q_run1(SOV_ELF, mm_out, "/tmp/_gpumm_tserial.txt" as *u8)
148 let tbuf: *u8 = sys_mmap(65536)
149 let tbn: i64 = q_read("/tmp/_gpumm_tserial.txt" as *u8, tbuf, 65536)
150 let drops: i64 = q_buf_has(tbuf, tbn, gM, q_strlen(gM))
151 if tet == 0 { if trst == 0 { if drops == 0 { input_tamper = 1 } } }
152 q_run1(EMIT_ELF, "knowledge/specs/gpu_matmul_virt.spec" as *u8, "/tmp/_gpumm_emit.out" as *u8) // restore
153 }
154
155 q_p(" gpu_matmul=" as *u8)
156 if gpu_ok == 1 { q_p("GREEN(GPU..MM: SPIR-V-gated 2x2 int8 matmul round-trip, clean halt)" as *u8) } else { q_p("RED" as *u8) }
157 q_p(" bit_identical=" as *u8)
158 if bit_identical == 1 { q_p("yes(cpu_packed==gpu_readback==0x" as *u8); q_fn(1, cpu_packed); q_p(")" as *u8) } else { q_p("no" as *u8) }
159 q_p(" input_tamper=" as *u8)
160 if input_tamper == 1 { q_p("rejected(A00 bumped -> C changes -> readback fails -> golden drops)" as *u8) } else { q_p("not-rejected" as *u8) }
161 q_p(" distinct=" as *u8)
162 if distinct == 1 { q_p("yes" as *u8) } else { q_p("no" as *u8) }
163 q_p(" throughput_exceed=OPEN(vs-cuBLAS-needs-real-RTX5080-not-emu)\n" as *u8)
164
165 var pass: i64 = 0
166 if gpu_ok == 1 { if bit_identical == 1 { if input_tamper == 1 { if distinct == 1 { pass = 1 } } } }
167
168 if pass == 1 {
169 q_p("GPUMATMULGATE verdict=GREEN (the canonical op-list emitter authored a SPIR-V-gated 2x2 int8 MATMUL driver; the sovereign GPU device computed C=A*B=[[19,22],[43,50]] and the driver read it back BIT-IDENTICAL to the independent CPU reference; an input tamper changed C and was REJECTED -- real matmul, not a stuck constant. CORRECTNESS of the sovereign GPU int8-matmul lane (V-RAM-005) proven; throughput-vs-cuBLAS = OPEN real-RTX measurement, honestly not claimed)\n" as *u8)
170 if lfd >= 0 {
171 q_fp(lfd, "GPUMATMULGATE verdict=GREEN keystone=gpu-int8-matmul-tile-bit-identical runtime=sovereign-emu device=gpu-class kernel=int8-matmul-2x2 spirv-gated=0x07230203 cpu_packed=gpu_readback=0x" as *u8); q_fn(lfd, cpu_packed)
172 q_fp(lfd, " input_tamper=rejected distinct=yes throughput_exceed=OPEN(vs-cuBLAS-real-RTX) emitter=nx_drv_proto_emit(zero-change) composes=spirv-lane(V-RAM-005) epoch=" as *u8); q_fn(lfd, sys_now_realtime_sec()); q_fp(lfd, "\n" as *u8); sys_close(lfd)
173 }
174 sys_exit(0); return 0
175 }
176 q_p("GPUMATMULGATE verdict=RED (gpu_ok/bit_identical/input_tamper/distinct not all green)\n" as *u8)
177 if lfd >= 0 {
178 q_fp(lfd, "GPUMATMULGATE verdict=RED gpu_ok=" as *u8); q_fn(lfd, gpu_ok)
179 q_fp(lfd, " bit_identical=" as *u8); q_fn(lfd, bit_identical)
180 q_fp(lfd, " input_tamper=" as *u8); q_fn(lfd, input_tamper)
181 q_fp(lfd, " distinct=" as *u8); q_fn(lfd, distinct); q_fp(lfd, "\n" as *u8); sys_close(lfd)
182 }
183 sys_exit(1)
184 return 1
185}