Skip to content

feat: add Web Workers for parallel WASM proving#81

Merged
MatteoMer merged 1 commit into
mainfrom
feat/wasm-target
Apr 15, 2026
Merged

feat: add Web Workers for parallel WASM proving#81
MatteoMer merged 1 commit into
mainfrom
feat/wasm-target

Conversation

@MatteoMer

Copy link
Copy Markdown
Owner

Add WasmWorkerPool backed by Web Workers + SharedArrayBuffer, enabling multi-threaded proving in the browser using the same Chase-Lev work-stealing pool as native.

Key changes:

  • WasmWorkerPool: aliases NativeThreadPool methods, adds workerEntry() for JS-spawned workers. Three-way ThreadPool selection: WasmWorkerPool (atomics) / WasmThreadPoolStub (no atomics) / NativeThreadPool (native)
  • WasmFutex: direct memory.atomic.wait32/notify intrinsics bypassing std.Thread.Futex (which requires single_threaded=false, incompatible with std.heap.wasm_allocator)
  • DequeIdx: i32 on wasm32 (atomics limited to 32-bit operands)
  • Build: shared_memory + import_memory flags, TLS exports (__tls_base/__tls_size/__wasm_init_tls) for per-worker TLS
  • zolt_pool single_threaded=false for atomics builds so threadlocal uses __tls_base (not a fixed shared address)
  • C API: zolt_thread_pool_create_wasm, zolt_thread_pool_ptr, zolt_worker_entry
  • Browser demo: prover worker (non-blocking UI), compute workers, two-phase init, COOP/COEP headers for SharedArrayBuffer

Build: zig build -Dtarget=wasm32-freestanding
-Dcpu=generic+atomics+bulk_memory -Doptimize=ReleaseFast

Add WasmWorkerPool backed by Web Workers + SharedArrayBuffer, enabling
multi-threaded proving in the browser using the same Chase-Lev
work-stealing pool as native.

Key changes:
- WasmWorkerPool: aliases NativeThreadPool methods, adds workerEntry()
  for JS-spawned workers. Three-way ThreadPool selection: WasmWorkerPool
  (atomics) / WasmThreadPoolStub (no atomics) / NativeThreadPool (native)
- WasmFutex: direct memory.atomic.wait32/notify intrinsics bypassing
  std.Thread.Futex (which requires single_threaded=false, incompatible
  with std.heap.wasm_allocator)
- DequeIdx: i32 on wasm32 (atomics limited to 32-bit operands)
- Build: shared_memory + import_memory flags, TLS exports
  (__tls_base/__tls_size/__wasm_init_tls) for per-worker TLS
- zolt_pool single_threaded=false for atomics builds so threadlocal
  uses __tls_base (not a fixed shared address)
- C API: zolt_thread_pool_create_wasm, zolt_thread_pool_ptr,
  zolt_worker_entry
- Browser demo: prover worker (non-blocking UI), compute workers,
  two-phase init, COOP/COEP headers for SharedArrayBuffer

Build: zig build -Dtarget=wasm32-freestanding \
  -Dcpu=generic+atomics+bulk_memory -Doptimize=ReleaseFast

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@MatteoMer MatteoMer merged commit 43084e8 into main Apr 15, 2026
17 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant