webgpu-bench 0.1.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -4
- package/dist/benchmarks/common.d.ts +6 -8
- package/dist/benchmarks/common.d.ts.map +1 -1
- package/dist/benchmarks/common.js +0 -8
- package/dist/benchmarks/common.js.map +1 -1
- package/dist/benchmarks/flopsCommon.d.ts +0 -9
- package/dist/benchmarks/flopsCommon.d.ts.map +1 -1
- package/dist/benchmarks/flopsCommon.js +1 -5
- package/dist/benchmarks/flopsCommon.js.map +1 -1
- package/dist/benchmarks/flopsConvert.d.ts +7 -6
- package/dist/benchmarks/flopsConvert.d.ts.map +1 -1
- package/dist/benchmarks/flopsConvert.js +10 -30
- package/dist/benchmarks/flopsConvert.js.map +1 -1
- package/dist/benchmarks/flopsF16.d.ts +1 -1
- package/dist/benchmarks/flopsF16.d.ts.map +1 -1
- package/dist/benchmarks/flopsF16.js +3 -11
- package/dist/benchmarks/flopsF16.js.map +1 -1
- package/dist/benchmarks/flopsF32.d.ts +1 -1
- package/dist/benchmarks/flopsF32.d.ts.map +1 -1
- package/dist/benchmarks/flopsF32.js +3 -11
- package/dist/benchmarks/flopsF32.js.map +1 -1
- package/dist/benchmarks/flopsI8.d.ts +2 -2
- package/dist/benchmarks/flopsI8.d.ts.map +1 -1
- package/dist/benchmarks/flopsI8.js +6 -25
- package/dist/benchmarks/flopsI8.js.map +1 -1
- package/dist/benchmarks/flopsMath.d.ts.map +1 -1
- package/dist/benchmarks/flopsMath.js +0 -16
- package/dist/benchmarks/flopsMath.js.map +1 -1
- package/dist/benchmarks/streamBandwidth.d.ts +6 -5
- package/dist/benchmarks/streamBandwidth.d.ts.map +1 -1
- package/dist/benchmarks/streamBandwidth.js +30 -21
- package/dist/benchmarks/streamBandwidth.js.map +1 -1
- package/dist/catalog.d.ts +18 -7
- package/dist/catalog.d.ts.map +1 -1
- package/dist/catalog.js +235 -32
- package/dist/catalog.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/shaders/flopsF16Vec4.d.ts +5 -4
- package/dist/shaders/flopsF16Vec4.d.ts.map +1 -1
- package/dist/shaders/flopsF16Vec4.js +46 -6
- package/dist/shaders/flopsF16Vec4.js.map +1 -1
- package/dist/shaders/flopsF32Div.d.ts +6 -3
- package/dist/shaders/flopsF32Div.d.ts.map +1 -1
- package/dist/shaders/flopsF32Div.js +37 -34
- package/dist/shaders/flopsF32Div.js.map +1 -1
- package/dist/shaders/flopsF32F16Convert.d.ts +3 -3
- package/dist/shaders/flopsF32F16Convert.js +3 -3
- package/dist/shaders/flopsF32Vec4.d.ts +8 -6
- package/dist/shaders/flopsF32Vec4.d.ts.map +1 -1
- package/dist/shaders/flopsF32Vec4.js +49 -8
- package/dist/shaders/flopsF32Vec4.js.map +1 -1
- package/dist/shaders/flopsI32Div.d.ts +5 -3
- package/dist/shaders/flopsI32Div.d.ts.map +1 -1
- package/dist/shaders/flopsI32Div.js +37 -35
- package/dist/shaders/flopsI32Div.js.map +1 -1
- package/dist/shaders/flopsI32F32Convert.d.ts +2 -2
- package/dist/shaders/flopsI32F32Convert.js +2 -2
- package/dist/shaders/flopsI8Dp4a.d.ts +8 -5
- package/dist/shaders/flopsI8Dp4a.d.ts.map +1 -1
- package/dist/shaders/flopsI8Dp4a.js +40 -9
- package/dist/shaders/flopsI8Dp4a.js.map +1 -1
- package/dist/shaders/flopsI8Vec4.d.ts +4 -4
- package/dist/shaders/flopsI8Vec4.d.ts.map +1 -1
- package/dist/shaders/flopsI8Vec4.js +45 -6
- package/dist/shaders/flopsI8Vec4.js.map +1 -1
- package/dist/shaders/flopsU32PackUnpack.d.ts +10 -8
- package/dist/shaders/flopsU32PackUnpack.d.ts.map +1 -1
- package/dist/shaders/flopsU32PackUnpack.js +49 -23
- package/dist/shaders/flopsU32PackUnpack.js.map +1 -1
- package/dist/shaders/streamRead.d.ts +9 -7
- package/dist/shaders/streamRead.d.ts.map +1 -1
- package/dist/shaders/streamRead.js +15 -17
- package/dist/shaders/streamRead.js.map +1 -1
- package/dist/shaders/streamWrite.d.ts +4 -5
- package/dist/shaders/streamWrite.d.ts.map +1 -1
- package/dist/shaders/streamWrite.js +10 -15
- package/dist/shaders/streamWrite.js.map +1 -1
- package/dist/suite.d.ts.map +1 -1
- package/dist/suite.js +2 -7
- package/dist/suite.js.map +1 -1
- package/dist/types.d.ts +5 -6
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -2,14 +2,17 @@
|
|
|
2
2
|
* int8 packed-dot-product FLOPS probe: uses the `packed_4x8_integer_dot_product`
|
|
3
3
|
* extension's `dot4I8Packed` builtin directly (two u32s, each four packed
|
|
4
4
|
* signed int8 lanes, one instruction) in a tight accumulation loop, to
|
|
5
|
-
* isolate the instruction's peak throughput.
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* isolate the instruction's peak throughput. Eight independent accumulators
|
|
6
|
+
* per thread so the number is throughput, not the latency of one dependent
|
|
7
|
+
* chain. Each `a` is fed back from its own running accumulator every
|
|
8
|
+
* iteration (not just `idx`-derived and fixed), so `dot4I8Packed(a, b)` is
|
|
9
|
+
* genuinely loop-carried — a compiler that
|
|
8
10
|
* noticed `a`/`b` were loop-invariant could otherwise hoist the call out of
|
|
9
11
|
* the loop and replace all `iterations` of it with one call + a multiply,
|
|
10
12
|
* which is exactly what happened before this fix (the loop collapsed to
|
|
11
13
|
* ~free, and the dispatch finished faster than the timestamp-query clock's
|
|
12
|
-
* resolution, reading back as a literal 0ns elapsed).
|
|
14
|
+
* resolution, reading back as a literal 0ns elapsed). 8 dots x 4 MACs =
|
|
15
|
+
* 64 ops per loop iteration.
|
|
13
16
|
*
|
|
14
17
|
* `packed_4x8_integer_dot_product` is a WGSL *language extension* (gated by
|
|
15
18
|
* `navigator.gpu.wgslLanguageFeatures`, checked as `ctx.info.supportsI8Dot`
|
|
@@ -37,13 +40,41 @@ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
|
|
|
37
40
|
return;
|
|
38
41
|
}
|
|
39
42
|
let b: u32 = 0x05060708u ^ (idx * 0x85ebca6bu);
|
|
40
|
-
var
|
|
41
|
-
var
|
|
43
|
+
var a0: u32 = 0x01020300u ^ (idx * 0x9e3779b1u);
|
|
44
|
+
var acc0: i32 = i32(idx & 255u) + 0;
|
|
45
|
+
var a1: u32 = 0x01020301u ^ (idx * 0x9e3779b1u);
|
|
46
|
+
var acc1: i32 = i32(idx & 255u) + 1;
|
|
47
|
+
var a2: u32 = 0x01020302u ^ (idx * 0x9e3779b1u);
|
|
48
|
+
var acc2: i32 = i32(idx & 255u) + 2;
|
|
49
|
+
var a3: u32 = 0x01020303u ^ (idx * 0x9e3779b1u);
|
|
50
|
+
var acc3: i32 = i32(idx & 255u) + 3;
|
|
51
|
+
var a4: u32 = 0x01020304u ^ (idx * 0x9e3779b1u);
|
|
52
|
+
var acc4: i32 = i32(idx & 255u) + 4;
|
|
53
|
+
var a5: u32 = 0x01020305u ^ (idx * 0x9e3779b1u);
|
|
54
|
+
var acc5: i32 = i32(idx & 255u) + 5;
|
|
55
|
+
var a6: u32 = 0x01020306u ^ (idx * 0x9e3779b1u);
|
|
56
|
+
var acc6: i32 = i32(idx & 255u) + 6;
|
|
57
|
+
var a7: u32 = 0x01020307u ^ (idx * 0x9e3779b1u);
|
|
58
|
+
var acc7: i32 = i32(idx & 255u) + 7;
|
|
42
59
|
for (var i: u32 = 0u; i < params.iterations; i = i + 1u) {
|
|
43
|
-
|
|
44
|
-
|
|
60
|
+
acc0 = acc0 + dot4I8Packed(a0, b);
|
|
61
|
+
a0 = a0 ^ u32(acc0);
|
|
62
|
+
acc1 = acc1 + dot4I8Packed(a1, b);
|
|
63
|
+
a1 = a1 ^ u32(acc1);
|
|
64
|
+
acc2 = acc2 + dot4I8Packed(a2, b);
|
|
65
|
+
a2 = a2 ^ u32(acc2);
|
|
66
|
+
acc3 = acc3 + dot4I8Packed(a3, b);
|
|
67
|
+
a3 = a3 ^ u32(acc3);
|
|
68
|
+
acc4 = acc4 + dot4I8Packed(a4, b);
|
|
69
|
+
a4 = a4 ^ u32(acc4);
|
|
70
|
+
acc5 = acc5 + dot4I8Packed(a5, b);
|
|
71
|
+
a5 = a5 ^ u32(acc5);
|
|
72
|
+
acc6 = acc6 + dot4I8Packed(a6, b);
|
|
73
|
+
a6 = a6 ^ u32(acc6);
|
|
74
|
+
acc7 = acc7 + dot4I8Packed(a7, b);
|
|
75
|
+
a7 = a7 ^ u32(acc7);
|
|
45
76
|
}
|
|
46
|
-
out[idx] = f32(
|
|
77
|
+
out[idx] = f32(acc0 + acc1 + acc2 + acc3 + acc4 + acc5 + acc6 + acc7);
|
|
47
78
|
}
|
|
48
79
|
`;
|
|
49
80
|
//# sourceMappingURL=flopsI8Dp4a.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flopsI8Dp4a.js","sourceRoot":"","sources":["../../src/shaders/flopsI8Dp4a.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"flopsI8Dp4a.js","sourceRoot":"","sources":["../../src/shaders/flopsI8Dp4a.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsDzC,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* int8-range vec4
|
|
3
|
-
* `vec4
|
|
4
|
-
*
|
|
2
|
+
* int8-range vec4 ops probe — {@link flopsF32Vec4Wgsl}'s eight independent,
|
|
3
|
+
* 4x-unrolled `vec4` multiply-add chains, on `vec4<i32>`. Overflow wraps, so
|
|
4
|
+
* the chains stay bounded. 256 integer ops per loop iteration.
|
|
5
5
|
*/
|
|
6
|
-
export declare const flopsI8Vec4Wgsl = "\nstruct Params {\n threads: u32,\n iterations: u32,\n};\n\n@group(0) @binding(0) var<uniform> params: Params;\n@group(0) @binding(1) var<storage, read_write> out: array<f32>;\n\n@compute @workgroup_size(64)\nfn main(@builtin(global_invocation_id) gid: vec3<u32>) {\n let idx = gid.x;\n if (idx >= params.threads) {\n return;\n }\n let s: i32 = i32(idx & 15u);\n let a: vec4<i32> = vec4<i32>(3 + s, 5 + s, 7 + s, 9 + s);\n let b: vec4<i32> = vec4<i32>(11 - s, 13 - s, 17 - s, 19 - s);\n var
|
|
6
|
+
export declare const flopsI8Vec4Wgsl = "\nstruct Params {\n threads: u32,\n iterations: u32,\n};\n\n@group(0) @binding(0) var<uniform> params: Params;\n@group(0) @binding(1) var<storage, read_write> out: array<f32>;\n\n@compute @workgroup_size(64)\nfn main(@builtin(global_invocation_id) gid: vec3<u32>) {\n let idx = gid.x;\n if (idx >= params.threads) {\n return;\n }\n let s: i32 = i32(idx & 15u);\n let a: vec4<i32> = vec4<i32>(3 + s, 5 + s, 7 + s, 9 + s);\n let b: vec4<i32> = vec4<i32>(11 - s, 13 - s, 17 - s, 19 - s);\n var x0: vec4<i32> = vec4<i32>(i32(idx & 255u) + 1);\n var x1: vec4<i32> = vec4<i32>(i32(idx & 255u) + 2);\n var x2: vec4<i32> = vec4<i32>(i32(idx & 255u) + 3);\n var x3: vec4<i32> = vec4<i32>(i32(idx & 255u) + 4);\n var x4: vec4<i32> = vec4<i32>(i32(idx & 255u) + 5);\n var x5: vec4<i32> = vec4<i32>(i32(idx & 255u) + 6);\n var x6: vec4<i32> = vec4<i32>(i32(idx & 255u) + 7);\n var x7: vec4<i32> = vec4<i32>(i32(idx & 255u) + 8);\n for (var i: u32 = 0u; i < params.iterations; i = i + 1u) {\n x0 = x0 * a + b;\n x1 = x1 * a + b;\n x2 = x2 * a + b;\n x3 = x3 * a + b;\n x4 = x4 * a + b;\n x5 = x5 * a + b;\n x6 = x6 * a + b;\n x7 = x7 * a + b;\n x0 = x0 * a + b;\n x1 = x1 * a + b;\n x2 = x2 * a + b;\n x3 = x3 * a + b;\n x4 = x4 * a + b;\n x5 = x5 * a + b;\n x6 = x6 * a + b;\n x7 = x7 * a + b;\n x0 = x0 * a + b;\n x1 = x1 * a + b;\n x2 = x2 * a + b;\n x3 = x3 * a + b;\n x4 = x4 * a + b;\n x5 = x5 * a + b;\n x6 = x6 * a + b;\n x7 = x7 * a + b;\n x0 = x0 * a + b;\n x1 = x1 * a + b;\n x2 = x2 * a + b;\n x3 = x3 * a + b;\n x4 = x4 * a + b;\n x5 = x5 * a + b;\n x6 = x6 * a + b;\n x7 = x7 * a + b;\n }\n let t = x0 + x1 + x2 + x3 + x4 + x5 + x6 + x7;\n out[idx] = f32(t.x + t.y + t.z + t.w);\n}\n";
|
|
7
7
|
//# sourceMappingURL=flopsI8Vec4.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flopsI8Vec4.d.ts","sourceRoot":"","sources":["../../src/shaders/flopsI8Vec4.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,eAAe,
|
|
1
|
+
{"version":3,"file":"flopsI8Vec4.d.ts","sourceRoot":"","sources":["../../src/shaders/flopsI8Vec4.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,eAAe,gxDA+D3B,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* int8-range vec4
|
|
3
|
-
* `vec4
|
|
4
|
-
*
|
|
2
|
+
* int8-range vec4 ops probe — {@link flopsF32Vec4Wgsl}'s eight independent,
|
|
3
|
+
* 4x-unrolled `vec4` multiply-add chains, on `vec4<i32>`. Overflow wraps, so
|
|
4
|
+
* the chains stay bounded. 256 integer ops per loop iteration.
|
|
5
5
|
*/
|
|
6
6
|
export const flopsI8Vec4Wgsl = /* wgsl */ `
|
|
7
7
|
struct Params {
|
|
@@ -21,11 +21,50 @@ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
|
|
|
21
21
|
let s: i32 = i32(idx & 15u);
|
|
22
22
|
let a: vec4<i32> = vec4<i32>(3 + s, 5 + s, 7 + s, 9 + s);
|
|
23
23
|
let b: vec4<i32> = vec4<i32>(11 - s, 13 - s, 17 - s, 19 - s);
|
|
24
|
-
var
|
|
24
|
+
var x0: vec4<i32> = vec4<i32>(i32(idx & 255u) + 1);
|
|
25
|
+
var x1: vec4<i32> = vec4<i32>(i32(idx & 255u) + 2);
|
|
26
|
+
var x2: vec4<i32> = vec4<i32>(i32(idx & 255u) + 3);
|
|
27
|
+
var x3: vec4<i32> = vec4<i32>(i32(idx & 255u) + 4);
|
|
28
|
+
var x4: vec4<i32> = vec4<i32>(i32(idx & 255u) + 5);
|
|
29
|
+
var x5: vec4<i32> = vec4<i32>(i32(idx & 255u) + 6);
|
|
30
|
+
var x6: vec4<i32> = vec4<i32>(i32(idx & 255u) + 7);
|
|
31
|
+
var x7: vec4<i32> = vec4<i32>(i32(idx & 255u) + 8);
|
|
25
32
|
for (var i: u32 = 0u; i < params.iterations; i = i + 1u) {
|
|
26
|
-
|
|
33
|
+
x0 = x0 * a + b;
|
|
34
|
+
x1 = x1 * a + b;
|
|
35
|
+
x2 = x2 * a + b;
|
|
36
|
+
x3 = x3 * a + b;
|
|
37
|
+
x4 = x4 * a + b;
|
|
38
|
+
x5 = x5 * a + b;
|
|
39
|
+
x6 = x6 * a + b;
|
|
40
|
+
x7 = x7 * a + b;
|
|
41
|
+
x0 = x0 * a + b;
|
|
42
|
+
x1 = x1 * a + b;
|
|
43
|
+
x2 = x2 * a + b;
|
|
44
|
+
x3 = x3 * a + b;
|
|
45
|
+
x4 = x4 * a + b;
|
|
46
|
+
x5 = x5 * a + b;
|
|
47
|
+
x6 = x6 * a + b;
|
|
48
|
+
x7 = x7 * a + b;
|
|
49
|
+
x0 = x0 * a + b;
|
|
50
|
+
x1 = x1 * a + b;
|
|
51
|
+
x2 = x2 * a + b;
|
|
52
|
+
x3 = x3 * a + b;
|
|
53
|
+
x4 = x4 * a + b;
|
|
54
|
+
x5 = x5 * a + b;
|
|
55
|
+
x6 = x6 * a + b;
|
|
56
|
+
x7 = x7 * a + b;
|
|
57
|
+
x0 = x0 * a + b;
|
|
58
|
+
x1 = x1 * a + b;
|
|
59
|
+
x2 = x2 * a + b;
|
|
60
|
+
x3 = x3 * a + b;
|
|
61
|
+
x4 = x4 * a + b;
|
|
62
|
+
x5 = x5 * a + b;
|
|
63
|
+
x6 = x6 * a + b;
|
|
64
|
+
x7 = x7 * a + b;
|
|
27
65
|
}
|
|
28
|
-
|
|
66
|
+
let t = x0 + x1 + x2 + x3 + x4 + x5 + x6 + x7;
|
|
67
|
+
out[idx] = f32(t.x + t.y + t.z + t.w);
|
|
29
68
|
}
|
|
30
69
|
`;
|
|
31
70
|
//# sourceMappingURL=flopsI8Vec4.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flopsI8Vec4.js","sourceRoot":"","sources":["../../src/shaders/flopsI8Vec4.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAC
|
|
1
|
+
{"version":3,"file":"flopsI8Vec4.js","sourceRoot":"","sources":["../../src/shaders/flopsI8Vec4.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+DzC,CAAC"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Manual byte pack/unpack
|
|
3
|
-
* the shift+mask bit-twiddling those builtins compile to
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
2
|
+
* Manual byte pack/unpack probe: no `pack4x*` (or `unpack4x*`) builtin, just
|
|
3
|
+
* the shift+mask bit-twiddling those builtins compile to. Eight independent
|
|
4
|
+
* u32 lanes, unrolled 4x; each step unpacks 4 bytes, increments each, and
|
|
5
|
+
* repacks. Written with no redundant ops (the top byte needs no mask after
|
|
6
|
+
* `>> 24u`, and `<< 24u` discards the bits a mask would) so the source is as
|
|
7
|
+
* close as possible to what executes — but the compiler is still free to
|
|
8
|
+
* reassociate shifts and masks, so each lane step counts as 2 ops (one
|
|
9
|
+
* unpack + one pack of a whole u32), not an instruction count. 64 ops per
|
|
10
|
+
* loop iteration.
|
|
9
11
|
*/
|
|
10
|
-
export declare const flopsU32PackUnpackWgsl = "\nstruct Params {\n threads: u32,\n iterations: u32,\n};\n\n@group(0) @binding(0) var<uniform> params: Params;\n@group(0) @binding(1) var<storage, read_write> out: array<f32>;\n\nfn
|
|
12
|
+
export declare const flopsU32PackUnpackWgsl = "\nstruct Params {\n threads: u32,\n iterations: u32,\n};\n\n@group(0) @binding(0) var<uniform> params: Params;\n@group(0) @binding(1) var<storage, read_write> out: array<f32>;\n\n// Unpack 4 bytes, add 1 to each (wrapping), repack.\nfn step(v: u32) -> u32 {\n let b0 = (v & 0xFFu) + 1u;\n let b1 = ((v >> 8u) & 0xFFu) + 1u;\n let b2 = ((v >> 16u) & 0xFFu) + 1u;\n let b3 = (v >> 24u) + 1u;\n return (b0 & 0xFFu) | ((b1 & 0xFFu) << 8u) | ((b2 & 0xFFu) << 16u) | (b3 << 24u);\n}\n\n@compute @workgroup_size(64)\nfn main(@builtin(global_invocation_id) gid: vec3<u32>) {\n let idx = gid.x;\n if (idx >= params.threads) {\n return;\n }\n var v0: u32 = (idx + 0u) * 2654435761u;\n var v1: u32 = (idx + 1u) * 2654435761u;\n var v2: u32 = (idx + 2u) * 2654435761u;\n var v3: u32 = (idx + 3u) * 2654435761u;\n var v4: u32 = (idx + 4u) * 2654435761u;\n var v5: u32 = (idx + 5u) * 2654435761u;\n var v6: u32 = (idx + 6u) * 2654435761u;\n var v7: u32 = (idx + 7u) * 2654435761u;\n for (var i: u32 = 0u; i < params.iterations; i = i + 1u) {\n v0 = step(v0);\n v1 = step(v1);\n v2 = step(v2);\n v3 = step(v3);\n v4 = step(v4);\n v5 = step(v5);\n v6 = step(v6);\n v7 = step(v7);\n v0 = step(v0);\n v1 = step(v1);\n v2 = step(v2);\n v3 = step(v3);\n v4 = step(v4);\n v5 = step(v5);\n v6 = step(v6);\n v7 = step(v7);\n v0 = step(v0);\n v1 = step(v1);\n v2 = step(v2);\n v3 = step(v3);\n v4 = step(v4);\n v5 = step(v5);\n v6 = step(v6);\n v7 = step(v7);\n v0 = step(v0);\n v1 = step(v1);\n v2 = step(v2);\n v3 = step(v3);\n v4 = step(v4);\n v5 = step(v5);\n v6 = step(v6);\n v7 = step(v7);\n }\n out[idx] = f32(v0 ^ v1 ^ v2 ^ v3 ^ v4 ^ v5 ^ v6 ^ v7);\n}\n";
|
|
11
13
|
//# sourceMappingURL=flopsU32PackUnpack.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flopsU32PackUnpack.d.ts","sourceRoot":"","sources":["../../src/shaders/flopsU32PackUnpack.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"flopsU32PackUnpack.d.ts","sourceRoot":"","sources":["../../src/shaders/flopsU32PackUnpack.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,sBAAsB,kuDAoElC,CAAC"}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Manual byte pack/unpack
|
|
3
|
-
* the shift+mask bit-twiddling those builtins compile to
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
2
|
+
* Manual byte pack/unpack probe: no `pack4x*` (or `unpack4x*`) builtin, just
|
|
3
|
+
* the shift+mask bit-twiddling those builtins compile to. Eight independent
|
|
4
|
+
* u32 lanes, unrolled 4x; each step unpacks 4 bytes, increments each, and
|
|
5
|
+
* repacks. Written with no redundant ops (the top byte needs no mask after
|
|
6
|
+
* `>> 24u`, and `<< 24u` discards the bits a mask would) so the source is as
|
|
7
|
+
* close as possible to what executes — but the compiler is still free to
|
|
8
|
+
* reassociate shifts and masks, so each lane step counts as 2 ops (one
|
|
9
|
+
* unpack + one pack of a whole u32), not an instruction count. 64 ops per
|
|
10
|
+
* loop iteration.
|
|
9
11
|
*/
|
|
10
12
|
export const flopsU32PackUnpackWgsl = /* wgsl */ `
|
|
11
13
|
struct Params {
|
|
@@ -16,12 +18,13 @@ struct Params {
|
|
|
16
18
|
@group(0) @binding(0) var<uniform> params: Params;
|
|
17
19
|
@group(0) @binding(1) var<storage, read_write> out: array<f32>;
|
|
18
20
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
// Unpack 4 bytes, add 1 to each (wrapping), repack.
|
|
22
|
+
fn step(v: u32) -> u32 {
|
|
23
|
+
let b0 = (v & 0xFFu) + 1u;
|
|
24
|
+
let b1 = ((v >> 8u) & 0xFFu) + 1u;
|
|
25
|
+
let b2 = ((v >> 16u) & 0xFFu) + 1u;
|
|
26
|
+
let b3 = (v >> 24u) + 1u;
|
|
27
|
+
return (b0 & 0xFFu) | ((b1 & 0xFFu) << 8u) | ((b2 & 0xFFu) << 16u) | (b3 << 24u);
|
|
25
28
|
}
|
|
26
29
|
|
|
27
30
|
@compute @workgroup_size(64)
|
|
@@ -30,7 +33,7 @@ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
|
|
|
30
33
|
if (idx >= params.threads) {
|
|
31
34
|
return;
|
|
32
35
|
}
|
|
33
|
-
var v0: u32 = idx * 2654435761u;
|
|
36
|
+
var v0: u32 = (idx + 0u) * 2654435761u;
|
|
34
37
|
var v1: u32 = (idx + 1u) * 2654435761u;
|
|
35
38
|
var v2: u32 = (idx + 2u) * 2654435761u;
|
|
36
39
|
var v3: u32 = (idx + 3u) * 2654435761u;
|
|
@@ -38,16 +41,39 @@ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
|
|
|
38
41
|
var v5: u32 = (idx + 5u) * 2654435761u;
|
|
39
42
|
var v6: u32 = (idx + 6u) * 2654435761u;
|
|
40
43
|
var v7: u32 = (idx + 7u) * 2654435761u;
|
|
41
|
-
let one = vec4<u32>(1u);
|
|
42
44
|
for (var i: u32 = 0u; i < params.iterations; i = i + 1u) {
|
|
43
|
-
v0 =
|
|
44
|
-
v1 =
|
|
45
|
-
v2 =
|
|
46
|
-
v3 =
|
|
47
|
-
v4 =
|
|
48
|
-
v5 =
|
|
49
|
-
v6 =
|
|
50
|
-
v7 =
|
|
45
|
+
v0 = step(v0);
|
|
46
|
+
v1 = step(v1);
|
|
47
|
+
v2 = step(v2);
|
|
48
|
+
v3 = step(v3);
|
|
49
|
+
v4 = step(v4);
|
|
50
|
+
v5 = step(v5);
|
|
51
|
+
v6 = step(v6);
|
|
52
|
+
v7 = step(v7);
|
|
53
|
+
v0 = step(v0);
|
|
54
|
+
v1 = step(v1);
|
|
55
|
+
v2 = step(v2);
|
|
56
|
+
v3 = step(v3);
|
|
57
|
+
v4 = step(v4);
|
|
58
|
+
v5 = step(v5);
|
|
59
|
+
v6 = step(v6);
|
|
60
|
+
v7 = step(v7);
|
|
61
|
+
v0 = step(v0);
|
|
62
|
+
v1 = step(v1);
|
|
63
|
+
v2 = step(v2);
|
|
64
|
+
v3 = step(v3);
|
|
65
|
+
v4 = step(v4);
|
|
66
|
+
v5 = step(v5);
|
|
67
|
+
v6 = step(v6);
|
|
68
|
+
v7 = step(v7);
|
|
69
|
+
v0 = step(v0);
|
|
70
|
+
v1 = step(v1);
|
|
71
|
+
v2 = step(v2);
|
|
72
|
+
v3 = step(v3);
|
|
73
|
+
v4 = step(v4);
|
|
74
|
+
v5 = step(v5);
|
|
75
|
+
v6 = step(v6);
|
|
76
|
+
v7 = step(v7);
|
|
51
77
|
}
|
|
52
78
|
out[idx] = f32(v0 ^ v1 ^ v2 ^ v3 ^ v4 ^ v5 ^ v6 ^ v7);
|
|
53
79
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flopsU32PackUnpack.js","sourceRoot":"","sources":["../../src/shaders/flopsU32PackUnpack.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"flopsU32PackUnpack.js","sourceRoot":"","sources":["../../src/shaders/flopsU32PackUnpack.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoEhD,CAAC"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Read-bandwidth probe:
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
2
|
+
* Read-bandwidth probe. Grid-stride loop: on step `i` every thread `t` loads
|
|
3
|
+
* `data[t + i * threads]`, so adjacent threads in a SIMD group always touch
|
|
4
|
+
* adjacent `vec4<f32>`s (fully coalesced) and the loads within a thread are
|
|
5
|
+
* independent (the compiler can keep several in flight). Folds with plain
|
|
6
|
+
* addition — the cheapest "prove you read it" op — and writes one scalar per
|
|
7
|
+
* thread, so reads dominate. The previous one-row-per-thread layout had
|
|
8
|
+
* adjacent threads 16 KB apart and only 4096 threads in total: fine on an
|
|
9
|
+
* M3, badly under-reports on a wide discrete GPU.
|
|
8
10
|
*/
|
|
9
|
-
export declare const streamReadWgsl = "\nstruct Params {\n
|
|
11
|
+
export declare const streamReadWgsl = "\nstruct Params {\n count: u32,\n threads: u32,\n};\n\n@group(0) @binding(0) var<uniform> params: Params;\n@group(0) @binding(1) var<storage, read> data: array<vec4<f32>>;\n@group(0) @binding(2) var<storage, read_write> out: array<f32>;\n\n@compute @workgroup_size(256)\nfn main(@builtin(global_invocation_id) gid: vec3<u32>) {\n let t = gid.x;\n var sum: vec4<f32> = vec4<f32>(0.0, 0.0, 0.0, 0.0);\n for (var i: u32 = t; i < params.count; i = i + params.threads) {\n sum = sum + data[i];\n }\n out[t] = sum.x + sum.y + sum.z + sum.w;\n}\n";
|
|
10
12
|
//# sourceMappingURL=streamRead.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streamRead.d.ts","sourceRoot":"","sources":["../../src/shaders/streamRead.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"streamRead.d.ts","sourceRoot":"","sources":["../../src/shaders/streamRead.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,0iBAmB1B,CAAC"}
|
|
@@ -1,33 +1,31 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Read-bandwidth probe:
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
2
|
+
* Read-bandwidth probe. Grid-stride loop: on step `i` every thread `t` loads
|
|
3
|
+
* `data[t + i * threads]`, so adjacent threads in a SIMD group always touch
|
|
4
|
+
* adjacent `vec4<f32>`s (fully coalesced) and the loads within a thread are
|
|
5
|
+
* independent (the compiler can keep several in flight). Folds with plain
|
|
6
|
+
* addition — the cheapest "prove you read it" op — and writes one scalar per
|
|
7
|
+
* thread, so reads dominate. The previous one-row-per-thread layout had
|
|
8
|
+
* adjacent threads 16 KB apart and only 4096 threads in total: fine on an
|
|
9
|
+
* M3, badly under-reports on a wide discrete GPU.
|
|
8
10
|
*/
|
|
9
11
|
export const streamReadWgsl = /* wgsl */ `
|
|
10
12
|
struct Params {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
+
count: u32,
|
|
14
|
+
threads: u32,
|
|
13
15
|
};
|
|
14
16
|
|
|
15
17
|
@group(0) @binding(0) var<uniform> params: Params;
|
|
16
18
|
@group(0) @binding(1) var<storage, read> data: array<vec4<f32>>;
|
|
17
19
|
@group(0) @binding(2) var<storage, read_write> out: array<f32>;
|
|
18
20
|
|
|
19
|
-
@compute @workgroup_size(
|
|
21
|
+
@compute @workgroup_size(256)
|
|
20
22
|
fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
|
|
21
|
-
let
|
|
22
|
-
if (row >= params.rows) {
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
23
|
+
let t = gid.x;
|
|
25
24
|
var sum: vec4<f32> = vec4<f32>(0.0, 0.0, 0.0, 0.0);
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
sum = sum + data[base + c];
|
|
25
|
+
for (var i: u32 = t; i < params.count; i = i + params.threads) {
|
|
26
|
+
sum = sum + data[i];
|
|
29
27
|
}
|
|
30
|
-
out[
|
|
28
|
+
out[t] = sum.x + sum.y + sum.z + sum.w;
|
|
31
29
|
}
|
|
32
30
|
`;
|
|
33
31
|
//# sourceMappingURL=streamRead.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streamRead.js","sourceRoot":"","sources":["../../src/shaders/streamRead.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"streamRead.js","sourceRoot":"","sources":["../../src/shaders/streamRead.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;CAmBxC,CAAC"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Write-bandwidth probe:
|
|
3
|
-
*
|
|
4
|
-
* thread's own id
|
|
5
|
-
* storage-buffer write bandwidth.
|
|
2
|
+
* Write-bandwidth probe: the grid-stride layout of {@link streamReadWgsl}
|
|
3
|
+
* with the loads replaced by stores. No buffer reads at all; the only input
|
|
4
|
+
* is the thread's own id.
|
|
6
5
|
*/
|
|
7
|
-
export declare const streamWriteWgsl = "\nstruct Params {\n
|
|
6
|
+
export declare const streamWriteWgsl = "\nstruct Params {\n count: u32,\n threads: u32,\n};\n\n@group(0) @binding(0) var<uniform> params: Params;\n@group(0) @binding(1) var<storage, read_write> out: array<vec4<f32>>;\n\n@compute @workgroup_size(256)\nfn main(@builtin(global_invocation_id) gid: vec3<u32>) {\n let t = gid.x;\n let v = vec4<f32>(f32(t), f32(t), f32(t), f32(t));\n for (var i: u32 = t; i < params.count; i = i + params.threads) {\n out[i] = v;\n }\n}\n";
|
|
8
7
|
//# sourceMappingURL=streamWrite.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streamWrite.d.ts","sourceRoot":"","sources":["../../src/shaders/streamWrite.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"streamWrite.d.ts","sourceRoot":"","sources":["../../src/shaders/streamWrite.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,eAAO,MAAM,eAAe,ybAiB3B,CAAC"}
|
|
@@ -1,28 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Write-bandwidth probe:
|
|
3
|
-
*
|
|
4
|
-
* thread's own id
|
|
5
|
-
* storage-buffer write bandwidth.
|
|
2
|
+
* Write-bandwidth probe: the grid-stride layout of {@link streamReadWgsl}
|
|
3
|
+
* with the loads replaced by stores. No buffer reads at all; the only input
|
|
4
|
+
* is the thread's own id.
|
|
6
5
|
*/
|
|
7
6
|
export const streamWriteWgsl = /* wgsl */ `
|
|
8
7
|
struct Params {
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
count: u32,
|
|
9
|
+
threads: u32,
|
|
11
10
|
};
|
|
12
11
|
|
|
13
12
|
@group(0) @binding(0) var<uniform> params: Params;
|
|
14
13
|
@group(0) @binding(1) var<storage, read_write> out: array<vec4<f32>>;
|
|
15
14
|
|
|
16
|
-
@compute @workgroup_size(
|
|
15
|
+
@compute @workgroup_size(256)
|
|
17
16
|
fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
|
|
18
|
-
let
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
let base = row * params.cols4;
|
|
23
|
-
let v = vec4<f32>(f32(row), f32(row), f32(row), f32(row));
|
|
24
|
-
for (var c: u32 = 0u; c < params.cols4; c = c + 1u) {
|
|
25
|
-
out[base + c] = v;
|
|
17
|
+
let t = gid.x;
|
|
18
|
+
let v = vec4<f32>(f32(t), f32(t), f32(t), f32(t));
|
|
19
|
+
for (var i: u32 = t; i < params.count; i = i + params.threads) {
|
|
20
|
+
out[i] = v;
|
|
26
21
|
}
|
|
27
22
|
}
|
|
28
23
|
`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streamWrite.js","sourceRoot":"","sources":["../../src/shaders/streamWrite.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"streamWrite.js","sourceRoot":"","sources":["../../src/shaders/streamWrite.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;CAiBzC,CAAC"}
|
package/dist/suite.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"suite.d.ts","sourceRoot":"","sources":["../src/suite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"suite.d.ts","sourceRoot":"","sources":["../src/suite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AA+CtE,OAAO,KAAK,EAAqB,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEnF,YAAY,EACV,eAAe,EACf,YAAY,EACZ,UAAU,EACV,KAAK,EACL,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,SAAS,GACV,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAgB1C;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAuB,QAAQ,CAAC,OAAO,GAAE,YAAiB,GAAG,cAAc,CAAC,eAAe,CAAC,CA4H3F;AAyCD,YAAY,EAAE,UAAU,EAAE,CAAC"}
|
package/dist/suite.js
CHANGED
|
@@ -7,8 +7,8 @@ import { prepareFlopsF32Scalar, prepareFlopsF32Vec4, prepareFlopsF32Mat4, prepar
|
|
|
7
7
|
import { prepareFlopsF16Scalar, prepareFlopsF16Vec4, prepareFlopsF16Mat4, prepareFlopsF16Matvec, } from "./benchmarks/flopsF16.js";
|
|
8
8
|
import { prepareFlopsI8Scalar, prepareFlopsI8Vec4, prepareFlopsI8Mat4, prepareFlopsI8Matvec, prepareFlopsI8MatvecDp4a, prepareFlopsI8Dp4a, } from "./benchmarks/flopsI8.js";
|
|
9
9
|
import { prepareFlopsF32Div, prepareFlopsI32Div, prepareFlopsF32Sqrt, prepareFlopsF32Rsqrt, prepareFlopsF32Pow, prepareFlopsF32Sincos, prepareFlopsF32Log, } from "./benchmarks/flopsMath.js";
|
|
10
|
-
import { prepareFlopsU32PackUnpack, prepareFlopsI32F32Convert, prepareFlopsF32F16Convert,
|
|
11
|
-
import { errorResult, metricPerSecond, rowFromMeta,
|
|
10
|
+
import { prepareFlopsU32PackUnpack, prepareFlopsI32F32Convert, prepareFlopsF32F16Convert, } from "./benchmarks/flopsConvert.js";
|
|
11
|
+
import { errorResult, metricPerSecond, rowFromMeta, } from "./benchmarks/common.js";
|
|
12
12
|
export { computeStats } from "./stats.js";
|
|
13
13
|
const DEFAULT_ROWS = 4096;
|
|
14
14
|
const DEFAULT_COLS = 4096;
|
|
@@ -71,7 +71,6 @@ export async function* runSuite(options = {}) {
|
|
|
71
71
|
compute('flops-u32-packunpack', () => prepareFlopsU32PackUnpack(ctx, flopsHarness)),
|
|
72
72
|
compute('flops-i32-f32-convert', () => prepareFlopsI32F32Convert(ctx, flopsHarness)),
|
|
73
73
|
compute('flops-f32-f16-convert', () => prepareFlopsF32F16Convert(ctx, flopsHarness)),
|
|
74
|
-
compute('flops-i32-f16-convert', () => prepareFlopsI32F16Convert(ctx, flopsHarness)),
|
|
75
74
|
];
|
|
76
75
|
// Phase 1: build every benchmark's GPU resources up front. Rows that can't
|
|
77
76
|
// run at all (missing feature, failed shader compile) resolve right here;
|
|
@@ -81,13 +80,9 @@ export async function* runSuite(options = {}) {
|
|
|
81
80
|
for (const [id, category, prepare] of benchmarks) {
|
|
82
81
|
const fallbackMeta = {
|
|
83
82
|
id,
|
|
84
|
-
label: id,
|
|
85
|
-
description: '',
|
|
86
|
-
source: '',
|
|
87
83
|
category,
|
|
88
84
|
rows,
|
|
89
85
|
cols,
|
|
90
|
-
metric: category === 'bandwidth' ? BYTES_METRIC : FLOPS_METRIC,
|
|
91
86
|
amountPerOp: 0,
|
|
92
87
|
};
|
|
93
88
|
let prepared;
|
package/dist/suite.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"suite.js","sourceRoot":"","sources":["../src/suite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAmB,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,WAAW,EAA6C,MAAM,eAAe,CAAC;AACvF,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAC9F,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,
|
|
1
|
+
{"version":3,"file":"suite.js","sourceRoot":"","sources":["../src/suite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAmB,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,WAAW,EAA6C,MAAM,eAAe,CAAC;AACvF,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAC9F,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,qBAAqB,GACtB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EACpB,wBAAwB,EACxB,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,WAAW,EACX,eAAe,EACf,WAAW,GAIZ,MAAM,wBAAwB,CAAC;AAchC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C,MAAM,YAAY,GAAG,IAAI,CAAC;AAC1B,MAAM,YAAY,GAAG,IAAI,CAAC;AAG1B,MAAM,SAAS,GAAG,CAAC,EAAU,EAAE,OAAyC,EAAkB,EAAE,CAAC,CAAC,EAAE,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;AACxH,MAAM,OAAO,GAAG,CAAC,EAAU,EAAE,OAAyC,EAAkB,EAAE,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AASpH;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,QAAQ,CAAC,UAAwB,EAAE;IACxD,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,CAAC,IAAI,IAAI,YAAY,CAAC,CAAC;IAC5D,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,CAAC,IAAI,IAAI,YAAY,CAAC,CAAC;IAE5D,MAAM,GAAG,GAAG,MAAM,iBAAiB,EAAE,CAAC;IACtC,OAAO,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAEjC,MAAM,IAAI,GAAG,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAkB;QAC7B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;QAC1C,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC;IACF,MAAM,YAAY,GAAG,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,cAAc,EAAE,UAAU,EAAE,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAE5G,MAAM,UAAU,GAA8B;QAC5C,SAAS,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3E,SAAS,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,qBAAqB,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAC7E,OAAO,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,qBAAqB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAC3E,OAAO,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACvE,OAAO,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACvE,OAAO,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,qBAAqB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAC3E,OAAO,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,qBAAqB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAC3E,OAAO,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACvE,OAAO,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACvE,OAAO,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,qBAAqB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAC3E,OAAO,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACzE,OAAO,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACrE,OAAO,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACrE,OAAO,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACzE,OAAO,CAAC,sBAAsB,EAAE,GAAG,EAAE,CAAC,wBAAwB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAClF,OAAO,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACrE,OAAO,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACrE,OAAO,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACrE,OAAO,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,mBAAmB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACvE,OAAO,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,oBAAoB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACzE,OAAO,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACrE,OAAO,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,qBAAqB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QAC3E,OAAO,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACrE,OAAO,CAAC,sBAAsB,EAAE,GAAG,EAAE,CAAC,yBAAyB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACnF,OAAO,CAAC,uBAAuB,EAAE,GAAG,EAAE,CAAC,yBAAyB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;QACpF,OAAO,CAAC,uBAAuB,EAAE,GAAG,EAAE,CAAC,yBAAyB,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;KACrF,CAAC;IAEF,2EAA2E;IAC3E,0EAA0E;IAC1E,wEAAwE;IACxE,+BAA+B;IAC/B,MAAM,SAAS,GAAsB,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,IAAI,UAAU,EAAE,CAAC;QACjD,MAAM,YAAY,GAAkB;YAClC,EAAE;YACF,QAAQ;YACR,IAAI;YACJ,IAAI;YACJ,WAAW,EAAE,CAAC;SACf,CAAC;QACF,IAAI,QAA2B,CAAC;QAChC,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,OAAO,EAAE,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,WAAW,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;YACvC,SAAS;QACX,CAAC;QACD,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAChC,MAAM,QAAQ,CAAC,MAAM,CAAC;YACtB,SAAS;QACX,CAAC;QACD,SAAS,CAAC,IAAI,CAAC;YACb,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,OAAO,EAAE,IAAI,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC5C,UAAU,EAAE,QAAQ,CAAC,UAAU;SAChC,CAAC,CAAC;QACH,MAAM,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,uEAAuE;IACvE,mEAAmE;IACnE,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAsB,EAAE,CAAC;IACpC,IAAI,IAAI,GAAwB,IAAI,CAAC;IACrC,MAAM,IAAI,GAAG,CAAC,CAAkB,EAAE,EAAE;QAClC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,IAAI,EAAE,EAAE,CAAC;QACT,IAAI,GAAG,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,MAAM,WAAW,GAAiB,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;QACtE,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE;QACpC,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE;KAC/B,CAAC,CAAC,CAAC;IAEJ,MAAM,GAAG,GAAG,WAAW,CAAC,WAAW,EAAE;QACnC,GAAG,mBAAmB,CAAC,OAAO,CAAC;QAC/B,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAE,EAAE,KAAK,CAAC,CAAC;KACvE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;QACd,KAAK,MAAM,CAAC,IAAI,SAAS;YAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IACjD,CAAC,CAAC,CAAC;IACH,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,KAAK,GAAG,CAAC,IAAI,CACX,GAAG,EAAE;QACH,IAAI,GAAG,IAAI,CAAC;QACZ,IAAI,EAAE,EAAE,CAAC;IACX,CAAC,EACD,GAAG,EAAE;QACH,IAAI,GAAG,IAAI,CAAC;QACZ,IAAI,EAAE,EAAE,CAAC;IACX,CAAC,CACF,CAAC;IAEF,IAAI,CAAC;QACH,OAAO,IAAI,EAAE,CAAC;YACZ,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,MAAM,KAAK,CAAC,KAAK,EAAG,CAAC;YAC9C,IAAI,IAAI;gBAAE,MAAM;YAChB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;gBAClC,IAAI,GAAG,OAAO,CAAC;YACjB,CAAC,CAAC,CAAC;QACL,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;YAAS,CAAC;QACT,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IACvB,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,CAAe;IAC1C,OAAO;QACL,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,SAAS,EAAE,CAAC,CAAC,SAAS;QACtB,YAAY,EAAE,CAAC,CAAC,YAAY;QAC5B,oBAAoB,EAAE,CAAC,CAAC,oBAAoB;QAC5C,iBAAiB,EAAE,CAAC,CAAC,iBAAiB;QACtC,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,UAAU,EAAE,CAAC,CAAC,UAAU;QACxB,YAAY,EAAE,CAAC,CAAC,YAAY;QAC5B,iBAAiB,EAAE,CAAC,CAAC,iBAAiB;KACvC,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,MAAuB,EAAE,KAA0B;IAC1E,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAC3B,8FAA8F;IAC9F,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;IAC7G,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;QAAE,OAAO,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IAErE,MAAM,GAAG,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC9B,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACjD,GAAG,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IAC9C,GAAG,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;IACxC,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC5B,GAAG,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;IACpC,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IACxB,GAAG,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;IAClC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,wEAAwE;QACxE,uEAAuE;QACvE,GAAG,CAAC,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,KAAK,WAAW,EAAE,CAAC;QACrC,GAAG,CAAC,OAAO,GAAG,uFAAuF,CAAC;IACxG,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -40,13 +40,14 @@ export interface MetricDef {
|
|
|
40
40
|
* after every sample it takes (still `running`, with the partial stats so
|
|
41
41
|
* far), and when it finishes (ok/skipped/error) — so the UI can render
|
|
42
42
|
* progress incrementally.
|
|
43
|
+
*
|
|
44
|
+
* Pure measurement, no identity/display metadata: label, description, WGSL
|
|
45
|
+
* source, and the metric definition all live on the matching `id` in
|
|
46
|
+
* `BENCHMARK_CATALOG` instead, so a UI joins a result onto its catalog row
|
|
47
|
+
* rather than getting them handed twice.
|
|
43
48
|
*/
|
|
44
49
|
export interface BenchmarkResult {
|
|
45
50
|
id: string;
|
|
46
|
-
label: string;
|
|
47
|
-
description: string;
|
|
48
|
-
/** WGSL source of the kernel that was run, for display alongside the result. */
|
|
49
|
-
source: string;
|
|
50
51
|
category: BenchmarkCategory;
|
|
51
52
|
status: BenchmarkStatus;
|
|
52
53
|
message?: string;
|
|
@@ -71,8 +72,6 @@ export interface BenchmarkResult {
|
|
|
71
72
|
stats?: Stats;
|
|
72
73
|
/** Set for `ok` rows: see `SamplingStopReason`. */
|
|
73
74
|
stopReason?: SamplingStopReason;
|
|
74
|
-
/** What `metricValue` counts. Set from the start, before any measurement lands. */
|
|
75
|
-
metric: MetricDef;
|
|
76
75
|
/** Peak `<metric.unit>/s`, computed from the best run (`stats.min`). */
|
|
77
76
|
metricValue?: number;
|
|
78
77
|
timingMethod: TimingMethod;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,oGAAoG;IACpG,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,wGAAwG;IACxG,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,YAAY,GAAG,WAAW,CAAC;AAE1E,MAAM,MAAM,YAAY,GAAG,eAAe,GAAG,eAAe,CAAC;AAE7D,iGAAiG;AACjG,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG,SAAS,CAAC;AAExD,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC;AAErE;;;;;;GAMG;AACH,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|