code wiki / (root) / nx_dot_simd_demo.nx

nx_dot_simd_demo.nx

buildroot/runtime/nx_dot_simd_demo.nx

5827 B165 linesdepth 8pulls 17 transitivereach 0 importersview sourcekind sketch/demo
docsdependenciesstructsconstsfunctions

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

nx_kernel_v2.nx nx_log.nx nx_atom.nx nx_clock.nx nx_thread_pool.nx nx_parallel.nx nx_hw.nx nx_dot_simd_demo.nx

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

main println sys_write strlen sys_mmap nxa_die sys_write ↻ sys_exit nxa_lock_take nxa_lock_addr sys_write ↻ nxa_lock_give nxa_lock_addr ↻ nxa_report_overrun sys_write ↻ nxa_dump_printable sys_write ↻ nxa_dump_sizes sys_write ↻ nx_clock_monotonic_ns sys_mmap ↻ sys_clock_gettime_mono scalar_dot simd_dot nx_hw_worker_count nx_hw_cpu_count sys_mmap ↻ sys_munmap nx_pool_new nx_hw_worker_count ↻ sys_mmap ↻ nx_chan_new sys_mmap ↻ _nx_chan_cell sys_thread_create nx_thread_spawn sys_mmap ↻ nx_thread_spawn_fn sys_mmap ↻ _set_dot_ctx

structs

none

consts

28const N: i64 = 8192

functions

31func scalar_dot(a_i32: *u8, b_i32: *u8, n: i64) -> i64
called by 1: main
50func simd_dot(a_i32: *u8, b_i32: *u8, n: i64) -> i64
called by 1: main
73func _set_dot_ctx(a: i64, b: i64, acc: i64, chunk: i64) -> i64
called by 1: main
81func _read_dot_a() -> i64 { return DOT_A_PTR }
called by 1: simd_dot_worker
82func _read_dot_b() -> i64 { return DOT_B_PTR }
called by 1: simd_dot_worker
83func _read_dot_acc() -> i64 { return DOT_ACC_PTR }
called by 1: simd_dot_worker
84func _read_dot_chunk() -> i64 { return DOT_CHUNK_SIZE }
called by 1: simd_dot_worker
87func simd_dot_worker(chunk_idx: i64) -> i64
110func main() -> nx_exit