1import type { MatmulResult } from './types'
2import type { WorkerRequest, WorkerResponse } from './benchWorker'
4let worker: Worker | null = null
5let nextId = 0
6const pending = new Map<number, { resolve: (r: MatmulResult) => void; reject: (e: Error) => void }>()
8function getWorker(): Worker {
9 if (!worker) {
10 worker = new Worker(new URL('./benchWorker.ts', import.meta.url), { type: 'module' })
11 worker.onmessage = (e: MessageEvent<WorkerResponse>) => {
12 const p = pending.get(e.data.id)
13 if (!p) return
14 pending.delete(e.data.id)
15 if ('error' in e.data) p.reject(new Error(e.data.error))
16 else p.resolve({ ms: e.data.ms, sample: e.data.sample })
17 }
18 }
19 return worker
20}
22export function runInWorker(methodId: string, n: number, seedA: number, seedB: number): Promise<MatmulResult> {
23 const w = getWorker()
24 const id = nextId++
25 return new Promise((resolve, reject) => {
26 pending.set(id, { resolve, reject })
27 w.postMessage({ id, methodId, n, seedA, seedB } satisfies WorkerRequest)
28 })
29}