wgblas 1.2.1 → 2.0.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/LICENSE +1 -1
- package/README.md +36 -54
- package/dist/wgblas.browser.js +779 -34
- package/index.d.mts +13 -0
- package/index.mjs +8 -0
- package/package.json +55 -2
- package/src/dasum/dasum.d.mts +2 -2
- package/src/dasum/dasum.mjs +6 -4
- package/src/idamax/idamax.d.mts +51 -0
- package/src/idamax/idamax.mjs +128 -0
- package/src/init.mjs +9 -1
- package/src/isamax/isamax.d.mts +1 -1
- package/src/sasum/sasum.d.mts +1 -1
- package/src/saxpy/saxpy.d.mts +1 -1
- package/src/scopy/scopy.d.mts +1 -1
- package/src/sdot/sdot.d.mts +1 -1
- package/src/sgemm/sgemm.d.mts +102 -0
- package/src/sgemm/sgemm.mjs +195 -0
- package/src/sgemmtr/sgemmtr.d.mts +104 -0
- package/src/sgemmtr/sgemmtr.mjs +203 -0
- package/src/sgemv/sgemv.d.mts +1 -38
- package/src/sgemv/sgemv.mjs +4 -0
- package/src/sger/sger.d.mts +1 -34
- package/src/sger/sger.mjs +2 -0
- package/src/shaders/block_transfer.wgsl +42 -0
- package/src/shaders/browser-shaders.mjs +26 -0
- package/src/shaders/dasum.wgsl +3 -2
- package/src/shaders/f64/dekker.wgsl +4 -85
- package/src/shaders/f64/utils/abs.wgsl +10 -0
- package/src/shaders/f64/utils/add.wgsl +77 -0
- package/src/shaders/f64/utils/equal.wgsl +7 -0
- package/src/shaders/f64/utils/greater.wgsl +12 -0
- package/src/shaders/f64/utils/multiply.wgsl +81 -0
- package/src/shaders/idamax.wgsl +96 -0
- package/src/shaders/reduction/argmaxF64.wgsl +50 -0
- package/src/shaders/reduction/sumF64.wgsl +2 -2
- package/src/shaders/sgemm_large.wgsl +117 -0
- package/src/shaders/sgemm_small.wgsl +112 -0
- package/src/shaders/sgemmtr_large.wgsl +117 -0
- package/src/shaders/sgemmtr_small.wgsl +110 -0
- package/src/shaders/symmetrize.wgsl +31 -0
- package/src/shaders/triangularize.wgsl +44 -0
- package/src/snrm2/snrm2.d.mts +1 -1
- package/src/srot/srot.d.mts +1 -1
- package/src/srotm/srotm.d.mts +1 -1
- package/src/sscal/sscal.d.mts +1 -1
- package/src/sswap/sswap.d.mts +1 -1
- package/src/ssymm/ssymm.d.mts +103 -0
- package/src/ssymm/ssymm.mjs +209 -0
- package/src/ssymv/ssymv.d.mts +1 -36
- package/src/ssymv/ssymv.mjs +2 -0
- package/src/ssyr/ssyr.d.mts +1 -30
- package/src/ssyr/ssyr.mjs +2 -0
- package/src/ssyr2/ssyr2.d.mts +1 -34
- package/src/ssyr2/ssyr2.mjs +2 -0
- package/src/ssyr2k/ssyr2k.d.mts +100 -0
- package/src/ssyr2k/ssyr2k.mjs +201 -0
- package/src/ssyrk/ssyrk.d.mts +90 -0
- package/src/ssyrk/ssyrk.mjs +176 -0
- package/src/strmm/strmm.d.mts +100 -0
- package/src/strmm/strmm.mjs +211 -0
- package/src/strmv/strmv.d.mts +1 -36
- package/src/strmv/strmv.mjs +2 -0
- package/src/strsm/strsm.d.mts +99 -0
- package/src/strsm/strsm.mjs +342 -0
- package/src/strsv/strsv.d.mts +1 -32
- package/src/strsv/strsv.mjs +2 -0
- package/src/util/buffer.mjs +4 -2
- package/src/util/compute.mjs +6 -3
- package/src/util/f64.mjs +3 -3
package/dist/wgblas.browser.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var wgblas=(()=>{var
|
|
1
|
+
var wgblas=(()=>{var Do=Object.create;var Ur=Object.defineProperty;var Ro=Object.getOwnPropertyDescriptor;var To=Object.getOwnPropertyNames;var jo=Object.getPrototypeOf,Co=Object.prototype.hasOwnProperty;var Or=(a=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(a,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):a)(function(a){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+a+'" is not supported')});var O=(a,e,r)=>()=>{if(r)throw r[0];try{return a&&(e=a(a=0)),e}catch(o){throw r=[o],o}};var te=(a,e)=>{for(var r in e)Ur(a,r,{get:e[r],enumerable:!0})},oe=(a,e,r,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of To(e))!Co.call(a,t)&&t!==r&&Ur(a,t,{get:()=>e[t],enumerable:!(o=Ro(e,t))||o.enumerable});return a};var Vr=(a,e,r)=>(r=a!=null?Do(jo(a)):{},oe(e||!a||!a.__esModule?Ur(r,"default",{value:a,enumerable:!0}):r,a)),Wo=a=>oe(Ur({},"__esModule",{value:!0}),a);var we,pe=O(()=>{we=`// amax reduction: collapses 2*WGS (value, index) pairs into one index.
|
|
2
2
|
// dispatch: 1 workgroup of WGS threads.
|
|
3
3
|
// partials_val and partials_idx must have exactly 2*WGS entries.
|
|
4
4
|
|
|
@@ -41,7 +41,57 @@ fn reduce(
|
|
|
41
41
|
|
|
42
42
|
if (i == 0u) { result[0] = tile_idx[0]; }
|
|
43
43
|
}
|
|
44
|
-
`});var
|
|
44
|
+
`});var be,ge=O(()=>{be=`// amax reduction (f64, double-double): collapses 2*WGS (value, index) pairs
|
|
45
|
+
// into one index, using ddGreater/ddEqual instead of plain f32 \`>\`/\`==\` (see
|
|
46
|
+
// reduction/argmax.wgsl for the f32 original this mirrors).
|
|
47
|
+
// dispatch: 1 workgroup of WGS threads. partialsValHi/partialsValLo/
|
|
48
|
+
// partialsIdx must have exactly 2*WGS entries each. Concatenated after
|
|
49
|
+
// f64/dekker.wgsl (DD struct), f64/utils/greater.wgsl (ddGreater), and
|
|
50
|
+
// f64/utils/equal.wgsl (ddEqual).
|
|
51
|
+
|
|
52
|
+
@group(0) @binding(0) var<storage, read> partialsValHi: array<f32>;
|
|
53
|
+
@group(0) @binding(1) var<storage, read> partialsValLo: array<f32>;
|
|
54
|
+
@group(0) @binding(2) var<storage, read> partialsIdx: array<u32>;
|
|
55
|
+
@group(0) @binding(3) var<storage, read_write> result: array<u32>;
|
|
56
|
+
|
|
57
|
+
const WGS: u32 = 64;
|
|
58
|
+
|
|
59
|
+
var<workgroup> tile_val: array<DD, 64>;
|
|
60
|
+
var<workgroup> tile_idx: array<u32, 64>;
|
|
61
|
+
|
|
62
|
+
@compute @workgroup_size(64)
|
|
63
|
+
fn reduce_f64(
|
|
64
|
+
@builtin(local_invocation_id) lid: vec3u,
|
|
65
|
+
) {
|
|
66
|
+
let i = lid.x;
|
|
67
|
+
let a_val = DD(partialsValHi[i], partialsValLo[i]);
|
|
68
|
+
let b_val = DD(partialsValHi[i + WGS], partialsValLo[i + WGS]);
|
|
69
|
+
if (ddGreater(b_val, a_val) ||
|
|
70
|
+
(ddEqual(b_val, a_val) && partialsIdx[i + WGS] < partialsIdx[i])) {
|
|
71
|
+
tile_val[i] = b_val;
|
|
72
|
+
tile_idx[i] = partialsIdx[i + WGS];
|
|
73
|
+
} else {
|
|
74
|
+
tile_val[i] = a_val;
|
|
75
|
+
tile_idx[i] = partialsIdx[i];
|
|
76
|
+
}
|
|
77
|
+
workgroupBarrier();
|
|
78
|
+
|
|
79
|
+
for (var s = WGS / 2u; s > 0u; s >>= 1u) {
|
|
80
|
+
if (i < s) {
|
|
81
|
+
let c_val = tile_val[i];
|
|
82
|
+
let d_val = tile_val[i + s];
|
|
83
|
+
if (ddGreater(d_val, c_val) ||
|
|
84
|
+
(ddEqual(d_val, c_val) && tile_idx[i + s] < tile_idx[i])) {
|
|
85
|
+
tile_val[i] = d_val;
|
|
86
|
+
tile_idx[i] = tile_idx[i + s];
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
workgroupBarrier();
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (i == 0u) { result[0] = tile_idx[0]; }
|
|
93
|
+
}
|
|
94
|
+
`});var xe,he=O(()=>{xe=`// sum reduction: collapses 2*WGS partials into one scalar.
|
|
45
95
|
// dispatch: 1 workgroup of WGS threads.
|
|
46
96
|
// partials must have exactly 2*WGS entries.
|
|
47
97
|
|
|
@@ -67,12 +117,12 @@ fn reduce(
|
|
|
67
117
|
|
|
68
118
|
if (i == 0u) { result[0] = tile[0]; }
|
|
69
119
|
}
|
|
70
|
-
`});var
|
|
120
|
+
`});var ye,ve=O(()=>{ye=`// sum reduction (f64, double-double): collapses 2*WGS partial (hi, lo) pairs
|
|
71
121
|
// into one, using ddAddProtected instead of plain f32 \`+\` (see
|
|
72
122
|
// reduction/sum.wgsl for the f32 original this mirrors).
|
|
73
123
|
// dispatch: 1 workgroup of WGS threads. partialsHi/partialsLo must have
|
|
74
|
-
// exactly 2*WGS entries each. Concatenated after f64/dekker.wgsl
|
|
75
|
-
//
|
|
124
|
+
// exactly 2*WGS entries each. Concatenated after f64/dekker.wgsl (DD struct)
|
|
125
|
+
// and f64/utils/add.wgsl (ddAddProtected \u2014 see it for why plain ddAdd isn't safe).
|
|
76
126
|
|
|
77
127
|
@group(0) @binding(0) var<storage, read> partialsHi: array<f32>;
|
|
78
128
|
@group(0) @binding(1) var<storage, read> partialsLo: array<f32>;
|
|
@@ -107,7 +157,7 @@ fn reduce_f64(
|
|
|
107
157
|
resultLo[0] = tile[0].lo;
|
|
108
158
|
}
|
|
109
159
|
}
|
|
110
|
-
`});var
|
|
160
|
+
`});var Be,_e=O(()=>{Be=`// sscal: x = alpha * x
|
|
111
161
|
|
|
112
162
|
@group(0) @binding(0) var<storage, read_write> x: array<f32>;
|
|
113
163
|
|
|
@@ -130,7 +180,7 @@ fn main(
|
|
|
130
180
|
x[id * params.x_inc] = params.alpha * x[id * params.x_inc];
|
|
131
181
|
}
|
|
132
182
|
}
|
|
133
|
-
`});var
|
|
183
|
+
`});var Ae,Ee=O(()=>{Ae=`// sswap: x <-> y
|
|
134
184
|
|
|
135
185
|
@group(0) @binding(0) var<storage, read_write> x: array<f32>;
|
|
136
186
|
@group(0) @binding(1) var<storage, read_write> y: array<f32>;
|
|
@@ -156,7 +206,7 @@ fn main(
|
|
|
156
206
|
y[id * params.y_inc] = temp;
|
|
157
207
|
}
|
|
158
208
|
}
|
|
159
|
-
`});var
|
|
209
|
+
`});var ke,Ge=O(()=>{ke=`// saxpy: y = alpha * x + y
|
|
160
210
|
|
|
161
211
|
@group(0) @binding(0) var<storage, read> x: array<f32>;
|
|
162
212
|
@group(0) @binding(1) var<storage, read_write> y: array<f32>;
|
|
@@ -181,7 +231,7 @@ fn main(
|
|
|
181
231
|
y[id * params.y_inc] = params.alpha * x[id * params.x_inc] + y[id * params.y_inc];
|
|
182
232
|
}
|
|
183
233
|
}
|
|
184
|
-
`});var
|
|
234
|
+
`});var Ne,Pe=O(()=>{Ne=`// scopy: y = x
|
|
185
235
|
|
|
186
236
|
@group(0) @binding(0) var<storage, read> x: array<f32>;
|
|
187
237
|
@group(0) @binding(1) var<storage, read_write> y: array<f32>;
|
|
@@ -205,7 +255,7 @@ fn main(
|
|
|
205
255
|
y[id * params.y_inc] = x[id * params.x_inc];
|
|
206
256
|
}
|
|
207
257
|
}
|
|
208
|
-
`});var
|
|
258
|
+
`});var Me,Se=O(()=>{Me=`// sdot: result = sum(x[i] * y[i])
|
|
209
259
|
// pass 1 dispatches exactly 2 * WGS workgroups; pass 2 uses reduction/sum.wgsl.
|
|
210
260
|
|
|
211
261
|
@group(0) @binding(0) var<storage, read> x: array<f32>;
|
|
@@ -258,7 +308,7 @@ fn main(
|
|
|
258
308
|
|
|
259
309
|
if (lid.x == 0u) { partials[wgid.x] = tile[0]; }
|
|
260
310
|
}
|
|
261
|
-
`});var
|
|
311
|
+
`});var Le,Ie=O(()=>{Le=`// sasum: result = sum(|x[i]|)
|
|
262
312
|
// pass 1 dispatches exactly 2 * WGS workgroups; pass 2 uses reduction/abssum.wgsl.
|
|
263
313
|
|
|
264
314
|
@group(0) @binding(0) var<storage, read> x: array<f32>;
|
|
@@ -309,7 +359,7 @@ fn main(
|
|
|
309
359
|
|
|
310
360
|
if (lid.x == 0u) { partials[wgid.x] = tile[0]; }
|
|
311
361
|
}
|
|
312
|
-
`});var
|
|
362
|
+
`});var Re,De=O(()=>{Re=`// snrm2: result = sqrt(sum(x[i] * x[i]))
|
|
313
363
|
// pass 1 dispatches exactly 2 * WGS workgroups; pass 2 uses reduction/sqsum.wgsl.
|
|
314
364
|
|
|
315
365
|
@group(0) @binding(0) var<storage, read> x: array<f32>;
|
|
@@ -365,7 +415,7 @@ fn main(
|
|
|
365
415
|
|
|
366
416
|
if (lid.x == 0u) { partials[wgid.x] = tile[0]; }
|
|
367
417
|
}
|
|
368
|
-
`});var
|
|
418
|
+
`});var je,Te=O(()=>{je=`// srot: x = c*x + s*y, y = -s*x + c*y
|
|
369
419
|
|
|
370
420
|
@group(0) @binding(0) var<storage, read_write> x: array<f32>;
|
|
371
421
|
@group(0) @binding(1) var<storage, read_write> y: array<f32>;
|
|
@@ -394,7 +444,7 @@ fn main(
|
|
|
394
444
|
y[id * params.y_inc] = -params.s * xi + params.c * yi;
|
|
395
445
|
}
|
|
396
446
|
}
|
|
397
|
-
`});var
|
|
447
|
+
`});var We,Ce=O(()=>{We=`// srotm: applies modified Givens rotation H to vectors x and y.
|
|
398
448
|
// param[0] = flag: -1 (full H), 0 (unit diagonal), 1 (unit off-diagonal)
|
|
399
449
|
// param = [ flag, h11, h21, h12, h22 ]
|
|
400
450
|
// flag == -2 (identity/no-op) is handled in JS before dispatch reaches here.
|
|
@@ -444,7 +494,7 @@ fn main(
|
|
|
444
494
|
y[id * params.y_inc] = h21 * xi + h22 * yi;
|
|
445
495
|
}
|
|
446
496
|
}
|
|
447
|
-
`});var
|
|
497
|
+
`});var He,Fe=O(()=>{He=`// isamax: returns index of element with largest absolute value
|
|
448
498
|
// pass 1 dispatches exactly 2 * WGS workgroups; pass 2 uses reduction/argmax.wgsl.
|
|
449
499
|
|
|
450
500
|
@group(0) @binding(0) var<storage, read> x: array<f32>;
|
|
@@ -526,7 +576,7 @@ fn main(
|
|
|
526
576
|
partials_idx[wgid.x] = tile_idx[0];
|
|
527
577
|
}
|
|
528
578
|
}
|
|
529
|
-
`});var
|
|
579
|
+
`});var Oe,Ue=O(()=>{Oe=`// sgemv_n: y = alpha * A * x + beta * y (A is m\xD7n row-major, no-transpose)
|
|
530
580
|
//
|
|
531
581
|
// One workgroup per output row, with a grid-stride outer loop so the shader
|
|
532
582
|
// still covers all rows when m exceeds maxComputeWorkgroupsPerDimension.
|
|
@@ -601,7 +651,7 @@ fn main(
|
|
|
601
651
|
workgroupBarrier();
|
|
602
652
|
}
|
|
603
653
|
}
|
|
604
|
-
`});var
|
|
654
|
+
`});var Ke,Ve=O(()=>{Ke=`// sgemv_t: y = alpha * A^T * x + beta * y (A is m\xD7n row-major, transposed)
|
|
605
655
|
// each thread owns one column of A \u2192 one element of y (length n)
|
|
606
656
|
// tiles over x (length m) using shared memory; four independent accumulators
|
|
607
657
|
// let the GPU pipeline A reads across j within each tile (ILP=4)
|
|
@@ -666,7 +716,7 @@ fn main(
|
|
|
666
716
|
y[yi] = params.alpha * (acc0 + acc1 + acc2 + acc3) + params.beta * y[yi];
|
|
667
717
|
}
|
|
668
718
|
}
|
|
669
|
-
`});var
|
|
719
|
+
`});var qe,ze=O(()=>{qe=`// ssymv: y = alpha * A * x + beta * y
|
|
670
720
|
// A is n\xD7n symmetric, lower (uplo=0) or upper (uplo=1) triangle stored.
|
|
671
721
|
// The logical matrix is fully dense (symmetric), so each row's dot product
|
|
672
722
|
// sums over all n columns; entries on the unstored side of the diagonal are
|
|
@@ -735,7 +785,7 @@ fn main(
|
|
|
735
785
|
}
|
|
736
786
|
}
|
|
737
787
|
}
|
|
738
|
-
`});var
|
|
788
|
+
`});var Xe,Ye=O(()=>{Xe=`// strmv: y = op(A) * x
|
|
739
789
|
// A is n\xD7n triangular, lower (uplo=0) or upper (uplo=1) triangle stored.
|
|
740
790
|
// op(A) is A (trans=0) or A^T (trans=1).
|
|
741
791
|
// diag=1 (unit) treats the diagonal as 1 without reading A's diagonal values.
|
|
@@ -838,7 +888,7 @@ fn main(
|
|
|
838
888
|
}
|
|
839
889
|
}
|
|
840
890
|
}
|
|
841
|
-
`});var
|
|
891
|
+
`});var Ze,Qe=O(()=>{Ze=`// sger: A := alpha * x * y^T + A (rank-1 update, A is m\xD7n general/dense)
|
|
842
892
|
|
|
843
893
|
@group(0) @binding(0) var<storage, read> x: array<f32>;
|
|
844
894
|
@group(0) @binding(1) var<storage, read> y: array<f32>;
|
|
@@ -886,7 +936,7 @@ fn main(
|
|
|
886
936
|
}
|
|
887
937
|
}
|
|
888
938
|
}
|
|
889
|
-
`});var
|
|
939
|
+
`});var Je,$e=O(()=>{Je=`// ssyr: A := alpha * x * x^T + A (symmetric rank-1 update)
|
|
890
940
|
// A is n\xD7n symmetric; only the triangle specified by uplo is referenced/updated,
|
|
891
941
|
// the other triangle is implied by symmetry (not touched).
|
|
892
942
|
|
|
@@ -946,7 +996,7 @@ fn main(
|
|
|
946
996
|
}
|
|
947
997
|
}
|
|
948
998
|
}
|
|
949
|
-
`});var
|
|
999
|
+
`});var et,rt=O(()=>{et=`// ssyr2: A := alpha * x * y^T + alpha * y * x^T + A (symmetric rank-2 update)
|
|
950
1000
|
// A is n\xD7n symmetric; only the triangle specified by uplo is referenced/updated,
|
|
951
1001
|
// the other triangle is implied by symmetry (not touched).
|
|
952
1002
|
|
|
@@ -1009,7 +1059,7 @@ fn main(
|
|
|
1009
1059
|
}
|
|
1010
1060
|
}
|
|
1011
1061
|
}
|
|
1012
|
-
`});var
|
|
1062
|
+
`});var ot,tt=O(()=>{ot=`// f64add: adds two doubles, each packed as a [main, aux] pair (main: f32
|
|
1013
1063
|
// value, aux: raw u32 bits \u2014 see src/util/f64pack.mjs; decode()/encode()
|
|
1014
1064
|
// below are the WGSL mirror of that file's packedToFields()/fieldsToPacked()),
|
|
1015
1065
|
// producing the sum as another [main, aux] pair.
|
|
@@ -1290,7 +1340,7 @@ fn computeSum(a: Fields, b: Fields) -> Packed {
|
|
|
1290
1340
|
let f = addFields(a, b);
|
|
1291
1341
|
return encode(f.sign, f.rawExp, f.mantissaHi, f.lo);
|
|
1292
1342
|
}
|
|
1293
|
-
`});var
|
|
1343
|
+
`});var it,at=O(()=>{it=`// Double-double arithmetic via Dekker's algorithm \u2014 an alternative to
|
|
1294
1344
|
// f64add.wgsl's bit-exact IEEE-754 emulation. Doesn't touch that path.
|
|
1295
1345
|
//
|
|
1296
1346
|
// A double-double number is a pair (hi, lo) of f32 with hi+lo approximating
|
|
@@ -1299,11 +1349,16 @@ fn computeSum(a: Fields, b: Fields) -> Packed {
|
|
|
1299
1349
|
//
|
|
1300
1350
|
// No bindings, no entry point \u2014 a helper library, concatenated with a
|
|
1301
1351
|
// consumer's own bindings/entry point by getPipeline (WGSL has no #include).
|
|
1352
|
+
// The DD struct lives here \u2014 abs.wgsl/add.wgsl/greater.wgsl/equal.wgsl all
|
|
1353
|
+
// use it but don't redefine it (WGSL errors on duplicate struct definitions
|
|
1354
|
+
// once concatenated), so any consumer using those must concatenate this
|
|
1355
|
+
// file too, first.
|
|
1302
1356
|
|
|
1303
1357
|
struct DD {
|
|
1304
1358
|
hi: f32,
|
|
1305
1359
|
lo: f32,
|
|
1306
1360
|
}
|
|
1361
|
+
`});var nt,st=O(()=>{nt=`// Requires f64/dekker.wgsl concatenated first for the DD struct.
|
|
1307
1362
|
|
|
1308
1363
|
// |a| for a double-double pair. Negation is exact (no rounding), so this is
|
|
1309
1364
|
// just a sign flip on both components \u2014 hi alone determines the pair's sign.
|
|
@@ -1313,6 +1368,7 @@ fn ddAbs(a: DD) -> DD {
|
|
|
1313
1368
|
}
|
|
1314
1369
|
return a;
|
|
1315
1370
|
}
|
|
1371
|
+
`});var lt,ut=O(()=>{lt=`// Requires f64/dekker.wgsl concatenated first for the DD struct.
|
|
1316
1372
|
|
|
1317
1373
|
// \u2500\u2500 A real compiler bug \u2014 read before touching anything below \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
1318
1374
|
//
|
|
@@ -1389,9 +1445,29 @@ fn ddAddProtected(a: DD, b: DD, threadSlot: u32) -> DD {
|
|
|
1389
1445
|
let loSum = a.lo + b.lo;
|
|
1390
1446
|
return fastTwoSumProtected(s.hi, s.lo + loSum, threadSlot);
|
|
1391
1447
|
}
|
|
1392
|
-
`});var
|
|
1393
|
-
|
|
1394
|
-
//
|
|
1448
|
+
`});var mt,ft=O(()=>{mt=`// Requires f64/dekker.wgsl concatenated first for the DD struct.
|
|
1449
|
+
|
|
1450
|
+
// a > b for double-double pairs. hi dominates (|lo| <= ulp(hi)/2 always), so
|
|
1451
|
+
// comparing hi alone is correct except on an exact hi tie, when lo breaks it.
|
|
1452
|
+
// A plain comparison, not a rounding-identity subtraction \u2014 no reassociation
|
|
1453
|
+
// risk, so unlike twoSum/fastTwoSum this needs no protection.
|
|
1454
|
+
fn ddGreater(a: DD, b: DD) -> bool {
|
|
1455
|
+
if (a.hi != b.hi) {
|
|
1456
|
+
return a.hi > b.hi;
|
|
1457
|
+
}
|
|
1458
|
+
return a.lo > b.lo;
|
|
1459
|
+
}
|
|
1460
|
+
`});var dt,ct=O(()=>{dt=`// Requires f64/dekker.wgsl concatenated first for the DD struct.
|
|
1461
|
+
|
|
1462
|
+
// a == b for double-double pairs \u2014 exact field equality, no rounding
|
|
1463
|
+
// involved, so (like ddGreater) this needs no protection.
|
|
1464
|
+
fn ddEqual(a: DD, b: DD) -> bool {
|
|
1465
|
+
return a.hi == b.hi && a.lo == b.lo;
|
|
1466
|
+
}
|
|
1467
|
+
`});var wt,pt=O(()=>{wt=`// dasum: sum(|x[i]|), double-double (Dekker). Same ILP=4 shape as sasum.wgsl;
|
|
1468
|
+
// see f64/utils/add.wgsl for ddAddProtected and why plain ddAdd isn't safe.
|
|
1469
|
+
// GpuVector input isn't pre-abs'd, so ddAbs() (f64/utils/abs.wgsl) applies
|
|
1470
|
+
// unconditionally below.
|
|
1395
1471
|
|
|
1396
1472
|
@group(0) @binding(0) var<storage, read> xHi: array<f32>;
|
|
1397
1473
|
@group(0) @binding(1) var<storage, read> xLo: array<f32>;
|
|
@@ -1473,7 +1549,103 @@ fn dasum_main(
|
|
|
1473
1549
|
partialsLo[wgid.x] = tile[0].lo;
|
|
1474
1550
|
}
|
|
1475
1551
|
}
|
|
1476
|
-
`});var
|
|
1552
|
+
`});var bt,gt=O(()=>{bt=`// idamax: returns index of element with largest absolute value (f64, double-double)
|
|
1553
|
+
// pass 1 dispatches exactly 2 * WGS workgroups; pass 2 uses reduction/argmaxF64.wgsl.
|
|
1554
|
+
// Concatenated after f64/dekker.wgsl (DD struct), f64/utils/abs.wgsl (ddAbs),
|
|
1555
|
+
// f64/utils/greater.wgsl (ddGreater), and f64/utils/equal.wgsl (ddEqual).
|
|
1556
|
+
|
|
1557
|
+
@group(0) @binding(0) var<storage, read> xHi: array<f32>;
|
|
1558
|
+
@group(0) @binding(1) var<storage, read> xLo: array<f32>;
|
|
1559
|
+
@group(0) @binding(2) var<storage, read_write> partialsValHi: array<f32>;
|
|
1560
|
+
@group(0) @binding(3) var<storage, read_write> partialsValLo: array<f32>;
|
|
1561
|
+
@group(0) @binding(4) var<storage, read_write> partialsIdx: array<u32>;
|
|
1562
|
+
@group(0) @binding(5) var<uniform> params: Params;
|
|
1563
|
+
|
|
1564
|
+
struct Params {
|
|
1565
|
+
n: u32,
|
|
1566
|
+
x_inc: u32,
|
|
1567
|
+
}
|
|
1568
|
+
|
|
1569
|
+
const WGS: u32 = 64;
|
|
1570
|
+
|
|
1571
|
+
var<workgroup> tile_val: array<DD, 64>;
|
|
1572
|
+
var<workgroup> tile_idx: array<u32, 64>;
|
|
1573
|
+
|
|
1574
|
+
@compute @workgroup_size(64)
|
|
1575
|
+
fn idamax_main(
|
|
1576
|
+
@builtin(global_invocation_id) gid: vec3u,
|
|
1577
|
+
@builtin(local_invocation_id) lid: vec3u,
|
|
1578
|
+
@builtin(workgroup_id) wgid: vec3u,
|
|
1579
|
+
@builtin(num_workgroups) num_wg: vec3u,
|
|
1580
|
+
) {
|
|
1581
|
+
// DD(-1.0, 0.0) is a safe sentinel: any |x[i]| >= 0 beats it,
|
|
1582
|
+
// so workgroups with no elements lose gracefully in the epilogue.
|
|
1583
|
+
var best_val0 = DD(-1.0, 0.0); var best_idx0: u32 = 0u;
|
|
1584
|
+
var best_val1 = DD(-1.0, 0.0); var best_idx1: u32 = 0u;
|
|
1585
|
+
var best_val2 = DD(-1.0, 0.0); var best_idx2: u32 = 0u;
|
|
1586
|
+
var best_val3 = DD(-1.0, 0.0); var best_idx3: u32 = 0u;
|
|
1587
|
+
|
|
1588
|
+
let stride = num_wg.x * WGS;
|
|
1589
|
+
let n4_floor = (params.n / (4u * stride)) * (4u * stride);
|
|
1590
|
+
|
|
1591
|
+
for (var id = gid.x; id < n4_floor; id += 4u * stride) {
|
|
1592
|
+
let i0 = id * params.x_inc;
|
|
1593
|
+
let i1 = (id + stride) * params.x_inc;
|
|
1594
|
+
let i2 = (id + 2u * stride) * params.x_inc;
|
|
1595
|
+
let i3 = (id + 3u * stride) * params.x_inc;
|
|
1596
|
+
let v0 = ddAbs(DD(xHi[i0], xLo[i0]));
|
|
1597
|
+
let v1 = ddAbs(DD(xHi[i1], xLo[i1]));
|
|
1598
|
+
let v2 = ddAbs(DD(xHi[i2], xLo[i2]));
|
|
1599
|
+
let v3 = ddAbs(DD(xHi[i3], xLo[i3]));
|
|
1600
|
+
if (ddGreater(v0, best_val0)) { best_val0 = v0; best_idx0 = id; }
|
|
1601
|
+
if (ddGreater(v1, best_val1)) { best_val1 = v1; best_idx1 = id + stride; }
|
|
1602
|
+
if (ddGreater(v2, best_val2)) { best_val2 = v2; best_idx2 = id + 2u * stride; }
|
|
1603
|
+
if (ddGreater(v3, best_val3)) { best_val3 = v3; best_idx3 = id + 3u * stride; }
|
|
1604
|
+
}
|
|
1605
|
+
for (var id = n4_floor + gid.x; id < params.n; id += stride) {
|
|
1606
|
+
let i = id * params.x_inc;
|
|
1607
|
+
let v = ddAbs(DD(xHi[i], xLo[i]));
|
|
1608
|
+
if (ddGreater(v, best_val0)) { best_val0 = v; best_idx0 = id; }
|
|
1609
|
+
}
|
|
1610
|
+
|
|
1611
|
+
// merge 4 independent lanes; prefer lower index on tie (first occurrence wins)
|
|
1612
|
+
if (ddGreater(best_val1, best_val0) ||
|
|
1613
|
+
(ddEqual(best_val1, best_val0) && best_idx1 < best_idx0)) {
|
|
1614
|
+
best_val0 = best_val1; best_idx0 = best_idx1;
|
|
1615
|
+
}
|
|
1616
|
+
if (ddGreater(best_val2, best_val0) ||
|
|
1617
|
+
(ddEqual(best_val2, best_val0) && best_idx2 < best_idx0)) {
|
|
1618
|
+
best_val0 = best_val2; best_idx0 = best_idx2;
|
|
1619
|
+
}
|
|
1620
|
+
if (ddGreater(best_val3, best_val0) ||
|
|
1621
|
+
(ddEqual(best_val3, best_val0) && best_idx3 < best_idx0)) {
|
|
1622
|
+
best_val0 = best_val3; best_idx0 = best_idx3;
|
|
1623
|
+
}
|
|
1624
|
+
|
|
1625
|
+
tile_val[lid.x] = best_val0;
|
|
1626
|
+
tile_idx[lid.x] = best_idx0;
|
|
1627
|
+
workgroupBarrier();
|
|
1628
|
+
|
|
1629
|
+
for (var s = WGS / 2u; s > 0u; s >>= 1u) {
|
|
1630
|
+
if (lid.x < s) {
|
|
1631
|
+
let a_val = tile_val[lid.x];
|
|
1632
|
+
let b_val = tile_val[lid.x + s];
|
|
1633
|
+
if (ddGreater(b_val, a_val) ||
|
|
1634
|
+
(ddEqual(b_val, a_val) && tile_idx[lid.x + s] < tile_idx[lid.x])) {
|
|
1635
|
+
tile_val[lid.x] = b_val;
|
|
1636
|
+
tile_idx[lid.x] = tile_idx[lid.x + s];
|
|
1637
|
+
}
|
|
1638
|
+
}
|
|
1639
|
+
workgroupBarrier();
|
|
1640
|
+
}
|
|
1641
|
+
|
|
1642
|
+
if (lid.x == 0u) {
|
|
1643
|
+
partialsValHi[wgid.x] = tile_val[0].hi;
|
|
1644
|
+
partialsValLo[wgid.x] = tile_val[0].lo;
|
|
1645
|
+
partialsIdx[wgid.x] = tile_idx[0];
|
|
1646
|
+
}
|
|
1647
|
+
}
|
|
1648
|
+
`});var xt,ht=O(()=>{xt=`// strsv_invert_block: computes ONE column (workgroup_id.x) of ONE block's
|
|
1477
1649
|
// (workgroup_id.y) explicit inverse, via the same one-row-at-a-time
|
|
1478
1650
|
// substitution as strsv_block.wgsl, but solving against a unit basis vector
|
|
1479
1651
|
// e_col instead of the real right-hand side, and writing to a dense
|
|
@@ -1582,7 +1754,7 @@ fn strsv_invert_block_main(
|
|
|
1582
1754
|
workgroupBarrier();
|
|
1583
1755
|
}
|
|
1584
1756
|
}
|
|
1585
|
-
`});var
|
|
1757
|
+
`});var yt,vt=O(()=>{yt=`// strsv_apply_inverse: given a precomputed block inverse (from
|
|
1586
1758
|
// strsv_invert_block.wgsl), computes this block's solution as a dense
|
|
1587
1759
|
// matrix-vector multiply against the block's current remainder in x \u2014
|
|
1588
1760
|
// replacing what the old strsv_block.wgsl did via a genuinely sequential,
|
|
@@ -1629,7 +1801,7 @@ fn strsv_apply_inverse_main(@builtin(local_invocation_id) lid: vec3u) {
|
|
|
1629
1801
|
}
|
|
1630
1802
|
x[(params.blockStart + lid.x) * params.incx] = acc;
|
|
1631
1803
|
}
|
|
1632
|
-
`});var
|
|
1804
|
+
`});var Bt,_t=O(()=>{Bt=`// strsv_update: subtracts a solved block's contribution from every
|
|
1633
1805
|
// remaining row in parallel (one workgroup per row, like strmv.wgsl) \u2014
|
|
1634
1806
|
// this is what turns strsv's O(n) sequential stages into O(n/blockSize).
|
|
1635
1807
|
// No diag/masking needed: this region never touches the diagonal.
|
|
@@ -1704,7 +1876,580 @@ fn strsv_update_main(
|
|
|
1704
1876
|
workgroupBarrier();
|
|
1705
1877
|
}
|
|
1706
1878
|
}
|
|
1707
|
-
`});var
|
|
1708
|
-
|
|
1709
|
-
|
|
1710
|
-
`)}`);let s=e==="main"?{module:i}:{module:i,entryPoint:e},l=r.createComputePipeline({label:o,layout:"auto",compute:s});return l._shaderModule=i,l}var qt=64,Fe=8;function O(a,e){let r=U().limits.maxComputeWorkgroupsPerDimension;return e===void 0?Math.min(Math.ceil(a/qt),r):{x:Math.min(Math.ceil(e/Fe),r),y:Math.min(Math.ceil(a/Fe),r)}}async function Ie(a,e,r,o,t){let i=o instanceof x;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(e)||!Number.isInteger(t))throw new Error("n and incx must be integers.");if(typeof r!="number")throw new Error("alpha must be a number.");if(Number.isNaN(r))throw new Error("alpha must not be NaN.");if(!Number.isFinite(r))throw new Error("alpha must be finite.");if(t<=0)throw new Error("incx must be positive.");if(!(o instanceof Float32Array)&&!(o instanceof x))throw new Error("x must be a Float32Array or GpuVector.");if(e<=0)return i?{}:o;if(o.length<(e-1)*t+1)throw new Error("x does not have enough elements for the given n and incx.");let n=await B(a,"sscal"),u=null,s=null,l=null;try{u=i?o._buf:b(o,"sscal-x",!0),s=I([{value:e,type:"u32"},{value:r,type:"f32"},{value:t,type:"u32"}],"sscal-params");let f=A(n.getBindGroupLayout(0),[u,s]),{commandEncoder:c,ts:p}=F(n,f,O(e));l=i?null:_(c,u),L(c);let d=await P(p);if(i)return d!==void 0?{gpuTimeMs:d}:{};let g=await y(l,Float32Array);return l=null,d!==void 0?{x:g,gpuTimeMs:d}:g}finally{!i&&u&&m(u),s&&m(s),l&&m(l)}}async function Ne(a,e,r,o,t,i){let n=r instanceof x,u=t instanceof x;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(e)||!Number.isInteger(o)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(o<=0||i<=0)throw new Error("incx and incy must be positive.");if(!(r instanceof Float32Array)&&!(r instanceof x))throw new Error("x must be a Float32Array or GpuVector.");if(!(t instanceof Float32Array)&&!(t instanceof x))throw new Error("y must be a Float32Array or GpuVector.");if(r.constructor!==t.constructor)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(e<=0)return n?{}:{x:r,y:t};if(r.length<(e-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(e-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let s=await B(a,"sswap"),l=null,f=null,c=null,p=null,d=null;try{l=n?r._buf:b(r,"sswap-x",!0),f=u?t._buf:b(t,"sswap-y",!0),c=I([{value:e,type:"u32"},{value:o,type:"u32"},{value:i,type:"u32"}],"sswap-params");let g=A(s.getBindGroupLayout(0),[l,f,c]),{commandEncoder:w,ts:E}=F(s,g,O(e));p=n?null:_(w,l),d=u?null:_(w,f),L(w);let h=await P(E);if(n&&u)return h!==void 0?{gpuTimeMs:h}:{};let G=await y(p,Float32Array);p=null;let v=await y(d,Float32Array);return d=null,h!==void 0?{x:G,y:v,gpuTimeMs:h}:{x:G,y:v}}finally{!n&&l&&m(l),!u&&f&&m(f),c&&m(c),p&&m(p),d&&m(d)}}async function We(a,e,r,o,t,i,n){let u=o instanceof x,s=i instanceof x;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(e)||!Number.isInteger(t)||!Number.isInteger(n))throw new Error("n, incx, and incy must be integers.");if(typeof r!="number")throw new Error("alpha must be a number.");if(Number.isNaN(r))throw new Error("alpha must not be NaN.");if(!Number.isFinite(r))throw new Error("alpha must be finite.");if(t<=0||n<=0)throw new Error("incx and incy must be positive.");if(!u&&!(o instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!s&&!(i instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(u!==s)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(e<=0)return s?{}:{y:i};if(o.length<(e-1)*t+1)throw new Error("x does not have enough elements for the given n and incx.");if(i.length<(e-1)*n+1)throw new Error("y does not have enough elements for the given n and incy.");let l=await B(a,"saxpy"),f=null,c=null,p=null,d=null;try{f=u?o._buf:b(o,"saxpy-x",!1),c=s?i._buf:b(i,"saxpy-y",!0),p=I([{value:e,type:"u32"},{value:r,type:"f32"},{value:t,type:"u32"},{value:n,type:"u32"}],"saxpy-params");let g=A(l.getBindGroupLayout(0),[f,c,p]),{commandEncoder:w,ts:E}=F(l,g,O(e));d=s?null:_(w,c),L(w);let h=await P(E);if(s&&u)return h!==void 0?{gpuTimeMs:h}:{};let G=await y(d,Float32Array);return d=null,h!==void 0?{y:G,gpuTimeMs:h}:{y:G}}finally{!u&&f&&m(f),!s&&c&&m(c),p&&m(p),d&&m(d)}}async function De(a,e,r,o,t,i){let n=r instanceof x,u=t instanceof x;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(e)||!Number.isInteger(o)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(o<=0||i<=0)throw new Error("incx and incy must be positive.");if(!n&&!(r instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!u&&!(t instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(n!==u)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(e<=0)return u?{}:{y:t};if(r.length<(e-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(e-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let s=await B(a,"scopy"),l=null,f=null,c=null,p=null;try{l=n?r._buf:b(r,"scopy-x",!1),f=u?t._buf:b(t,"scopy-y",!0),c=I([{value:e,type:"u32"},{value:o,type:"u32"},{value:i,type:"u32"}],"scopy-params");let d=A(s.getBindGroupLayout(0),[l,f,c]),{commandEncoder:g,ts:w}=F(s,d,O(e));p=u?null:_(g,f),L(g);let E=await P(w);if(u&&n)return E!==void 0?{gpuTimeMs:E}:{};let h=await y(p,Float32Array);return p=null,E!==void 0?{y:h,gpuTimeMs:E}:{y:h}}finally{!n&&l&&m(l),!u&&f&&m(f),c&&m(c),p&&m(p)}}var Me=64;async function Te(a,e,r,o,t,i){let n=r instanceof x,u=t instanceof x;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(e)||!Number.isInteger(o)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(o<=0||i<=0)throw new Error("incx and incy must be positive.");if(!n&&!(r instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!u&&!(t instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(n!==u)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(e<=0)return{dot:0};if(r.length<(e-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(e-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let s=await B(a,"sdot"),l=await B(a,"reduction/sum"),f=null,c=null,p=null,d=null,g=null,w=null;try{f=n?r._buf:b(r,"sdot-x",!1),c=u?t._buf:b(t,"sdot-y",!1),p=C(2*Me*4,"sdot-partials"),d=q(4,"sdot-result"),g=I([{value:e,type:"u32"},{value:o,type:"u32"},{value:i,type:"u32"}],"sdot-params");let E=A(s.getBindGroupLayout(0),[f,c,p,g]),{commandEncoder:h,ts:G}=F(s,E,2*Me);L(h);let v=A(l.getBindGroupLayout(0),[p,d]),{commandEncoder:k,ts:S}=F(l,v,1);w=_(k,d),L(k);let j=y(w,Float32Array);w=null;let[N,D,M]=await Promise.all([P(G),P(S),j]);return N!==void 0&&D!==void 0?{dot:M[0],gpuTimeMs:N+D}:{dot:M[0]}}finally{!n&&f&&m(f),!u&&c&&m(c),p&&m(p),d&&m(d),g&&m(g),w&&m(w)}}var Ue=64;async function He(a,e,r,o){let t=r instanceof x;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(e)||!Number.isInteger(o))throw new Error("n and incx must be integers.");if(o<=0)throw new Error("incx must be positive.");if(!t&&!(r instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(e<=0)return{asum:0};if(r.length<(e-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");let i=await B(a,"sasum"),n=await B(a,"reduction/sum"),u=null,s=null,l=null,f=null,c=null;try{u=t?r._buf:b(r,"sasum-x",!1),s=C(2*Ue*4,"sasum-partials"),l=q(4,"sasum-result"),f=I([{value:e,type:"u32"},{value:o,type:"u32"}],"sasum-params");let p=A(i.getBindGroupLayout(0),[u,s,f]),{commandEncoder:d,ts:g}=F(i,p,2*Ue);L(d);let w=A(n.getBindGroupLayout(0),[s,l]),{commandEncoder:E,ts:h}=F(n,w,1);c=_(E,l),L(E);let G=y(c,Float32Array);c=null;let[v,k,S]=await Promise.all([P(g),P(h),G]);return v!==void 0&&k!==void 0?{asum:S[0],gpuTimeMs:v+k}:{asum:S[0]}}finally{!t&&u&&m(u),s&&m(s),l&&m(l),f&&m(f),c&&m(c)}}var gr=64;async function Ve(a,e,r,o){let t=r instanceof x;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(e)||!Number.isInteger(o))throw new Error("n and incx must be integers.");if(o<=0)throw new Error("incx must be positive.");if(!t&&!(r instanceof Float64Array))throw new Error("x must be a Float64Array or GpuVector.");if(t&&r.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(e<=0)return{asum:0};if(r.length<(e-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");let i=await B(a,["f64/dekker","dasum"]),n=await B(a,["f64/dekker","reduction/sumF64"]),u=null,s=null,l=null,f=null,c=null,p=null,d=null,g=null,w=null;try{if(t)u=r._buf,s=r._loBuf;else{let{hi:Z,lo:z}=er(r.map(Math.abs));u=b(Z,"dasum-xHi",!1),s=b(z,"dasum-xLo",!1)}l=C(2*gr*4,"dasum-partialsHi"),f=C(2*gr*4,"dasum-partialsLo"),c=q(4,"dasum-result-hi"),p=q(4,"dasum-result-lo"),d=I([{value:e,type:"u32"},{value:o,type:"u32"}],"dasum-params");let E=A(i.getBindGroupLayout(0),[u,s,l,f,d]),{commandEncoder:h,ts:G}=F(i,E,2*gr);L(h);let v=A(n.getBindGroupLayout(0),[l,f,c,p]),{commandEncoder:k,ts:S}=F(n,v,1);g=_(k,c),w=_(k,p),L(k);let j=y(g,Float32Array),N=y(w,Float32Array);g=null,w=null;let[D,M,T,H]=await Promise.all([P(G),P(S),j,N]),R=tr(T,H)[0];return D!==void 0&&M!==void 0?{asum:R,gpuTimeMs:D+M}:{asum:R}}finally{!t&&u&&m(u),!t&&s&&m(s),l&&m(l),f&&m(f),c&&m(c),p&&m(p),d&&m(d),g&&m(g),w&&m(w)}}var Re=64;async function Ce(a,e,r,o){let t=r instanceof x;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(e)||!Number.isInteger(o))throw new Error("n and incx must be integers.");if(o<=0)throw new Error("incx must be positive.");if(!t&&!(r instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(e<=0)return{nrm2:0};if(r.length<(e-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");let i=await B(a,"snrm2"),n=await B(a,"reduction/sum"),u=null,s=null,l=null,f=null,c=null;try{u=t?r._buf:b(r,"snrm2-x",!1),s=C(2*Re*4,"snrm2-partials"),l=q(4,"snrm2-result"),f=I([{value:e,type:"u32"},{value:o,type:"u32"}],"snrm2-params");let p=A(i.getBindGroupLayout(0),[u,s,f]),{commandEncoder:d,ts:g}=F(i,p,2*Re);L(d);let w=A(n.getBindGroupLayout(0),[s,l]),{commandEncoder:E,ts:h}=F(n,w,1);c=_(E,l),L(E);let G=y(c,Float32Array);c=null;let[v,k,S]=await Promise.all([P(g),P(h),G]),j=Math.sqrt(S[0]);return v!==void 0&&k!==void 0?{nrm2:j,gpuTimeMs:v+k}:{nrm2:j}}finally{!t&&u&&m(u),s&&m(s),l&&m(l),f&&m(f),c&&m(c)}}var wr=64;async function Oe(a,e,r,o){let t=r instanceof x;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(e)||!Number.isInteger(o))throw new Error("n and incx must be integers.");if(o<=0)throw new Error("incx must be positive.");if(!t&&!(r instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(e<=0)return{index:0};if(r.length<(e-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");let i=await B(a,"isamax"),n=await B(a,"reduction/argmax"),u=null,s=null,l=null,f=null,c=null,p=null;try{u=t?r._buf:b(r,"isamax-x",!1),s=C(2*wr*4,"isamax-partials-val"),l=C(2*wr*4,"isamax-partials-idx"),f=q(4,"isamax-result"),c=I([{value:e,type:"u32"},{value:o,type:"u32"}],"isamax-params");let d=A(i.getBindGroupLayout(0),[u,s,l,c]),{commandEncoder:g,ts:w}=F(i,d,2*wr);L(g);let E=A(n.getBindGroupLayout(0),[s,l,f]),{commandEncoder:h,ts:G}=F(n,E,1);p=_(h,f),L(h);let v=y(p,Uint32Array);p=null;let[k,S,j]=await Promise.all([P(w),P(G),v]),N=j[0];return k!==void 0&&S!==void 0?{index:N,gpuTimeMs:k+S}:{index:N}}finally{!t&&u&&m(u),s&&m(s),l&&m(l),f&&m(f),c&&m(c),p&&m(p)}}async function ze(a,e,r,o,t,i,n,u){let s=r instanceof x,l=t instanceof x;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(e)||!Number.isInteger(o)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(typeof n!="number")throw new Error("c must be a number.");if(typeof u!="number")throw new Error("s must be a number.");if(Number.isNaN(n)||Number.isNaN(u))throw new Error("c and s must not be NaN.");if(!Number.isFinite(n))throw new Error("c must be finite.");if(!Number.isFinite(u))throw new Error("s must be finite.");if(o<=0||i<=0)throw new Error("incx and incy must be positive.");if(!s&&!(r instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!l&&!(t instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(s!==l)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(e<=0)return s?{}:{x:r,y:t};if(r.length<(e-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(e-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let f=await B(a,"srot"),c=null,p=null,d=null,g=null,w=null;try{c=s?r._buf:b(r,"srot-x",!0),p=l?t._buf:b(t,"srot-y",!0),d=I([{value:e,type:"u32"},{value:n,type:"f32"},{value:u,type:"f32"},{value:o,type:"u32"},{value:i,type:"u32"}],"srot-params");let E=A(f.getBindGroupLayout(0),[c,p,d]),{commandEncoder:h,ts:G}=F(f,E,O(e));g=s?null:_(h,c),w=l?null:_(h,p),L(h);let v=await P(G);if(s&&l)return v!==void 0?{gpuTimeMs:v}:{};let k=y(g,Float32Array),S=y(w,Float32Array);g=null,w=null;let[j,N]=await Promise.all([k,S]);return v!==void 0?{x:j,y:N,gpuTimeMs:v}:{x:j,y:N}}finally{!s&&c&&m(c),!l&&p&&m(p),d&&m(d),g&&m(g),w&&m(w)}}async function Qe(a,e,r,o,t,i,n){let u=r instanceof x,s=t instanceof x;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(e)||!Number.isInteger(o)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(!(n instanceof Float32Array)||n.length!==5)throw new Error("param must be a Float32Array of length 5.");if(o<=0||i<=0)throw new Error("incx and incy must be positive.");if(!u&&!(r instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!s&&!(t instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(u!==s)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(e<=0||n[0]===-2)return u?{}:{x:r,y:t};if(r.length<(e-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(e-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let l=await B(a,"srotm"),f=null,c=null,p=null,d=null,g=null,w=null;try{f=u?r._buf:b(r,"srotm-x",!0),c=s?t._buf:b(t,"srotm-y",!0),p=b(n,"srotm-param",!1),d=I([{value:e,type:"u32"},{value:o,type:"u32"},{value:i,type:"u32"}],"srotm-params");let E=A(l.getBindGroupLayout(0),[f,c,p,d]),{commandEncoder:h,ts:G}=F(l,E,O(e));g=u?null:_(h,f),w=s?null:_(h,c),L(h);let v=await P(G);if(u&&s)return v!==void 0?{gpuTimeMs:v}:{};let k=y(g,Float32Array),S=y(w,Float32Array);g=null,w=null;let[j,N]=await Promise.all([k,S]);return v!==void 0?{x:j,y:N,gpuTimeMs:v}:{x:j,y:N}}finally{!u&&f&&m(f),!s&&c&&m(c),p&&m(p),d&&m(d),g&&m(g),w&&m(w)}}async function qe(a,e,r,o,t,i,n,u,s,l,f,c,p="row-major"){let d=i instanceof V,g=u instanceof x,w=f instanceof x;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(e!=="no-transpose"&&e!=="transpose")throw new Error("trans must be 'no-transpose' or 'transpose'.");if(p!=="row-major"&&p!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(typeof t!="number")throw new Error("alpha must be a number.");if(Number.isNaN(t))throw new Error("alpha must not be NaN.");if(!Number.isFinite(t))throw new Error("alpha must be finite.");if(typeof l!="number")throw new Error("beta must be a number.");if(Number.isNaN(l))throw new Error("beta must not be NaN.");if(!Number.isFinite(l))throw new Error("beta must be finite.");if(!Number.isInteger(r)||!Number.isInteger(o)||!Number.isInteger(s)||!Number.isInteger(c)||!Number.isInteger(n))throw new Error("m, n, incx, incy, and lda must be integers.");if(s<=0||c<=0)throw new Error("incx and incy must be positive.");if(!d&&!(i instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!g&&!(u instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!w&&!(f instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(g!==w)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(g&&!d)throw new Error("A must be a GpuMatrix when x and y are GpuVectors.");if(g&&u._buf===f._buf)throw new Error("x and y must not reference the same GPU buffer when both are GpuVectors.");if(d&&n!==i.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(d&&(i.rows<r||i.cols<o))throw new Error("A is too small for the given m and n.");if(r<0||o<0)throw new Error("m and n must be non-negative.");if(r===0||o===0)return w?{}:{y:f};(d?i.layout:p)==="column-major"&&([r,o]=[o,r],e=e==="no-transpose"?"transpose":"no-transpose");let h=e==="no-transpose",G=h?o:r,v=h?r:o;if(n<o)throw new Error("lda must be >= n.");if(!d&&i.length<(r-1)*n+o)throw new Error("A does not have enough elements for the given m, n, and lda.");if(u.length<(G-1)*s+1)throw new Error("x does not have enough elements for the given dimensions and incx.");if(f.length<(v-1)*c+1)throw new Error("y does not have enough elements for the given dimensions and incy.");let S=await B(a,h?"sgemv_n":"sgemv_t"),j=d?i._buf:b(i,"sgemv-A",!1),N=g?u._buf:b(u,"sgemv-x",!1),D=w?f._buf:b(f,"sgemv-y",!0),M=I([{value:r,type:"u32"},{value:o,type:"u32"},{value:t,type:"f32"},{value:l,type:"f32"},{value:s,type:"u32"},{value:c,type:"u32"},{value:n,type:"u32"}],"sgemv-params");try{let T=A(S.getBindGroupLayout(0),[j,N,D,M]),H=h?Math.min(r,a.limits.maxComputeWorkgroupsPerDimension):O(v),{commandEncoder:R,ts:Z}=F(S,T,H),z=w?null:_(R,D);L(R);let Q=await P(Z);if(w)return Q!==void 0?{gpuTimeMs:Q}:{};let nr=await y(z,Float32Array);return Q!==void 0?{y:nr,gpuTimeMs:Q}:{y:nr}}finally{d||m(j),g||m(N),w||m(D),m(M)}}async function Ze(a,e,r,o,t,i,n,u,s,l,f,c="row-major"){let p=n instanceof x,d=l instanceof x,g=t instanceof V;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(e!=="lower"&&e!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(c!=="row-major"&&c!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(!Number.isInteger(r)||!Number.isInteger(u)||!Number.isInteger(f)||!Number.isInteger(i))throw new Error("n, incx, incy, and lda must be integers.");if(typeof o!="number")throw new Error("alpha must be a number.");if(Number.isNaN(o))throw new Error("alpha must not be NaN.");if(!Number.isFinite(o))throw new Error("alpha must be finite.");if(typeof s!="number")throw new Error("beta must be a number.");if(Number.isNaN(s))throw new Error("beta must not be NaN.");if(!Number.isFinite(s))throw new Error("beta must be finite.");if(u<=0||f<=0)throw new Error("incx and incy must be positive.");if(i<r)throw new Error("lda must be >= n.");if(!g&&!(t instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!p&&!(n instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!d&&!(l instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(p!==d)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(p&&!g)throw new Error("A must be a GpuMatrix when x and y are GpuVectors.");if(p&&n._buf===l._buf)throw new Error("x and y must not reference the same GPU buffer when both are GpuVectors.");if(g&&i!==t.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(g&&(t.rows<r||t.cols<r))throw new Error("A is too small for the given n.");if(r<0)throw new Error("n must be non-negative.");if(r===0)return d?{}:{y:l};if(!g&&t.length<(r-1)*i+r)throw new Error("A does not have enough elements for the given n and lda.");if(n.length<(r-1)*u+1)throw new Error("x does not have enough elements for the given n and incx.");if(l.length<(r-1)*f+1)throw new Error("y does not have enough elements for the given n and incy.");let E=(g?t.layout:c)==="column-major"?e==="upper":e==="lower",h=await B(a,"ssymv"),G=null,v=null,k=null,S=null;try{G=g?t._buf:b(t,"ssymv-A",!1),v=p?n._buf:b(n,"ssymv-x",!1),k=d?l._buf:b(l,"ssymv-y",!0),S=I([{value:r,type:"u32"},{value:o,type:"f32"},{value:s,type:"f32"},{value:u,type:"u32"},{value:f,type:"u32"},{value:i,type:"u32"},{value:E?0:1,type:"u32"}],"ssymv-params");let j=A(h.getBindGroupLayout(0),[G,v,k,S]),N=Math.min(r,a.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:D,ts:M}=F(h,j,N),T=d?null:_(D,k);L(D);let H=await P(M);if(d)return H!==void 0?{gpuTimeMs:H}:{};let R=await y(T,Float32Array);return H!==void 0?{y:R,gpuTimeMs:H}:{y:R}}finally{!g&&G&&m(G),!p&&v&&m(v),!d&&k&&m(k),S&&m(S)}}async function Ke(a,e,r,o,t,i,n,u,s,l,f,c="row-major"){let p=u instanceof x,d=l instanceof x,g=i instanceof V,w=o==="unit";if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(e!=="lower"&&e!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(r!=="no-transpose"&&r!=="transpose")throw new Error("trans must be 'no-transpose' or 'transpose'.");if(!w&&o!=="non-unit")throw new Error("diag must be 'unit' or 'non-unit'.");if(c!=="row-major"&&c!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(!Number.isInteger(t)||!Number.isInteger(s)||!Number.isInteger(f)||!Number.isInteger(n))throw new Error("n, incx, incy, and lda must be integers.");if(s<=0||f<=0)throw new Error("incx and incy must be positive.");if(n<t)throw new Error("lda must be >= n.");if(!g&&!(i instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!p&&!(u instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!d&&!(l instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(p!==d)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(p&&u._buf===l._buf)throw new Error("x and y must not reference the same GPU buffer when both are GpuVectors.");if(p&&!g)throw new Error("A must be a GpuMatrix when x and y are GpuVectors.");if(g&&d&&i._buf===l._buf)throw new Error("A and y must not reference the same GPU buffer.");if(g&&n!==i.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(g&&(i.rows<t||i.cols<t))throw new Error("A is too small for the given n.");if(t<0)throw new Error("n must be non-negative.");if(t===0)return d?{}:{y:l};if(!g&&i.length<(t-1)*n+t)throw new Error("A does not have enough elements for the given n and lda.");if(u.length<(t-1)*s+1)throw new Error("x does not have enough elements for the given n and incx.");if(l.length<(t-1)*f+1)throw new Error("y does not have enough elements for the given n and incy.");let h=(g?i.layout:c)==="column-major",G=h?e==="upper":e==="lower",v=h?r==="transpose":r==="no-transpose",k=await B(a,"strmv"),S=null,j=null,N=null,D=null;try{S=g?i._buf:b(i,"strmv-A",!1),j=p?u._buf:b(u,"strmv-x",!1),N=d?l._buf:b(l,"strmv-y",!0),D=I([{value:t,type:"u32"},{value:s,type:"u32"},{value:f,type:"u32"},{value:n,type:"u32"},{value:v?0:1,type:"u32"},{value:G?0:1,type:"u32"},{value:w?1:0,type:"u32"}],"strmv-params");let M=A(k.getBindGroupLayout(0),[S,j,N,D]),T=Math.min(t,a.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:H,ts:R}=F(k,M,T),Z=d?null:_(H,N);L(H);let z=await P(R);if(d)return z!==void 0?{gpuTimeMs:z}:{};let Q=await y(Z,Float32Array);return z!==void 0?{y:Q,gpuTimeMs:z}:{y:Q}}finally{!g&&S&&m(S),!p&&j&&m(j),!d&&N&&m(N),D&&m(D)}}var X=64;function Xe(a,e,r){let o=new ArrayBuffer(a*e),t=new DataView(o);for(let i=0;i<a;i++){let n=r(i),u=i*e;n.forEach((s,l)=>t.setUint32(u+l*4,s,!0))}return o}function $e(a,e,r){let o=a.createBuffer({label:r,size:e.byteLength,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});return a.queue.writeBuffer(o,0,e),o}async function Ye(a,e,r,o,t,i,n,u,s,l="row-major"){let f=u instanceof x,c=i instanceof V,p=o==="unit";if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(e!=="lower"&&e!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(r!=="no-transpose"&&r!=="transpose")throw new Error("trans must be 'no-transpose' or 'transpose'.");if(!p&&o!=="non-unit")throw new Error("diag must be 'unit' or 'non-unit'.");if(l!=="row-major"&&l!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(!Number.isInteger(t)||!Number.isInteger(s)||!Number.isInteger(n))throw new Error("n, incx, and lda must be integers.");if(s<=0)throw new Error("incx must be positive.");if(n<t)throw new Error("lda must be >= n.");if(!c&&!(i instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!f&&!(u instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(f&&!c)throw new Error("A must be a GpuMatrix when x is a GpuVector.");if(c&&n!==i.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(c&&(i.rows<t||i.cols<t))throw new Error("A is too small for the given n.");if(t<0)throw new Error("n must be non-negative.");if(t===0)return f?{}:{x:u};if(!c&&i.length<(t-1)*n+t)throw new Error("A does not have enough elements for the given n and lda.");if(u.length<(t-1)*s+1)throw new Error("x does not have enough elements for the given n and incx.");let g=(c?i.layout:l)==="column-major",w=g?e==="upper":e==="lower",E=g?r==="transpose":r==="no-transpose",h=await B(a,"strsv_invert_block"),G=await B(a,"strsv_apply_inverse"),v=await B(a,"strsv_update"),k=E===w,S=[];for(let Q=0;Q<t;Q+=X)S.push(Q);k||S.reverse();let j=S.length,N=a.limits.maxComputeWorkgroupsPerDimension,D=a.limits.minUniformBufferOffsetAlignment,M=null,T=null,H=null,R=null,Z=null,z=null;try{M=c?i._buf:b(i,"strsv-A",!1),T=f?u._buf:b(u,"strsv-x",!0),H=C(j*X*X*4,"strsv-Ainv");let Q=Xe(j,D,$=>{let Y=$*X,or=Math.min(Y+X,t);return[s,$,Y,or]});R=$e(a,Q,"strsv-apply-params");let nr=Xe(j,D,$=>{let Y=$*X,or=Math.min(Y+X,t);return[t,s,n,E?0:1,w?0:1,Y,or]});Z=$e(a,nr,"strsv-update-params");let{commandEncoder:rr,querySet:ar}=dr();z=I([{value:t,type:"u32"},{value:n,type:"u32"},{value:E?0:1,type:"u32"},{value:w?0:1,type:"u32"},{value:p?1:0,type:"u32"}],"strsv-invert-params");let tt=A(h.getBindGroupLayout(0),[M,H,z]);ir(rr,h,tt,{x:X,y:j},ar?{timestampWrites:{querySet:ar,beginningOfPassWriteIndex:0}}:void 0);for(let $=0;$<S.length;$++){let Y=S[$],or=Math.min(Y+X,t),it=Y/X,nt=$===S.length-1,hr=it*D,st=A(G.getBindGroupLayout(0),[H,T,{buffer:R,offset:hr,size:16}]);ir(rr,G,st,1,nt&&ar?{timestampWrites:{querySet:ar,endOfPassWriteIndex:1}}:void 0);let xr=k?t-or:Y;if(xr===0)continue;let ut=A(v.getBindGroupLayout(0),[M,T,{buffer:Z,offset:hr,size:32}]),lt=Math.min(xr,N);ir(rr,v,ut,lt)}let at=cr(rr,ar),ot=f?null:_(rr,T);L(rr);let sr=await P(at);if(f)return sr!==void 0?{gpuTimeMs:sr}:{};let br=await y(ot,Float32Array);return sr!==void 0?{x:br,gpuTimeMs:sr}:{x:br}}finally{!c&&M&&m(M),!f&&T&&m(T),H&&m(H),R&&m(R),Z&&m(Z),z&&m(z)}}async function Je(a,e,r,o,t,i,n,u,s,l,f="row-major"){let c=s instanceof V;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(f!=="row-major"&&f!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(typeof o!="number")throw new Error("alpha must be a number.");if(Number.isNaN(o))throw new Error("alpha must not be NaN.");if(!Number.isFinite(o))throw new Error("alpha must be finite.");if(!Number.isInteger(e)||!Number.isInteger(r)||!Number.isInteger(i)||!Number.isInteger(u)||!Number.isInteger(l))throw new Error("m, n, incx, incy, and lda must be integers.");if(i<=0||u<=0)throw new Error("incx and incy must be positive.");if(!c&&!(s instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(c&&l!==s.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(c&&(s.rows<e||s.cols<r))throw new Error("A is too small for the given m and n.");(c?s.layout:f)==="column-major"&&([e,r]=[r,e],[t,n]=[n,t],[i,u]=[u,i]);let d=t instanceof x,g=n instanceof x;if(l<r)throw new Error("lda must be >= n.");if(!d&&!(t instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!g&&!(n instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(d!==g)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(d&&!c)throw new Error("A must be a GpuMatrix when x and y are GpuVectors.");if(c&&d&&s._buf===t._buf)throw new Error("A and x must not reference the same GPU buffer.");if(c&&g&&s._buf===n._buf)throw new Error("A and y must not reference the same GPU buffer.");if(e<0||r<0)throw new Error("m and n must be non-negative.");if(e===0||r===0)return c?{}:{A:s};if(!c&&s.length<(e-1)*l+r)throw new Error("A does not have enough elements for the given m, n, and lda.");if(t.length<(e-1)*i+1)throw new Error("x does not have enough elements for the given m and incx.");if(n.length<(r-1)*u+1)throw new Error("y does not have enough elements for the given n and incy.");let w=await B(a,"sger"),E=null,h=null,G=null,v=null;try{E=d?t._buf:b(t,"sger-x",!1),h=g?n._buf:b(n,"sger-y",!1),G=c?s._buf:b(s,"sger-A",!0),v=I([{value:e,type:"u32"},{value:r,type:"u32"},{value:o,type:"f32"},{value:i,type:"u32"},{value:u,type:"u32"},{value:l,type:"u32"}],"sger-params");let k=A(w.getBindGroupLayout(0),[E,h,G,v]),S=Math.min(e,a.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:j,ts:N}=F(w,k,S),D=c?null:_(j,G);L(j);let M=await P(N);if(c)return M!==void 0?{gpuTimeMs:M}:{};let T=await y(D,Float32Array);return M!==void 0?{A:T,gpuTimeMs:M}:{A:T}}finally{!d&&E&&m(E),!g&&h&&m(h),!c&&G&&m(G),v&&m(v)}}async function rt(a,e,r,o,t,i,n,u,s="row-major"){let l=t instanceof x,f=n instanceof V;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(e!=="lower"&&e!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(s!=="row-major"&&s!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(!Number.isInteger(r)||!Number.isInteger(i)||!Number.isInteger(u))throw new Error("n, incx, and lda must be integers.");if(typeof o!="number")throw new Error("alpha must be a number.");if(Number.isNaN(o))throw new Error("alpha must not be NaN.");if(!Number.isFinite(o))throw new Error("alpha must be finite.");if(i<=0)throw new Error("incx must be positive.");if(u<r)throw new Error("lda must be >= n.");if(!f&&!(n instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!l&&!(t instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(l&&!f)throw new Error("A must be a GpuMatrix when x is a GpuVector.");if(f&&l&&n._buf===t._buf)throw new Error("A and x must not reference the same GPU buffer.");if(f&&u!==n.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(f&&(n.rows<r||n.cols<r))throw new Error("A is too small for the given n.");if(r<0)throw new Error("n must be non-negative.");if(r===0)return f?{}:{A:n};if(!f&&n.length<(r-1)*u+r)throw new Error("A does not have enough elements for the given n and lda.");if(t.length<(r-1)*i+1)throw new Error("x does not have enough elements for the given n and incx.");let p=(f?n.layout:s)==="column-major"?e==="upper":e==="lower",d=await B(a,"ssyr"),g=null,w=null,E=null;try{g=l?t._buf:b(t,"ssyr-x",!1),w=f?n._buf:b(n,"ssyr-A",!0),E=I([{value:r,type:"u32"},{value:o,type:"f32"},{value:i,type:"u32"},{value:u,type:"u32"},{value:p?0:1,type:"u32"}],"ssyr-params");let h=A(d.getBindGroupLayout(0),[g,w,E]),G=Math.min(r,a.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:v,ts:k}=F(d,h,G),S=f?null:_(v,w);L(v);let j=await P(k);if(f)return j!==void 0?{gpuTimeMs:j}:{};let N=await y(S,Float32Array);return j!==void 0?{A:N,gpuTimeMs:j}:{A:N}}finally{!l&&g&&m(g),!f&&w&&m(w),E&&m(E)}}async function et(a,e,r,o,t,i,n,u,s,l,f="row-major"){let c=t instanceof x,p=n instanceof x,d=s instanceof V;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(e!=="lower"&&e!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(f!=="row-major"&&f!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(!Number.isInteger(r)||!Number.isInteger(i)||!Number.isInteger(u)||!Number.isInteger(l))throw new Error("n, incx, incy, and lda must be integers.");if(typeof o!="number")throw new Error("alpha must be a number.");if(Number.isNaN(o))throw new Error("alpha must not be NaN.");if(!Number.isFinite(o))throw new Error("alpha must be finite.");if(i<=0||u<=0)throw new Error("incx and incy must be positive.");if(l<r)throw new Error("lda must be >= n.");if(!d&&!(s instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!c&&!(t instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!p&&!(n instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(c!==p)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(c&&!d)throw new Error("A must be a GpuMatrix when x and y are GpuVectors.");if(d&&c&&s._buf===t._buf)throw new Error("A and x must not reference the same GPU buffer.");if(d&&p&&s._buf===n._buf)throw new Error("A and y must not reference the same GPU buffer.");if(c&&t._buf===n._buf)throw new Error("x and y must not reference the same GPU buffer when both are GpuVectors.");if(d&&l!==s.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(d&&(s.rows<r||s.cols<r))throw new Error("A is too small for the given n.");if(r<0)throw new Error("n must be non-negative.");if(r===0)return d?{}:{A:s};if(!d&&s.length<(r-1)*l+r)throw new Error("A does not have enough elements for the given n and lda.");if(t.length<(r-1)*i+1)throw new Error("x does not have enough elements for the given n and incx.");if(n.length<(r-1)*u+1)throw new Error("y does not have enough elements for the given n and incy.");let w=(d?s.layout:f)==="column-major"?e==="upper":e==="lower",E=await B(a,"ssyr2"),h=null,G=null,v=null,k=null;try{h=c?t._buf:b(t,"ssyr2-x",!1),G=p?n._buf:b(n,"ssyr2-y",!1),v=d?s._buf:b(s,"ssyr2-A",!0),k=I([{value:r,type:"u32"},{value:o,type:"f32"},{value:i,type:"u32"},{value:u,type:"u32"},{value:l,type:"u32"},{value:w?0:1,type:"u32"}],"ssyr2-params");let S=A(E.getBindGroupLayout(0),[h,G,v,k]),j=Math.min(r,a.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:N,ts:D}=F(E,S,j),M=d?null:_(N,v);L(N);let T=await P(D);if(d)return T!==void 0?{gpuTimeMs:T}:{};let H=await y(M,Float32Array);return T!==void 0?{A:H,gpuTimeMs:T}:{A:H}}finally{!c&&h&&m(h),!p&&G&&m(G),!d&&v&&m(v),k&&m(k)}}return gt(Zt);})();
|
|
1879
|
+
`});var At,Et=O(()=>{At=`// sgemm_small: C = alpha * op(A) * op(B) + beta * C \u2014 small-tile half of
|
|
1880
|
+
// the two-tier autotuned dispatch (see sgemm.mjs and sgemm_large.wgsl).
|
|
1881
|
+
// BM=BN=32, BK=8, TM=TN=2 \u2014 wins over the large tile below a 6x6=36
|
|
1882
|
+
// workgroup grid of 64-tiles, where the large tile doesn't have enough
|
|
1883
|
+
// workgroups to fill the GPU. Same structure as sgemm_large.wgsl (2D
|
|
1884
|
+
// register-blocked, shared-memory-tiled), just smaller.
|
|
1885
|
+
//
|
|
1886
|
+
// col mapped to gid.x for coalesced B/C access (row-major: col contiguous).
|
|
1887
|
+
|
|
1888
|
+
const BM: u32 = 32u;
|
|
1889
|
+
const BN: u32 = 32u;
|
|
1890
|
+
const BK: u32 = 8u;
|
|
1891
|
+
const TM: u32 = 2u;
|
|
1892
|
+
const TN: u32 = 2u;
|
|
1893
|
+
const THREADS_X: u32 = BN / TN;
|
|
1894
|
+
const THREADS_Y: u32 = BM / TM;
|
|
1895
|
+
const NUM_THREADS: u32 = THREADS_X * THREADS_Y; // 256
|
|
1896
|
+
const STRIDE_A: u32 = NUM_THREADS / BK;
|
|
1897
|
+
const STRIDE_B: u32 = NUM_THREADS / BN;
|
|
1898
|
+
|
|
1899
|
+
@group(0) @binding(0) var<storage, read> A: array<f32>;
|
|
1900
|
+
@group(0) @binding(1) var<storage, read> B: array<f32>;
|
|
1901
|
+
@group(0) @binding(2) var<storage, read_write> C: array<f32>;
|
|
1902
|
+
|
|
1903
|
+
struct Params {
|
|
1904
|
+
m: u32,
|
|
1905
|
+
n: u32,
|
|
1906
|
+
k: u32,
|
|
1907
|
+
alpha: f32,
|
|
1908
|
+
beta: f32,
|
|
1909
|
+
lda: u32,
|
|
1910
|
+
ldb: u32,
|
|
1911
|
+
ldc: u32,
|
|
1912
|
+
transA: u32, // 0 = no-transpose, 1 = transpose
|
|
1913
|
+
transB: u32,
|
|
1914
|
+
}
|
|
1915
|
+
|
|
1916
|
+
@group(0) @binding(3) var<uniform> params: Params;
|
|
1917
|
+
|
|
1918
|
+
var<workgroup> As: array<f32, BM * BK>;
|
|
1919
|
+
var<workgroup> Bs: array<f32, BK * BN>;
|
|
1920
|
+
|
|
1921
|
+
@compute @workgroup_size(THREADS_X, THREADS_Y)
|
|
1922
|
+
fn main(
|
|
1923
|
+
@builtin(workgroup_id) wid: vec3u,
|
|
1924
|
+
@builtin(local_invocation_id) lid: vec3u,
|
|
1925
|
+
@builtin(local_invocation_index) tid: u32,
|
|
1926
|
+
) {
|
|
1927
|
+
let blockRow = wid.y * BM;
|
|
1928
|
+
let blockCol = wid.x * BN;
|
|
1929
|
+
let threadCol = lid.x;
|
|
1930
|
+
let threadRow = lid.y;
|
|
1931
|
+
|
|
1932
|
+
let innerRowA = tid / BK;
|
|
1933
|
+
let innerColA = tid % BK;
|
|
1934
|
+
let innerRowB = tid / BN;
|
|
1935
|
+
let innerColB = tid % BN;
|
|
1936
|
+
|
|
1937
|
+
var threadResults: array<f32, TM * TN>;
|
|
1938
|
+
for (var i = 0u; i < TM * TN; i++) {
|
|
1939
|
+
threadResults[i] = 0.0;
|
|
1940
|
+
}
|
|
1941
|
+
var regM: array<f32, TM>;
|
|
1942
|
+
var regN: array<f32, TN>;
|
|
1943
|
+
|
|
1944
|
+
let numTiles = (params.k + BK - 1u) / BK;
|
|
1945
|
+
for (var t = 0u; t < numTiles; t++) {
|
|
1946
|
+
for (var loadOffset = 0u; loadOffset < BM; loadOffset += STRIDE_A) {
|
|
1947
|
+
let gRowA = blockRow + innerRowA + loadOffset;
|
|
1948
|
+
let gColA = t * BK + innerColA;
|
|
1949
|
+
let aIdx = select(gRowA * params.lda + gColA, gColA * params.lda + gRowA, params.transA != 0u);
|
|
1950
|
+
As[(innerRowA + loadOffset) * BK + innerColA] = select(0.0, A[aIdx], gRowA < params.m && gColA < params.k);
|
|
1951
|
+
}
|
|
1952
|
+
for (var loadOffset = 0u; loadOffset < BK; loadOffset += STRIDE_B) {
|
|
1953
|
+
let gRowB = t * BK + innerRowB + loadOffset;
|
|
1954
|
+
let gColB = blockCol + innerColB;
|
|
1955
|
+
let bIdx = select(gRowB * params.ldb + gColB, gColB * params.ldb + gRowB, params.transB != 0u);
|
|
1956
|
+
Bs[(innerRowB + loadOffset) * BN + innerColB] = select(0.0, B[bIdx], gRowB < params.k && gColB < params.n);
|
|
1957
|
+
}
|
|
1958
|
+
|
|
1959
|
+
workgroupBarrier();
|
|
1960
|
+
|
|
1961
|
+
for (var dotIdx = 0u; dotIdx < BK; dotIdx++) {
|
|
1962
|
+
for (var i = 0u; i < TM; i++) {
|
|
1963
|
+
regM[i] = As[(threadRow * TM + i) * BK + dotIdx];
|
|
1964
|
+
}
|
|
1965
|
+
for (var i = 0u; i < TN; i++) {
|
|
1966
|
+
regN[i] = Bs[dotIdx * BN + threadCol * TN + i];
|
|
1967
|
+
}
|
|
1968
|
+
for (var resIdxM = 0u; resIdxM < TM; resIdxM++) {
|
|
1969
|
+
for (var resIdxN = 0u; resIdxN < TN; resIdxN++) {
|
|
1970
|
+
threadResults[resIdxM * TN + resIdxN] += regM[resIdxM] * regN[resIdxN];
|
|
1971
|
+
}
|
|
1972
|
+
}
|
|
1973
|
+
}
|
|
1974
|
+
|
|
1975
|
+
workgroupBarrier();
|
|
1976
|
+
}
|
|
1977
|
+
|
|
1978
|
+
for (var resIdxM = 0u; resIdxM < TM; resIdxM++) {
|
|
1979
|
+
let row = blockRow + threadRow * TM + resIdxM;
|
|
1980
|
+
if (row < params.m) {
|
|
1981
|
+
for (var resIdxN = 0u; resIdxN < TN; resIdxN++) {
|
|
1982
|
+
let col = blockCol + threadCol * TN + resIdxN;
|
|
1983
|
+
if (col < params.n) {
|
|
1984
|
+
let cIdx = row * params.ldc + col;
|
|
1985
|
+
C[cIdx] = params.alpha * threadResults[resIdxM * TN + resIdxN] + params.beta * C[cIdx];
|
|
1986
|
+
}
|
|
1987
|
+
}
|
|
1988
|
+
}
|
|
1989
|
+
}
|
|
1990
|
+
}
|
|
1991
|
+
`});var kt,Gt=O(()=>{kt=`// sgemm_large: C = alpha * op(A) * op(B) + beta * C \u2014 large-tile half of
|
|
1992
|
+
// the two-tier autotuned dispatch (see sgemm.mjs and sgemm_small.wgsl).
|
|
1993
|
+
// BM=BN=64, BK=8, TM=8, TN=4 (128 threads/workgroup) \u2014 the kernel 9
|
|
1994
|
+
// autotuning winner (temp/autotune_sweep.mjs, temp/gen_sweep_kernel.mjs,
|
|
1995
|
+
// swept BM/BN/BK/TM/TN and warp-tiled variants), +69% over the old BM=32
|
|
1996
|
+
// single-tier baseline at n=512, +84% at n=1024. But BM=64 loses to BM=32
|
|
1997
|
+
// below a 6x6=36 workgroup grid (not enough workgroups to fill the GPU at
|
|
1998
|
+
// that tile size), hence the two-tier split rather than one global config.
|
|
1999
|
+
// Neither vectorized loads (kernel 6) nor warp-tiling (kernel 10) beat this
|
|
2000
|
+
// at the sizes tried, including warp-tiled variants in the same sweep at
|
|
2001
|
+
// BM=64/128.
|
|
2002
|
+
|
|
2003
|
+
const BM: u32 = 64u;
|
|
2004
|
+
const BN: u32 = 64u;
|
|
2005
|
+
const BK: u32 = 8u;
|
|
2006
|
+
const TM: u32 = 8u;
|
|
2007
|
+
const TN: u32 = 4u;
|
|
2008
|
+
const THREADS_X: u32 = BN / TN;
|
|
2009
|
+
const THREADS_Y: u32 = BM / TM;
|
|
2010
|
+
const NUM_THREADS: u32 = THREADS_X * THREADS_Y; // 128
|
|
2011
|
+
const STRIDE_A: u32 = NUM_THREADS / BK; // rows of As covered per load-loop step
|
|
2012
|
+
const STRIDE_B: u32 = NUM_THREADS / BN; // rows of Bs covered per load-loop step
|
|
2013
|
+
|
|
2014
|
+
@group(0) @binding(0) var<storage, read> A: array<f32>;
|
|
2015
|
+
@group(0) @binding(1) var<storage, read> B: array<f32>;
|
|
2016
|
+
@group(0) @binding(2) var<storage, read_write> C: array<f32>;
|
|
2017
|
+
|
|
2018
|
+
struct Params {
|
|
2019
|
+
m: u32,
|
|
2020
|
+
n: u32,
|
|
2021
|
+
k: u32,
|
|
2022
|
+
alpha: f32,
|
|
2023
|
+
beta: f32,
|
|
2024
|
+
lda: u32,
|
|
2025
|
+
ldb: u32,
|
|
2026
|
+
ldc: u32,
|
|
2027
|
+
transA: u32, // 0 = no-transpose, 1 = transpose
|
|
2028
|
+
transB: u32,
|
|
2029
|
+
}
|
|
2030
|
+
|
|
2031
|
+
@group(0) @binding(3) var<uniform> params: Params;
|
|
2032
|
+
|
|
2033
|
+
var<workgroup> As: array<f32, BM * BK>;
|
|
2034
|
+
var<workgroup> Bs: array<f32, BK * BN>;
|
|
2035
|
+
|
|
2036
|
+
@compute @workgroup_size(THREADS_X, THREADS_Y)
|
|
2037
|
+
fn main(
|
|
2038
|
+
@builtin(workgroup_id) wid: vec3u,
|
|
2039
|
+
@builtin(local_invocation_id) lid: vec3u,
|
|
2040
|
+
@builtin(local_invocation_index) tid: u32,
|
|
2041
|
+
) {
|
|
2042
|
+
let blockRow = wid.y * BM;
|
|
2043
|
+
let blockCol = wid.x * BN;
|
|
2044
|
+
let threadCol = lid.x;
|
|
2045
|
+
let threadRow = lid.y;
|
|
2046
|
+
|
|
2047
|
+
// Load indices, independent of the compute thread shape \u2014 a loop since
|
|
2048
|
+
// NUM_THREADS doesn't match the tile size 1:1 at this config.
|
|
2049
|
+
let innerRowA = tid / BK;
|
|
2050
|
+
let innerColA = tid % BK;
|
|
2051
|
+
let innerRowB = tid / BN;
|
|
2052
|
+
let innerColB = tid % BN;
|
|
2053
|
+
|
|
2054
|
+
var threadResults: array<f32, TM * TN>;
|
|
2055
|
+
for (var i = 0u; i < TM * TN; i++) {
|
|
2056
|
+
threadResults[i] = 0.0;
|
|
2057
|
+
}
|
|
2058
|
+
var regM: array<f32, TM>;
|
|
2059
|
+
var regN: array<f32, TN>;
|
|
2060
|
+
|
|
2061
|
+
let numTiles = (params.k + BK - 1u) / BK;
|
|
2062
|
+
for (var t = 0u; t < numTiles; t++) {
|
|
2063
|
+
for (var loadOffset = 0u; loadOffset < BM; loadOffset += STRIDE_A) {
|
|
2064
|
+
let gRowA = blockRow + innerRowA + loadOffset;
|
|
2065
|
+
let gColA = t * BK + innerColA;
|
|
2066
|
+
let aIdx = select(gRowA * params.lda + gColA, gColA * params.lda + gRowA, params.transA != 0u);
|
|
2067
|
+
As[(innerRowA + loadOffset) * BK + innerColA] = select(0.0, A[aIdx], gRowA < params.m && gColA < params.k);
|
|
2068
|
+
}
|
|
2069
|
+
for (var loadOffset = 0u; loadOffset < BK; loadOffset += STRIDE_B) {
|
|
2070
|
+
let gRowB = t * BK + innerRowB + loadOffset;
|
|
2071
|
+
let gColB = blockCol + innerColB;
|
|
2072
|
+
let bIdx = select(gRowB * params.ldb + gColB, gColB * params.ldb + gRowB, params.transB != 0u);
|
|
2073
|
+
Bs[(innerRowB + loadOffset) * BN + innerColB] = select(0.0, B[bIdx], gRowB < params.k && gColB < params.n);
|
|
2074
|
+
}
|
|
2075
|
+
|
|
2076
|
+
workgroupBarrier();
|
|
2077
|
+
|
|
2078
|
+
for (var dotIdx = 0u; dotIdx < BK; dotIdx++) {
|
|
2079
|
+
for (var i = 0u; i < TM; i++) {
|
|
2080
|
+
regM[i] = As[(threadRow * TM + i) * BK + dotIdx];
|
|
2081
|
+
}
|
|
2082
|
+
for (var i = 0u; i < TN; i++) {
|
|
2083
|
+
regN[i] = Bs[dotIdx * BN + threadCol * TN + i];
|
|
2084
|
+
}
|
|
2085
|
+
for (var resIdxM = 0u; resIdxM < TM; resIdxM++) {
|
|
2086
|
+
for (var resIdxN = 0u; resIdxN < TN; resIdxN++) {
|
|
2087
|
+
threadResults[resIdxM * TN + resIdxN] += regM[resIdxM] * regN[resIdxN];
|
|
2088
|
+
}
|
|
2089
|
+
}
|
|
2090
|
+
}
|
|
2091
|
+
|
|
2092
|
+
workgroupBarrier();
|
|
2093
|
+
}
|
|
2094
|
+
|
|
2095
|
+
for (var resIdxM = 0u; resIdxM < TM; resIdxM++) {
|
|
2096
|
+
let row = blockRow + threadRow * TM + resIdxM;
|
|
2097
|
+
if (row < params.m) {
|
|
2098
|
+
for (var resIdxN = 0u; resIdxN < TN; resIdxN++) {
|
|
2099
|
+
let col = blockCol + threadCol * TN + resIdxN;
|
|
2100
|
+
if (col < params.n) {
|
|
2101
|
+
let cIdx = row * params.ldc + col;
|
|
2102
|
+
C[cIdx] = params.alpha * threadResults[resIdxM * TN + resIdxN] + params.beta * C[cIdx];
|
|
2103
|
+
}
|
|
2104
|
+
}
|
|
2105
|
+
}
|
|
2106
|
+
}
|
|
2107
|
+
}
|
|
2108
|
+
`});var Nt,Pt=O(()=>{Nt=`// sgemmtr_small: C := uplo(alpha * op(A) * op(B) + beta * C) \u2014 small-tile
|
|
2109
|
+
// half of a two-tier dispatch, identical to sgemm_small.wgsl except the
|
|
2110
|
+
// final output write is gated to one triangle of C by \`uplo\` \u2014 see
|
|
2111
|
+
// sgemmtr_large.wgsl for the full rationale (shared by both tiers).
|
|
2112
|
+
|
|
2113
|
+
const BM: u32 = 32u;
|
|
2114
|
+
const BN: u32 = 32u;
|
|
2115
|
+
const BK: u32 = 8u;
|
|
2116
|
+
const TM: u32 = 2u;
|
|
2117
|
+
const TN: u32 = 2u;
|
|
2118
|
+
const THREADS_X: u32 = BN / TN;
|
|
2119
|
+
const THREADS_Y: u32 = BM / TM;
|
|
2120
|
+
const NUM_THREADS: u32 = THREADS_X * THREADS_Y; // 256
|
|
2121
|
+
const STRIDE_A: u32 = NUM_THREADS / BK;
|
|
2122
|
+
const STRIDE_B: u32 = NUM_THREADS / BN;
|
|
2123
|
+
|
|
2124
|
+
@group(0) @binding(0) var<storage, read> A: array<f32>;
|
|
2125
|
+
@group(0) @binding(1) var<storage, read> B: array<f32>;
|
|
2126
|
+
@group(0) @binding(2) var<storage, read_write> C: array<f32>;
|
|
2127
|
+
|
|
2128
|
+
struct Params {
|
|
2129
|
+
m: u32,
|
|
2130
|
+
n: u32,
|
|
2131
|
+
k: u32,
|
|
2132
|
+
alpha: f32,
|
|
2133
|
+
beta: f32,
|
|
2134
|
+
lda: u32,
|
|
2135
|
+
ldb: u32,
|
|
2136
|
+
ldc: u32,
|
|
2137
|
+
transA: u32, // 0 = no-transpose, 1 = transpose
|
|
2138
|
+
transB: u32,
|
|
2139
|
+
uplo: u32, // 0 = lower (col <= row), 1 = upper (col >= row)
|
|
2140
|
+
}
|
|
2141
|
+
|
|
2142
|
+
@group(0) @binding(3) var<uniform> params: Params;
|
|
2143
|
+
|
|
2144
|
+
var<workgroup> As: array<f32, BM * BK>;
|
|
2145
|
+
var<workgroup> Bs: array<f32, BK * BN>;
|
|
2146
|
+
|
|
2147
|
+
@compute @workgroup_size(THREADS_X, THREADS_Y)
|
|
2148
|
+
fn main(
|
|
2149
|
+
@builtin(workgroup_id) wid: vec3u,
|
|
2150
|
+
@builtin(local_invocation_id) lid: vec3u,
|
|
2151
|
+
@builtin(local_invocation_index) tid: u32,
|
|
2152
|
+
) {
|
|
2153
|
+
let blockRow = wid.y * BM;
|
|
2154
|
+
let blockCol = wid.x * BN;
|
|
2155
|
+
let threadCol = lid.x;
|
|
2156
|
+
let threadRow = lid.y;
|
|
2157
|
+
|
|
2158
|
+
let innerRowA = tid / BK;
|
|
2159
|
+
let innerColA = tid % BK;
|
|
2160
|
+
let innerRowB = tid / BN;
|
|
2161
|
+
let innerColB = tid % BN;
|
|
2162
|
+
|
|
2163
|
+
var threadResults: array<f32, TM * TN>;
|
|
2164
|
+
for (var i = 0u; i < TM * TN; i++) {
|
|
2165
|
+
threadResults[i] = 0.0;
|
|
2166
|
+
}
|
|
2167
|
+
var regM: array<f32, TM>;
|
|
2168
|
+
var regN: array<f32, TN>;
|
|
2169
|
+
|
|
2170
|
+
let numTiles = (params.k + BK - 1u) / BK;
|
|
2171
|
+
for (var t = 0u; t < numTiles; t++) {
|
|
2172
|
+
for (var loadOffset = 0u; loadOffset < BM; loadOffset += STRIDE_A) {
|
|
2173
|
+
let gRowA = blockRow + innerRowA + loadOffset;
|
|
2174
|
+
let gColA = t * BK + innerColA;
|
|
2175
|
+
let aIdx = select(gRowA * params.lda + gColA, gColA * params.lda + gRowA, params.transA != 0u);
|
|
2176
|
+
As[(innerRowA + loadOffset) * BK + innerColA] = select(0.0, A[aIdx], gRowA < params.m && gColA < params.k);
|
|
2177
|
+
}
|
|
2178
|
+
for (var loadOffset = 0u; loadOffset < BK; loadOffset += STRIDE_B) {
|
|
2179
|
+
let gRowB = t * BK + innerRowB + loadOffset;
|
|
2180
|
+
let gColB = blockCol + innerColB;
|
|
2181
|
+
let bIdx = select(gRowB * params.ldb + gColB, gColB * params.ldb + gRowB, params.transB != 0u);
|
|
2182
|
+
Bs[(innerRowB + loadOffset) * BN + innerColB] = select(0.0, B[bIdx], gRowB < params.k && gColB < params.n);
|
|
2183
|
+
}
|
|
2184
|
+
|
|
2185
|
+
workgroupBarrier();
|
|
2186
|
+
|
|
2187
|
+
for (var dotIdx = 0u; dotIdx < BK; dotIdx++) {
|
|
2188
|
+
for (var i = 0u; i < TM; i++) {
|
|
2189
|
+
regM[i] = As[(threadRow * TM + i) * BK + dotIdx];
|
|
2190
|
+
}
|
|
2191
|
+
for (var i = 0u; i < TN; i++) {
|
|
2192
|
+
regN[i] = Bs[dotIdx * BN + threadCol * TN + i];
|
|
2193
|
+
}
|
|
2194
|
+
for (var resIdxM = 0u; resIdxM < TM; resIdxM++) {
|
|
2195
|
+
for (var resIdxN = 0u; resIdxN < TN; resIdxN++) {
|
|
2196
|
+
threadResults[resIdxM * TN + resIdxN] += regM[resIdxM] * regN[resIdxN];
|
|
2197
|
+
}
|
|
2198
|
+
}
|
|
2199
|
+
}
|
|
2200
|
+
|
|
2201
|
+
workgroupBarrier();
|
|
2202
|
+
}
|
|
2203
|
+
|
|
2204
|
+
for (var resIdxM = 0u; resIdxM < TM; resIdxM++) {
|
|
2205
|
+
let row = blockRow + threadRow * TM + resIdxM;
|
|
2206
|
+
if (row < params.m) {
|
|
2207
|
+
for (var resIdxN = 0u; resIdxN < TN; resIdxN++) {
|
|
2208
|
+
let col = blockCol + threadCol * TN + resIdxN;
|
|
2209
|
+
let inTriangle = select(col >= row, col <= row, params.uplo == 0u);
|
|
2210
|
+
if (col < params.n && inTriangle) {
|
|
2211
|
+
let cIdx = row * params.ldc + col;
|
|
2212
|
+
C[cIdx] = params.alpha * threadResults[resIdxM * TN + resIdxN] + params.beta * C[cIdx];
|
|
2213
|
+
}
|
|
2214
|
+
}
|
|
2215
|
+
}
|
|
2216
|
+
}
|
|
2217
|
+
}
|
|
2218
|
+
`});var Mt,St=O(()=>{Mt=`// sgemmtr_large: C := uplo(alpha * op(A) * op(B) + beta * C) \u2014 large-tile
|
|
2219
|
+
// half of a two-tier dispatch, identical to sgemm_large.wgsl (see that file
|
|
2220
|
+
// for the BM/BN/BK/TM/TN autotuning rationale) except the final output write
|
|
2221
|
+
// is gated to one triangle of C by \`uplo\`, the same convention ssyr/ssyr2
|
|
2222
|
+
// use (0 = lower: col <= row, 1 = upper: col >= row). Every other element of
|
|
2223
|
+
// C \u2014 including inside the compute loop, where the full tile is still
|
|
2224
|
+
// computed regardless of uplo, only the write is masked \u2014 is left untouched.
|
|
2225
|
+
// gemmtr's uplo(C) test is a plain row/col comparison over the full m\xD7n
|
|
2226
|
+
// grid, well-defined even when m != n (not restricted to square C).
|
|
2227
|
+
|
|
2228
|
+
const BM: u32 = 64u;
|
|
2229
|
+
const BN: u32 = 64u;
|
|
2230
|
+
const BK: u32 = 8u;
|
|
2231
|
+
const TM: u32 = 8u;
|
|
2232
|
+
const TN: u32 = 4u;
|
|
2233
|
+
const THREADS_X: u32 = BN / TN;
|
|
2234
|
+
const THREADS_Y: u32 = BM / TM;
|
|
2235
|
+
const NUM_THREADS: u32 = THREADS_X * THREADS_Y; // 128
|
|
2236
|
+
const STRIDE_A: u32 = NUM_THREADS / BK; // rows of As covered per load-loop step
|
|
2237
|
+
const STRIDE_B: u32 = NUM_THREADS / BN; // rows of Bs covered per load-loop step
|
|
2238
|
+
|
|
2239
|
+
@group(0) @binding(0) var<storage, read> A: array<f32>;
|
|
2240
|
+
@group(0) @binding(1) var<storage, read> B: array<f32>;
|
|
2241
|
+
@group(0) @binding(2) var<storage, read_write> C: array<f32>;
|
|
2242
|
+
|
|
2243
|
+
struct Params {
|
|
2244
|
+
m: u32,
|
|
2245
|
+
n: u32,
|
|
2246
|
+
k: u32,
|
|
2247
|
+
alpha: f32,
|
|
2248
|
+
beta: f32,
|
|
2249
|
+
lda: u32,
|
|
2250
|
+
ldb: u32,
|
|
2251
|
+
ldc: u32,
|
|
2252
|
+
transA: u32, // 0 = no-transpose, 1 = transpose
|
|
2253
|
+
transB: u32,
|
|
2254
|
+
uplo: u32, // 0 = lower (col <= row), 1 = upper (col >= row)
|
|
2255
|
+
}
|
|
2256
|
+
|
|
2257
|
+
@group(0) @binding(3) var<uniform> params: Params;
|
|
2258
|
+
|
|
2259
|
+
var<workgroup> As: array<f32, BM * BK>;
|
|
2260
|
+
var<workgroup> Bs: array<f32, BK * BN>;
|
|
2261
|
+
|
|
2262
|
+
@compute @workgroup_size(THREADS_X, THREADS_Y)
|
|
2263
|
+
fn main(
|
|
2264
|
+
@builtin(workgroup_id) wid: vec3u,
|
|
2265
|
+
@builtin(local_invocation_id) lid: vec3u,
|
|
2266
|
+
@builtin(local_invocation_index) tid: u32,
|
|
2267
|
+
) {
|
|
2268
|
+
let blockRow = wid.y * BM;
|
|
2269
|
+
let blockCol = wid.x * BN;
|
|
2270
|
+
let threadCol = lid.x;
|
|
2271
|
+
let threadRow = lid.y;
|
|
2272
|
+
|
|
2273
|
+
// Load indices, independent of the compute thread shape \u2014 a loop since
|
|
2274
|
+
// NUM_THREADS doesn't match the tile size 1:1 at this config.
|
|
2275
|
+
let innerRowA = tid / BK;
|
|
2276
|
+
let innerColA = tid % BK;
|
|
2277
|
+
let innerRowB = tid / BN;
|
|
2278
|
+
let innerColB = tid % BN;
|
|
2279
|
+
|
|
2280
|
+
var threadResults: array<f32, TM * TN>;
|
|
2281
|
+
for (var i = 0u; i < TM * TN; i++) {
|
|
2282
|
+
threadResults[i] = 0.0;
|
|
2283
|
+
}
|
|
2284
|
+
var regM: array<f32, TM>;
|
|
2285
|
+
var regN: array<f32, TN>;
|
|
2286
|
+
|
|
2287
|
+
let numTiles = (params.k + BK - 1u) / BK;
|
|
2288
|
+
for (var t = 0u; t < numTiles; t++) {
|
|
2289
|
+
for (var loadOffset = 0u; loadOffset < BM; loadOffset += STRIDE_A) {
|
|
2290
|
+
let gRowA = blockRow + innerRowA + loadOffset;
|
|
2291
|
+
let gColA = t * BK + innerColA;
|
|
2292
|
+
let aIdx = select(gRowA * params.lda + gColA, gColA * params.lda + gRowA, params.transA != 0u);
|
|
2293
|
+
As[(innerRowA + loadOffset) * BK + innerColA] = select(0.0, A[aIdx], gRowA < params.m && gColA < params.k);
|
|
2294
|
+
}
|
|
2295
|
+
for (var loadOffset = 0u; loadOffset < BK; loadOffset += STRIDE_B) {
|
|
2296
|
+
let gRowB = t * BK + innerRowB + loadOffset;
|
|
2297
|
+
let gColB = blockCol + innerColB;
|
|
2298
|
+
let bIdx = select(gRowB * params.ldb + gColB, gColB * params.ldb + gRowB, params.transB != 0u);
|
|
2299
|
+
Bs[(innerRowB + loadOffset) * BN + innerColB] = select(0.0, B[bIdx], gRowB < params.k && gColB < params.n);
|
|
2300
|
+
}
|
|
2301
|
+
|
|
2302
|
+
workgroupBarrier();
|
|
2303
|
+
|
|
2304
|
+
for (var dotIdx = 0u; dotIdx < BK; dotIdx++) {
|
|
2305
|
+
for (var i = 0u; i < TM; i++) {
|
|
2306
|
+
regM[i] = As[(threadRow * TM + i) * BK + dotIdx];
|
|
2307
|
+
}
|
|
2308
|
+
for (var i = 0u; i < TN; i++) {
|
|
2309
|
+
regN[i] = Bs[dotIdx * BN + threadCol * TN + i];
|
|
2310
|
+
}
|
|
2311
|
+
for (var resIdxM = 0u; resIdxM < TM; resIdxM++) {
|
|
2312
|
+
for (var resIdxN = 0u; resIdxN < TN; resIdxN++) {
|
|
2313
|
+
threadResults[resIdxM * TN + resIdxN] += regM[resIdxM] * regN[resIdxN];
|
|
2314
|
+
}
|
|
2315
|
+
}
|
|
2316
|
+
}
|
|
2317
|
+
|
|
2318
|
+
workgroupBarrier();
|
|
2319
|
+
}
|
|
2320
|
+
|
|
2321
|
+
for (var resIdxM = 0u; resIdxM < TM; resIdxM++) {
|
|
2322
|
+
let row = blockRow + threadRow * TM + resIdxM;
|
|
2323
|
+
if (row < params.m) {
|
|
2324
|
+
for (var resIdxN = 0u; resIdxN < TN; resIdxN++) {
|
|
2325
|
+
let col = blockCol + threadCol * TN + resIdxN;
|
|
2326
|
+
let inTriangle = select(col >= row, col <= row, params.uplo == 0u);
|
|
2327
|
+
if (col < params.n && inTriangle) {
|
|
2328
|
+
let cIdx = row * params.ldc + col;
|
|
2329
|
+
C[cIdx] = params.alpha * threadResults[resIdxM * TN + resIdxN] + params.beta * C[cIdx];
|
|
2330
|
+
}
|
|
2331
|
+
}
|
|
2332
|
+
}
|
|
2333
|
+
}
|
|
2334
|
+
}
|
|
2335
|
+
`});var Lt,It=O(()=>{Lt=`// symmetrize: Adense := full dense expansion of a symmetric matrix stored
|
|
2336
|
+
// with only its \`uplo\` triangle meaningful (the other triangle is implied
|
|
2337
|
+
// by symmetry: A[i,j] = A[j,i]). A plain element-wise pass, no tiling or
|
|
2338
|
+
// shared memory needed \u2014 used to materialize a dense operand for routines
|
|
2339
|
+
// that read a symmetric matrix as a normal dense gemm input (e.g. ssymm),
|
|
2340
|
+
// rather than teaching the tiled gemm kernel itself to mirror-read.
|
|
2341
|
+
|
|
2342
|
+
@group(0) @binding(0) var<storage, read> A: array<f32>;
|
|
2343
|
+
@group(0) @binding(1) var<storage, read_write> Adense: array<f32>;
|
|
2344
|
+
|
|
2345
|
+
struct Params {
|
|
2346
|
+
n: u32,
|
|
2347
|
+
lda: u32,
|
|
2348
|
+
ldd: u32, // leading dimension of Adense
|
|
2349
|
+
uplo: u32, // 0 = lower (stored where col <= row), 1 = upper (col >= row)
|
|
2350
|
+
}
|
|
2351
|
+
|
|
2352
|
+
@group(0) @binding(2) var<uniform> params: Params;
|
|
2353
|
+
|
|
2354
|
+
@compute @workgroup_size(8, 8)
|
|
2355
|
+
fn main(@builtin(global_invocation_id) gid: vec3u) {
|
|
2356
|
+
let row = gid.y;
|
|
2357
|
+
let col = gid.x;
|
|
2358
|
+
if (row >= params.n || col >= params.n) {
|
|
2359
|
+
return;
|
|
2360
|
+
}
|
|
2361
|
+
|
|
2362
|
+
let isStored = select(col >= row, col <= row, params.uplo == 0u);
|
|
2363
|
+
let srcIdx = select(col * params.lda + row, row * params.lda + col, isStored);
|
|
2364
|
+
Adense[row * params.ldd + col] = A[srcIdx];
|
|
2365
|
+
}
|
|
2366
|
+
`});var Rt,Dt=O(()=>{Rt=`// triangularize: Adense := dense expansion of op(A) (A or A^T per \`trans\`),
|
|
2367
|
+
// zero-filling the unstored triangle (exact for a matmul) so strmm can reuse
|
|
2368
|
+
// sgemm's kernel unchanged. \`diag=1\` substitutes 1.0 on the diagonal.
|
|
2369
|
+
|
|
2370
|
+
@group(0) @binding(0) var<storage, read> A: array<f32>;
|
|
2371
|
+
@group(0) @binding(1) var<storage, read_write> Adense: array<f32>;
|
|
2372
|
+
|
|
2373
|
+
struct Params {
|
|
2374
|
+
n: u32,
|
|
2375
|
+
lda: u32,
|
|
2376
|
+
ldd: u32, // leading dimension of Adense
|
|
2377
|
+
uplo: u32, // 0 = lower, 1 = upper
|
|
2378
|
+
trans: u32, // 0 = no-transpose (op(A) = A), 1 = transpose (op(A) = A^T)
|
|
2379
|
+
diag: u32, // 0 = non-unit, 1 = unit
|
|
2380
|
+
}
|
|
2381
|
+
|
|
2382
|
+
@group(0) @binding(2) var<uniform> params: Params;
|
|
2383
|
+
|
|
2384
|
+
@compute @workgroup_size(8, 8)
|
|
2385
|
+
fn main(@builtin(global_invocation_id) gid: vec3u) {
|
|
2386
|
+
let row = gid.y;
|
|
2387
|
+
let col = gid.x;
|
|
2388
|
+
if (row >= params.n || col >= params.n) {
|
|
2389
|
+
return;
|
|
2390
|
+
}
|
|
2391
|
+
|
|
2392
|
+
if (row == col) {
|
|
2393
|
+
Adense[row * params.ldd + col] = select(A[row * params.lda + row], 1.0, params.diag == 1u);
|
|
2394
|
+
return;
|
|
2395
|
+
}
|
|
2396
|
+
|
|
2397
|
+
var isMeaningful: bool;
|
|
2398
|
+
var srcRow: u32;
|
|
2399
|
+
var srcCol: u32;
|
|
2400
|
+
if (params.trans == 0u) {
|
|
2401
|
+
isMeaningful = select(col >= row, col <= row, params.uplo == 0u);
|
|
2402
|
+
srcRow = row; srcCol = col;
|
|
2403
|
+
} else {
|
|
2404
|
+
isMeaningful = select(col <= row, col >= row, params.uplo == 0u);
|
|
2405
|
+
srcRow = col; srcCol = row;
|
|
2406
|
+
}
|
|
2407
|
+
|
|
2408
|
+
Adense[row * params.ldd + col] = select(0.0, A[srcRow * params.lda + srcCol], isMeaningful);
|
|
2409
|
+
}
|
|
2410
|
+
`});var jt,Tt=O(()=>{jt=`// block_transfer: gather/scatter/scatter-subtract between a tight (blockLen
|
|
2411
|
+
// x otherLen) block and a sub-range of a strided (any ld, row/col-major)
|
|
2412
|
+
// buffer \u2014 needed since block offsets aren't 256-byte-aligned and block
|
|
2413
|
+
// rows/cols aren't always one contiguous range for copyBufferToBuffer.
|
|
2414
|
+
|
|
2415
|
+
@group(0) @binding(0) var<storage, read_write> block: array<f32>; // blockLen x otherLen, block[i*otherLen+j]
|
|
2416
|
+
@group(0) @binding(1) var<storage, read_write> strided: array<f32>; // B's or A's own buffer
|
|
2417
|
+
|
|
2418
|
+
struct Params {
|
|
2419
|
+
blockStart: u32,
|
|
2420
|
+
blockLen: u32,
|
|
2421
|
+
otherStart: u32,
|
|
2422
|
+
otherLen: u32,
|
|
2423
|
+
ld: u32,
|
|
2424
|
+
isColMajor: u32, // 0 = row-major addressing, 1 = column-major (row/col swapped)
|
|
2425
|
+
blockIsRow: u32, // 1 = blockStart indexes strided's rows, 0 = its columns
|
|
2426
|
+
mode: u32, // 0 = scatter (strided := block), 1 = scatter_sub (strided -= block), 2 = gather (block := strided)
|
|
2427
|
+
}
|
|
2428
|
+
|
|
2429
|
+
@group(0) @binding(2) var<uniform> params: Params;
|
|
2430
|
+
|
|
2431
|
+
@compute @workgroup_size(8, 8)
|
|
2432
|
+
fn main(@builtin(global_invocation_id) gid: vec3u) {
|
|
2433
|
+
let i = gid.y; // index along the blocked axis, within the block
|
|
2434
|
+
let j = gid.x; // index along the other axis, within the block
|
|
2435
|
+
if (i >= params.blockLen || j >= params.otherLen) {
|
|
2436
|
+
return;
|
|
2437
|
+
}
|
|
2438
|
+
|
|
2439
|
+
let row = select(params.otherStart + j, params.blockStart + i, params.blockIsRow == 1u);
|
|
2440
|
+
let col = select(params.blockStart + i, params.otherStart + j, params.blockIsRow == 1u);
|
|
2441
|
+
let stridedIdx = select(row * params.ld + col, col * params.ld + row, params.isColMajor == 1u);
|
|
2442
|
+
let blockIdx = i * params.otherLen + j;
|
|
2443
|
+
|
|
2444
|
+
if (params.mode == 2u) {
|
|
2445
|
+
block[blockIdx] = strided[stridedIdx];
|
|
2446
|
+
} else if (params.mode == 1u) {
|
|
2447
|
+
strided[stridedIdx] -= block[blockIdx];
|
|
2448
|
+
} else {
|
|
2449
|
+
strided[stridedIdx] = block[blockIdx];
|
|
2450
|
+
}
|
|
2451
|
+
}
|
|
2452
|
+
`});var Ct={};te(Ct,{shaderSources:()=>Ga});var Ga,Wt=O(()=>{pe();ge();he();ve();_e();Ee();Ge();Pe();Se();Ie();De();Te();Ce();Fe();Ue();Ve();ze();Ye();Qe();$e();rt();tt();at();st();ut();ft();ct();pt();gt();ht();vt();_t();Et();Gt();Pt();St();It();Dt();Tt();Ga={"reduction/argmax":we,"reduction/argmaxF64":be,"reduction/sum":xe,"reduction/sumF64":ye,sscal:Be,sswap:Ae,saxpy:ke,scopy:Ne,sdot:Me,sasum:Le,snrm2:Re,srot:je,srotm:We,isamax:He,sgemv_n:Oe,sgemv_t:Ke,ssymv:qe,strmv:Xe,sger:Ze,ssyr:Je,ssyr2:et,f64add:ot,"f64/dekker":it,"f64/utils/abs":nt,"f64/utils/add":lt,"f64/utils/greater":mt,"f64/utils/equal":dt,dasum:wt,idamax:bt,strsv_invert_block:xt,strsv_apply_inverse:yt,strsv_update:Bt,sgemm_small:At,sgemm_large:kt,sgemmtr_small:Nt,sgemmtr_large:Mt,symmetrize:Lt,triangularize:Rt,block_transfer:jt}});var ni={};te(ni,{GpuMatrix:()=>H,GpuVector:()=>I,cleanup:()=>le,dasum:()=>Xt,gpuName:()=>fe,idamax:()=>Jt,init:()=>ue,isamax:()=>$t,randomFloat32Array:()=>me,randomFloat64Array:()=>ce,randomTriangularFloat32Array:()=>de,sasum:()=>Yt,saxpy:()=>Ot,scopy:()=>Vt,sdot:()=>zt,sgemm:()=>mo,sgemmtr:()=>co,sgemv:()=>to,sger:()=>uo,snrm2:()=>Zt,srot:()=>ro,srotm:()=>eo,sscal:()=>Ht,sswap:()=>Ut,ssymm:()=>bo,ssymv:()=>oo,ssyr:()=>lo,ssyr2:()=>fo,ssyr2k:()=>wo,ssyrk:()=>po,strmm:()=>xo,strmv:()=>ao,strsm:()=>Ao,strsv:()=>no});function ae(a,e){return e?a.features.has("timestamp-query")?{requiredFeatures:["timestamp-query"]}:(console.warn("timestamp-query not supported on this device \u2014 benchmark mode disabled."),{}):{}}function ie(){if(!se())return{querySet:null,passDescriptor:void 0};let e=lr().createQuerySet({type:"timestamp",count:2});return{querySet:e,passDescriptor:{timestampWrites:{querySet:e,beginningOfPassWriteIndex:0,endOfPassWriteIndex:1}}}}function br(a,e){if(!e)return null;let r=lr(),o=r.createBuffer({label:"timestamp-resolve",size:16,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC});a.resolveQuerySet(e,0,2,o,0);let t=r.createBuffer({label:"timestamp-readback",size:16,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});return a.copyBufferToBuffer(o,0,t,0,16),{tsReadBuffer:t,resolveBuffer:o,querySet:e}}async function S(a){if(!a)return;let{tsReadBuffer:e,resolveBuffer:r,querySet:o}=a;await e.mapAsync(GPUMapMode.READ);let t=new BigInt64Array(e.getMappedRange().slice());return e.unmap(),e.destroy(),r.destroy(),o.destroy(),Math.max(0,Number(t[1]-t[0]))/1e6}var Ar=null,Ir=null,ne=null,Qr=!1;async function ue({powerPreference:a="high-performance",benchmark:e=!1,dumpShaders:r=!1}={}){if(Ar)return Ar;let o;if(typeof window>"u"){let{create:s,globals:l}=await import("webgpu");Object.assign(globalThis,l),o=s(r?["enable-dawn-features=dump_shaders,disable_symbol_renaming"]:[]),ne=o}else r&&console.warn("dumpShaders has no effect in the browser \u2014 see init()'s docs."),o=navigator.gpu;if(!o)throw new Error("WebGPU not supported in this environment.");if(Ir=await o.requestAdapter({powerPreference:a})??await o.requestAdapter(),!Ir)throw new Error("No WebGPU adapter found.");Qr=e;let i=[...ae(Ir,e).requiredFeatures??[]];return Ar=await Ir.requestDevice({requiredFeatures:i}),Ar.addEventListener("uncapturederror",s=>{console.error("Uncaptured GPU error:",s.error.message)}),Ar}function le(){Ar&&(Ar.destroy(),Ar=null),Ir=null,ne=null,Qr=!1}function fe(){if(!Ir)throw new Error("WebGPU adapter not initialized \u2014 call init() first.");let{device:a,description:e}=Ir.info;return{description:e||"unknown",device:a||"unknown"}}function se(){return Qr}function lr(){if(!Ar)throw new Error("WebGPU device not initialized \u2014 call init() first.");return Ar}function d(...a){a.flat().forEach(e=>e.destroy())}function v(a,e="blas-input",r=!1){let o=lr(),t=o.limits.maxStorageBufferBindingSize,i=a.byteLength;if(i>t)throw new Error(`Buffer size ${i} bytes exceeds device limit of ${t} bytes.`);let s=r?GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC:GPUBufferUsage.STORAGE,l=o.createBuffer({label:e,size:i,usage:s,mappedAtCreation:!0}),n=a.constructor;return new n(l.getMappedRange()).set(a),l.unmap(),l}function er(a,e="blas-storage",r=0){return lr().createBuffer({label:e,size:a,usage:GPUBufferUsage.STORAGE|r})}function xr(a,e="blas-result"){return lr().createBuffer({label:e,size:a,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC})}function N(a,e){let o=lr().createBuffer({label:"blas-readback",size:e.size,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});return a.copyBufferToBuffer(e,0,o,0,e.size),o}function L(a,e="blas-params"){let r=lr(),o=a.length*4,t=Math.ceil(o/16)*16,i=new ArrayBuffer(t),s=new DataView(i);a.forEach(({value:n,type:u},f)=>{let m=f*4;if(u==="u32")s.setUint32(m,n,!0);else if(u==="i32")s.setInt32(m,n,!0);else if(u==="f32")s.setFloat32(m,n,!0);else throw new Error(`Unknown param type "${u}". Use "f32", "u32", or "i32".`)});let l=r.createBuffer({label:e,size:t,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});return r.queue.writeBuffer(l,0,i),l}async function k(a,e=Float32Array){try{await a.mapAsync(GPUMapMode.READ);let r=new e(a.getMappedRange().slice());return a.unmap(),r}finally{a.destroy()}}function Pr(a){let e=a.length,r=new Float32Array(e),o=new Float32Array(e);for(let t=0;t<e;t++){let i=Math.fround(a[t]);r[t]=i,o[t]=Math.fround(a[t]-i)}return{hi:r,lo:o}}function Dr(a,e){let r=a.length,o=new Float64Array(r);for(let t=0;t<r;t++)o[t]=a[t]+e[t];return o}var I=class a{constructor(e,r,o=Float32Array,t=null){this._buf=e,this._loBuf=t,this.length=r,this.dtype=o}static from(e){if(e instanceof Float64Array){let{hi:o,lo:t}=Pr(e),i=v(o,"gpu-vector-f64-hi",!0),s=v(t,"gpu-vector-f64-lo",!0);return new a(i,e.length,Float64Array,s)}if(!(e instanceof Float32Array))throw new Error("GpuVector.from expects a Float32Array or Float64Array.");let r=v(e,"gpu-vector",!0);return new a(r,e.length,e.constructor)}async read(){let e=lr(),r=e.createCommandEncoder(),o=N(r,this._buf);if(e.queue.submit([r.finish()]),!this._loBuf)return k(o,this.dtype);let t=e.createCommandEncoder(),i=N(t,this._loBuf);e.queue.submit([t.finish()]);let[s,l]=await Promise.all([k(o,Float32Array),k(i,Float32Array)]);return Dr(s,l)}destroy(){this._buf.destroy(),this._loBuf&&this._loBuf.destroy()}};var H=class a{constructor(e,r,o,t,i=null,s="row-major"){this._buf=e,this._loBuf=i,this.rows=r,this.cols=o,this.lda=t,this.layout=s}static from(e,r,o,t,i="row-major"){if(i!=="row-major"&&i!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");let s=i==="row-major";if(t===void 0&&(t=s?o:r),!(e instanceof Float32Array)&&!(e instanceof Float64Array))throw new Error("GpuMatrix.from expects a Float32Array or Float64Array.");if(!Number.isInteger(r)||r<=0)throw new Error("rows must be a positive integer.");if(!Number.isInteger(o)||o<=0)throw new Error("cols must be a positive integer.");let l=s?o:r;if(!Number.isInteger(t)||t<l)throw new Error(`lda must be an integer >= ${s?"cols":"rows"}.`);let n=s?r:o;if(e.length<n*t)throw new Error("data does not have enough elements for the given rows, cols, and lda.");if(e instanceof Float64Array){let f=n*t,{hi:m,lo:w}=Pr(e.subarray(0,f)),c=v(m,"gpu-matrix-f64-hi",!0),p=v(w,"gpu-matrix-f64-lo",!0);return new a(c,r,o,t,p,i)}let u=v(e.subarray(0,n*t),"gpu-matrix",!0);return new a(u,r,o,t,null,i)}async read(){let e=lr(),r=e.createCommandEncoder(),o=N(r,this._buf);e.queue.submit([r.finish()]);let t=this.layout!=="column-major",i=t?this.rows:this.cols,s=t?this.cols:this.rows;if(this._loBuf){let u=e.createCommandEncoder(),f=N(u,this._loBuf);e.queue.submit([u.finish()]);let[m,w]=await Promise.all([k(o,Float32Array),k(f,Float32Array)]),c=Dr(m,w);if(this.lda===s)return c;let p=new Float64Array(i*s);for(let g=0;g<i;g++)p.set(c.subarray(g*this.lda,g*this.lda+s),g*s);return p}let l=await k(o,Float32Array);if(this.lda===s)return l;let n=new Float32Array(i*s);for(let u=0;u<i;u++)n.set(l.subarray(u*this.lda,u*this.lda+s),u*s);return n}destroy(){this._buf.destroy(),this._loBuf&&this._loBuf.destroy()}};function me(a,e=-1,r=1){let o=new Float32Array(a);for(let t=0;t<a;t++)o[t]=e+Math.random()*(r-e);return o}function ce(a,e=-1,r=1){let o=new Float64Array(a);for(let t=0;t<a;t++)o[t]=e+Math.random()*(r-e);return o}function de(a,e,r="lower",o=-1,t=1,i=5,s=15){if(r!=="lower"&&r!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(e<a)throw new Error("lda must be >= n.");let l=new Float32Array(a*e);for(let n=0;n<a;n++){for(let u=0;u<a;u++){if(n===u)continue;(r==="lower"?u<n:u>n)&&(l[n*e+u]=o+Math.random()*(t-o))}l[n*e+n]=i+Math.random()*(s-i)}return l}function B(a,e,r=0){let o=lr(),t=e.map((i,s)=>({binding:r+s,resource:i instanceof GPUBuffer?{buffer:i}:i}));return o.createBindGroup({layout:a,entries:t})}var Fo=new WeakMap;function M(a){lr().queue.submit([a.finish()])}function vr(){let a=lr(),{querySet:e,passDescriptor:r}=ie();return{commandEncoder:a.createCommandEncoder(),querySet:e,passDescriptor:r}}function ar(a,e,r,o,t){let i=a.beginComputePass(t);i.setPipeline(e),i.setBindGroup(0,r),typeof o=="number"?i.dispatchWorkgroups(o):i.dispatchWorkgroups(o.x,o.y,o.z??1),i.end(),Fo.set(a,i)}function C(a,e,r){let{commandEncoder:o,querySet:t,passDescriptor:i}=vr();ar(o,a,e,r,i);let s=br(o,t);return{commandEncoder:o,ts:s}}var Na={},Zr=new WeakMap;async function G(a,e,r="main"){Zr.has(a)||Zr.set(a,new Map);let o=Zr.get(a),t=Array.isArray(e)?e:[e],i=`${t.join("+")}::${r}`;return o.has(i)||o.set(i,await Pa(t,r)),o.get(i)}async function ka(a){if(typeof process>"u"||!process.versions?.node){let{shaderSources:e}=await Promise.resolve().then(()=>(Wt(),Ct)),r=e[a];if(!r)throw new Error(`Shader "${a}" not found in browser bundle.`);return r}else{let{readFileSync:e}=await import("fs"),{fileURLToPath:r}=await import("url"),{dirname:o,join:t}=await import("path"),i=o(r(Na.url));return e(t(i,`../shaders/${a}.wgsl`),"utf8")}}async function Pa(a,e="main"){let r=lr(),o=a.join("+"),t=(await Promise.all(a.map(ka))).join(`
|
|
2453
|
+
`),i=r.createShaderModule({label:o,code:t}),l=(await i.getCompilationInfo()).messages.filter(f=>f.type==="error");if(l.length>0)throw new Error(`Shader "${o}" compilation failed:
|
|
2454
|
+
${l.map(f=>` line ${f.lineNum}: ${f.message}`).join(`
|
|
2455
|
+
`)}`);let n=e==="main"?{module:i}:{module:i,entryPoint:e},u=r.createComputePipeline({label:o,layout:"auto",compute:n});return u._shaderModule=i,u}var Sa=64,Ft=8;function mr(a,e){let r=lr().limits.maxComputeWorkgroupsPerDimension;return e===void 0?Math.min(Math.ceil(a/Sa),r):{x:Math.min(Math.ceil(e/Ft),r),y:Math.min(Math.ceil(a/Ft),r)}}async function Ht(a,e,r,o,t){let i=o instanceof I;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(e)||!Number.isInteger(t))throw new Error("n and incx must be integers.");if(typeof r!="number")throw new Error("alpha must be a number.");if(Number.isNaN(r))throw new Error("alpha must not be NaN.");if(!Number.isFinite(r))throw new Error("alpha must be finite.");if(t<=0)throw new Error("incx must be positive.");if(!(o instanceof Float32Array)&&!(o instanceof I))throw new Error("x must be a Float32Array or GpuVector.");if(e<=0)return i?{}:o;if(o.length<(e-1)*t+1)throw new Error("x does not have enough elements for the given n and incx.");let s=await G(a,"sscal"),l=null,n=null,u=null;try{l=i?o._buf:v(o,"sscal-x",!0),n=L([{value:e,type:"u32"},{value:r,type:"f32"},{value:t,type:"u32"}],"sscal-params");let f=B(s.getBindGroupLayout(0),[l,n]),{commandEncoder:m,ts:w}=C(s,f,mr(e));u=i?null:N(m,l),M(m);let c=await S(w);if(i)return c!==void 0?{gpuTimeMs:c}:{};let p=await k(u,Float32Array);return u=null,c!==void 0?{x:p,gpuTimeMs:c}:p}finally{!i&&l&&d(l),n&&d(n),u&&d(u)}}async function Ut(a,e,r,o,t,i){let s=r instanceof I,l=t instanceof I;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(e)||!Number.isInteger(o)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(o<=0||i<=0)throw new Error("incx and incy must be positive.");if(!(r instanceof Float32Array)&&!(r instanceof I))throw new Error("x must be a Float32Array or GpuVector.");if(!(t instanceof Float32Array)&&!(t instanceof I))throw new Error("y must be a Float32Array or GpuVector.");if(r.constructor!==t.constructor)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(e<=0)return s?{}:{x:r,y:t};if(r.length<(e-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(e-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let n=await G(a,"sswap"),u=null,f=null,m=null,w=null,c=null;try{u=s?r._buf:v(r,"sswap-x",!0),f=l?t._buf:v(t,"sswap-y",!0),m=L([{value:e,type:"u32"},{value:o,type:"u32"},{value:i,type:"u32"}],"sswap-params");let p=B(n.getBindGroupLayout(0),[u,f,m]),{commandEncoder:g,ts:h}=C(n,p,mr(e));w=s?null:N(g,u),c=l?null:N(g,f),M(g);let b=await S(h);if(s&&l)return b!==void 0?{gpuTimeMs:b}:{};let x=await k(w,Float32Array);w=null;let _=await k(c,Float32Array);return c=null,b!==void 0?{x,y:_,gpuTimeMs:b}:{x,y:_}}finally{!s&&u&&d(u),!l&&f&&d(f),m&&d(m),w&&d(w),c&&d(c)}}async function Ot(a,e,r,o,t,i,s){let l=o instanceof I,n=i instanceof I;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(e)||!Number.isInteger(t)||!Number.isInteger(s))throw new Error("n, incx, and incy must be integers.");if(typeof r!="number")throw new Error("alpha must be a number.");if(Number.isNaN(r))throw new Error("alpha must not be NaN.");if(!Number.isFinite(r))throw new Error("alpha must be finite.");if(t<=0||s<=0)throw new Error("incx and incy must be positive.");if(!l&&!(o instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!n&&!(i instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(l!==n)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(e<=0)return n?{}:{y:i};if(o.length<(e-1)*t+1)throw new Error("x does not have enough elements for the given n and incx.");if(i.length<(e-1)*s+1)throw new Error("y does not have enough elements for the given n and incy.");let u=await G(a,"saxpy"),f=null,m=null,w=null,c=null;try{f=l?o._buf:v(o,"saxpy-x",!1),m=n?i._buf:v(i,"saxpy-y",!0),w=L([{value:e,type:"u32"},{value:r,type:"f32"},{value:t,type:"u32"},{value:s,type:"u32"}],"saxpy-params");let p=B(u.getBindGroupLayout(0),[f,m,w]),{commandEncoder:g,ts:h}=C(u,p,mr(e));c=n?null:N(g,m),M(g);let b=await S(h);if(n&&l)return b!==void 0?{gpuTimeMs:b}:{};let x=await k(c,Float32Array);return c=null,b!==void 0?{y:x,gpuTimeMs:b}:{y:x}}finally{!l&&f&&d(f),!n&&m&&d(m),w&&d(w),c&&d(c)}}async function Vt(a,e,r,o,t,i){let s=r instanceof I,l=t instanceof I;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(e)||!Number.isInteger(o)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(o<=0||i<=0)throw new Error("incx and incy must be positive.");if(!s&&!(r instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!l&&!(t instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(s!==l)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(e<=0)return l?{}:{y:t};if(r.length<(e-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(e-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let n=await G(a,"scopy"),u=null,f=null,m=null,w=null;try{u=s?r._buf:v(r,"scopy-x",!1),f=l?t._buf:v(t,"scopy-y",!0),m=L([{value:e,type:"u32"},{value:o,type:"u32"},{value:i,type:"u32"}],"scopy-params");let c=B(n.getBindGroupLayout(0),[u,f,m]),{commandEncoder:p,ts:g}=C(n,c,mr(e));w=l?null:N(p,f),M(p);let h=await S(g);if(l&&s)return h!==void 0?{gpuTimeMs:h}:{};let b=await k(w,Float32Array);return w=null,h!==void 0?{y:b,gpuTimeMs:h}:{y:b}}finally{!s&&u&&d(u),!l&&f&&d(f),m&&d(m),w&&d(w)}}var Kt=64;async function zt(a,e,r,o,t,i){let s=r instanceof I,l=t instanceof I;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(e)||!Number.isInteger(o)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(o<=0||i<=0)throw new Error("incx and incy must be positive.");if(!s&&!(r instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!l&&!(t instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(s!==l)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(e<=0)return{dot:0};if(r.length<(e-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(e-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let n=await G(a,"sdot"),u=await G(a,"reduction/sum"),f=null,m=null,w=null,c=null,p=null,g=null;try{f=s?r._buf:v(r,"sdot-x",!1),m=l?t._buf:v(t,"sdot-y",!1),w=er(2*Kt*4,"sdot-partials"),c=xr(4,"sdot-result"),p=L([{value:e,type:"u32"},{value:o,type:"u32"},{value:i,type:"u32"}],"sdot-params");let h=B(n.getBindGroupLayout(0),[f,m,w,p]),{commandEncoder:b,ts:x}=C(n,h,2*Kt);M(b);let _=B(u.getBindGroupLayout(0),[w,c]),{commandEncoder:y,ts:A}=C(u,_,1);g=N(y,c),M(y);let P=k(g,Float32Array);g=null;let[E,T,D]=await Promise.all([S(x),S(A),P]);return E!==void 0&&T!==void 0?{dot:D[0],gpuTimeMs:E+T}:{dot:D[0]}}finally{!s&&f&&d(f),!l&&m&&d(m),w&&d(w),c&&d(c),p&&d(p),g&&d(g)}}var qt=64;async function Yt(a,e,r,o){let t=r instanceof I;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(e)||!Number.isInteger(o))throw new Error("n and incx must be integers.");if(o<=0)throw new Error("incx must be positive.");if(!t&&!(r instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(e<=0)return{asum:0};if(r.length<(e-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");let i=await G(a,"sasum"),s=await G(a,"reduction/sum"),l=null,n=null,u=null,f=null,m=null;try{l=t?r._buf:v(r,"sasum-x",!1),n=er(2*qt*4,"sasum-partials"),u=xr(4,"sasum-result"),f=L([{value:e,type:"u32"},{value:o,type:"u32"}],"sasum-params");let w=B(i.getBindGroupLayout(0),[l,n,f]),{commandEncoder:c,ts:p}=C(i,w,2*qt);M(c);let g=B(s.getBindGroupLayout(0),[n,u]),{commandEncoder:h,ts:b}=C(s,g,1);m=N(h,u),M(h);let x=k(m,Float32Array);m=null;let[_,y,A]=await Promise.all([S(p),S(b),x]);return _!==void 0&&y!==void 0?{asum:A[0],gpuTimeMs:_+y}:{asum:A[0]}}finally{!t&&l&&d(l),n&&d(n),u&&d(u),f&&d(f),m&&d(m)}}var $r=64;async function Xt(a,e,r,o){let t=r instanceof I;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(e)||!Number.isInteger(o))throw new Error("n and incx must be integers.");if(o<=0)throw new Error("incx must be positive.");if(!t&&!(r instanceof Float64Array))throw new Error("x must be a Float64Array or GpuVector.");if(t&&r.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(e<=0)return{asum:0};if(r.length<(e-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");let i=["f64/dekker","f64/utils/abs","f64/utils/add"],s=await G(a,[...i,"dasum"]),l=await G(a,[...i,"reduction/sumF64"]),n=null,u=null,f=null,m=null,w=null,c=null,p=null,g=null,h=null;try{if(t)n=r._buf,u=r._loBuf;else{let{hi:K,lo:W}=Pr(r.map(Math.abs));n=v(K,"dasum-xHi",!1),u=v(W,"dasum-xLo",!1)}f=er(2*$r*4,"dasum-partialsHi"),m=er(2*$r*4,"dasum-partialsLo"),w=xr(4,"dasum-result-hi"),c=xr(4,"dasum-result-lo"),p=L([{value:e,type:"u32"},{value:o,type:"u32"}],"dasum-params");let b=B(s.getBindGroupLayout(0),[n,u,f,m,p]),{commandEncoder:x,ts:_}=C(s,b,2*$r);M(x);let y=B(l.getBindGroupLayout(0),[f,m,w,c]),{commandEncoder:A,ts:P}=C(l,y,1);g=N(A,w),h=N(A,c),M(A);let E=k(g,Float32Array),T=k(h,Float32Array);g=null,h=null;let[D,R,j,F]=await Promise.all([S(_),S(P),E,T]),V=Dr(j,F)[0];return D!==void 0&&R!==void 0?{asum:V,gpuTimeMs:D+R}:{asum:V}}finally{!t&&n&&d(n),!t&&u&&d(u),f&&d(f),m&&d(m),w&&d(w),c&&d(c),p&&d(p),g&&d(g),h&&d(h)}}var Qt=64;async function Zt(a,e,r,o){let t=r instanceof I;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(e)||!Number.isInteger(o))throw new Error("n and incx must be integers.");if(o<=0)throw new Error("incx must be positive.");if(!t&&!(r instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(e<=0)return{nrm2:0};if(r.length<(e-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");let i=await G(a,"snrm2"),s=await G(a,"reduction/sum"),l=null,n=null,u=null,f=null,m=null;try{l=t?r._buf:v(r,"snrm2-x",!1),n=er(2*Qt*4,"snrm2-partials"),u=xr(4,"snrm2-result"),f=L([{value:e,type:"u32"},{value:o,type:"u32"}],"snrm2-params");let w=B(i.getBindGroupLayout(0),[l,n,f]),{commandEncoder:c,ts:p}=C(i,w,2*Qt);M(c);let g=B(s.getBindGroupLayout(0),[n,u]),{commandEncoder:h,ts:b}=C(s,g,1);m=N(h,u),M(h);let x=k(m,Float32Array);m=null;let[_,y,A]=await Promise.all([S(p),S(b),x]),P=Math.sqrt(A[0]);return _!==void 0&&y!==void 0?{nrm2:P,gpuTimeMs:_+y}:{nrm2:P}}finally{!t&&l&&d(l),n&&d(n),u&&d(u),f&&d(f),m&&d(m)}}var Jr=64;async function $t(a,e,r,o){let t=r instanceof I;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(e)||!Number.isInteger(o))throw new Error("n and incx must be integers.");if(o<=0)throw new Error("incx must be positive.");if(!t&&!(r instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(e<=0)return{index:0};if(r.length<(e-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");let i=await G(a,"isamax"),s=await G(a,"reduction/argmax"),l=null,n=null,u=null,f=null,m=null,w=null;try{l=t?r._buf:v(r,"isamax-x",!1),n=er(2*Jr*4,"isamax-partials-val"),u=er(2*Jr*4,"isamax-partials-idx"),f=xr(4,"isamax-result"),m=L([{value:e,type:"u32"},{value:o,type:"u32"}],"isamax-params");let c=B(i.getBindGroupLayout(0),[l,n,u,m]),{commandEncoder:p,ts:g}=C(i,c,2*Jr);M(p);let h=B(s.getBindGroupLayout(0),[n,u,f]),{commandEncoder:b,ts:x}=C(s,h,1);w=N(b,f),M(b);let _=k(w,Uint32Array);w=null;let[y,A,P]=await Promise.all([S(g),S(x),_]),E=P[0];return y!==void 0&&A!==void 0?{index:E,gpuTimeMs:y+A}:{index:E}}finally{!t&&l&&d(l),n&&d(n),u&&d(u),f&&d(f),m&&d(m),w&&d(w)}}var Kr=64;async function Jt(a,e,r,o){let t=r instanceof I;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(e)||!Number.isInteger(o))throw new Error("n and incx must be integers.");if(o<=0)throw new Error("incx must be positive.");if(!t&&!(r instanceof Float64Array))throw new Error("x must be a Float64Array or GpuVector.");if(t&&r.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(e<=0)return{index:0};if(r.length<(e-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");let i=["f64/dekker","f64/utils/abs","f64/utils/greater","f64/utils/equal"],s=await G(a,[...i,"idamax"],"idamax_main"),l=await G(a,[...i,"reduction/argmaxF64"],"reduce_f64"),n=null,u=null,f=null,m=null,w=null,c=null,p=null,g=null;try{if(t)n=r._buf,u=r._loBuf;else{let{hi:j,lo:F}=Pr(r);n=v(j,"idamax-xHi",!1),u=v(F,"idamax-xLo",!1)}f=er(2*Kr*4,"idamax-partials-val-hi"),m=er(2*Kr*4,"idamax-partials-val-lo"),w=er(2*Kr*4,"idamax-partials-idx"),c=xr(4,"idamax-result"),p=L([{value:e,type:"u32"},{value:o,type:"u32"}],"idamax-params");let h=B(s.getBindGroupLayout(0),[n,u,f,m,w,p]),{commandEncoder:b,ts:x}=C(s,h,2*Kr);M(b);let _=B(l.getBindGroupLayout(0),[f,m,w,c]),{commandEncoder:y,ts:A}=C(l,_,1);g=N(y,c),M(y);let P=k(g,Uint32Array);g=null;let[E,T,D]=await Promise.all([S(x),S(A),P]),R=D[0];return E!==void 0&&T!==void 0?{index:R,gpuTimeMs:E+T}:{index:R}}finally{!t&&n&&d(n),!t&&u&&d(u),f&&d(f),m&&d(m),w&&d(w),c&&d(c),p&&d(p),g&&d(g)}}async function ro(a,e,r,o,t,i,s,l){let n=r instanceof I,u=t instanceof I;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(e)||!Number.isInteger(o)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(typeof s!="number")throw new Error("c must be a number.");if(typeof l!="number")throw new Error("s must be a number.");if(Number.isNaN(s)||Number.isNaN(l))throw new Error("c and s must not be NaN.");if(!Number.isFinite(s))throw new Error("c must be finite.");if(!Number.isFinite(l))throw new Error("s must be finite.");if(o<=0||i<=0)throw new Error("incx and incy must be positive.");if(!n&&!(r instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!u&&!(t instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(n!==u)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(e<=0)return n?{}:{x:r,y:t};if(r.length<(e-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(e-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let f=await G(a,"srot"),m=null,w=null,c=null,p=null,g=null;try{m=n?r._buf:v(r,"srot-x",!0),w=u?t._buf:v(t,"srot-y",!0),c=L([{value:e,type:"u32"},{value:s,type:"f32"},{value:l,type:"f32"},{value:o,type:"u32"},{value:i,type:"u32"}],"srot-params");let h=B(f.getBindGroupLayout(0),[m,w,c]),{commandEncoder:b,ts:x}=C(f,h,mr(e));p=n?null:N(b,m),g=u?null:N(b,w),M(b);let _=await S(x);if(n&&u)return _!==void 0?{gpuTimeMs:_}:{};let y=k(p,Float32Array),A=k(g,Float32Array);p=null,g=null;let[P,E]=await Promise.all([y,A]);return _!==void 0?{x:P,y:E,gpuTimeMs:_}:{x:P,y:E}}finally{!n&&m&&d(m),!u&&w&&d(w),c&&d(c),p&&d(p),g&&d(g)}}async function eo(a,e,r,o,t,i,s){let l=r instanceof I,n=t instanceof I;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(!Number.isInteger(e)||!Number.isInteger(o)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(!(s instanceof Float32Array)||s.length!==5)throw new Error("param must be a Float32Array of length 5.");if(o<=0||i<=0)throw new Error("incx and incy must be positive.");if(!l&&!(r instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!n&&!(t instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(l!==n)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(e<=0||s[0]===-2)return l?{}:{x:r,y:t};if(r.length<(e-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(e-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let u=await G(a,"srotm"),f=null,m=null,w=null,c=null,p=null,g=null;try{f=l?r._buf:v(r,"srotm-x",!0),m=n?t._buf:v(t,"srotm-y",!0),w=v(s,"srotm-param",!1),c=L([{value:e,type:"u32"},{value:o,type:"u32"},{value:i,type:"u32"}],"srotm-params");let h=B(u.getBindGroupLayout(0),[f,m,w,c]),{commandEncoder:b,ts:x}=C(u,h,mr(e));p=l?null:N(b,f),g=n?null:N(b,m),M(b);let _=await S(x);if(l&&n)return _!==void 0?{gpuTimeMs:_}:{};let y=k(p,Float32Array),A=k(g,Float32Array);p=null,g=null;let[P,E]=await Promise.all([y,A]);return _!==void 0?{x:P,y:E,gpuTimeMs:_}:{x:P,y:E}}finally{!l&&f&&d(f),!n&&m&&d(m),w&&d(w),c&&d(c),p&&d(p),g&&d(g)}}async function to(a,e,r,o,t,i,s,l,n,u,f,m,w="row-major"){let c=i instanceof H,p=l instanceof I,g=f instanceof I;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(e!=="no-transpose"&&e!=="transpose")throw new Error("trans must be 'no-transpose' or 'transpose'.");if(w!=="row-major"&&w!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(typeof t!="number")throw new Error("alpha must be a number.");if(Number.isNaN(t))throw new Error("alpha must not be NaN.");if(!Number.isFinite(t))throw new Error("alpha must be finite.");if(typeof u!="number")throw new Error("beta must be a number.");if(Number.isNaN(u))throw new Error("beta must not be NaN.");if(!Number.isFinite(u))throw new Error("beta must be finite.");if(!Number.isInteger(r)||!Number.isInteger(o)||!Number.isInteger(n)||!Number.isInteger(m)||!Number.isInteger(s))throw new Error("m, n, incx, incy, and lda must be integers.");if(n<=0||m<=0)throw new Error("incx and incy must be positive.");if(!c&&!(i instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!p&&!(l instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!g&&!(f instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(p!==g)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(p&&!c)throw new Error("A must be a GpuMatrix when x and y are GpuVectors.");if(c&&!p)throw new Error("x and y must be GpuVectors when A is a GpuMatrix.");if(p&&l._buf===f._buf)throw new Error("x and y must not reference the same GPU buffer when both are GpuVectors.");if(c&&s!==i.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(c&&(i.rows<r||i.cols<o))throw new Error("A is too small for the given m and n.");if(r<0||o<0)throw new Error("m and n must be non-negative.");if(r===0||o===0)return g?{}:{y:f};(c?i.layout:w)==="column-major"&&([r,o]=[o,r],e=e==="no-transpose"?"transpose":"no-transpose");let b=e==="no-transpose",x=b?o:r,_=b?r:o;if(s<o)throw new Error("lda must be >= n.");if(!c&&i.length<(r-1)*s+o)throw new Error("A does not have enough elements for the given m, n, and lda.");if(l.length<(x-1)*n+1)throw new Error("x does not have enough elements for the given dimensions and incx.");if(f.length<(_-1)*m+1)throw new Error("y does not have enough elements for the given dimensions and incy.");let A=await G(a,b?"sgemv_n":"sgemv_t"),P=c?i._buf:v(i,"sgemv-A",!1),E=p?l._buf:v(l,"sgemv-x",!1),T=g?f._buf:v(f,"sgemv-y",!0),D=L([{value:r,type:"u32"},{value:o,type:"u32"},{value:t,type:"f32"},{value:u,type:"f32"},{value:n,type:"u32"},{value:m,type:"u32"},{value:s,type:"u32"}],"sgemv-params");try{let R=B(A.getBindGroupLayout(0),[P,E,T,D]),j=b?Math.min(r,a.limits.maxComputeWorkgroupsPerDimension):mr(_),{commandEncoder:F,ts:V}=C(A,R,j),K=g?null:N(F,T);M(F);let W=await S(V);if(g)return W!==void 0?{gpuTimeMs:W}:{};let $=await k(K,Float32Array);return W!==void 0?{y:$,gpuTimeMs:W}:{y:$}}finally{c||d(P),p||d(E),g||d(T),d(D)}}async function oo(a,e,r,o,t,i,s,l,n,u,f,m="row-major"){let w=s instanceof I,c=u instanceof I,p=t instanceof H;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(e!=="lower"&&e!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(m!=="row-major"&&m!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(!Number.isInteger(r)||!Number.isInteger(l)||!Number.isInteger(f)||!Number.isInteger(i))throw new Error("n, incx, incy, and lda must be integers.");if(typeof o!="number")throw new Error("alpha must be a number.");if(Number.isNaN(o))throw new Error("alpha must not be NaN.");if(!Number.isFinite(o))throw new Error("alpha must be finite.");if(typeof n!="number")throw new Error("beta must be a number.");if(Number.isNaN(n))throw new Error("beta must not be NaN.");if(!Number.isFinite(n))throw new Error("beta must be finite.");if(l<=0||f<=0)throw new Error("incx and incy must be positive.");if(i<r)throw new Error("lda must be >= n.");if(!p&&!(t instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!w&&!(s instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!c&&!(u instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(w!==c)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(w&&!p)throw new Error("A must be a GpuMatrix when x and y are GpuVectors.");if(p&&!w)throw new Error("x and y must be GpuVectors when A is a GpuMatrix.");if(w&&s._buf===u._buf)throw new Error("x and y must not reference the same GPU buffer when both are GpuVectors.");if(p&&i!==t.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(p&&(t.rows<r||t.cols<r))throw new Error("A is too small for the given n.");if(r<0)throw new Error("n must be non-negative.");if(r===0)return c?{}:{y:u};if(!p&&t.length<(r-1)*i+r)throw new Error("A does not have enough elements for the given n and lda.");if(s.length<(r-1)*l+1)throw new Error("x does not have enough elements for the given n and incx.");if(u.length<(r-1)*f+1)throw new Error("y does not have enough elements for the given n and incy.");let h=(p?t.layout:m)==="column-major"?e==="upper":e==="lower",b=await G(a,"ssymv"),x=null,_=null,y=null,A=null;try{x=p?t._buf:v(t,"ssymv-A",!1),_=w?s._buf:v(s,"ssymv-x",!1),y=c?u._buf:v(u,"ssymv-y",!0),A=L([{value:r,type:"u32"},{value:o,type:"f32"},{value:n,type:"f32"},{value:l,type:"u32"},{value:f,type:"u32"},{value:i,type:"u32"},{value:h?0:1,type:"u32"}],"ssymv-params");let P=B(b.getBindGroupLayout(0),[x,_,y,A]),E=Math.min(r,a.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:T,ts:D}=C(b,P,E),R=c?null:N(T,y);M(T);let j=await S(D);if(c)return j!==void 0?{gpuTimeMs:j}:{};let F=await k(R,Float32Array);return j!==void 0?{y:F,gpuTimeMs:j}:{y:F}}finally{!p&&x&&d(x),!w&&_&&d(_),!c&&y&&d(y),A&&d(A)}}async function ao(a,e,r,o,t,i,s,l,n,u,f,m="row-major"){let w=l instanceof I,c=u instanceof I,p=i instanceof H,g=o==="unit";if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(e!=="lower"&&e!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(r!=="no-transpose"&&r!=="transpose")throw new Error("trans must be 'no-transpose' or 'transpose'.");if(!g&&o!=="non-unit")throw new Error("diag must be 'unit' or 'non-unit'.");if(m!=="row-major"&&m!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(!Number.isInteger(t)||!Number.isInteger(n)||!Number.isInteger(f)||!Number.isInteger(s))throw new Error("n, incx, incy, and lda must be integers.");if(n<=0||f<=0)throw new Error("incx and incy must be positive.");if(s<t)throw new Error("lda must be >= n.");if(!p&&!(i instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!w&&!(l instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!c&&!(u instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(w!==c)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(w&&l._buf===u._buf)throw new Error("x and y must not reference the same GPU buffer when both are GpuVectors.");if(w&&!p)throw new Error("A must be a GpuMatrix when x and y are GpuVectors.");if(p&&!w)throw new Error("x and y must be GpuVectors when A is a GpuMatrix.");if(p&&c&&i._buf===u._buf)throw new Error("A and y must not reference the same GPU buffer.");if(p&&s!==i.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(p&&(i.rows<t||i.cols<t))throw new Error("A is too small for the given n.");if(t<0)throw new Error("n must be non-negative.");if(t===0)return c?{}:{y:u};if(!p&&i.length<(t-1)*s+t)throw new Error("A does not have enough elements for the given n and lda.");if(l.length<(t-1)*n+1)throw new Error("x does not have enough elements for the given n and incx.");if(u.length<(t-1)*f+1)throw new Error("y does not have enough elements for the given n and incy.");let b=(p?i.layout:m)==="column-major",x=b?e==="upper":e==="lower",_=b?r==="transpose":r==="no-transpose",y=await G(a,"strmv"),A=null,P=null,E=null,T=null;try{A=p?i._buf:v(i,"strmv-A",!1),P=w?l._buf:v(l,"strmv-x",!1),E=c?u._buf:v(u,"strmv-y",!0),T=L([{value:t,type:"u32"},{value:n,type:"u32"},{value:f,type:"u32"},{value:s,type:"u32"},{value:_?0:1,type:"u32"},{value:x?0:1,type:"u32"},{value:g?1:0,type:"u32"}],"strmv-params");let D=B(y.getBindGroupLayout(0),[A,P,E,T]),R=Math.min(t,a.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:j,ts:F}=C(y,D,R),V=c?null:N(j,E);M(j);let K=await S(F);if(c)return K!==void 0?{gpuTimeMs:K}:{};let W=await k(V,Float32Array);return K!==void 0?{y:W,gpuTimeMs:K}:{y:W}}finally{!p&&A&&d(A),!w&&P&&d(P),!c&&E&&d(E),T&&d(T)}}var Gr=64;function io(a,e,r){let o=new ArrayBuffer(a*e),t=new DataView(o);for(let i=0;i<a;i++){let s=r(i),l=i*e;s.forEach((n,u)=>t.setUint32(l+u*4,n,!0))}return o}function so(a,e,r){let o=a.createBuffer({label:r,size:e.byteLength,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});return a.queue.writeBuffer(o,0,e),o}async function no(a,e,r,o,t,i,s,l,n,u="row-major"){let f=l instanceof I,m=i instanceof H,w=o==="unit";if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(e!=="lower"&&e!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(r!=="no-transpose"&&r!=="transpose")throw new Error("trans must be 'no-transpose' or 'transpose'.");if(!w&&o!=="non-unit")throw new Error("diag must be 'unit' or 'non-unit'.");if(u!=="row-major"&&u!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(!Number.isInteger(t)||!Number.isInteger(n)||!Number.isInteger(s))throw new Error("n, incx, and lda must be integers.");if(n<=0)throw new Error("incx must be positive.");if(s<t)throw new Error("lda must be >= n.");if(!m&&!(i instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!f&&!(l instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(f&&!m)throw new Error("A must be a GpuMatrix when x is a GpuVector.");if(m&&!f)throw new Error("x must be a GpuVector when A is a GpuMatrix.");if(m&&s!==i.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(m&&(i.rows<t||i.cols<t))throw new Error("A is too small for the given n.");if(t<0)throw new Error("n must be non-negative.");if(t===0)return f?{}:{x:l};if(!m&&i.length<(t-1)*s+t)throw new Error("A does not have enough elements for the given n and lda.");if(l.length<(t-1)*n+1)throw new Error("x does not have enough elements for the given n and incx.");let p=(m?i.layout:u)==="column-major",g=p?e==="upper":e==="lower",h=p?r==="transpose":r==="no-transpose",b=await G(a,"strsv_invert_block"),x=await G(a,"strsv_apply_inverse"),_=await G(a,"strsv_update"),y=h===g,A=[];for(let W=0;W<t;W+=Gr)A.push(W);y||A.reverse();let P=A.length,E=a.limits.maxComputeWorkgroupsPerDimension,T=a.limits.minUniformBufferOffsetAlignment,D=null,R=null,j=null,F=null,V=null,K=null;try{D=m?i._buf:v(i,"strsv-A",!1),R=f?l._buf:v(l,"strsv-x",!0),j=er(P*Gr*Gr*4,"strsv-Ainv");let W=io(P,T,q=>{let z=q*Gr,X=Math.min(z+Gr,t);return[n,q,z,X]});F=so(a,W,"strsv-apply-params");let $=io(P,T,q=>{let z=q*Gr,X=Math.min(z+Gr,t);return[t,n,s,h?0:1,g?0:1,z,X]});V=so(a,$,"strsv-update-params");let{commandEncoder:Y,querySet:J}=vr();K=L([{value:t,type:"u32"},{value:s,type:"u32"},{value:h?0:1,type:"u32"},{value:g?0:1,type:"u32"},{value:w?1:0,type:"u32"}],"strsv-invert-params");let nr=B(b.getBindGroupLayout(0),[D,j,K]);ar(Y,b,nr,{x:Gr,y:P},J?{timestampWrites:{querySet:J,beginningOfPassWriteIndex:0}}:void 0);for(let q=0;q<A.length;q++){let z=A[q],X=Math.min(z+Gr,t),Q=z/Gr,tr=q===A.length-1,fr=Q*T,or=B(x.getBindGroupLayout(0),[j,R,{buffer:F,offset:fr,size:16}]);ar(Y,x,or,1,tr&&J?{timestampWrites:{querySet:J,endOfPassWriteIndex:1}}:void 0);let dr=y?t-X:z;if(dr===0)continue;let Br=B(_.getBindGroupLayout(0),[D,R,{buffer:V,offset:fr,size:32}]),yr=Math.min(dr,E);ar(Y,_,Br,yr)}let sr=br(Y,J),Z=f?null:N(Y,R);M(Y);let rr=await S(sr);if(f)return rr!==void 0?{gpuTimeMs:rr}:{};let U=await k(Z,Float32Array);return rr!==void 0?{x:U,gpuTimeMs:rr}:{x:U}}finally{!m&&D&&d(D),!f&&R&&d(R),j&&d(j),F&&d(F),V&&d(V),K&&d(K)}}async function uo(a,e,r,o,t,i,s,l,n,u,f="row-major"){let m=n instanceof H;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(f!=="row-major"&&f!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(typeof o!="number")throw new Error("alpha must be a number.");if(Number.isNaN(o))throw new Error("alpha must not be NaN.");if(!Number.isFinite(o))throw new Error("alpha must be finite.");if(!Number.isInteger(e)||!Number.isInteger(r)||!Number.isInteger(i)||!Number.isInteger(l)||!Number.isInteger(u))throw new Error("m, n, incx, incy, and lda must be integers.");if(i<=0||l<=0)throw new Error("incx and incy must be positive.");if(!m&&!(n instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(m&&u!==n.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(m&&(n.rows<e||n.cols<r))throw new Error("A is too small for the given m and n.");(m?n.layout:f)==="column-major"&&([e,r]=[r,e],[t,s]=[s,t],[i,l]=[l,i]);let c=t instanceof I,p=s instanceof I;if(u<r)throw new Error("lda must be >= n.");if(!c&&!(t instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!p&&!(s instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(c!==p)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(c&&!m)throw new Error("A must be a GpuMatrix when x and y are GpuVectors.");if(m&&!c)throw new Error("x and y must be GpuVectors when A is a GpuMatrix.");if(m&&c&&n._buf===t._buf)throw new Error("A and x must not reference the same GPU buffer.");if(m&&p&&n._buf===s._buf)throw new Error("A and y must not reference the same GPU buffer.");if(e<0||r<0)throw new Error("m and n must be non-negative.");if(e===0||r===0)return m?{}:{A:n};if(!m&&n.length<(e-1)*u+r)throw new Error("A does not have enough elements for the given m, n, and lda.");if(t.length<(e-1)*i+1)throw new Error("x does not have enough elements for the given m and incx.");if(s.length<(r-1)*l+1)throw new Error("y does not have enough elements for the given n and incy.");let g=await G(a,"sger"),h=null,b=null,x=null,_=null;try{h=c?t._buf:v(t,"sger-x",!1),b=p?s._buf:v(s,"sger-y",!1),x=m?n._buf:v(n,"sger-A",!0),_=L([{value:e,type:"u32"},{value:r,type:"u32"},{value:o,type:"f32"},{value:i,type:"u32"},{value:l,type:"u32"},{value:u,type:"u32"}],"sger-params");let y=B(g.getBindGroupLayout(0),[h,b,x,_]),A=Math.min(e,a.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:P,ts:E}=C(g,y,A),T=m?null:N(P,x);M(P);let D=await S(E);if(m)return D!==void 0?{gpuTimeMs:D}:{};let R=await k(T,Float32Array);return D!==void 0?{A:R,gpuTimeMs:D}:{A:R}}finally{!c&&h&&d(h),!p&&b&&d(b),!m&&x&&d(x),_&&d(_)}}async function lo(a,e,r,o,t,i,s,l,n="row-major"){let u=t instanceof I,f=s instanceof H;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(e!=="lower"&&e!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(n!=="row-major"&&n!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(!Number.isInteger(r)||!Number.isInteger(i)||!Number.isInteger(l))throw new Error("n, incx, and lda must be integers.");if(typeof o!="number")throw new Error("alpha must be a number.");if(Number.isNaN(o))throw new Error("alpha must not be NaN.");if(!Number.isFinite(o))throw new Error("alpha must be finite.");if(i<=0)throw new Error("incx must be positive.");if(l<r)throw new Error("lda must be >= n.");if(!f&&!(s instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!u&&!(t instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(u&&!f)throw new Error("A must be a GpuMatrix when x is a GpuVector.");if(f&&!u)throw new Error("x must be a GpuVector when A is a GpuMatrix.");if(f&&u&&s._buf===t._buf)throw new Error("A and x must not reference the same GPU buffer.");if(f&&l!==s.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(f&&(s.rows<r||s.cols<r))throw new Error("A is too small for the given n.");if(r<0)throw new Error("n must be non-negative.");if(r===0)return f?{}:{A:s};if(!f&&s.length<(r-1)*l+r)throw new Error("A does not have enough elements for the given n and lda.");if(t.length<(r-1)*i+1)throw new Error("x does not have enough elements for the given n and incx.");let w=(f?s.layout:n)==="column-major"?e==="upper":e==="lower",c=await G(a,"ssyr"),p=null,g=null,h=null;try{p=u?t._buf:v(t,"ssyr-x",!1),g=f?s._buf:v(s,"ssyr-A",!0),h=L([{value:r,type:"u32"},{value:o,type:"f32"},{value:i,type:"u32"},{value:l,type:"u32"},{value:w?0:1,type:"u32"}],"ssyr-params");let b=B(c.getBindGroupLayout(0),[p,g,h]),x=Math.min(r,a.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:_,ts:y}=C(c,b,x),A=f?null:N(_,g);M(_);let P=await S(y);if(f)return P!==void 0?{gpuTimeMs:P}:{};let E=await k(A,Float32Array);return P!==void 0?{A:E,gpuTimeMs:P}:{A:E}}finally{!u&&p&&d(p),!f&&g&&d(g),h&&d(h)}}async function fo(a,e,r,o,t,i,s,l,n,u,f="row-major"){let m=t instanceof I,w=s instanceof I,c=n instanceof H;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(e!=="lower"&&e!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(f!=="row-major"&&f!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(!Number.isInteger(r)||!Number.isInteger(i)||!Number.isInteger(l)||!Number.isInteger(u))throw new Error("n, incx, incy, and lda must be integers.");if(typeof o!="number")throw new Error("alpha must be a number.");if(Number.isNaN(o))throw new Error("alpha must not be NaN.");if(!Number.isFinite(o))throw new Error("alpha must be finite.");if(i<=0||l<=0)throw new Error("incx and incy must be positive.");if(u<r)throw new Error("lda must be >= n.");if(!c&&!(n instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!m&&!(t instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!w&&!(s instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(m!==w)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(m&&!c)throw new Error("A must be a GpuMatrix when x and y are GpuVectors.");if(c&&!m)throw new Error("x and y must be GpuVectors when A is a GpuMatrix.");if(c&&m&&n._buf===t._buf)throw new Error("A and x must not reference the same GPU buffer.");if(c&&w&&n._buf===s._buf)throw new Error("A and y must not reference the same GPU buffer.");if(m&&t._buf===s._buf)throw new Error("x and y must not reference the same GPU buffer when both are GpuVectors.");if(c&&u!==n.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(c&&(n.rows<r||n.cols<r))throw new Error("A is too small for the given n.");if(r<0)throw new Error("n must be non-negative.");if(r===0)return c?{}:{A:n};if(!c&&n.length<(r-1)*u+r)throw new Error("A does not have enough elements for the given n and lda.");if(t.length<(r-1)*i+1)throw new Error("x does not have enough elements for the given n and incx.");if(s.length<(r-1)*l+1)throw new Error("y does not have enough elements for the given n and incy.");let g=(c?n.layout:f)==="column-major"?e==="upper":e==="lower",h=await G(a,"ssyr2"),b=null,x=null,_=null,y=null;try{b=m?t._buf:v(t,"ssyr2-x",!1),x=w?s._buf:v(s,"ssyr2-y",!1),_=c?n._buf:v(n,"ssyr2-A",!0),y=L([{value:r,type:"u32"},{value:o,type:"f32"},{value:i,type:"u32"},{value:l,type:"u32"},{value:u,type:"u32"},{value:g?0:1,type:"u32"}],"ssyr2-params");let A=B(h.getBindGroupLayout(0),[b,x,_,y]),P=Math.min(r,a.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:E,ts:T}=C(h,A,P),D=c?null:N(E,_);M(E);let R=await S(T);if(c)return R!==void 0?{gpuTimeMs:R}:{};let j=await k(D,Float32Array);return R!==void 0?{A:j,gpuTimeMs:R}:{A:j}}finally{!m&&b&&d(b),!w&&x&&d(x),!c&&_&&d(_),y&&d(y)}}var Ma=32,Ia=32,La=64,Da=64,Ra=36;async function mo(a,e,r,o,t,i,s,l,n,u,f,m,w,c,p="row-major"){let g=l instanceof H,h=u instanceof H,b=w instanceof H;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(e!=="no-transpose"&&e!=="transpose")throw new Error("transA must be 'no-transpose' or 'transpose'.");if(r!=="no-transpose"&&r!=="transpose")throw new Error("transB must be 'no-transpose' or 'transpose'.");if(p!=="row-major"&&p!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(typeof s!="number")throw new Error("alpha must be a number.");if(Number.isNaN(s))throw new Error("alpha must not be NaN.");if(!Number.isFinite(s))throw new Error("alpha must be finite.");if(typeof m!="number")throw new Error("beta must be a number.");if(Number.isNaN(m))throw new Error("beta must not be NaN.");if(!Number.isFinite(m))throw new Error("beta must be finite.");if(!Number.isInteger(o)||!Number.isInteger(t)||!Number.isInteger(i)||!Number.isInteger(n)||!Number.isInteger(f)||!Number.isInteger(c))throw new Error("m, n, k, lda, ldb, and ldc must be integers.");if(!g&&!(l instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!h&&!(u instanceof Float32Array))throw new Error("B must be a Float32Array or GpuMatrix.");if(!b&&!(w instanceof Float32Array))throw new Error("C must be a Float32Array or GpuMatrix.");if((g||h)&&!b)throw new Error("C must be a GpuMatrix when A or B is a GpuMatrix.");if(b&&(!g||!h))throw new Error("A and B must be GpuMatrix when C is a GpuMatrix.");if(o<0||t<0||i<0)throw new Error("m, n, and k must be non-negative.");if(o===0||t===0)return b?{}:{C:w};let x=g?l.layout:p,_=h?u.layout:p,y=b?w.layout:p,A=x==="column-major"?i:o,P=x==="column-major"?o:i,E=e==="no-transpose"?A:P,T=e==="no-transpose"?P:A;if(n<T)throw new Error(`lda must be >= ${x==="column-major"?"rows":"cols"} of A as stored.`);if(g){if(n!==l.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");let[rr,U]=e==="no-transpose"?[o,i]:[i,o];if(l.rows<rr||l.cols<U)throw new Error("A is too small for the given m, k, and transA.")}else if(l.length<(E-1)*n+T)throw new Error("A does not have enough elements for the given dimensions and lda.");let D=_==="column-major"?t:i,R=_==="column-major"?i:t,j=r==="no-transpose"?D:R,F=r==="no-transpose"?R:D;if(f<F)throw new Error(`ldb must be >= ${_==="column-major"?"rows":"cols"} of B as stored.`);if(h){if(f!==u.lda)throw new Error("ldb must match B.lda when B is a GpuMatrix.");let[rr,U]=r==="no-transpose"?[i,t]:[t,i];if(u.rows<rr||u.cols<U)throw new Error("B is too small for the given n, k, and transB.")}else if(u.length<(j-1)*f+F)throw new Error("B does not have enough elements for the given dimensions and ldb.");let V=y==="column-major"?t:o,K=y==="column-major"?o:t;if(c<K)throw new Error(`ldc must be >= ${y==="column-major"?"rows":"cols"} of C as stored.`);if(b){if(c!==w.lda)throw new Error("ldc must match C.lda when C is a GpuMatrix.");if(w.rows<o||w.cols<t)throw new Error("C is too small for the given m and n.")}else if(w.length<(V-1)*c+K)throw new Error("C does not have enough elements for the given dimensions and ldc.");x==="column-major"&&(e=e==="no-transpose"?"transpose":"no-transpose"),_==="column-major"&&(r=r==="no-transpose"?"transpose":"no-transpose"),y==="column-major"&&([l,u]=[u,l],[g,h]=[h,g],[n,f]=[f,n],[e,r]=[r==="no-transpose"?"transpose":"no-transpose",e==="no-transpose"?"transpose":"no-transpose"],[o,t]=[t,o]);let W=Math.ceil(t/Da),$=Math.ceil(o/La),Y=W*$>=Ra,J=await G(a,Y?"sgemm_large":"sgemm_small"),nr=g?l._buf:v(l,"sgemm-A",!1),ur=h?u._buf:v(u,"sgemm-B",!1),sr=b?w._buf:v(w,"sgemm-C",!0),Z=L([{value:o,type:"u32"},{value:t,type:"u32"},{value:i,type:"u32"},{value:s,type:"f32"},{value:m,type:"f32"},{value:n,type:"u32"},{value:f,type:"u32"},{value:c,type:"u32"},{value:e==="transpose"?1:0,type:"u32"},{value:r==="transpose"?1:0,type:"u32"}],"sgemm-params");try{let rr=B(J.getBindGroupLayout(0),[nr,ur,sr,Z]),U=Y?{x:Math.min(W,a.limits.maxComputeWorkgroupsPerDimension),y:Math.min($,a.limits.maxComputeWorkgroupsPerDimension)}:{x:Math.min(Math.ceil(t/Ia),a.limits.maxComputeWorkgroupsPerDimension),y:Math.min(Math.ceil(o/Ma),a.limits.maxComputeWorkgroupsPerDimension)},{commandEncoder:q,ts:z}=C(J,rr,U),X=b?null:N(q,sr);M(q);let Q=await S(z);if(b)return Q!==void 0?{gpuTimeMs:Q}:{};let tr=await k(X,Float32Array);return Q!==void 0?{C:tr,gpuTimeMs:Q}:{C:tr}}finally{g||d(nr),h||d(ur),b||d(sr),d(Z)}}var Ta=32,ja=32,Ca=64,Wa=64,Fa=36;async function co(a,e,r,o,t,i,s,l,n,u,f,m,w,c,p,g="row-major"){let h=n instanceof H,b=f instanceof H,x=c instanceof H;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(e!=="lower"&&e!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(r!=="no-transpose"&&r!=="transpose")throw new Error("transA must be 'no-transpose' or 'transpose'.");if(o!=="no-transpose"&&o!=="transpose")throw new Error("transB must be 'no-transpose' or 'transpose'.");if(g!=="row-major"&&g!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(typeof l!="number")throw new Error("alpha must be a number.");if(Number.isNaN(l))throw new Error("alpha must not be NaN.");if(!Number.isFinite(l))throw new Error("alpha must be finite.");if(typeof w!="number")throw new Error("beta must be a number.");if(Number.isNaN(w))throw new Error("beta must not be NaN.");if(!Number.isFinite(w))throw new Error("beta must be finite.");if(!Number.isInteger(t)||!Number.isInteger(i)||!Number.isInteger(s)||!Number.isInteger(u)||!Number.isInteger(m)||!Number.isInteger(p))throw new Error("m, n, k, lda, ldb, and ldc must be integers.");if(!h&&!(n instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!b&&!(f instanceof Float32Array))throw new Error("B must be a Float32Array or GpuMatrix.");if(!x&&!(c instanceof Float32Array))throw new Error("C must be a Float32Array or GpuMatrix.");if((h||b)&&!x)throw new Error("C must be a GpuMatrix when A or B is a GpuMatrix.");if(x&&(!h||!b))throw new Error("A and B must be GpuMatrix when C is a GpuMatrix.");if(t<0||i<0||s<0)throw new Error("m, n, and k must be non-negative.");if(t===0||i===0)return x?{}:{C:c};let _=h?n.layout:g,y=b?f.layout:g,A=x?c.layout:g,P=_==="column-major"?s:t,E=_==="column-major"?t:s,T=r==="no-transpose"?P:E,D=r==="no-transpose"?E:P;if(u<D)throw new Error(`lda must be >= ${_==="column-major"?"rows":"cols"} of A as stored.`);if(h){if(u!==n.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");let[U,q]=r==="no-transpose"?[t,s]:[s,t];if(n.rows<U||n.cols<q)throw new Error("A is too small for the given m, k, and transA.")}else if(n.length<(T-1)*u+D)throw new Error("A does not have enough elements for the given dimensions and lda.");let R=y==="column-major"?i:s,j=y==="column-major"?s:i,F=o==="no-transpose"?R:j,V=o==="no-transpose"?j:R;if(m<V)throw new Error(`ldb must be >= ${y==="column-major"?"rows":"cols"} of B as stored.`);if(b){if(m!==f.lda)throw new Error("ldb must match B.lda when B is a GpuMatrix.");let[U,q]=o==="no-transpose"?[s,i]:[i,s];if(f.rows<U||f.cols<q)throw new Error("B is too small for the given n, k, and transB.")}else if(f.length<(F-1)*m+V)throw new Error("B does not have enough elements for the given dimensions and ldb.");let K=A==="column-major"?i:t,W=A==="column-major"?t:i;if(p<W)throw new Error(`ldc must be >= ${A==="column-major"?"rows":"cols"} of C as stored.`);if(x){if(p!==c.lda)throw new Error("ldc must match C.lda when C is a GpuMatrix.");if(c.rows<t||c.cols<i)throw new Error("C is too small for the given m and n.")}else if(c.length<(K-1)*p+W)throw new Error("C does not have enough elements for the given dimensions and ldc.");_==="column-major"&&(r=r==="no-transpose"?"transpose":"no-transpose"),y==="column-major"&&(o=o==="no-transpose"?"transpose":"no-transpose"),A==="column-major"&&([n,f]=[f,n],[h,b]=[b,h],[u,m]=[m,u],[r,o]=[o==="no-transpose"?"transpose":"no-transpose",r==="no-transpose"?"transpose":"no-transpose"],[t,i]=[i,t],e=e==="lower"?"upper":"lower");let $=Math.ceil(i/Wa),Y=Math.ceil(t/Ca),J=$*Y>=Fa,nr=await G(a,J?"sgemmtr_large":"sgemmtr_small"),ur=h?n._buf:v(n,"sgemmtr-A",!1),sr=b?f._buf:v(f,"sgemmtr-B",!1),Z=x?c._buf:v(c,"sgemmtr-C",!0),rr=L([{value:t,type:"u32"},{value:i,type:"u32"},{value:s,type:"u32"},{value:l,type:"f32"},{value:w,type:"f32"},{value:u,type:"u32"},{value:m,type:"u32"},{value:p,type:"u32"},{value:r==="transpose"?1:0,type:"u32"},{value:o==="transpose"?1:0,type:"u32"},{value:e==="upper"?1:0,type:"u32"}],"sgemmtr-params");try{let U=B(nr.getBindGroupLayout(0),[ur,sr,Z,rr]),q=J?{x:Math.min($,a.limits.maxComputeWorkgroupsPerDimension),y:Math.min(Y,a.limits.maxComputeWorkgroupsPerDimension)}:{x:Math.min(Math.ceil(i/ja),a.limits.maxComputeWorkgroupsPerDimension),y:Math.min(Math.ceil(t/Ta),a.limits.maxComputeWorkgroupsPerDimension)},{commandEncoder:z,ts:X}=C(nr,U,q),Q=x?null:N(z,Z);M(z);let tr=await S(X);if(x)return tr!==void 0?{gpuTimeMs:tr}:{};let fr=await k(Q,Float32Array);return tr!==void 0?{C:fr,gpuTimeMs:tr}:{C:fr}}finally{h||d(ur),b||d(sr),x||d(Z),d(rr)}}var Ha=32,Ua=32,Oa=64,Va=64,Ka=36;async function po(a,e,r,o,t,i,s,l,n,u,f,m="row-major"){let w=s instanceof H,c=u instanceof H;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(e!=="lower"&&e!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(r!=="no-transpose"&&r!=="transpose")throw new Error("trans must be 'no-transpose' or 'transpose'.");if(m!=="row-major"&&m!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(typeof i!="number")throw new Error("alpha must be a number.");if(Number.isNaN(i))throw new Error("alpha must not be NaN.");if(!Number.isFinite(i))throw new Error("alpha must be finite.");if(typeof n!="number")throw new Error("beta must be a number.");if(Number.isNaN(n))throw new Error("beta must not be NaN.");if(!Number.isFinite(n))throw new Error("beta must be finite.");if(!Number.isInteger(o)||!Number.isInteger(t)||!Number.isInteger(l)||!Number.isInteger(f))throw new Error("n, k, lda, and ldc must be integers.");if(!w&&!(s instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!c&&!(u instanceof Float32Array))throw new Error("C must be a Float32Array or GpuMatrix.");if(w&&!c)throw new Error("C must be a GpuMatrix when A is a GpuMatrix.");if(c&&!w)throw new Error("A must be a GpuMatrix when C is a GpuMatrix.");if(o<0||t<0)throw new Error("n and k must be non-negative.");if(o===0)return c?{}:{C:u};let p=w?s.layout:m,g=c?u.layout:m,h=p==="column-major"?t:o,b=p==="column-major"?o:t,x=r==="no-transpose"?h:b,_=r==="no-transpose"?b:h;if(l<_)throw new Error(`lda must be >= ${p==="column-major"?"rows":"cols"} of A as stored.`);if(w){if(l!==s.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");let[W,$]=r==="no-transpose"?[o,t]:[t,o];if(s.rows<W||s.cols<$)throw new Error("A is too small for the given n, k, and trans.")}else if(s.length<(x-1)*l+_)throw new Error("A does not have enough elements for the given dimensions and lda.");if(f<o)throw new Error("ldc must be >= n.");if(c){if(f!==u.lda)throw new Error("ldc must match C.lda when C is a GpuMatrix.");if(u.rows<o||u.cols<o)throw new Error("C is too small for the given n.")}else if(u.length<(o-1)*f+o)throw new Error("C does not have enough elements for the given dimensions and ldc.");let y=r;p==="column-major"&&(y=y==="no-transpose"?"transpose":"no-transpose");let A=y==="no-transpose"?"transpose":"no-transpose",P=e;g==="column-major"&&([y,A]=[A==="no-transpose"?"transpose":"no-transpose",y==="no-transpose"?"transpose":"no-transpose"],P=P==="lower"?"upper":"lower");let E=Math.ceil(o/Va),T=Math.ceil(o/Oa),D=E*T>=Ka,R=await G(a,D?"sgemmtr_large":"sgemmtr_small"),j=w?s._buf:v(s,"ssyrk-A",!1),F=c?u._buf:v(u,"ssyrk-C",!0),V=w?er(j.size,"ssyrk-B",GPUBufferUsage.COPY_DST):v(s,"ssyrk-B",!1),K=L([{value:o,type:"u32"},{value:o,type:"u32"},{value:t,type:"u32"},{value:i,type:"f32"},{value:n,type:"f32"},{value:l,type:"u32"},{value:l,type:"u32"},{value:f,type:"u32"},{value:y==="transpose"?1:0,type:"u32"},{value:A==="transpose"?1:0,type:"u32"},{value:P==="upper"?1:0,type:"u32"}],"ssyrk-params");try{let W=B(R.getBindGroupLayout(0),[j,V,F,K]),$=D?{x:Math.min(E,a.limits.maxComputeWorkgroupsPerDimension),y:Math.min(T,a.limits.maxComputeWorkgroupsPerDimension)}:{x:Math.min(Math.ceil(o/Ua),a.limits.maxComputeWorkgroupsPerDimension),y:Math.min(Math.ceil(o/Ha),a.limits.maxComputeWorkgroupsPerDimension)},{commandEncoder:Y,querySet:J,passDescriptor:nr}=vr();w&&Y.copyBufferToBuffer(j,0,V,0,j.size),ar(Y,R,W,$,nr);let ur=br(Y,J),sr=c?null:N(Y,F);M(Y);let Z=await S(ur);if(c)return Z!==void 0?{gpuTimeMs:Z}:{};let rr=await k(sr,Float32Array);return Z!==void 0?{C:rr,gpuTimeMs:Z}:{C:rr}}finally{w||d(j),d(V),c||d(F),d(K)}}var za=32,qa=32,Ya=64,Xa=64,Qa=36;async function wo(a,e,r,o,t,i,s,l,n,u,f,m,w,c="row-major"){let p=s instanceof H,g=n instanceof H,h=m instanceof H;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(e!=="lower"&&e!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(r!=="no-transpose"&&r!=="transpose")throw new Error("trans must be 'no-transpose' or 'transpose'.");if(c!=="row-major"&&c!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(typeof i!="number")throw new Error("alpha must be a number.");if(Number.isNaN(i))throw new Error("alpha must not be NaN.");if(!Number.isFinite(i))throw new Error("alpha must be finite.");if(typeof f!="number")throw new Error("beta must be a number.");if(Number.isNaN(f))throw new Error("beta must not be NaN.");if(!Number.isFinite(f))throw new Error("beta must be finite.");if(!Number.isInteger(o)||!Number.isInteger(t)||!Number.isInteger(l)||!Number.isInteger(u)||!Number.isInteger(w))throw new Error("n, k, lda, ldb, and ldc must be integers.");if(!p&&!(s instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!g&&!(n instanceof Float32Array))throw new Error("B must be a Float32Array or GpuMatrix.");if(!h&&!(m instanceof Float32Array))throw new Error("C must be a Float32Array or GpuMatrix.");if((p||g)&&!h)throw new Error("C must be a GpuMatrix when A or B is a GpuMatrix.");if(h&&(!p||!g))throw new Error("A and B must be GpuMatrix when C is a GpuMatrix.");if(o<0||t<0)throw new Error("n and k must be non-negative.");if(o===0)return h?{}:{C:m};let b=p?s.layout:c,x=g?n.layout:c,_=h?m.layout:c,y=b==="column-major"?t:o,A=b==="column-major"?o:t,P=r==="no-transpose"?y:A,E=r==="no-transpose"?A:y;if(l<E)throw new Error(`lda must be >= ${b==="column-major"?"rows":"cols"} of A as stored.`);if(p){if(l!==s.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");let[X,Q]=r==="no-transpose"?[o,t]:[t,o];if(s.rows<X||s.cols<Q)throw new Error("A is too small for the given n, k, and trans.")}else if(s.length<(P-1)*l+E)throw new Error("A does not have enough elements for the given dimensions and lda.");let T=x==="column-major"?t:o,D=x==="column-major"?o:t,R=r==="no-transpose"?T:D,j=r==="no-transpose"?D:T;if(u<j)throw new Error(`ldb must be >= ${x==="column-major"?"rows":"cols"} of B as stored.`);if(g){if(u!==n.lda)throw new Error("ldb must match B.lda when B is a GpuMatrix.");let[X,Q]=r==="no-transpose"?[o,t]:[t,o];if(n.rows<X||n.cols<Q)throw new Error("B is too small for the given n, k, and trans.")}else if(n.length<(R-1)*u+j)throw new Error("B does not have enough elements for the given dimensions and ldb.");if(w<o)throw new Error("ldc must be >= n.");if(h){if(w!==m.lda)throw new Error("ldc must match C.lda when C is a GpuMatrix.");if(m.rows<o||m.cols<o)throw new Error("C is too small for the given n.")}else if(m.length<(o-1)*w+o)throw new Error("C does not have enough elements for the given dimensions and ldc.");let F=r;b==="column-major"&&(F=F==="no-transpose"?"transpose":"no-transpose");let V=r;x==="column-major"&&(V=V==="no-transpose"?"transpose":"no-transpose");let K=_==="column-major"?e==="lower"?"upper":"lower":e,W=X=>X==="no-transpose"?"transpose":"no-transpose";function $(X,Q,tr,fr,or,ir){let dr=X,Br=W(fr);return _!=="column-major"?{transX:dr,X:Q,ldX:tr,transY:Br,Y:or,ldY:ir}:{transX:W(Br),X:or,ldX:ir,transY:W(dr),Y:Q,ldY:tr}}let Y=Math.ceil(o/Xa),J=Math.ceil(o/Ya),nr=Y*J>=Qa,ur=await G(a,nr?"sgemmtr_large":"sgemmtr_small"),sr=nr?{x:Math.min(Y,a.limits.maxComputeWorkgroupsPerDimension),y:Math.min(J,a.limits.maxComputeWorkgroupsPerDimension)}:{x:Math.min(Math.ceil(o/qa),a.limits.maxComputeWorkgroupsPerDimension),y:Math.min(Math.ceil(o/za),a.limits.maxComputeWorkgroupsPerDimension)},Z=p?s._buf:v(s,"ssyr2k-A",!1),rr=g?n._buf:v(n,"ssyr2k-B",!1),U=h?m._buf:v(m,"ssyr2k-C",!0),q=null,z=null;try{let X=$(F,Z,l,V,rr,u),Q=$(V,rr,u,F,Z,l),tr=(Er,wr)=>L([{value:o,type:"u32"},{value:o,type:"u32"},{value:t,type:"u32"},{value:i,type:"f32"},{value:wr,type:"f32"},{value:Er.ldX,type:"u32"},{value:Er.ldY,type:"u32"},{value:w,type:"u32"},{value:Er.transX==="transpose"?1:0,type:"u32"},{value:Er.transY==="transpose"?1:0,type:"u32"},{value:K==="upper"?1:0,type:"u32"}],"ssyr2k-params");q=tr(X,f),z=tr(Q,1);let fr=B(ur.getBindGroupLayout(0),[X.X,X.Y,U,q]),or=B(ur.getBindGroupLayout(0),[Q.X,Q.Y,U,z]),{commandEncoder:ir,querySet:dr}=vr(),Br=dr?{timestampWrites:{querySet:dr,beginningOfPassWriteIndex:0}}:void 0,yr=dr?{timestampWrites:{querySet:dr,endOfPassWriteIndex:1}}:void 0;ar(ir,ur,fr,sr,Br),ar(ir,ur,or,sr,yr);let _r=br(ir,dr),gr=h?null:N(ir,U);M(ir);let pr=await S(_r);if(h)return pr!==void 0?{gpuTimeMs:pr}:{};let cr=await k(gr,Float32Array);return pr!==void 0?{C:cr,gpuTimeMs:pr}:{C:cr}}finally{p||d(Z),g||d(rr),h||d(U),q&&d(q),z&&d(z)}}var Za=32,$a=32,Ja=64,ri=64,ei=36,go=8;async function bo(a,e,r,o,t,i,s,l,n,u,f,m,w,c="row-major"){let p=s instanceof H,g=n instanceof H,h=m instanceof H;if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(e!=="left"&&e!=="right")throw new Error("side must be 'left' or 'right'.");if(r!=="lower"&&r!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(c!=="row-major"&&c!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(typeof i!="number")throw new Error("alpha must be a number.");if(Number.isNaN(i))throw new Error("alpha must not be NaN.");if(!Number.isFinite(i))throw new Error("alpha must be finite.");if(typeof f!="number")throw new Error("beta must be a number.");if(Number.isNaN(f))throw new Error("beta must not be NaN.");if(!Number.isFinite(f))throw new Error("beta must be finite.");if(!Number.isInteger(o)||!Number.isInteger(t)||!Number.isInteger(l)||!Number.isInteger(u)||!Number.isInteger(w))throw new Error("m, n, lda, ldb, and ldc must be integers.");if(!p&&!(s instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!g&&!(n instanceof Float32Array))throw new Error("B must be a Float32Array or GpuMatrix.");if(!h&&!(m instanceof Float32Array))throw new Error("C must be a Float32Array or GpuMatrix.");if((p||g)&&!h)throw new Error("C must be a GpuMatrix when A or B is a GpuMatrix.");if(h&&(!p||!g))throw new Error("A and B must be GpuMatrix when C is a GpuMatrix.");if(o<0||t<0)throw new Error("m and n must be non-negative.");if(o===0||t===0)return h?{}:{C:m};let b=p?s.layout:c,x=g?n.layout:c,_=h?m.layout:c,y=e==="left"?o:t;if(l<y)throw new Error("lda must be >= "+(e==="left"?"m":"n")+".");if(p){if(l!==s.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(s.rows<y||s.cols<y)throw new Error("A is too small for the given m/n and side.")}else if(s.length<(y-1)*l+y)throw new Error("A does not have enough elements for the given dimensions and lda.");let A=x==="column-major"?t:o,P=x==="column-major"?o:t;if(u<P)throw new Error(`ldb must be >= ${x==="column-major"?"rows":"cols"} of B as stored.`);if(g){if(u!==n.lda)throw new Error("ldb must match B.lda when B is a GpuMatrix.");if(n.rows<o||n.cols<t)throw new Error("B is too small for the given m and n.")}else if(n.length<(A-1)*u+P)throw new Error("B does not have enough elements for the given dimensions and ldb.");let E=_==="column-major"?t:o,T=_==="column-major"?o:t;if(w<T)throw new Error(`ldc must be >= ${_==="column-major"?"rows":"cols"} of C as stored.`);if(h){if(w!==m.lda)throw new Error("ldc must match C.lda when C is a GpuMatrix.");if(m.rows<o||m.cols<t)throw new Error("C is too small for the given m and n.")}else if(m.length<(E-1)*w+T)throw new Error("C does not have enough elements for the given dimensions and ldc.");let D=b==="column-major"?r==="lower"?"upper":"lower":r,R=x==="column-major"?"transpose":"no-transpose",j="no-transpose",F=o,V=t,K=y,W=e==="left"?j:R,$=e==="left"?R:j,Y=ir=>ir==="no-transpose"?"transpose":"no-transpose",J=e==="right";_==="column-major"&&([W,$]=[Y($),Y(W)],J=!J,[F,V]=[V,F]);let nr=y,ur=Math.ceil(V/ri),sr=Math.ceil(F/Ja),Z=ur*sr>=ei,rr=await G(a,Z?"sgemm_large":"sgemm_small"),U=await G(a,"symmetrize"),q=Z?{x:Math.min(ur,a.limits.maxComputeWorkgroupsPerDimension),y:Math.min(sr,a.limits.maxComputeWorkgroupsPerDimension)}:{x:Math.min(Math.ceil(V/$a),a.limits.maxComputeWorkgroupsPerDimension),y:Math.min(Math.ceil(F/Za),a.limits.maxComputeWorkgroupsPerDimension)},z=p?s._buf:v(s,"ssymm-A",!1),X=g?n._buf:v(n,"ssymm-B",!1),Q=h?m._buf:v(m,"ssymm-C",!0),tr=er(y*nr*4,"ssymm-Adense"),fr=null,or=null;try{fr=L([{value:y,type:"u32"},{value:l,type:"u32"},{value:nr,type:"u32"},{value:D==="upper"?1:0,type:"u32"}],"ssymm-sym-params");let ir=B(U.getBindGroupLayout(0),[z,tr,fr]),dr=J?X:tr,Br=J?u:nr,yr=J?tr:X;or=L([{value:F,type:"u32"},{value:V,type:"u32"},{value:K,type:"u32"},{value:i,type:"f32"},{value:f,type:"f32"},{value:Br,type:"u32"},{value:J?nr:u,type:"u32"},{value:w,type:"u32"},{value:W==="transpose"?1:0,type:"u32"},{value:$==="transpose"?1:0,type:"u32"}],"ssymm-gemm-params");let gr=B(rr.getBindGroupLayout(0),[dr,yr,Q,or]),{commandEncoder:pr,querySet:cr}=vr(),Er=cr?{timestampWrites:{querySet:cr,beginningOfPassWriteIndex:0}}:void 0,wr=cr?{timestampWrites:{querySet:cr,endOfPassWriteIndex:1}}:void 0;ar(pr,U,ir,{x:Math.ceil(y/go),y:Math.ceil(y/go)},Er),ar(pr,rr,gr,q,wr);let kr=br(pr,cr),Nr=h?null:N(pr,Q);M(pr);let Lr=await S(kr);if(h)return Lr!==void 0?{gpuTimeMs:Lr}:{};let Fr=await k(Nr,Float32Array);return Lr!==void 0?{C:Fr,gpuTimeMs:Lr}:{C:Fr}}finally{p||d(z),g||d(X),h||d(Q),d(tr),fr&&d(fr),or&&d(or)}}var ti=32,oi=32,ai=64,ii=64,si=36,ho=8;async function xo(a,e,r,o,t,i,s,l,n,u,f,m,w="row-major"){let c=n instanceof H,p=f instanceof H,g=t==="unit";if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(e!=="left"&&e!=="right")throw new Error("side must be 'left' or 'right'.");if(r!=="lower"&&r!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(o!=="no-transpose"&&o!=="transpose")throw new Error("transA must be 'no-transpose' or 'transpose'.");if(!g&&t!=="non-unit")throw new Error("diag must be 'unit' or 'non-unit'.");if(w!=="row-major"&&w!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(typeof l!="number")throw new Error("alpha must be a number.");if(Number.isNaN(l))throw new Error("alpha must not be NaN.");if(!Number.isFinite(l))throw new Error("alpha must be finite.");if(!Number.isInteger(i)||!Number.isInteger(s)||!Number.isInteger(u)||!Number.isInteger(m))throw new Error("m, n, lda, and ldb must be integers.");if(!c&&!(n instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!p&&!(f instanceof Float32Array))throw new Error("B must be a Float32Array or GpuMatrix.");if(c!==p)throw new Error("A and B must both be GpuMatrix or both be Float32Array.");if(i<0||s<0)throw new Error("m and n must be non-negative.");if(i===0||s===0)return p?{}:{B:f};let h=c?n.layout:w,b=p?f.layout:w,x=e==="left"?i:s;if(u<x)throw new Error("lda must be >= "+(e==="left"?"m":"n")+".");if(c){if(u!==n.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(n.rows<x||n.cols<x)throw new Error("A is too small for the given m/n and side.")}else if(n.length<(x-1)*u+x)throw new Error("A does not have enough elements for the given dimensions and lda.");let _=b==="column-major"?s:i,y=b==="column-major"?i:s;if(m<y)throw new Error(`ldb must be >= ${b==="column-major"?"rows":"cols"} of B as stored.`);if(p){if(m!==f.lda)throw new Error("ldb must match B.lda when B is a GpuMatrix.");if(f.rows<i||f.cols<s)throw new Error("B is too small for the given m and n.")}else if(f.length<(_-1)*m+y)throw new Error("B does not have enough elements for the given dimensions and ldb.");let A=h==="column-major"?r==="lower"?"upper":"lower":r,P=h==="column-major"?o==="no-transpose"?"transpose":"no-transpose":o,E=b==="column-major"?"transpose":"no-transpose",T="no-transpose",D=i,R=s,j=x,F=e==="left"?T:E,V=e==="left"?E:T,K=fr=>fr==="no-transpose"?"transpose":"no-transpose",W=e==="right";b==="column-major"&&([F,V]=[K(V),K(F)],W=!W,[D,R]=[R,D]);let $=x,Y=Math.ceil(R/ii),J=Math.ceil(D/ai),nr=Y*J>=si,ur=await G(a,nr?"sgemm_large":"sgemm_small"),sr=await G(a,"triangularize"),Z=nr?{x:Math.min(Y,a.limits.maxComputeWorkgroupsPerDimension),y:Math.min(J,a.limits.maxComputeWorkgroupsPerDimension)}:{x:Math.min(Math.ceil(R/oi),a.limits.maxComputeWorkgroupsPerDimension),y:Math.min(Math.ceil(D/ti),a.limits.maxComputeWorkgroupsPerDimension)},rr=c?n._buf:v(n,"strmm-A",!1),U=p?f._buf:v(f,"strmm-B",!0),q=er(x*$*4,"strmm-Adense"),z=er(_*m*4,"strmm-out",GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST),X=null,Q=null,tr=!1;try{X=L([{value:x,type:"u32"},{value:u,type:"u32"},{value:$,type:"u32"},{value:A==="upper"?1:0,type:"u32"},{value:P==="transpose"?1:0,type:"u32"},{value:g?1:0,type:"u32"}],"strmm-tri-params");let fr=B(sr.getBindGroupLayout(0),[rr,q,X]),or=W?U:q,ir=W?m:$,dr=W?q:U;Q=L([{value:D,type:"u32"},{value:R,type:"u32"},{value:j,type:"u32"},{value:l,type:"f32"},{value:0,type:"f32"},{value:ir,type:"u32"},{value:W?$:m,type:"u32"},{value:m,type:"u32"},{value:F==="transpose"?1:0,type:"u32"},{value:V==="transpose"?1:0,type:"u32"}],"strmm-gemm-params");let yr=B(ur.getBindGroupLayout(0),[or,dr,z,Q]),{commandEncoder:_r,querySet:gr}=vr();_r.copyBufferToBuffer(U,0,z,0,Math.min(U.size,z.size));let pr=gr?{timestampWrites:{querySet:gr,beginningOfPassWriteIndex:0}}:void 0,cr=gr?{timestampWrites:{querySet:gr,endOfPassWriteIndex:1}}:void 0;ar(_r,sr,fr,{x:Math.ceil(x/ho),y:Math.ceil(x/ho)},pr),ar(_r,ur,yr,Z,cr);let Er=br(_r,gr),wr=p?null:N(_r,z);M(_r);let kr=await S(Er);if(p)return d(f._buf),f._buf=z,tr=!0,kr!==void 0?{gpuTimeMs:kr}:{};let Nr=await k(wr,Float32Array);return kr!==void 0?{B:Nr,gpuTimeMs:kr}:{B:Nr}}finally{c||d(rr),p||d(U),d(q),tr||d(z),X&&d(X),Q&&d(Q)}}var hr=64,vo=32,yo=32,_o=64,Bo=64,Eo=36;async function Ao(a,e,r,o,t,i,s,l,n,u,f,m,w="row-major"){let c=n instanceof H,p=f instanceof H,g=t==="unit";if(!(a instanceof GPUDevice))throw new Error("device must be a GPUDevice.");if(e!=="left"&&e!=="right")throw new Error("side must be 'left' or 'right'.");if(r!=="lower"&&r!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(o!=="no-transpose"&&o!=="transpose")throw new Error("transA must be 'no-transpose' or 'transpose'.");if(!g&&t!=="non-unit")throw new Error("diag must be 'unit' or 'non-unit'.");if(w!=="row-major"&&w!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(typeof l!="number")throw new Error("alpha must be a number.");if(Number.isNaN(l))throw new Error("alpha must not be NaN.");if(!Number.isFinite(l))throw new Error("alpha must be finite.");if(!Number.isInteger(i)||!Number.isInteger(s)||!Number.isInteger(u)||!Number.isInteger(m))throw new Error("m, n, lda, and ldb must be integers.");if(!c&&!(n instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!p&&!(f instanceof Float32Array))throw new Error("B must be a Float32Array or GpuMatrix.");if(c!==p)throw new Error("A and B must both be GpuMatrix or both be Float32Array.");if(i<0||s<0)throw new Error("m and n must be non-negative.");if(i===0||s===0)return p?{}:{B:f};let h=c?n.layout:w,b=p?f.layout:w,x=e==="left"?i:s;if(u<x)throw new Error("lda must be >= "+(e==="left"?"m":"n")+".");if(c){if(u!==n.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(n.rows<x||n.cols<x)throw new Error("A is too small for the given m/n and side.")}else if(n.length<(x-1)*u+x)throw new Error("A does not have enough elements for the given dimensions and lda.");let _=b==="column-major"?s:i,y=b==="column-major"?i:s;if(m<y)throw new Error(`ldb must be >= ${b==="column-major"?"rows":"cols"} of B as stored.`);if(p){if(m!==f.lda)throw new Error("ldb must match B.lda when B is a GpuMatrix.");if(f.rows<i||f.cols<s)throw new Error("B is too small for the given m and n.")}else if(f.length<(_-1)*m+y)throw new Error("B does not have enough elements for the given dimensions and ldb.");let A=h==="column-major"?r==="lower"?"upper":"lower":r,P=h==="column-major"?o==="no-transpose"?"transpose":"no-transpose":o,E=e==="left"?s:i,T=e==="left",D=P==="no-transpose"==(A==="lower"),R=e==="left"?D:!D,j=[];for(let U=0;U<x;U+=hr)j.push(U);R||j.reverse();let F=j.length,V=await G(a,"strsv_invert_block"),K=await G(a,"block_transfer"),W=await G(a,"sscal"),$=c?n._buf:v(n,"strsm-A",!1),Y=p?f._buf:v(f,"strsm-B",!0),J=er(F*hr*hr*4,"strsm-Ainv"),nr=[],ur=[];function sr(U,q){let z=er(U,q);return ur.push(z),z}function Z(U,q){let z=L(U,q);return nr.push(z),z}let rr=(_-1)*m+y;try{let U=null;if(l!==1){let gr=Z([{value:rr,type:"u32"},{value:l,type:"f32"},{value:1,type:"u32"}],"strsm-scale-params");U=B(W.getBindGroupLayout(0),[Y,gr])}let q=Z([{value:x,type:"u32"},{value:u,type:"u32"},{value:P==="transpose"?1:0,type:"u32"},{value:A==="upper"?1:0,type:"u32"},{value:g?1:0,type:"u32"}],"strsm-invert-params"),z=B(V.getBindGroupLayout(0),[$,J,q]),X=sr(hr*E*4,"strsm-Bblock"),Q=sr(hr*E*4,"strsm-Xblock"),tr=sr(x*hr*4,"strsm-Aoff"),fr=sr(x*E*4,"strsm-delta"),{commandEncoder:or,querySet:ir}=vr();if(l===0){let gr=ir?{timestampWrites:{querySet:ir,beginningOfPassWriteIndex:0,endOfPassWriteIndex:1}}:void 0;ar(or,W,U,mr(rr),gr)}else{U&&ar(or,W,U,mr(rr)),ar(or,V,z,{x:hr,y:F},ir?{timestampWrites:{querySet:ir,beginningOfPassWriteIndex:0}}:void 0);for(let pr=0;pr<j.length;pr++){let cr=j[pr],Er=Math.min(cr+hr,x),wr=Er-cr,kr=cr/hr,Nr=pr===j.length-1,Lr=Z([{value:cr,type:"u32"},{value:wr,type:"u32"},{value:0,type:"u32"},{value:E,type:"u32"},{value:m,type:"u32"},{value:b==="column-major"?1:0,type:"u32"},{value:T?1:0,type:"u32"},{value:2,type:"u32"}],"strsm-gather-B-params"),Fr=B(K.getBindGroupLayout(0),[X,Y,Lr]);ar(or,K,Fr,mr(wr,E));{let Sr=wr,Mr=E,zr=wr,Tr=Math.ceil(Mr/Bo),jr=Math.ceil(Sr/_o),Cr=Tr*jr>=Eo,Wr=await G(a,Cr?"sgemm_large":"sgemm_small"),qr=Z([{value:Sr,type:"u32"},{value:Mr,type:"u32"},{value:zr,type:"u32"},{value:1,type:"f32"},{value:0,type:"f32"},{value:hr,type:"u32"},{value:E,type:"u32"},{value:E,type:"u32"},{value:e==="right"?1:0,type:"u32"},{value:0,type:"u32"}],"strsm-apply-params"),Yr=B(Wr.getBindGroupLayout(0),[{buffer:J,offset:kr*hr*hr*4,size:hr*hr*4},X,Q,qr]),Xr=Cr?{x:Math.min(Tr,a.limits.maxComputeWorkgroupsPerDimension),y:Math.min(jr,a.limits.maxComputeWorkgroupsPerDimension)}:{x:Math.min(Math.ceil(Mr/yo),a.limits.maxComputeWorkgroupsPerDimension),y:Math.min(Math.ceil(Sr/vo),a.limits.maxComputeWorkgroupsPerDimension)};ar(or,Wr,Yr,Xr)}let Hr=R?Er:0,re=R?x:cr,ee=Hr<re,Go=Z([{value:cr,type:"u32"},{value:wr,type:"u32"},{value:0,type:"u32"},{value:E,type:"u32"},{value:m,type:"u32"},{value:b==="column-major"?1:0,type:"u32"},{value:T?1:0,type:"u32"},{value:0,type:"u32"}],"strsm-scatter-params"),ko=B(K.getBindGroupLayout(0),[Q,Y,Go]),Po=Nr&&!ee&&ir?{timestampWrites:{querySet:ir,endOfPassWriteIndex:1}}:void 0;if(ar(or,K,ko,mr(wr,E),Po),!ee)continue;let Rr=re-Hr,No=Z([{value:Hr,type:"u32"},{value:Rr,type:"u32"},{value:cr,type:"u32"},{value:wr,type:"u32"},{value:u,type:"u32"},{value:P==="transpose"?1:0,type:"u32"},{value:T?1:0,type:"u32"},{value:2,type:"u32"}],"strsm-gather-A-params"),So=B(K.getBindGroupLayout(0),[tr,$,No]);ar(or,K,So,mr(Rr,wr));{let Sr=Rr,Mr=E,zr=wr,Tr=Math.ceil(Mr/Bo),jr=Math.ceil(Sr/_o),Cr=Tr*jr>=Eo,Wr=await G(a,Cr?"sgemm_large":"sgemm_small"),qr=Z([{value:Sr,type:"u32"},{value:Mr,type:"u32"},{value:zr,type:"u32"},{value:1,type:"f32"},{value:0,type:"f32"},{value:wr,type:"u32"},{value:E,type:"u32"},{value:E,type:"u32"},{value:0,type:"u32"},{value:0,type:"u32"}],"strsm-update-params"),Yr=B(Wr.getBindGroupLayout(0),[tr,Q,fr,qr]),Xr=Cr?{x:Math.min(Tr,a.limits.maxComputeWorkgroupsPerDimension),y:Math.min(jr,a.limits.maxComputeWorkgroupsPerDimension)}:{x:Math.min(Math.ceil(Mr/yo),a.limits.maxComputeWorkgroupsPerDimension),y:Math.min(Math.ceil(Sr/vo),a.limits.maxComputeWorkgroupsPerDimension)};ar(or,Wr,Yr,Xr)}let Mo=Z([{value:Hr,type:"u32"},{value:Rr,type:"u32"},{value:0,type:"u32"},{value:E,type:"u32"},{value:m,type:"u32"},{value:b==="column-major"?1:0,type:"u32"},{value:T?1:0,type:"u32"},{value:1,type:"u32"}],"strsm-scatter-sub-params"),Io=B(K.getBindGroupLayout(0),[fr,Y,Mo]),Lo=Nr&&ir?{timestampWrites:{querySet:ir,endOfPassWriteIndex:1}}:void 0;ar(or,K,Io,mr(Rr,E),Lo)}}let dr=br(or,ir),Br=p?null:N(or,Y);M(or);let yr=await S(dr);if(p)return yr!==void 0?{gpuTimeMs:yr}:{};let _r=await k(Br,Float32Array);return yr!==void 0?{B:_r,gpuTimeMs:yr}:{B:_r}}finally{c||d($),p||d(Y),d(J),d(ur),d(nr)}}return Wo(ni);})();
|