code wiki / (root) / nx_bigread_test.nx

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}