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.
Files changed (85) hide show
  1. package/README.md +4 -4
  2. package/dist/benchmarks/common.d.ts +6 -8
  3. package/dist/benchmarks/common.d.ts.map +1 -1
  4. package/dist/benchmarks/common.js +0 -8
  5. package/dist/benchmarks/common.js.map +1 -1
  6. package/dist/benchmarks/flopsCommon.d.ts +0 -9
  7. package/dist/benchmarks/flopsCommon.d.ts.map +1 -1
  8. package/dist/benchmarks/flopsCommon.js +1 -5
  9. package/dist/benchmarks/flopsCommon.js.map +1 -1
  10. package/dist/benchmarks/flopsConvert.d.ts +7 -6
  11. package/dist/benchmarks/flopsConvert.d.ts.map +1 -1
  12. package/dist/benchmarks/flopsConvert.js +10 -30
  13. package/dist/benchmarks/flopsConvert.js.map +1 -1
  14. package/dist/benchmarks/flopsF16.d.ts +1 -1
  15. package/dist/benchmarks/flopsF16.d.ts.map +1 -1
  16. package/dist/benchmarks/flopsF16.js +3 -11
  17. package/dist/benchmarks/flopsF16.js.map +1 -1
  18. package/dist/benchmarks/flopsF32.d.ts +1 -1
  19. package/dist/benchmarks/flopsF32.d.ts.map +1 -1
  20. package/dist/benchmarks/flopsF32.js +3 -11
  21. package/dist/benchmarks/flopsF32.js.map +1 -1
  22. package/dist/benchmarks/flopsI8.d.ts +2 -2
  23. package/dist/benchmarks/flopsI8.d.ts.map +1 -1
  24. package/dist/benchmarks/flopsI8.js +6 -25
  25. package/dist/benchmarks/flopsI8.js.map +1 -1
  26. package/dist/benchmarks/flopsMath.d.ts.map +1 -1
  27. package/dist/benchmarks/flopsMath.js +0 -16
  28. package/dist/benchmarks/flopsMath.js.map +1 -1
  29. package/dist/benchmarks/streamBandwidth.d.ts +6 -5
  30. package/dist/benchmarks/streamBandwidth.d.ts.map +1 -1
  31. package/dist/benchmarks/streamBandwidth.js +30 -21
  32. package/dist/benchmarks/streamBandwidth.js.map +1 -1
  33. package/dist/catalog.d.ts +18 -7
  34. package/dist/catalog.d.ts.map +1 -1
  35. package/dist/catalog.js +235 -32
  36. package/dist/catalog.js.map +1 -1
  37. package/dist/index.d.ts +1 -1
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js.map +1 -1
  40. package/dist/shaders/flopsF16Vec4.d.ts +5 -4
  41. package/dist/shaders/flopsF16Vec4.d.ts.map +1 -1
  42. package/dist/shaders/flopsF16Vec4.js +46 -6
  43. package/dist/shaders/flopsF16Vec4.js.map +1 -1
  44. package/dist/shaders/flopsF32Div.d.ts +6 -3
  45. package/dist/shaders/flopsF32Div.d.ts.map +1 -1
  46. package/dist/shaders/flopsF32Div.js +37 -34
  47. package/dist/shaders/flopsF32Div.js.map +1 -1
  48. package/dist/shaders/flopsF32F16Convert.d.ts +3 -3
  49. package/dist/shaders/flopsF32F16Convert.js +3 -3
  50. package/dist/shaders/flopsF32Vec4.d.ts +8 -6
  51. package/dist/shaders/flopsF32Vec4.d.ts.map +1 -1
  52. package/dist/shaders/flopsF32Vec4.js +49 -8
  53. package/dist/shaders/flopsF32Vec4.js.map +1 -1
  54. package/dist/shaders/flopsI32Div.d.ts +5 -3
  55. package/dist/shaders/flopsI32Div.d.ts.map +1 -1
  56. package/dist/shaders/flopsI32Div.js +37 -35
  57. package/dist/shaders/flopsI32Div.js.map +1 -1
  58. package/dist/shaders/flopsI32F32Convert.d.ts +2 -2
  59. package/dist/shaders/flopsI32F32Convert.js +2 -2
  60. package/dist/shaders/flopsI8Dp4a.d.ts +8 -5
  61. package/dist/shaders/flopsI8Dp4a.d.ts.map +1 -1
  62. package/dist/shaders/flopsI8Dp4a.js +40 -9
  63. package/dist/shaders/flopsI8Dp4a.js.map +1 -1
  64. package/dist/shaders/flopsI8Vec4.d.ts +4 -4
  65. package/dist/shaders/flopsI8Vec4.d.ts.map +1 -1
  66. package/dist/shaders/flopsI8Vec4.js +45 -6
  67. package/dist/shaders/flopsI8Vec4.js.map +1 -1
  68. package/dist/shaders/flopsU32PackUnpack.d.ts +10 -8
  69. package/dist/shaders/flopsU32PackUnpack.d.ts.map +1 -1
  70. package/dist/shaders/flopsU32PackUnpack.js +49 -23
  71. package/dist/shaders/flopsU32PackUnpack.js.map +1 -1
  72. package/dist/shaders/streamRead.d.ts +9 -7
  73. package/dist/shaders/streamRead.d.ts.map +1 -1
  74. package/dist/shaders/streamRead.js +15 -17
  75. package/dist/shaders/streamRead.js.map +1 -1
  76. package/dist/shaders/streamWrite.d.ts +4 -5
  77. package/dist/shaders/streamWrite.d.ts.map +1 -1
  78. package/dist/shaders/streamWrite.js +10 -15
  79. package/dist/shaders/streamWrite.js.map +1 -1
  80. package/dist/suite.d.ts.map +1 -1
  81. package/dist/suite.js +2 -7
  82. package/dist/suite.js.map +1 -1
  83. package/dist/types.d.ts +5 -6
  84. package/dist/types.d.ts.map +1 -1
  85. package/package.json +1 -1
package/README.md CHANGED
@@ -16,17 +16,17 @@ bandwidth/FLOPS specs.
16
16
 
17
17
  | Benchmark | What it tests |
18
18
  | -------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
19
- | `read-bandwidth` | Streams a large buffer in via `vec4<f32>` loads folded with addition only (no multiply, one scalar written per thread) — a read-bandwidth-bound probe of peak storage-buffer read throughput |
20
- | `write-bandwidth` | Streams computed `vec4<f32>` values out into a large buffer with no buffer reads at all — a write-bandwidth-bound probe of peak storage-buffer write throughput |
19
+ | `read-bandwidth` | Coalesced grid-stride loop (adjacent threads load adjacent `vec4<f32>`s, ~256K threads) folded with addition only, one scalar written per thread — a read-bandwidth-bound probe of peak storage-buffer read throughput |
20
+ | `write-bandwidth` | The same coalesced grid-stride loop storing computed `vec4<f32>` values with no buffer reads at all — a write-bandwidth-bound probe of peak storage-buffer write throughput |
21
21
  | `flops-f32-scalar` | Raw fp32 FLOPS: eight _independent_ scalar FMA chains per thread, unrolled 4x, so the ALU always has work in flight (a single dependent chain would measure FMA latency + loop overhead, not throughput) |
22
- | `flops-f32-vec4` | One FMA chain held in a `vec4<f32>` register. On scalar-SIMT GPUs (Apple, NVIDIA, AMD) that is 4 independent scalar FMAs per step it measures 4-wide instruction-level parallelism, not a wider ALU |
22
+ | `flops-f32-vec4` | The same eight 4x-unrolled chains held in `vec4<f32>` registers. On scalar-SIMT GPUs (Apple, NVIDIA, AMD) each step is 4 scalar FMAs, so this should match the scalar number; a gap means vector ops cost extra |
23
23
  | `flops-f32-mat4` | `x = m * x + c` chained with a `mat4x4<f32>` (a bounded contraction, so it stays numerically stable over any iteration count) |
24
24
  | `flops-f32-matvec` | Register-resident matvec tile: a 4x8 f32 weight tile held in registers, applied to an 8-wide input every iteration via `dot()`, outputs feeding back as the next inputs. The dot-product-accumulate shape of a GEMV inner loop with zero buffer traffic |
25
25
  | `flops-f16-scalar` / `-vec4` / `-mat4` / `-matvec` | The same four shapes, entirely in `f16` (skipped if the device lacks `shader-f16`) |
26
26
  | `flops-i8-scalar` / `-vec4` / `-mat4` | The scalar / vec4 shapes on `i32` (WGSL has no first-class `i8` type), and a 4x4 integer matvec emulated as four `vec4<i32>` rows combined with `dot()` (WGSL has no `mat4x4<i32>`) |
27
27
  | `flops-i8-matvec` | The register-resident matvec tile with int8-range weights/inputs held unpacked as `vec4<i32>` and integer `dot()` accumulation — the no-extension int8 path |
28
28
  | `flops-i8-matvec-dp4a` | The same tile with weights/inputs kept packed four int8 lanes per `u32`, each 4-wide dot product a single `dot4I8Packed` (skipped without `packed_4x8_integer_dot_product`) |
29
- | `flops-i8-dp4a` | `dot4I8Packed` accumulated in a tight loop to isolate the instruction's peak throughput (skipped without the feature) |
29
+ | `flops-i8-dp4a` | `dot4I8Packed` accumulated into eight independent accumulators in a tight loop to isolate the instruction's peak throughput (skipped without the feature) |
30
30
 
31
31
  The two bandwidth benchmarks stream the same deterministically-generated buffer (default 4096 &times;
32
32
  4096 f32, padded to a multiple of 4). The raw-FLOPS kernels' loop trip count and per-lane operands are
@@ -24,19 +24,17 @@ export declare function createPipeline(device: GPUDevice, label: string, code: s
24
24
  export declare function metricPerSecond(amountPerOp: number, perOpMs: number): number;
25
25
  /** Per-measurement knobs (`targetMs`, `targetDispatchMs`, `warmups`) shared by every benchmark. */
26
26
  export type HarnessConfig = MeasurementConfig;
27
- /** Everything about a benchmark that's known before it's measured. */
27
+ /**
28
+ * Everything about a benchmark that's known before it's measured. Identity/display
29
+ * fields (label, description, source, metric) live in `BENCHMARK_CATALOG` instead —
30
+ * this is just what a live run needs to size and account for the work.
31
+ */
28
32
  export interface BenchmarkMeta {
29
33
  id: string;
30
- label: string;
31
- description: string;
32
- /** WGSL source of the kernel, for display alongside the result. */
33
- source: string;
34
34
  category: BenchmarkCategory;
35
35
  rows: number;
36
36
  cols: number;
37
- /** What this benchmark's throughput number counts. */
38
- metric: MetricDef;
39
- /** Amount of `metric.unit` moved/computed per op. */
37
+ /** Amount of `metric.unit` (per the catalog's `MetricDef` for this id) moved/computed per op. */
40
38
  amountPerOp: number;
41
39
  }
42
40
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/benchmarks/common.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC5F,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEjF,oIAAoI;AACpI,eAAO,MAAM,YAAY,EAAE,SAAsE,CAAC;AAClG,eAAO,MAAM,UAAU,EAAE,SAA0D,CAAC;AACpF,eAAO,MAAM,YAAY,EAAE,SAA0D,CAAC;AAEtF;;;;;;;;;;;;;GAaG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC,OAAO,CAAC,kBAAkB,CAAC,CAa7B;AAED,wGAAwG;AACxG,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAE5E;AAED,mGAAmG;AACnG,MAAM,MAAM,aAAa,GAAG,iBAAiB,CAAC;AAE9C,sEAAsE;AACtE,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,sDAAsD;IACtD,MAAM,EAAE,SAAS,CAAC;IAClB,qDAAqD;IACrD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GACzB;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,aAAa,CAAC;IACvB,8GAA8G;IAC9G,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,aAAa,CAAC;CAC9C,GACD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,CAAC;AAEjD,MAAM,WAAW,oBAAqB,SAAQ,aAAa,EAAE,aAAa;IACxE,GAAG,EAAE,UAAU,CAAC;IAChB,sBAAsB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,SAAS,EAAE,YAAY,CAAC;IACxB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,aAAa,CAAC;CAC9C;AAED,2FAA2F;AAC3F,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,oBAAoB,GAAG,iBAAiB,CAiCpF;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,GAAG,eAAe,CAMnF;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,GAAG,eAAe,CAMhF;AAED,4EAA4E;AAC5E,wBAAgB,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,eAAe,CAgBhE"}
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../src/benchmarks/common.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAC5F,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEjF,oIAAoI;AACpI,eAAO,MAAM,YAAY,EAAE,SAAsE,CAAC;AAClG,eAAO,MAAM,UAAU,EAAE,SAA0D,CAAC;AACpF,eAAO,MAAM,YAAY,EAAE,SAA0D,CAAC;AAEtF;;;;;;;;;;;;;GAaG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC,OAAO,CAAC,kBAAkB,CAAC,CAa7B;AAED,wGAAwG;AACxG,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAE5E;AAED,mGAAmG;AACnG,MAAM,MAAM,aAAa,GAAG,iBAAiB,CAAC;AAE9C;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,iGAAiG;IACjG,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GACzB;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,aAAa,CAAC;IACvB,8GAA8G;IAC9G,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,aAAa,CAAC;CAC9C,GACD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,eAAe,CAAA;CAAE,CAAC;AAEjD,MAAM,WAAW,oBAAqB,SAAQ,aAAa,EAAE,aAAa;IACxE,GAAG,EAAE,UAAU,CAAC;IAChB,sBAAsB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,SAAS,EAAE,YAAY,CAAC;IACxB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,aAAa,CAAC;CAC9C;AAED,2FAA2F;AAC3F,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,oBAAoB,GAAG,iBAAiB,CA6BpF;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,GAAG,eAAe,CAMnF;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,OAAO,GAAG,eAAe,CAMhF;AAED,4EAA4E;AAC5E,wBAAgB,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,eAAe,CAYhE"}
@@ -41,13 +41,9 @@ export function prepareKernelBenchmark(opts) {
41
41
  kind: 'kernel',
42
42
  meta: {
43
43
  id: opts.id,
44
- label: opts.label,
45
- description: opts.description,
46
- source: opts.source,
47
44
  category: opts.category,
48
45
  rows: opts.rows,
49
46
  cols: opts.cols,
50
- metric: opts.metric,
51
47
  amountPerOp: opts.amountPerOp,
52
48
  },
53
49
  metaAtWork: opts.metaAtWork,
@@ -87,9 +83,6 @@ export function errorResult(meta, error) {
87
83
  export function rowFromMeta(meta) {
88
84
  return {
89
85
  id: meta.id,
90
- label: meta.label,
91
- description: meta.description,
92
- source: meta.source,
93
86
  category: meta.category,
94
87
  status: 'running',
95
88
  rows: meta.rows,
@@ -97,7 +90,6 @@ export function rowFromMeta(meta) {
97
90
  innerIterations: 0,
98
91
  timesMs: [],
99
92
  throttledMs: [],
100
- metric: meta.metric,
101
93
  timingMethod: 'cpu-wallclock',
102
94
  };
103
95
  }
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/benchmarks/common.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/benchmarks/common.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,8 @@
1
1
  import type { GpuContext } from '../gpu/context.ts';
2
2
  import { type HarnessConfig, type PreparedBenchmark } from './common.ts';
3
- import type { MetricDef } from '../types.ts';
4
3
  export interface FlopsKernelSpec {
5
4
  id: string;
6
- label: string;
7
- description: string;
8
5
  wgsl: string;
9
- /**
10
- * What this kernel's per-iteration count represents. Defaults to
11
- * `FLOPS_METRIC`; kernels doing integer or bit-twiddling work (not IEEE
12
- * floating-point ops) should pass `OPS_METRIC` instead.
13
- */
14
- metric?: MetricDef;
15
6
  /** Amount of `metric.unit` (same MAC-as-2 convention throughout) performed per loop iteration by a single thread. */
16
7
  flopsPerIteration: number;
17
8
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"flopsCommon.d.ts","sourceRoot":"","sources":["../../src/benchmarks/flopsCommon.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAML,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACvB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,qHAAqH;IACrH,iBAAiB,EAAE,MAAM,CAAC;IAC1B;;;;;;OAMG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,8GAA8G;IAC9G,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iIAAiI;IACjI,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,kBAAmB,SAAQ,aAAa;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAMD;;;;;;;;;;;GAWG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,UAAU,EACf,IAAI,EAAE,eAAe,EACrB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAmE5B"}
1
+ {"version":3,"file":"flopsCommon.d.ts","sourceRoot":"","sources":["../../src/benchmarks/flopsCommon.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EAKL,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACvB,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,qHAAqH;IACrH,iBAAiB,EAAE,MAAM,CAAC;IAC1B;;;;;;OAMG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,8GAA8G;IAC9G,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iIAAiI;IACjI,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,kBAAmB,SAAQ,aAAa;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAMD;;;;;;;;;;;GAWG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,UAAU,EACf,IAAI,EAAE,eAAe,EACrB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CA+D5B"}
@@ -1,5 +1,5 @@
1
1
  import { createUniformBuffer, createEmptyStorageBuffer } from "../gpu/buffers.js";
2
- import { createPipeline, prepareKernelBenchmark, skippedResult, FLOPS_METRIC, } from "./common.js";
2
+ import { createPipeline, prepareKernelBenchmark, skippedResult, } from "./common.js";
3
3
  const DEFAULT_THREADS = 1024 * 1024;
4
4
  const DEFAULT_ITERATIONS = 1024;
5
5
  const DEFAULT_MIN_ITERATIONS = 16;
@@ -20,13 +20,9 @@ export async function prepareFlopsBenchmark(ctx, spec, harness = {}) {
20
20
  const maxIterations = harness.iterations ?? spec.defaultIterations ?? DEFAULT_ITERATIONS;
21
21
  const metaAtWork = (iterations) => ({
22
22
  id: spec.id,
23
- label: spec.label,
24
- description: spec.description,
25
- source: spec.wgsl,
26
23
  category: 'compute',
27
24
  rows: threads,
28
25
  cols: iterations,
29
- metric: spec.metric ?? FLOPS_METRIC,
30
26
  amountPerOp: threads * iterations * spec.flopsPerIteration,
31
27
  });
32
28
  const meta = metaAtWork(maxIterations);
@@ -1 +1 @@
1
- {"version":3,"file":"flopsCommon.js","sourceRoot":"","sources":["../../src/benchmarks/flopsCommon.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"flopsCommon.js","sourceRoot":"","sources":["../../src/benchmarks/flopsCommon.ts"],"names":[],"mappings":"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"}
@@ -5,14 +5,15 @@ import type { PreparedBenchmark } from './common.ts';
5
5
  * Bit-twiddling and type-conversion ops: what quantized/packed formats
6
6
  * actually cost to get in and out of, as opposed to the flops-i8-* kernels
7
7
  * (which measure compute once data is already unpacked into i32/u32
8
- * registers). "Ops/s" here again isn't IEEE FLOPs, same caveat as flopsMath.ts.
8
+ * registers). "Ops" here count only the conversions themselves, one per
9
+ * direction per lane (an unpack or pack of a whole u32 counts as one), not
10
+ * the FMA / shifts / masks around them: the compiler folds and fuses those,
11
+ * so a source-level op count would overstate what executes.
9
12
  */
10
- /** Manual (shift+mask) byte pack/unpack: no pack4x8 (or unpack4x8) builtin, just what those compile to. */
13
+ /** Manual (shift+mask) byte pack/unpack: no pack4x8 (or unpack4x8) builtin, just what those compile to. 2 ops per lane step (unpack + pack). */
11
14
  export declare function prepareFlopsU32PackUnpack(ctx: GpuContext, harness?: FlopsHarnessConfig): Promise<PreparedBenchmark>;
12
- /** i32<->f32 round-trip: convert, FMA, convert back — the delta against the fp32 scalar test isolates conversion cost. */
15
+ /** i32<->f32 round-trip: convert, FMA, convert back — 2 ops per lane step (one convert each way). */
13
16
  export declare function prepareFlopsI32F32Convert(ctx: GpuContext, harness?: FlopsHarnessConfig): Promise<PreparedBenchmark>;
14
- /** fp32<->fp16 round-trip via pack2x16float/unpack2x16float — no shader-f16 feature needed. */
17
+ /** fp32<->fp16 round-trip via pack2x16float/unpack2x16float — no shader-f16 feature needed. Counted as 2 ops per lane round-trip (one convert each way). */
15
18
  export declare function prepareFlopsF32F16Convert(ctx: GpuContext, harness?: FlopsHarnessConfig): Promise<PreparedBenchmark>;
16
- /** i32<->f16 round-trip, chained through f32 (there's no native int<->f16 builtin). */
17
- export declare function prepareFlopsI32F16Convert(ctx: GpuContext, harness?: FlopsHarnessConfig): Promise<PreparedBenchmark>;
18
19
  //# sourceMappingURL=flopsConvert.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"flopsConvert.d.ts","sourceRoot":"","sources":["../../src/benchmarks/flopsConvert.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAyB,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAMlF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD;;;;;GAKG;AAEH,2GAA2G;AAC3G,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,UAAU,EACf,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAe5B;AAED,0HAA0H;AAC1H,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,UAAU,EACf,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAe5B;AAED,+FAA+F;AAC/F,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,UAAU,EACf,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAe5B;AAED,uFAAuF;AACvF,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,UAAU,EACf,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAe5B"}
1
+ {"version":3,"file":"flopsConvert.d.ts","sourceRoot":"","sources":["../../src/benchmarks/flopsConvert.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAyB,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAIlF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD;;;;;;;;GAQG;AAEH,gJAAgJ;AAChJ,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,UAAU,EACf,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAW5B;AAED,qGAAqG;AACrG,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,UAAU,EACf,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAW5B;AAED,4JAA4J;AAC5J,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,UAAU,EACf,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAW5B"}
@@ -2,59 +2,39 @@ import { prepareFlopsBenchmark } from "./flopsCommon.js";
2
2
  import { flopsU32PackUnpackWgsl } from "../shaders/flopsU32PackUnpack.js";
3
3
  import { flopsI32F32ConvertWgsl } from "../shaders/flopsI32F32Convert.js";
4
4
  import { flopsF32F16ConvertWgsl } from "../shaders/flopsF32F16Convert.js";
5
- import { flopsI32F16ConvertWgsl } from "../shaders/flopsI32F16Convert.js";
6
- import { OPS_METRIC } from "./common.js";
7
5
  /**
8
6
  * Bit-twiddling and type-conversion ops: what quantized/packed formats
9
7
  * actually cost to get in and out of, as opposed to the flops-i8-* kernels
10
8
  * (which measure compute once data is already unpacked into i32/u32
11
- * registers). "Ops/s" here again isn't IEEE FLOPs, same caveat as flopsMath.ts.
9
+ * registers). "Ops" here count only the conversions themselves, one per
10
+ * direction per lane (an unpack or pack of a whole u32 counts as one), not
11
+ * the FMA / shifts / masks around them: the compiler folds and fuses those,
12
+ * so a source-level op count would overstate what executes.
12
13
  */
13
- /** Manual (shift+mask) byte pack/unpack: no pack4x8 (or unpack4x8) builtin, just what those compile to. */
14
+ /** Manual (shift+mask) byte pack/unpack: no pack4x8 (or unpack4x8) builtin, just what those compile to. 2 ops per lane step (unpack + pack). */
14
15
  export function prepareFlopsU32PackUnpack(ctx, harness = {}) {
15
16
  return prepareFlopsBenchmark(ctx, {
16
17
  id: 'flops-u32-packunpack',
17
- label: 'u32 byte pack/unpack ops',
18
- description: 'Eight independent u32 lanes, each step unpacking 4 bytes via shift+mask, incrementing them, and repacking the same way — no pack4x8 (or unpack4x8) builtin, just the bit-twiddling those compile to. 25 ops/lane/step, no unrolling.',
19
18
  wgsl: flopsU32PackUnpackWgsl,
20
- metric: OPS_METRIC,
21
- flopsPerIteration: 200,
19
+ flopsPerIteration: 64,
22
20
  defaultIterations: 256,
23
21
  }, harness);
24
22
  }
25
- /** i32<->f32 round-trip: convert, FMA, convert back — the delta against the fp32 scalar test isolates conversion cost. */
23
+ /** i32<->f32 round-trip: convert, FMA, convert back — 2 ops per lane step (one convert each way). */
26
24
  export function prepareFlopsI32F32Convert(ctx, harness = {}) {
27
25
  return prepareFlopsBenchmark(ctx, {
28
26
  id: 'flops-i32-f32-convert',
29
- label: 'i32<->f32 convert FLOPS',
30
- description: 'Eight independent chains per thread, unrolled 4x: xi -> f32(xi)*a+b -> back to i32 each step. Same FMA as the fp32 scalar test plus a convert on each side, so the gap against that test isolates int<->float conversion cost.',
31
27
  wgsl: flopsI32F32ConvertWgsl,
32
- metric: OPS_METRIC,
33
- flopsPerIteration: 128,
28
+ flopsPerIteration: 64,
34
29
  defaultIterations: 256,
35
30
  }, harness);
36
31
  }
37
- /** fp32<->fp16 round-trip via pack2x16float/unpack2x16float — no shader-f16 feature needed. */
32
+ /** fp32<->fp16 round-trip via pack2x16float/unpack2x16float — no shader-f16 feature needed. Counted as 2 ops per lane round-trip (one convert each way). */
38
33
  export function prepareFlopsF32F16Convert(ctx, harness = {}) {
39
34
  return prepareFlopsBenchmark(ctx, {
40
35
  id: 'flops-f32-f16-convert',
41
- label: 'f32<->f16 convert FLOPS',
42
- description: 'Eight independent vec2<f32> chains per thread, unrolled 4x: pack2x16float then unpack2x16float (round-trips through fp16 bits) plus a vec2 FMA to keep the chain moving. Unlike flops-f16-*, this needs no shader-f16 device feature — it measures the conversion, not f16 compute.',
43
36
  wgsl: flopsF32F16ConvertWgsl,
44
- metric: OPS_METRIC,
45
- flopsPerIteration: 192,
46
- defaultIterations: 256,
47
- }, harness);
48
- }
49
- /** i32<->f16 round-trip, chained through f32 (there's no native int<->f16 builtin). */
50
- export function prepareFlopsI32F16Convert(ctx, harness = {}) {
51
- return prepareFlopsBenchmark(ctx, {
52
- id: 'flops-i32-f16-convert',
53
- label: 'i32<->f16 convert FLOPS',
54
- description: 'Eight independent i32 chains per thread, unrolled 4x: xi -> f32 -> pack2x16float -> unpack2x16float -> f32*a+b -> i32. There is no native int<->f16 conversion, so this is what the real path (through f32) costs.',
55
- wgsl: flopsI32F16ConvertWgsl,
56
- metric: OPS_METRIC,
57
- flopsPerIteration: 192,
37
+ flopsPerIteration: 128,
58
38
  defaultIterations: 256,
59
39
  }, harness);
60
40
  }
@@ -1 +1 @@
1
- {"version":3,"file":"flopsConvert.js","sourceRoot":"","sources":["../../src/benchmarks/flopsConvert.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAA2B,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC;;;;;GAKG;AAEH,2GAA2G;AAC3G,MAAM,UAAU,yBAAyB,CACvC,GAAe,EACf,UAA8B,EAAE;IAEhC,OAAO,qBAAqB,CAC1B,GAAG,EACH;QACE,EAAE,EAAE,sBAAsB;QAC1B,KAAK,EAAE,0BAA0B;QACjC,WAAW,EACT,sOAAsO;QACxO,IAAI,EAAE,sBAAsB;QAC5B,MAAM,EAAE,UAAU;QAClB,iBAAiB,EAAE,GAAG;QACtB,iBAAiB,EAAE,GAAG;KACvB,EACD,OAAO,CACR,CAAC;AACJ,CAAC;AAED,0HAA0H;AAC1H,MAAM,UAAU,yBAAyB,CACvC,GAAe,EACf,UAA8B,EAAE;IAEhC,OAAO,qBAAqB,CAC1B,GAAG,EACH;QACE,EAAE,EAAE,uBAAuB;QAC3B,KAAK,EAAE,yBAAyB;QAChC,WAAW,EACT,gOAAgO;QAClO,IAAI,EAAE,sBAAsB;QAC5B,MAAM,EAAE,UAAU;QAClB,iBAAiB,EAAE,GAAG;QACtB,iBAAiB,EAAE,GAAG;KACvB,EACD,OAAO,CACR,CAAC;AACJ,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,yBAAyB,CACvC,GAAe,EACf,UAA8B,EAAE;IAEhC,OAAO,qBAAqB,CAC1B,GAAG,EACH;QACE,EAAE,EAAE,uBAAuB;QAC3B,KAAK,EAAE,yBAAyB;QAChC,WAAW,EACT,qRAAqR;QACvR,IAAI,EAAE,sBAAsB;QAC5B,MAAM,EAAE,UAAU;QAClB,iBAAiB,EAAE,GAAG;QACtB,iBAAiB,EAAE,GAAG;KACvB,EACD,OAAO,CACR,CAAC;AACJ,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,yBAAyB,CACvC,GAAe,EACf,UAA8B,EAAE;IAEhC,OAAO,qBAAqB,CAC1B,GAAG,EACH;QACE,EAAE,EAAE,uBAAuB;QAC3B,KAAK,EAAE,yBAAyB;QAChC,WAAW,EACT,oNAAoN;QACtN,IAAI,EAAE,sBAAsB;QAC5B,MAAM,EAAE,UAAU;QAClB,iBAAiB,EAAE,GAAG;QACtB,iBAAiB,EAAE,GAAG;KACvB,EACD,OAAO,CACR,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"flopsConvert.js","sourceRoot":"","sources":["../../src/benchmarks/flopsConvert.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAA2B,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAG1E;;;;;;;;GAQG;AAEH,gJAAgJ;AAChJ,MAAM,UAAU,yBAAyB,CACvC,GAAe,EACf,UAA8B,EAAE;IAEhC,OAAO,qBAAqB,CAC1B,GAAG,EACH;QACE,EAAE,EAAE,sBAAsB;QAC1B,IAAI,EAAE,sBAAsB;QAC5B,iBAAiB,EAAE,EAAE;QACrB,iBAAiB,EAAE,GAAG;KACvB,EACD,OAAO,CACR,CAAC;AACJ,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,yBAAyB,CACvC,GAAe,EACf,UAA8B,EAAE;IAEhC,OAAO,qBAAqB,CAC1B,GAAG,EACH;QACE,EAAE,EAAE,uBAAuB;QAC3B,IAAI,EAAE,sBAAsB;QAC5B,iBAAiB,EAAE,EAAE;QACrB,iBAAiB,EAAE,GAAG;KACvB,EACD,OAAO,CACR,CAAC;AACJ,CAAC;AAED,4JAA4J;AAC5J,MAAM,UAAU,yBAAyB,CACvC,GAAe,EACf,UAA8B,EAAE;IAEhC,OAAO,qBAAqB,CAC1B,GAAG,EACH;QACE,EAAE,EAAE,uBAAuB;QAC3B,IAAI,EAAE,sBAAsB;QAC5B,iBAAiB,EAAE,GAAG;QACtB,iBAAiB,EAAE,GAAG;KACvB,EACD,OAAO,CACR,CAAC;AACJ,CAAC"}
@@ -3,7 +3,7 @@ import { type FlopsHarnessConfig } from './flopsCommon.ts';
3
3
  import type { PreparedBenchmark } from './common.ts';
4
4
  /** Raw fp16 FLOPS: eight independent scalar f16 FMA chains per thread, unrolled 4x. */
5
5
  export declare function prepareFlopsF16Scalar(ctx: GpuContext, harness?: FlopsHarnessConfig): Promise<PreparedBenchmark>;
6
- /** fp16 vec4 FLOPS: one f16 FMA chain on a vec4<f16> register (4 independent lanes). */
6
+ /** fp16 vec4 FLOPS: eight independent vec4<f16> FMA chains, unrolled 4x (same shape as scalar). */
7
7
  export declare function prepareFlopsF16Vec4(ctx: GpuContext, harness?: FlopsHarnessConfig): Promise<PreparedBenchmark>;
8
8
  /** fp16 mat4 FLOPS: x = m*x + c chained with a mat4x4<f16>. */
9
9
  export declare function prepareFlopsF16Mat4(ctx: GpuContext, harness?: FlopsHarnessConfig): Promise<PreparedBenchmark>;
@@ -1 +1 @@
1
- {"version":3,"file":"flopsF16.d.ts","sourceRoot":"","sources":["../../src/benchmarks/flopsF16.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAyB,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAKlF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,uFAAuF;AACvF,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAenH;AAED,wFAAwF;AACxF,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAejH;AAED,+DAA+D;AAC/D,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAejH;AAED,wGAAwG;AACxG,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAenH"}
1
+ {"version":3,"file":"flopsF16.d.ts","sourceRoot":"","sources":["../../src/benchmarks/flopsF16.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAyB,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAKlF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,uFAAuF;AACvF,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAYnH;AAED,mGAAmG;AACnG,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAYjH;AAED,+DAA+D;AAC/D,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAYjH;AAED,wGAAwG;AACxG,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAYnH"}
@@ -7,23 +7,19 @@ import { flopsF16MatvecWgsl } from "../shaders/flopsF16Matvec.js";
7
7
  export function prepareFlopsF16Scalar(ctx, harness = {}) {
8
8
  return prepareFlopsBenchmark(ctx, {
9
9
  id: 'flops-f16-scalar',
10
- label: 'fp16 scalar FMA FLOPS',
11
- description: 'Same eight independent, 4x-unrolled FMA chains as the fp32 scalar test, but every operand and accumulator is f16, so the chains run entirely in half precision.',
12
10
  wgsl: flopsF16ScalarWgsl,
13
11
  flopsPerIteration: 64,
14
12
  defaultIterations: 256,
15
13
  requiresF16: true,
16
14
  }, harness);
17
15
  }
18
- /** fp16 vec4 FLOPS: one f16 FMA chain on a vec4<f16> register (4 independent lanes). */
16
+ /** fp16 vec4 FLOPS: eight independent vec4<f16> FMA chains, unrolled 4x (same shape as scalar). */
19
17
  export function prepareFlopsF16Vec4(ctx, harness = {}) {
20
18
  return prepareFlopsBenchmark(ctx, {
21
19
  id: 'flops-f16-vec4',
22
- label: 'fp16 vec4 FLOPS',
23
- description: 'Same single FMA chain as the fp32 vec4 test, but held in a vec4<f16> register: 4 independent half-precision lanes per step. Only GPUs with packed-half ALUs run this faster than fp32.',
24
20
  wgsl: flopsF16Vec4Wgsl,
25
- flopsPerIteration: 8,
26
- defaultIterations: 1024,
21
+ flopsPerIteration: 256,
22
+ defaultIterations: 256,
27
23
  requiresF16: true,
28
24
  }, harness);
29
25
  }
@@ -31,8 +27,6 @@ export function prepareFlopsF16Vec4(ctx, harness = {}) {
31
27
  export function prepareFlopsF16Mat4(ctx, harness = {}) {
32
28
  return prepareFlopsBenchmark(ctx, {
33
29
  id: 'flops-f16-mat4',
34
- label: 'fp16 mat4 FLOPS',
35
- description: 'Same bounded x = m * x + c recurrence as the fp32 mat4 test, but m, c, and x are all f16, so the mat4x4 x vec4 multiply runs entirely in half precision.',
36
30
  wgsl: flopsF16Mat4Wgsl,
37
31
  flopsPerIteration: 32,
38
32
  defaultIterations: 1024,
@@ -43,8 +37,6 @@ export function prepareFlopsF16Mat4(ctx, harness = {}) {
43
37
  export function prepareFlopsF16Matvec(ctx, harness = {}) {
44
38
  return prepareFlopsBenchmark(ctx, {
45
39
  id: 'flops-f16-matvec',
46
- label: 'fp16 matvec FLOPS',
47
- description: 'Same register-resident 4x8 matvec tile as the fp32 matvec test, but weights, inputs, and dot() accumulation are all f16. Pure ALU: the fp16 win here comes only from the ALU, not from halved memory traffic.',
48
40
  wgsl: flopsF16MatvecWgsl,
49
41
  flopsPerIteration: 64,
50
42
  defaultIterations: 512,
@@ -1 +1 @@
1
- {"version":3,"file":"flopsF16.js","sourceRoot":"","sources":["../../src/benchmarks/flopsF16.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAA2B,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAGlE,uFAAuF;AACvF,MAAM,UAAU,qBAAqB,CAAC,GAAe,EAAE,UAA8B,EAAE;IACrF,OAAO,qBAAqB,CAC1B,GAAG,EACH;QACE,EAAE,EAAE,kBAAkB;QACtB,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EACT,iKAAiK;QACnK,IAAI,EAAE,kBAAkB;QACxB,iBAAiB,EAAE,EAAE;QACrB,iBAAiB,EAAE,GAAG;QACtB,WAAW,EAAE,IAAI;KAClB,EACD,OAAO,CACR,CAAC;AACJ,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,mBAAmB,CAAC,GAAe,EAAE,UAA8B,EAAE;IACnF,OAAO,qBAAqB,CAC1B,GAAG,EACH;QACE,EAAE,EAAE,gBAAgB;QACpB,KAAK,EAAE,iBAAiB;QACxB,WAAW,EACT,wLAAwL;QAC1L,IAAI,EAAE,gBAAgB;QACtB,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,IAAI;QACvB,WAAW,EAAE,IAAI;KAClB,EACD,OAAO,CACR,CAAC;AACJ,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,mBAAmB,CAAC,GAAe,EAAE,UAA8B,EAAE;IACnF,OAAO,qBAAqB,CAC1B,GAAG,EACH;QACE,EAAE,EAAE,gBAAgB;QACpB,KAAK,EAAE,iBAAiB;QACxB,WAAW,EACT,0JAA0J;QAC5J,IAAI,EAAE,gBAAgB;QACtB,iBAAiB,EAAE,EAAE;QACrB,iBAAiB,EAAE,IAAI;QACvB,WAAW,EAAE,IAAI;KAClB,EACD,OAAO,CACR,CAAC;AACJ,CAAC;AAED,wGAAwG;AACxG,MAAM,UAAU,qBAAqB,CAAC,GAAe,EAAE,UAA8B,EAAE;IACrF,OAAO,qBAAqB,CAC1B,GAAG,EACH;QACE,EAAE,EAAE,kBAAkB;QACtB,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EACT,+MAA+M;QACjN,IAAI,EAAE,kBAAkB;QACxB,iBAAiB,EAAE,EAAE;QACrB,iBAAiB,EAAE,GAAG;QACtB,WAAW,EAAE,IAAI;KAClB,EACD,OAAO,CACR,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"flopsF16.js","sourceRoot":"","sources":["../../src/benchmarks/flopsF16.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAA2B,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAGlE,uFAAuF;AACvF,MAAM,UAAU,qBAAqB,CAAC,GAAe,EAAE,UAA8B,EAAE;IACrF,OAAO,qBAAqB,CAC1B,GAAG,EACH;QACE,EAAE,EAAE,kBAAkB;QACtB,IAAI,EAAE,kBAAkB;QACxB,iBAAiB,EAAE,EAAE;QACrB,iBAAiB,EAAE,GAAG;QACtB,WAAW,EAAE,IAAI;KAClB,EACD,OAAO,CACR,CAAC;AACJ,CAAC;AAED,mGAAmG;AACnG,MAAM,UAAU,mBAAmB,CAAC,GAAe,EAAE,UAA8B,EAAE;IACnF,OAAO,qBAAqB,CAC1B,GAAG,EACH;QACE,EAAE,EAAE,gBAAgB;QACpB,IAAI,EAAE,gBAAgB;QACtB,iBAAiB,EAAE,GAAG;QACtB,iBAAiB,EAAE,GAAG;QACtB,WAAW,EAAE,IAAI;KAClB,EACD,OAAO,CACR,CAAC;AACJ,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,mBAAmB,CAAC,GAAe,EAAE,UAA8B,EAAE;IACnF,OAAO,qBAAqB,CAC1B,GAAG,EACH;QACE,EAAE,EAAE,gBAAgB;QACpB,IAAI,EAAE,gBAAgB;QACtB,iBAAiB,EAAE,EAAE;QACrB,iBAAiB,EAAE,IAAI;QACvB,WAAW,EAAE,IAAI;KAClB,EACD,OAAO,CACR,CAAC;AACJ,CAAC;AAED,wGAAwG;AACxG,MAAM,UAAU,qBAAqB,CAAC,GAAe,EAAE,UAA8B,EAAE;IACrF,OAAO,qBAAqB,CAC1B,GAAG,EACH;QACE,EAAE,EAAE,kBAAkB;QACtB,IAAI,EAAE,kBAAkB;QACxB,iBAAiB,EAAE,EAAE;QACrB,iBAAiB,EAAE,GAAG;QACtB,WAAW,EAAE,IAAI;KAClB,EACD,OAAO,CACR,CAAC;AACJ,CAAC"}
@@ -3,7 +3,7 @@ import { type FlopsHarnessConfig } from './flopsCommon.ts';
3
3
  import type { PreparedBenchmark } from './common.ts';
4
4
  /** Raw fp32 FLOPS: eight independent scalar FMA chains per thread, unrolled 4x. */
5
5
  export declare function prepareFlopsF32Scalar(ctx: GpuContext, harness?: FlopsHarnessConfig): Promise<PreparedBenchmark>;
6
- /** fp32 vec4 FLOPS: one FMA chain on a vec4<f32> register (4 independent lanes). */
6
+ /** fp32 vec4 FLOPS: eight independent vec4<f32> FMA chains, unrolled 4x (same shape as scalar). */
7
7
  export declare function prepareFlopsF32Vec4(ctx: GpuContext, harness?: FlopsHarnessConfig): Promise<PreparedBenchmark>;
8
8
  /** fp32 mat4 FLOPS: x = m*x + c chained with a mat4x4<f32>. */
9
9
  export declare function prepareFlopsF32Mat4(ctx: GpuContext, harness?: FlopsHarnessConfig): Promise<PreparedBenchmark>;
@@ -1 +1 @@
1
- {"version":3,"file":"flopsF32.d.ts","sourceRoot":"","sources":["../../src/benchmarks/flopsF32.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAyB,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAKlF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,mFAAmF;AACnF,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAcnH;AAED,oFAAoF;AACpF,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAcjH;AAED,+DAA+D;AAC/D,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAcjH;AAED,oGAAoG;AACpG,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAcnH"}
1
+ {"version":3,"file":"flopsF32.d.ts","sourceRoot":"","sources":["../../src/benchmarks/flopsF32.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAyB,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAKlF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,mFAAmF;AACnF,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAWnH;AAED,mGAAmG;AACnG,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAWjH;AAED,+DAA+D;AAC/D,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAWjH;AAED,oGAAoG;AACpG,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAWnH"}
@@ -7,30 +7,24 @@ import { flopsF32MatvecWgsl } from "../shaders/flopsF32Matvec.js";
7
7
  export function prepareFlopsF32Scalar(ctx, harness = {}) {
8
8
  return prepareFlopsBenchmark(ctx, {
9
9
  id: 'flops-f32-scalar',
10
- label: 'fp32 scalar FMA FLOPS',
11
- description: 'Eight independent scalar f32 fused multiply-add chains per thread, unrolled 4x, so the ALU always has work in flight and the number reflects throughput rather than FMA latency. ~no memory traffic.',
12
10
  wgsl: flopsF32ScalarWgsl,
13
11
  flopsPerIteration: 64,
14
12
  defaultIterations: 256,
15
13
  }, harness);
16
14
  }
17
- /** fp32 vec4 FLOPS: one FMA chain on a vec4<f32> register (4 independent lanes). */
15
+ /** fp32 vec4 FLOPS: eight independent vec4<f32> FMA chains, unrolled 4x (same shape as scalar). */
18
16
  export function prepareFlopsF32Vec4(ctx, harness = {}) {
19
17
  return prepareFlopsBenchmark(ctx, {
20
18
  id: 'flops-f32-vec4',
21
- label: 'fp32 vec4 FLOPS',
22
- description: 'A single FMA chain held in a vec4<f32> register. On scalar-SIMT GPUs (Apple, NVIDIA, AMD) this compiles to 4 independent scalar FMAs per step, so it measures how well 4-wide instruction-level parallelism hides latency, not a wider ALU.',
23
19
  wgsl: flopsF32Vec4Wgsl,
24
- flopsPerIteration: 8,
25
- defaultIterations: 1024,
20
+ flopsPerIteration: 256,
21
+ defaultIterations: 256,
26
22
  }, harness);
27
23
  }
28
24
  /** fp32 mat4 FLOPS: x = m*x + c chained with a mat4x4<f32>. */
29
25
  export function prepareFlopsF32Mat4(ctx, harness = {}) {
30
26
  return prepareFlopsBenchmark(ctx, {
31
27
  id: 'flops-f32-mat4',
32
- label: 'fp32 mat4 FLOPS',
33
- description: 'x = m * x + c chained in a register with a mat4x4<f32> (a bounded contraction so it stays numerically stable): 16 FMAs per step with plenty of independent work, exercising the full mat4 x vec4 multiply.',
34
28
  wgsl: flopsF32Mat4Wgsl,
35
29
  flopsPerIteration: 32,
36
30
  defaultIterations: 1024,
@@ -40,8 +34,6 @@ export function prepareFlopsF32Mat4(ctx, harness = {}) {
40
34
  export function prepareFlopsF32Matvec(ctx, harness = {}) {
41
35
  return prepareFlopsBenchmark(ctx, {
42
36
  id: 'flops-f32-matvec',
43
- label: 'fp32 matvec FLOPS',
44
- description: 'A 4-row x 8-column f32 weight tile held in registers, applied to an 8-wide input every iteration via dot() (outputs feed back as the next inputs). The dot-product-accumulate shape of a GEMV inner loop with zero buffer traffic: pure ALU.',
45
37
  wgsl: flopsF32MatvecWgsl,
46
38
  flopsPerIteration: 64,
47
39
  defaultIterations: 512,
@@ -1 +1 @@
1
- {"version":3,"file":"flopsF32.js","sourceRoot":"","sources":["../../src/benchmarks/flopsF32.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAA2B,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAGlE,mFAAmF;AACnF,MAAM,UAAU,qBAAqB,CAAC,GAAe,EAAE,UAA8B,EAAE;IACrF,OAAO,qBAAqB,CAC1B,GAAG,EACH;QACE,EAAE,EAAE,kBAAkB;QACtB,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EACT,sMAAsM;QACxM,IAAI,EAAE,kBAAkB;QACxB,iBAAiB,EAAE,EAAE;QACrB,iBAAiB,EAAE,GAAG;KACvB,EACD,OAAO,CACR,CAAC;AACJ,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,mBAAmB,CAAC,GAAe,EAAE,UAA8B,EAAE;IACnF,OAAO,qBAAqB,CAC1B,GAAG,EACH;QACE,EAAE,EAAE,gBAAgB;QACpB,KAAK,EAAE,iBAAiB;QACxB,WAAW,EACT,6OAA6O;QAC/O,IAAI,EAAE,gBAAgB;QACtB,iBAAiB,EAAE,CAAC;QACpB,iBAAiB,EAAE,IAAI;KACxB,EACD,OAAO,CACR,CAAC;AACJ,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,mBAAmB,CAAC,GAAe,EAAE,UAA8B,EAAE;IACnF,OAAO,qBAAqB,CAC1B,GAAG,EACH;QACE,EAAE,EAAE,gBAAgB;QACpB,KAAK,EAAE,iBAAiB;QACxB,WAAW,EACT,4MAA4M;QAC9M,IAAI,EAAE,gBAAgB;QACtB,iBAAiB,EAAE,EAAE;QACrB,iBAAiB,EAAE,IAAI;KACxB,EACD,OAAO,CACR,CAAC;AACJ,CAAC;AAED,oGAAoG;AACpG,MAAM,UAAU,qBAAqB,CAAC,GAAe,EAAE,UAA8B,EAAE;IACrF,OAAO,qBAAqB,CAC1B,GAAG,EACH;QACE,EAAE,EAAE,kBAAkB;QACtB,KAAK,EAAE,mBAAmB;QAC1B,WAAW,EACT,8OAA8O;QAChP,IAAI,EAAE,kBAAkB;QACxB,iBAAiB,EAAE,EAAE;QACrB,iBAAiB,EAAE,GAAG;KACvB,EACD,OAAO,CACR,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"flopsF32.js","sourceRoot":"","sources":["../../src/benchmarks/flopsF32.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAA2B,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAGlE,mFAAmF;AACnF,MAAM,UAAU,qBAAqB,CAAC,GAAe,EAAE,UAA8B,EAAE;IACrF,OAAO,qBAAqB,CAC1B,GAAG,EACH;QACE,EAAE,EAAE,kBAAkB;QACtB,IAAI,EAAE,kBAAkB;QACxB,iBAAiB,EAAE,EAAE;QACrB,iBAAiB,EAAE,GAAG;KACvB,EACD,OAAO,CACR,CAAC;AACJ,CAAC;AAED,mGAAmG;AACnG,MAAM,UAAU,mBAAmB,CAAC,GAAe,EAAE,UAA8B,EAAE;IACnF,OAAO,qBAAqB,CAC1B,GAAG,EACH;QACE,EAAE,EAAE,gBAAgB;QACpB,IAAI,EAAE,gBAAgB;QACtB,iBAAiB,EAAE,GAAG;QACtB,iBAAiB,EAAE,GAAG;KACvB,EACD,OAAO,CACR,CAAC;AACJ,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,mBAAmB,CAAC,GAAe,EAAE,UAA8B,EAAE;IACnF,OAAO,qBAAqB,CAC1B,GAAG,EACH;QACE,EAAE,EAAE,gBAAgB;QACpB,IAAI,EAAE,gBAAgB;QACtB,iBAAiB,EAAE,EAAE;QACrB,iBAAiB,EAAE,IAAI;KACxB,EACD,OAAO,CACR,CAAC;AACJ,CAAC;AAED,oGAAoG;AACpG,MAAM,UAAU,qBAAqB,CAAC,GAAe,EAAE,UAA8B,EAAE;IACrF,OAAO,qBAAqB,CAC1B,GAAG,EACH;QACE,EAAE,EAAE,kBAAkB;QACtB,IAAI,EAAE,kBAAkB;QACxB,iBAAiB,EAAE,EAAE;QACrB,iBAAiB,EAAE,GAAG;KACvB,EACD,OAAO,CACR,CAAC;AACJ,CAAC"}
@@ -3,7 +3,7 @@ import { type FlopsHarnessConfig } from './flopsCommon.ts';
3
3
  import type { PreparedBenchmark } from './common.ts';
4
4
  /** Raw int8-range FLOPS: eight independent scalar i32 multiply-add chains per thread, unrolled 4x. */
5
5
  export declare function prepareFlopsI8Scalar(ctx: GpuContext, harness?: FlopsHarnessConfig): Promise<PreparedBenchmark>;
6
- /** int8-range vec4 FLOPS: one integer FMA chain on a vec4<i32> register (4 independent lanes). */
6
+ /** int8-range vec4 FLOPS: eight independent vec4<i32> multiply-add chains, unrolled 4x (same shape as scalar). */
7
7
  export declare function prepareFlopsI8Vec4(ctx: GpuContext, harness?: FlopsHarnessConfig): Promise<PreparedBenchmark>;
8
8
  /** int8-range mat4 FLOPS: a 4x4 integer matvec emulated via four dot(vec4<i32>) calls (WGSL has no mat4x4<i32>). */
9
9
  export declare function prepareFlopsI8Mat4(ctx: GpuContext, harness?: FlopsHarnessConfig): Promise<PreparedBenchmark>;
@@ -11,6 +11,6 @@ export declare function prepareFlopsI8Mat4(ctx: GpuContext, harness?: FlopsHarne
11
11
  export declare function prepareFlopsI8Matvec(ctx: GpuContext, harness?: FlopsHarnessConfig): Promise<PreparedBenchmark>;
12
12
  /** int8 register-resident matvec tile on packed u32 words, two dot4I8Packed calls per output row. */
13
13
  export declare function prepareFlopsI8MatvecDp4a(ctx: GpuContext, harness?: FlopsHarnessConfig): Promise<PreparedBenchmark>;
14
- /** int8 packed-dot-product FLOPS: dot4I8Packed from the packed_4x8_integer_dot_product extension, run in a tight accumulation loop. */
14
+ /** int8 packed-dot-product FLOPS: dot4I8Packed from the packed_4x8_integer_dot_product extension, run in a tight accumulation loop over eight independent accumulators. */
15
15
  export declare function prepareFlopsI8Dp4a(ctx: GpuContext, harness?: FlopsHarnessConfig): Promise<PreparedBenchmark>;
16
16
  //# sourceMappingURL=flopsI8.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"flopsI8.d.ts","sourceRoot":"","sources":["../../src/benchmarks/flopsI8.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAyB,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAQlF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,sGAAsG;AACtG,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAelH;AAED,kGAAkG;AAClG,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAehH;AAED,oHAAoH;AACpH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAehH;AAED,qHAAqH;AACrH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAelH;AAED,qGAAqG;AACrG,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,UAAU,EACf,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAgB5B;AAED,uIAAuI;AACvI,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAgBhH"}
1
+ {"version":3,"file":"flopsI8.d.ts","sourceRoot":"","sources":["../../src/benchmarks/flopsI8.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAyB,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAOlF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD,sGAAsG;AACtG,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAWlH;AAED,kHAAkH;AAClH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAWhH;AAED,oHAAoH;AACpH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAWhH;AAED,qHAAqH;AACrH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAWlH;AAED,qGAAqG;AACrG,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,UAAU,EACf,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,iBAAiB,CAAC,CAY5B;AAED,2KAA2K;AAC3K,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAYhH"}
@@ -1,5 +1,4 @@
1
1
  import { prepareFlopsBenchmark } from "./flopsCommon.js";
2
- import { OPS_METRIC } from "./common.js";
3
2
  import { flopsI8ScalarWgsl } from "../shaders/flopsI8Scalar.js";
4
3
  import { flopsI8Vec4Wgsl } from "../shaders/flopsI8Vec4.js";
5
4
  import { flopsI8Mat4Wgsl } from "../shaders/flopsI8Mat4.js";
@@ -10,34 +9,25 @@ import { flopsI8MatvecDp4aWgsl } from "../shaders/flopsI8MatvecDp4a.js";
10
9
  export function prepareFlopsI8Scalar(ctx, harness = {}) {
11
10
  return prepareFlopsBenchmark(ctx, {
12
11
  id: 'flops-i8-scalar',
13
- label: 'int8-range scalar FMA FLOPS',
14
- description: 'Same eight independent, 4x-unrolled multiply-add chains as the fp32 scalar test, but on i32 (WGSL has no first-class i8 type). Measures integer multiply-add throughput; overflow wraps.',
15
12
  wgsl: flopsI8ScalarWgsl,
16
- metric: OPS_METRIC,
17
13
  flopsPerIteration: 64,
18
14
  defaultIterations: 256,
19
15
  }, harness);
20
16
  }
21
- /** int8-range vec4 FLOPS: one integer FMA chain on a vec4<i32> register (4 independent lanes). */
17
+ /** int8-range vec4 FLOPS: eight independent vec4<i32> multiply-add chains, unrolled 4x (same shape as scalar). */
22
18
  export function prepareFlopsI8Vec4(ctx, harness = {}) {
23
19
  return prepareFlopsBenchmark(ctx, {
24
20
  id: 'flops-i8-vec4',
25
- label: 'int8-range vec4 FLOPS',
26
- description: 'Same single multiply-add chain as the fp32 vec4 test, but held in a vec4<i32> register: 4 independent integer lanes per step.',
27
21
  wgsl: flopsI8Vec4Wgsl,
28
- metric: OPS_METRIC,
29
- flopsPerIteration: 8,
30
- defaultIterations: 1024,
22
+ flopsPerIteration: 256,
23
+ defaultIterations: 256,
31
24
  }, harness);
32
25
  }
33
26
  /** int8-range mat4 FLOPS: a 4x4 integer matvec emulated via four dot(vec4<i32>) calls (WGSL has no mat4x4<i32>). */
34
27
  export function prepareFlopsI8Mat4(ctx, harness = {}) {
35
28
  return prepareFlopsBenchmark(ctx, {
36
29
  id: 'flops-i8-mat4',
37
- label: 'int8-range mat4 FLOPS',
38
- description: 'x = m * x + c chained in a register, where m is a 4x4 integer matrix emulated as four vec4<i32> rows combined with dot() (WGSL has no mat4x4<i32>): the same 4 dot products a real int4x4 multiply compiles to.',
39
30
  wgsl: flopsI8Mat4Wgsl,
40
- metric: OPS_METRIC,
41
31
  flopsPerIteration: 32,
42
32
  defaultIterations: 1024,
43
33
  }, harness);
@@ -46,10 +36,7 @@ export function prepareFlopsI8Mat4(ctx, harness = {}) {
46
36
  export function prepareFlopsI8Matvec(ctx, harness = {}) {
47
37
  return prepareFlopsBenchmark(ctx, {
48
38
  id: 'flops-i8-matvec',
49
- label: 'int8 matvec FLOPS (i32 dot)',
50
- description: 'Same register-resident 4x8 matvec tile as the fp32 matvec test, with int8-range weights and inputs held unpacked as vec4<i32> and accumulated with integer dot(). The no-extension int8 path: what dot4I8Packed is competing against.',
51
39
  wgsl: flopsI8MatvecWgsl,
52
- metric: OPS_METRIC,
53
40
  flopsPerIteration: 64,
54
41
  defaultIterations: 512,
55
42
  }, harness);
@@ -58,25 +45,19 @@ export function prepareFlopsI8Matvec(ctx, harness = {}) {
58
45
  export function prepareFlopsI8MatvecDp4a(ctx, harness = {}) {
59
46
  return prepareFlopsBenchmark(ctx, {
60
47
  id: 'flops-i8-matvec-dp4a',
61
- label: 'int8 matvec FLOPS (dot4I8Packed)',
62
- description: "Same 4x8 matvec tile, but weights and inputs stay packed four int8 lanes per u32 and each 4-wide dot product is one dot4I8Packed call from the packed_4x8_integer_dot_product extension. On GPUs without a native dp4a instruction this runs the extension's polyfill.",
63
48
  wgsl: flopsI8MatvecDp4aWgsl,
64
- metric: OPS_METRIC,
65
49
  flopsPerIteration: 64,
66
50
  defaultIterations: 512,
67
51
  requiresI8Dot: true,
68
52
  }, harness);
69
53
  }
70
- /** int8 packed-dot-product FLOPS: dot4I8Packed from the packed_4x8_integer_dot_product extension, run in a tight accumulation loop. */
54
+ /** int8 packed-dot-product FLOPS: dot4I8Packed from the packed_4x8_integer_dot_product extension, run in a tight accumulation loop over eight independent accumulators. */
71
55
  export function prepareFlopsI8Dp4a(ctx, harness = {}) {
72
56
  return prepareFlopsBenchmark(ctx, {
73
57
  id: 'flops-i8-dp4a',
74
- label: 'int8 dot4I8Packed FLOPS',
75
- description: "One thread per lane, accumulating dot4I8Packed(a, b) — the packed_4x8_integer_dot_product extension's 4-wide int8 dot-product instruction — in a tight loop to measure its peak throughput in isolation.",
76
58
  wgsl: flopsI8Dp4aWgsl,
77
- metric: OPS_METRIC,
78
- flopsPerIteration: 8,
79
- defaultIterations: 1024,
59
+ flopsPerIteration: 64,
60
+ defaultIterations: 256,
80
61
  requiresI8Dot: true,
81
62
  }, harness);
82
63
  }
@@ -1 +1 @@
1
- {"version":3,"file":"flopsI8.js","sourceRoot":"","sources":["../../src/benchmarks/flopsI8.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"flopsI8.js","sourceRoot":"","sources":["../../src/benchmarks/flopsI8.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAA2B,MAAM,kBAAkB,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAGxE,sGAAsG;AACtG,MAAM,UAAU,oBAAoB,CAAC,GAAe,EAAE,UAA8B,EAAE;IACpF,OAAO,qBAAqB,CAC1B,GAAG,EACH;QACE,EAAE,EAAE,iBAAiB;QACrB,IAAI,EAAE,iBAAiB;QACvB,iBAAiB,EAAE,EAAE;QACrB,iBAAiB,EAAE,GAAG;KACvB,EACD,OAAO,CACR,CAAC;AACJ,CAAC;AAED,kHAAkH;AAClH,MAAM,UAAU,kBAAkB,CAAC,GAAe,EAAE,UAA8B,EAAE;IAClF,OAAO,qBAAqB,CAC1B,GAAG,EACH;QACE,EAAE,EAAE,eAAe;QACnB,IAAI,EAAE,eAAe;QACrB,iBAAiB,EAAE,GAAG;QACtB,iBAAiB,EAAE,GAAG;KACvB,EACD,OAAO,CACR,CAAC;AACJ,CAAC;AAED,oHAAoH;AACpH,MAAM,UAAU,kBAAkB,CAAC,GAAe,EAAE,UAA8B,EAAE;IAClF,OAAO,qBAAqB,CAC1B,GAAG,EACH;QACE,EAAE,EAAE,eAAe;QACnB,IAAI,EAAE,eAAe;QACrB,iBAAiB,EAAE,EAAE;QACrB,iBAAiB,EAAE,IAAI;KACxB,EACD,OAAO,CACR,CAAC;AACJ,CAAC;AAED,qHAAqH;AACrH,MAAM,UAAU,oBAAoB,CAAC,GAAe,EAAE,UAA8B,EAAE;IACpF,OAAO,qBAAqB,CAC1B,GAAG,EACH;QACE,EAAE,EAAE,iBAAiB;QACrB,IAAI,EAAE,iBAAiB;QACvB,iBAAiB,EAAE,EAAE;QACrB,iBAAiB,EAAE,GAAG;KACvB,EACD,OAAO,CACR,CAAC;AACJ,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,wBAAwB,CACtC,GAAe,EACf,UAA8B,EAAE;IAEhC,OAAO,qBAAqB,CAC1B,GAAG,EACH;QACE,EAAE,EAAE,sBAAsB;QAC1B,IAAI,EAAE,qBAAqB;QAC3B,iBAAiB,EAAE,EAAE;QACrB,iBAAiB,EAAE,GAAG;QACtB,aAAa,EAAE,IAAI;KACpB,EACD,OAAO,CACR,CAAC;AACJ,CAAC;AAED,2KAA2K;AAC3K,MAAM,UAAU,kBAAkB,CAAC,GAAe,EAAE,UAA8B,EAAE;IAClF,OAAO,qBAAqB,CAC1B,GAAG,EACH;QACE,EAAE,EAAE,eAAe;QACnB,IAAI,EAAE,eAAe;QACrB,iBAAiB,EAAE,EAAE;QACrB,iBAAiB,EAAE,GAAG;QACtB,aAAa,EAAE,IAAI;KACpB,EACD,OAAO,CACR,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"flopsMath.d.ts","sourceRoot":"","sources":["../../src/benchmarks/flopsMath.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAyB,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AASlF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD;;;;;;;;;GASG;AAEH,gGAAgG;AAChG,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAchH;AAED,iGAAiG;AACjG,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAehH;AAED,4DAA4D;AAC5D,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAcjH;AAED,oEAAoE;AACpE,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAclH;AAED,0DAA0D;AAC1D,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAchH;AAED,6EAA6E;AAC7E,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAcnH;AAED,iEAAiE;AACjE,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAchH"}
1
+ {"version":3,"file":"flopsMath.d.ts","sourceRoot":"","sources":["../../src/benchmarks/flopsMath.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAyB,KAAK,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAQlF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErD;;;;;;;;;GASG;AAEH,gGAAgG;AAChG,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAWhH;AAED,iGAAiG;AACjG,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAWhH;AAED,4DAA4D;AAC5D,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAWjH;AAED,oEAAoE;AACpE,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAWlH;AAED,0DAA0D;AAC1D,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAWhH;AAED,6EAA6E;AAC7E,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAWnH;AAED,iEAAiE;AACjE,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,kBAAuB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAWhH"}