/ proof-of-concept / toy-instruments
Sign in
proof-of-concept / toy-instruments
toy-instruments / src / sim / worker.ts
32 lines · 1.1 KBCodeBlameHistory
a78afe0Add WebGPU solver with a toggle; faster CPU solverJeremy Magland 2import { simulateGPU } from './gpu';
3import type { BeadSystem, Excitation, SimOptions, SimResult } from './types';
5export interface WorkerRequest {
6 sys: BeadSystem;
7 exc: Excitation;
8 opt: SimOptions;
a78afe0Add WebGPU solver with a toggle; faster CPU solverJeremy Magland 9 gpu: boolean;
a78afe0Add WebGPU solver with a toggle; faster CPU solverJeremy Magland 12self.onmessage = async (ev: MessageEvent<WorkerRequest>) => {
13 const { sys, exc, opt, gpu } = ev.data;
14 const progress = (f: number) => self.postMessage({ type: 'progress', fraction: f });
a78afe0Add WebGPU solver with a toggle; faster CPU solverJeremy Magland 16 let result: SimResult | undefined;
17 let fallback: string | undefined;
18 if (gpu) {
19 try {
20 const r = await simulateGPU(sys, exc, opt, progress);
21 result = { ...r, backend: `WebGPU (${r.device})` };
22 } catch (e) {
23 fallback = (e as Error).message ?? String(e);
24 }
25 }
26 result ??= { ...simulate(sys, exc, opt, progress), backend: 'CPU', fallback };
27 const transfer = [result.audio.buffer, result.frames.buffer, result.frameTimes.buffer, result.energy.buffer, result.balance.buffer];
28 self.postMessage({ type: 'done', result }, { transfer: transfer as ArrayBuffer[] });
30 self.postMessage({ type: 'error', message: String(e) });
31 }
32};
↑↓ move↵openescclose