nx_bigread_test.nx source
↩ module page · 73 lines · 3218 B
1// nx_bigread_test.nx -- isolate the >64MB fault: does sys_read fill a 177MB buffer, and is far access ok?
2// license_tier: ORIGINAL
3import "nx_syscalls.nx"
4import "nx_le.nx"
5import "nx_f32.nx"
6import "nx_strconv.nx"
7
8func brt_emit(fd: i64, key: *u8, kl: i64, v: i64) -> i64 {
9 let line: *u8 = sys_mmap(64)
10 var lo: i64 = 0
11 var i: i64 = 0
12 while i < kl { line[lo] = key[i]; lo = lo + 1; i = i + 1 }
13 line[lo] = 0x3D; lo = lo + 1
14 let dec: *u8 = sys_mmap(32)
15 let nd: i64 = nx_strconv_format_i64(v, dec)
16 var k: i64 = 0
17 while k < nd { line[lo] = dec[k]; lo = lo + 1; k = k + 1 }
18 line[lo] = 0x0A; lo = lo + 1
19 return sys_write(fd, line, lo)
20}
21
22func main() -> i64 {
23 let path: *u8 = "/mnt/c/Users/elder/AppData/Local/Temp/claude/C--Users-elder/7be78b15-304c-449e-afe8-4d5bd7ddaa9c/scratchpad/zblk/qkv_w.f32" as *u8
24 let fd: i64 = sys_openat_rd(path)
25 if fd < 0 { return 30 }
26 let bytes: i64 = 176947200
27 let buf: *u8 = sys_mmap(bytes + 64)
28 let ofd: i64 = sys_openat_wr("/tmp/bigread.txt" as *u8, 0x1a4)
29 brt_emit(ofd, "mmap_ptr_hi" as *u8, 11, (buf as i64) >> 28)
30 var tot: i64 = 0
31 var go: i64 = 1
32 var ncall: i64 = 0
33 while go == 1 {
34 let r: i64 = sys_read(fd, ((buf as i64) + tot) as *u8, bytes - tot)
35 ncall = ncall + 1
36 if r <= 0 { go = 0 } else { tot = tot + r; if tot >= bytes { go = 0 } }
37 }
38 sys_close(fd)
39 brt_emit(ofd, "tot" as *u8, 3, tot)
40 brt_emit(ofd, "ncalls" as *u8, 6, ncall)
41 // probe far offsets, writing the offset BEFORE the access (so a fault leaves the last-attempted marker)
42 brt_emit(ofd, "probe32MB" as *u8, 9, nx_le_read_u32(buf, 33000000))
43 brt_emit(ofd, "probe64MB" as *u8, 9, nx_le_read_u32(buf, 67000000))
44 brt_emit(ofd, "probe100MB" as *u8, 10, nx_le_read_u32(buf, 100000000))
45 brt_emit(ofd, "probe170MB" as *u8, 10, nx_le_read_u32(buf, 170000000))
46 // load out_w too (replicate attention's 2nd large buffer)
47 let fd2: i64 = sys_openat_rd("/mnt/c/Users/elder/AppData/Local/Temp/claude/C--Users-elder/7be78b15-304c-449e-afe8-4d5bd7ddaa9c/scratchpad/zblk/out_w.f32" as *u8)
48 let obytes: i64 = 58982400
49 let obuf: *u8 = sys_mmap(obytes + 64)
50 var otot: i64 = 0
51 var ogo: i64 = 1
52 while ogo == 1 { let r2: i64 = sys_read(fd2, ((obuf as i64) + otot) as *u8, obytes - otot); if r2 <= 0 { ogo = 0 } else { otot = otot + r2; if otot >= obytes { ogo = 0 } } }
53 sys_close(fd2)
54 brt_emit(ofd, "outw_tot" as *u8, 8, otot)
55 brt_emit(ofd, "outw_hi" as *u8, 7, (obuf as i64) >> 28)
56 // qkv-linear repro (t=0, fake input = buf), markers every 2000 o
57 let qkvo: *i64 = sys_mmap(46080 * 8 + 64) as *i64
58 brt_emit(ofd, "lin_start" as *u8, 9, 0)
59 var o: i64 = 0
60 while o < 11520 {
61 var acc: i64 = 0
62 var ii: i64 = 0
63 let wb: i64 = o * 3840 * 4
64 while ii < 3840 { acc = nx_f32_add(acc, nx_f32_mul(nx_le_read_u32(buf, ii * 4), nx_le_read_u32(buf, wb + ii * 4))); ii = ii + 1 }
65 qkvo[o] = acc
66 if (o - (o / 2000) * 2000) == 0 { brt_emit(ofd, "lin_o" as *u8, 5, o) }
67 o = o + 1
68 }
69 brt_emit(ofd, "lin_done" as *u8, 8, o)
70 brt_emit(ofd, "done" as *u8, 4, 1)
71 sys_close(ofd)
72 return 0
73}