code wiki / (root) / nx_simd_x86_test.nx

nx_simd_x86_test.nx source

↩ module page · 49 lines · 1610 B

1// nx_simd_x86_test.nx -- AVX2-subset SIMD smoke (excludes VMUL which 2// requires AVX-512 VPMULLQ; VMUL with --target x86_64 errors LOUD). 3// 4// Same lanewise correctness vs scalar as nx_simd_test.nx but limited 5// to ops AVX2 actually supports. Run on real x86 hardware (or 6// qemu-x86_64 with AVX2 cpu) -- our setup compiles to native x86 + 7// runs directly via wsl bash since we're on x86 Linux/Windows. 8// 9// Note on runtime: nx_simd_test imports nx_kernel_v2 + nx_log which 10// use RISC-V syscall numbers. This bench skips those and uses the 11// x86_64 syscall wrappers directly to keep dependencies minimal. 12 13import "nx_syscalls_x86_64.nx" 14 15const N: i64 = 4096 16 17func main() -> i64 { 18 let a_raw: *u8 = sys_mmap(N * 8) 19 let b_raw: *u8 = sys_mmap(N * 8) 20 let r_raw: *u8 = sys_mmap(N * 8) 21 let a: *i64 = a_raw as *i64 22 let b: *i64 = b_raw as *i64 23 let r: *i64 = r_raw as *i64 24 25 var i: i64 = 0 26 while i < N { a[i] = i * 3; b[i] = i * 7; i = i + 1 } 27 28 // vadd over the whole array in i64x4 chunks. 29 i = 0 30 while i < N { 31 let a_ptr: *i64 = ((a as i64) + i * 8) as *i64 32 let b_ptr: *i64 = ((b as i64) + i * 8) as *i64 33 let r_ptr: *i64 = ((r as i64) + i * 8) as *i64 34 let va: i64 = __simd_vload_i64_x4(a_ptr) 35 let vb: i64 = __simd_vload_i64_x4(b_ptr) 36 let vsum: i64 = __simd_vadd_i64_x4(va, vb) 37 __simd_vstore_i64_x4(vsum, r_ptr) 38 i = i + 4 39 } 40 41 // Verify lanewise. 42 i = 0 43 while i < N { 44 let expected: i64 = a[i] + b[i] 45 if r[i] != expected { return i + 1 } 46 i = i + 1 47 } 48 return 0 49}