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}