1import type { MatmulResult } from './types'
3// Dedicated classic worker for the pthread-capable WASM modules (threaded
4// custom C, libFLAME/BLIS st + mt). It's a classic worker served verbatim
5// from public/matmul/ (see worker.js for why it can't be a Vite module
6// worker). Resolve it relative to the deployed base.
7const WORKER_URL = new URL(
8 `${import.meta.env.BASE_URL}matmul/worker.js`,
9 window.location.href,
10)
12let worker: Worker | null = null
13let nextId = 0
14const pending = new Map<number, { resolve: (r: MatmulResult) => void; reject: (e: Error) => void }>()
16function getWorker(): Worker {
17 if (!worker) {
18 worker = new Worker(WORKER_URL) // classic worker (no { type: 'module' })
19 worker.onmessage = (e: MessageEvent<{ id: number; ms?: number; sample?: number; error?: string }>) => {
20 const p = pending.get(e.data.id)
21 if (!p) return
22 pending.delete(e.data.id)
23 if (e.data.error) p.reject(new Error(e.data.error))
24 else p.resolve({ ms: e.data.ms!, sample: e.data.sample! })
25 }
26 }
27 return worker
28}
30export function runInThreadedWorker(
31 kind: string,
32 n: number,
33 seedA: number,
34 seedB: number,
35 threads: number,
36): Promise<MatmulResult> {
37 const w = getWorker()
38 const id = nextId++
39 return new Promise((resolve, reject) => {
40 pending.set(id, { resolve, reject })
41 w.postMessage({ id, kind, n, seedA, seedB, threads })
42 })
43}