nx_dot_simd_demo.nx
buildroot/runtime/nx_dot_simd_demo.nx
about
nx_dot_simd_demo.nx -- parallel SIMD dot product demo.
dot(a, b) = sum(a[i] * b[i]) for i in 0..N
Three implementations, all bit-exact:
1. scalar: trivial for-loop
2. SIMD: i32x8 vmul + vreduce_sum per chunk; i64 accumulator
3. parallel+SIMD: split chunks across pool workers, each
worker does SIMD inner loop, atomic FAA into shared acc
Composes L7 nx_parallel + L8 SIMD i32x8 into a real ML-class
dot-product kernel.
dependencies 7 imports · 0 importers
imports: nx_kernel_v2.nxnx_log.nxnx_atom.nxnx_clock.nxnx_thread_pool.nxnx_parallel.nxnx_hw.nx
imported by: nobody (leaf or entry point)
call flow from main pre-order; caps 40 nodes / depth 6 declared; ↻ = already shown
structs
| none |
consts
| 28 | const N: i64 = 8192 |
functions
| 31 | func scalar_dot(a_i32: *u8, b_i32: *u8, n: i64) -> i64 called by 1: main |
| 50 | func simd_dot(a_i32: *u8, b_i32: *u8, n: i64) -> i64 called by 1: main |
| 73 | func _set_dot_ctx(a: i64, b: i64, acc: i64, chunk: i64) -> i64 called by 1: main |
| 81 | func _read_dot_a() -> i64 { return DOT_A_PTR } called by 1: simd_dot_worker |
| 82 | func _read_dot_b() -> i64 { return DOT_B_PTR } called by 1: simd_dot_worker |
| 83 | func _read_dot_acc() -> i64 { return DOT_ACC_PTR } called by 1: simd_dot_worker |
| 84 | func _read_dot_chunk() -> i64 { return DOT_CHUNK_SIZE } called by 1: simd_dot_worker |
| 87 | func simd_dot_worker(chunk_idx: i64) -> i64 |
| 110 | func main() -> nx_exit |