e01ddf1MATLAB-syntax scripts on WebGPU: fused kernels, tic/toc timing, CPU comparisonJeremy Magland 1/* Quick timing sanity: does the sandbox produce sane benchmark numbers? */
2import { installWebGpu } from './nodeWebGpu.ts';
3import { runScript } from '../src/mgpu/session.ts';
5const script = `
6n = 4000000;
7x = rand(n, 1);
8y = zeros(n, 1);
9tic;
10for k = 1:100
11 y = y + 0.1*sin(x + k) .* exp(-x) + x.^2;
12end
13toc
14fprintf('checksum %.4f\\n', mean(y));
16m = 1024;
17A = rand(m, m);
18B = rand(m, m);
19C = A * B;
20tic;
21for k = 1:10
22 C = A * B;
23end
24toc
25fprintf('gemm checksum %.2f\\n', sum(C(:)) / m);
27tic;
28s = 0;
29for k = 1:100
30 s = s + sum(x);
31end
32toc
33fprintf('reduce checksum %.1f\\n', s / 100);
34`;
36async function main(): Promise<void> {
37 console.log(await installWebGpu());
38 const adapter = await navigator.gpu.requestAdapter();
39 const device = await adapter!.requestDevice({
40 requiredLimits: {
41 maxStorageBufferBindingSize: adapter!.limits.maxStorageBufferBindingSize,
42 maxBufferSize: adapter!.limits.maxBufferSize,
43 },
44 });
45 const run = await runScript(device, script);
46 console.log('--- output ---');
47 console.log(run.result.output);
48 console.log('--- plan ---');
49 console.log(run.planDescription.join('\n'));
50 console.log(`compile: ${(run.compileSeconds * 1000).toFixed(1)} ms`);
51 console.log(`total: ${(run.result.totalSeconds * 1000).toFixed(1)} ms`);
52 if (run.result.error) console.log('ERROR:', run.result.error);
53 const flops = (2 * 1024 ** 3 * 10) / 1e9;
54 const gemmSeg = run.result.segments[1];
55 console.log(`gemm: ${(flops / gemmSeg.seconds).toFixed(1)} GFLOP/s over 10 reps`);
56 process.exit(0);
57}
58main().catch((e) => { console.error(e); process.exit(1); });