concept-collection / math-webgpu-sandbox
math-webgpu-sandbox / scripts / time-examples.ts
31 lines · 1.3 KBBlameHistoryRaw
1/* Time every example on desktop Dawn: npx vite-node scripts/time-examples.ts */
2import { readFileSync, readdirSync } from 'node:fs';
3import { installWebGpu } from './nodeWebGpu.ts';
4import { runScript } from '../src/mgpu/session.ts';
5import { formatFailure } from '../src/mgpu/errors.ts';
7async function main(): Promise<void> {
8 console.log(await installWebGpu());
9 const adapter = await navigator.gpu.requestAdapter();
10 const device = await adapter!.requestDevice({
11 requiredLimits: {
12 maxStorageBufferBindingSize: adapter!.limits.maxStorageBufferBindingSize,
13 maxBufferSize: adapter!.limits.maxBufferSize,
14 },
15 });
16 for (const f of readdirSync('examples').sort()) {
17 if (!f.endsWith('.m')) continue;
18 const source = readFileSync(`examples/${f}`, 'utf8');
19 try {
20 const run = await runScript(device, source);
21 const segs = run.result.segments.map((s) => s.seconds.toFixed(3)).join(', ');
22 console.log(`\n=== ${f} [tic..toc: ${segs} s ยท total ${run.result.totalSeconds.toFixed(3)} s]`);
23 console.log(run.result.output.trimEnd());
24 if (run.result.error) console.log('ERROR:', run.result.error);
25 } catch (e) {
26 console.log(`\n=== ${f} COMPILE FAIL: ${formatFailure(e, source)}`);
27 }
28 }
29 process.exit(0);
31main().catch((e) => { console.error(e); process.exit(1); });