wgblas 2.2.1 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -2
- package/dist/wgblas.browser.js +1082 -57
- package/index.d.mts +7 -0
- package/index.mjs +7 -0
- package/package.json +40 -4
- package/src/dgemv/dgemv.d.mts +92 -0
- package/src/dgemv/dgemv.mjs +247 -0
- package/src/dger/dger.d.mts +80 -0
- package/src/dger/dger.mjs +213 -0
- package/src/dsymv/dsymv.d.mts +84 -0
- package/src/dsymv/dsymv.mjs +227 -0
- package/src/dsyr/dsyr.d.mts +73 -0
- package/src/dsyr/dsyr.mjs +171 -0
- package/src/dsyr2/dsyr2.d.mts +81 -0
- package/src/dsyr2/dsyr2.mjs +214 -0
- package/src/dtrmv/dtrmv.d.mts +84 -0
- package/src/dtrmv/dtrmv.mjs +219 -0
- package/src/dtrsv/dtrsv.d.mts +79 -0
- package/src/dtrsv/dtrsv.mjs +331 -0
- package/src/shaders/dgemv_n.wgsl +112 -0
- package/src/shaders/dgemv_t.wgsl +102 -0
- package/src/shaders/dger.wgsl +77 -0
- package/src/shaders/dsymv.wgsl +125 -0
- package/src/shaders/dsyr.wgsl +84 -0
- package/src/shaders/dsyr2.wgsl +95 -0
- package/src/shaders/dtrmv.wgsl +111 -0
- package/src/shaders/dtrsv_apply_inverse.wgsl +60 -0
- package/src/shaders/dtrsv_invert_block.wgsl +148 -0
- package/src/shaders/dtrsv_update.wgsl +111 -0
- package/src/shaders/index.mjs +63 -0
package/dist/wgblas.browser.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
var wgblas=(()=>{var
|
|
1
|
+
var wgblas=(()=>{var oi=Object.create;var pe=Object.defineProperty;var ai=Object.getOwnPropertyDescriptor;var ii=Object.getOwnPropertyNames;var si=Object.getPrototypeOf,ni=Object.prototype.hasOwnProperty;var we=(r=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(r,{get:(o,e)=>(typeof require<"u"?require:o)[e]}):r)(function(r){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+r+'" is not supported')});var Z=(r,o,e)=>()=>{if(e)throw e[0];try{return r&&(o=r(r=0)),o}catch(a){throw e=[a],a}};var Fe=(r,o)=>{for(var e in o)pe(r,e,{get:o[e],enumerable:!0})},qe=(r,o,e,a)=>{if(o&&typeof o=="object"||typeof o=="function")for(let t of ii(o))!ni.call(r,t)&&t!==e&&pe(r,t,{get:()=>o[t],enumerable:!(a=ai(o,t))||a.enumerable});return r};var ge=(r,o,e)=>(e=r!=null?oi(si(r)):{},qe(o||!r||!r.__esModule?pe(e,"default",{value:r,enumerable:!0}):e,r)),li=r=>qe(pe({},"__esModule",{value:!0}),r);var ke,$e=Z(()=>{ke=`// sscal: x = alpha * x
|
|
2
2
|
|
|
3
3
|
@group(0) @binding(0) var<storage, read_write> x: array<f32>;
|
|
4
4
|
|
|
@@ -21,7 +21,7 @@ fn main(
|
|
|
21
21
|
x[id * params.x_inc] = params.alpha * x[id * params.x_inc];
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
|
-
`});var Qe,
|
|
24
|
+
`});var Qe,Je=Z(()=>{Qe=`// cscal: x := alpha * x, complex. x is one interleaved f32 array
|
|
25
25
|
// (re0, im0, re1, im1, ...), matching Complex32Array/GpuVector's storage
|
|
26
26
|
// (and cuBLAS's cuComplex / stdlib's Complex64Array) \u2014 no repacking needed
|
|
27
27
|
// between JS and GPU.
|
|
@@ -54,7 +54,7 @@ fn main(
|
|
|
54
54
|
x[base + 1u] = params.alphaRe * im + params.alphaIm * re;
|
|
55
55
|
}
|
|
56
56
|
}
|
|
57
|
-
`});var rt
|
|
57
|
+
`});var et,rt=Z(()=>{et=`// sswap: x <-> y
|
|
58
58
|
|
|
59
59
|
@group(0) @binding(0) var<storage, read_write> x: array<f32>;
|
|
60
60
|
@group(0) @binding(1) var<storage, read_write> y: array<f32>;
|
|
@@ -80,7 +80,7 @@ fn main(
|
|
|
80
80
|
y[id * params.y_inc] = temp;
|
|
81
81
|
}
|
|
82
82
|
}
|
|
83
|
-
`});var tt
|
|
83
|
+
`});var ot,tt=Z(()=>{ot=`// dswap: x <-> y, double-double (Dekker) f64 emulation of sswap. A swap is
|
|
84
84
|
// pure data movement \u2014 hi and lo are exchanged verbatim, with no arithmetic
|
|
85
85
|
// at all \u2014 so (unlike dscal/daxpy/ddot) this needs no
|
|
86
86
|
// ddMulProtected/ddAddProtected renormalizing barrier, and so no
|
|
@@ -118,7 +118,7 @@ fn main(
|
|
|
118
118
|
yLo[iy] = tempLo;
|
|
119
119
|
}
|
|
120
120
|
}
|
|
121
|
-
`});var at
|
|
121
|
+
`});var it,at=Z(()=>{it=`// saxpy: y = alpha * x + y
|
|
122
122
|
|
|
123
123
|
@group(0) @binding(0) var<storage, read> x: array<f32>;
|
|
124
124
|
@group(0) @binding(1) var<storage, read_write> y: array<f32>;
|
|
@@ -143,7 +143,7 @@ fn main(
|
|
|
143
143
|
y[id * params.y_inc] = params.alpha * x[id * params.x_inc] + y[id * params.y_inc];
|
|
144
144
|
}
|
|
145
145
|
}
|
|
146
|
-
`});var st
|
|
146
|
+
`});var nt,st=Z(()=>{nt=`// scopy: y = x
|
|
147
147
|
|
|
148
148
|
@group(0) @binding(0) var<storage, read> x: array<f32>;
|
|
149
149
|
@group(0) @binding(1) var<storage, read_write> y: array<f32>;
|
|
@@ -167,7 +167,7 @@ fn main(
|
|
|
167
167
|
y[id * params.y_inc] = x[id * params.x_inc];
|
|
168
168
|
}
|
|
169
169
|
}
|
|
170
|
-
`});var lt
|
|
170
|
+
`});var ut,lt=Z(()=>{ut=`// dcopy: y = x, double-double (Dekker) f64 emulation of scopy. A copy is
|
|
171
171
|
// pure data movement \u2014 hi and lo are transferred verbatim, with no
|
|
172
172
|
// arithmetic at all \u2014 so (unlike dscal/daxpy/ddot) this needs no
|
|
173
173
|
// ddMulProtected/ddAddProtected renormalizing barrier, and so no
|
|
@@ -201,7 +201,7 @@ fn main(
|
|
|
201
201
|
yLo[iy] = xLo[ix];
|
|
202
202
|
}
|
|
203
203
|
}
|
|
204
|
-
`});var ft,
|
|
204
|
+
`});var ft,dt=Z(()=>{ft=`// sdot: result = sum(x[i] * y[i])
|
|
205
205
|
// pass 1 dispatches exactly 2 * WGS workgroups; pass 2 uses reduction/sum.wgsl.
|
|
206
206
|
|
|
207
207
|
@group(0) @binding(0) var<storage, read> x: array<f32>;
|
|
@@ -254,7 +254,7 @@ fn main(
|
|
|
254
254
|
|
|
255
255
|
if (lid.x == 0u) { partials[wgid.x] = tile[0]; }
|
|
256
256
|
}
|
|
257
|
-
`});var De,mt=
|
|
257
|
+
`});var De,mt=Z(()=>{De=`// sum reduction: collapses 2*WGS partials into one scalar.
|
|
258
258
|
// dispatch: 1 workgroup of WGS threads.
|
|
259
259
|
// partials must have exactly 2*WGS entries.
|
|
260
260
|
|
|
@@ -280,7 +280,7 @@ fn reduce(
|
|
|
280
280
|
|
|
281
281
|
if (i == 0u) { result[0] = tile[0]; }
|
|
282
282
|
}
|
|
283
|
-
`});var ct
|
|
283
|
+
`});var pt,ct=Z(()=>{pt=`// sasum: result = sum(|x[i]|)
|
|
284
284
|
// pass 1 dispatches exactly 2 * WGS workgroups; pass 2 uses reduction/abssum.wgsl.
|
|
285
285
|
|
|
286
286
|
@group(0) @binding(0) var<storage, read> x: array<f32>;
|
|
@@ -331,7 +331,7 @@ fn main(
|
|
|
331
331
|
|
|
332
332
|
if (lid.x == 0u) { partials[wgid.x] = tile[0]; }
|
|
333
333
|
}
|
|
334
|
-
`});var gt,
|
|
334
|
+
`});var gt,wt=Z(()=>{gt=`// snrm2: result = sqrt(sum(x[i] * x[i])), computed via scaled accumulation
|
|
335
335
|
// (Blue's algorithm / reference BLAS's SLASSQ) rather than naive squaring \u2014
|
|
336
336
|
// naive \`sum += x_i * x_i\` overflows to inf for |x_i| \u2273 1.8e19 (f32's
|
|
337
337
|
// squaring range is only sqrt(f32_max)) and loses precision on tiny
|
|
@@ -436,7 +436,7 @@ fn main(
|
|
|
436
436
|
partialsSsq[wgid.x] = tileSsq[0];
|
|
437
437
|
}
|
|
438
438
|
}
|
|
439
|
-
`});var ht
|
|
439
|
+
`});var bt,ht=Z(()=>{bt=`// scaledSum reduction: collapses 2*WGS (scale, ssq) partials from
|
|
440
440
|
// snrm2.wgsl into the final norm \u2014 sqrt(scale\xB2 \xB7 ssq) == scale \xB7 sqrt(ssq).
|
|
441
441
|
// Mirrors reduction/sum.wgsl's shape exactly, merging via ssqMerge (see
|
|
442
442
|
// snrm2.wgsl for the derivation) instead of plain \`+\`, and taking the final
|
|
@@ -501,7 +501,7 @@ fn reduce_scaled(
|
|
|
501
501
|
result[0] = tileScale[0] * sqrt(tileSsq[0]);
|
|
502
502
|
}
|
|
503
503
|
}
|
|
504
|
-
`});var yt
|
|
504
|
+
`});var xt,yt=Z(()=>{xt=`// isamax: returns index of element with largest absolute value
|
|
505
505
|
// pass 1 dispatches exactly 2 * WGS workgroups; pass 2 uses reduction/argmax.wgsl.
|
|
506
506
|
|
|
507
507
|
@group(0) @binding(0) var<storage, read> x: array<f32>;
|
|
@@ -583,7 +583,7 @@ fn main(
|
|
|
583
583
|
partials_idx[wgid.x] = tile_idx[0];
|
|
584
584
|
}
|
|
585
585
|
}
|
|
586
|
-
`});var vt
|
|
586
|
+
`});var _t,vt=Z(()=>{_t=`// amax reduction: collapses 2*WGS (value, index) pairs into one index.
|
|
587
587
|
// dispatch: 1 workgroup of WGS threads.
|
|
588
588
|
// partials_val and partials_idx must have exactly 2*WGS entries.
|
|
589
589
|
|
|
@@ -626,7 +626,7 @@ fn reduce(
|
|
|
626
626
|
|
|
627
627
|
if (i == 0u) { result[0] = tile_idx[0]; }
|
|
628
628
|
}
|
|
629
|
-
`});var
|
|
629
|
+
`});var Pr,Bt=Z(()=>{Pr=`// Double-double arithmetic via Dekker's algorithm \u2014 an alternative to
|
|
630
630
|
// f64add.wgsl's bit-exact IEEE-754 emulation. Doesn't touch that path.
|
|
631
631
|
//
|
|
632
632
|
// A double-double number is a pair (hi, lo) of f32 with hi+lo approximating
|
|
@@ -644,7 +644,7 @@ struct DD {
|
|
|
644
644
|
hi: f32,
|
|
645
645
|
lo: f32,
|
|
646
646
|
}
|
|
647
|
-
`});var ye,
|
|
647
|
+
`});var ye,At=Z(()=>{ye=`// Requires f64/dekker.wgsl concatenated first for the DD struct.
|
|
648
648
|
|
|
649
649
|
// |a| for a double-double pair. Negation is exact (no rounding), so this is
|
|
650
650
|
// just a sign flip on both components \u2014 hi alone determines the pair's sign.
|
|
@@ -654,7 +654,7 @@ fn ddAbs(a: DD) -> DD {
|
|
|
654
654
|
}
|
|
655
655
|
return a;
|
|
656
656
|
}
|
|
657
|
-
`});var
|
|
657
|
+
`});var Ir,St=Z(()=>{Ir=`// Requires f64/dekker.wgsl concatenated first for the DD struct.
|
|
658
658
|
|
|
659
659
|
// \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
|
|
660
660
|
//
|
|
@@ -737,7 +737,7 @@ fn ddAddProtected(a: DD, b: DD, threadSlot: u32) -> DD {
|
|
|
737
737
|
fn ddSubProtected(a: DD, b: DD, threadSlot: u32) -> DD {
|
|
738
738
|
return ddAddProtected(a, DD(negf(b.hi), negf(b.lo)), threadSlot);
|
|
739
739
|
}
|
|
740
|
-
`});var Gt
|
|
740
|
+
`});var Et,Gt=Z(()=>{Et=`// dasum: sum(|x[i]|), double-double (Dekker). Same ILP=4 shape as sasum.wgsl;
|
|
741
741
|
// see f64/utils/add.wgsl for ddAddProtected and why plain ddAdd isn't safe.
|
|
742
742
|
// GpuVector input isn't pre-abs'd, so ddAbs() (f64/utils/abs.wgsl) applies
|
|
743
743
|
// unconditionally below.
|
|
@@ -822,7 +822,7 @@ fn dasum_main(
|
|
|
822
822
|
partialsLo[wgid.x] = tile[0].lo;
|
|
823
823
|
}
|
|
824
824
|
}
|
|
825
|
-
`});var
|
|
825
|
+
`});var Le,kt=Z(()=>{Le=`// sum reduction (f64, double-double): collapses 2*WGS partial (hi, lo) pairs
|
|
826
826
|
// into one, using ddAddProtected instead of plain f32 \`+\` (see
|
|
827
827
|
// reduction/sum.wgsl for the f32 original this mirrors).
|
|
828
828
|
// dispatch: 1 workgroup of WGS threads. partialsHi/partialsLo must have
|
|
@@ -862,7 +862,7 @@ fn reduce_f64(
|
|
|
862
862
|
resultLo[0] = tile[0].lo;
|
|
863
863
|
}
|
|
864
864
|
}
|
|
865
|
-
`});var
|
|
865
|
+
`});var Cr,Dt=Z(()=>{Cr=`// Requires f64/dekker.wgsl concatenated first for the DD struct, and
|
|
866
866
|
// f64/utils/add.wgsl for fsub/negf (bitcast-based subtraction/negation) and,
|
|
867
867
|
// for ddMulProtected at the bottom, fastTwoSumProtected.
|
|
868
868
|
//
|
|
@@ -961,7 +961,7 @@ fn ddMulProtected(a: DD, b: DD, threadSlot: u32) -> DD {
|
|
|
961
961
|
let rawHi = dekkerScratch[threadSlot];
|
|
962
962
|
return fastTwoSumProtected(rawHi, raw.lo, threadSlot);
|
|
963
963
|
}
|
|
964
|
-
`});var
|
|
964
|
+
`});var Pt,Lt=Z(()=>{Pt=`// ddot: sum(x[i] * y[i]), double-double (Dekker). Same ILP=4 shape as
|
|
965
965
|
// dasum.wgsl, which this mirrors closely \u2014 the only structural difference is
|
|
966
966
|
// a second input vector and a product where dasum takes an absolute value.
|
|
967
967
|
//
|
|
@@ -1067,7 +1067,7 @@ fn ddot_main(
|
|
|
1067
1067
|
partialsLo[wgid.x] = tile[0].lo;
|
|
1068
1068
|
}
|
|
1069
1069
|
}
|
|
1070
|
-
`});var Mt,
|
|
1070
|
+
`});var Mt,Nt=Z(()=>{Mt=`// dscal: x := alpha * x, double-double (Dekker) f64 emulation of sscal.
|
|
1071
1071
|
// alpha and x are each an f32 (hi, lo) pair. See f64/utils/multiply.wgsl for
|
|
1072
1072
|
// ddMulProtected and why plain ddMulRaw isn't safe without a renormalizing
|
|
1073
1073
|
// barrier \u2014 that barrier needs a provably uniform loop trip count across
|
|
@@ -1127,7 +1127,7 @@ fn dscal_main(
|
|
|
1127
1127
|
}
|
|
1128
1128
|
}
|
|
1129
1129
|
}
|
|
1130
|
-
`});var
|
|
1130
|
+
`});var Rt,It=Z(()=>{Rt=`// daxpy: y := alpha * x + y, double-double (Dekker) f64 emulation of saxpy.
|
|
1131
1131
|
// Each element costs one ddMulProtected (alpha*x[i]) then one ddAddProtected
|
|
1132
1132
|
// (+ y[i]) \u2014 the same two-protected-op shape ddot spends per term, applied
|
|
1133
1133
|
// straight to the output instead of folded into a reduction. See dscal.wgsl
|
|
@@ -1193,7 +1193,7 @@ fn daxpy_main(
|
|
|
1193
1193
|
}
|
|
1194
1194
|
}
|
|
1195
1195
|
}
|
|
1196
|
-
`});var Pe,
|
|
1196
|
+
`});var Pe,jt=Z(()=>{Pe=`// Requires f64/dekker.wgsl concatenated first for the DD struct.
|
|
1197
1197
|
|
|
1198
1198
|
// a > b for double-double pairs. hi dominates (|lo| <= ulp(hi)/2 always), so
|
|
1199
1199
|
// comparing hi alone is correct except on an exact hi tie, when lo breaks it.
|
|
@@ -1205,14 +1205,14 @@ fn ddGreater(a: DD, b: DD) -> bool {
|
|
|
1205
1205
|
}
|
|
1206
1206
|
return a.lo > b.lo;
|
|
1207
1207
|
}
|
|
1208
|
-
`});var
|
|
1208
|
+
`});var qt,Ft=Z(()=>{qt=`// Requires f64/dekker.wgsl concatenated first for the DD struct.
|
|
1209
1209
|
|
|
1210
1210
|
// a == b for double-double pairs \u2014 exact field equality, no rounding
|
|
1211
1211
|
// involved, so (like ddGreater) this needs no protection.
|
|
1212
1212
|
fn ddEqual(a: DD, b: DD) -> bool {
|
|
1213
1213
|
return a.hi == b.hi && a.lo == b.lo;
|
|
1214
1214
|
}
|
|
1215
|
-
`});var
|
|
1215
|
+
`});var Tt,Ht=Z(()=>{Tt=`// idamax: returns index of element with largest absolute value (f64, double-double)
|
|
1216
1216
|
// pass 1 dispatches exactly 2 * WGS workgroups; pass 2 uses reduction/argmaxF64.wgsl.
|
|
1217
1217
|
// Concatenated after f64/dekker.wgsl (DD struct), f64/utils/abs.wgsl (ddAbs),
|
|
1218
1218
|
// f64/utils/greater.wgsl (ddGreater), and f64/utils/equal.wgsl (ddEqual).
|
|
@@ -1308,7 +1308,7 @@ fn idamax_main(
|
|
|
1308
1308
|
partialsIdx[wgid.x] = tile_idx[0];
|
|
1309
1309
|
}
|
|
1310
1310
|
}
|
|
1311
|
-
`});var Wt,
|
|
1311
|
+
`});var Wt,Ct=Z(()=>{Wt=`// amax reduction (f64, double-double): collapses 2*WGS (value, index) pairs
|
|
1312
1312
|
// into one index, using ddGreater/ddEqual instead of plain f32 \`>\`/\`==\` (see
|
|
1313
1313
|
// reduction/argmax.wgsl for the f32 original this mirrors).
|
|
1314
1314
|
// dispatch: 1 workgroup of WGS threads. partialsValHi/partialsValLo/
|
|
@@ -1358,7 +1358,7 @@ fn reduce_f64(
|
|
|
1358
1358
|
|
|
1359
1359
|
if (i == 0u) { result[0] = tile_idx[0]; }
|
|
1360
1360
|
}
|
|
1361
|
-
`});var Ot,
|
|
1361
|
+
`});var Ot,Vt=Z(()=>{Ot=`// srot: x = c*x + s*y, y = -s*x + c*y
|
|
1362
1362
|
|
|
1363
1363
|
@group(0) @binding(0) var<storage, read_write> x: array<f32>;
|
|
1364
1364
|
@group(0) @binding(1) var<storage, read_write> y: array<f32>;
|
|
@@ -1387,7 +1387,7 @@ fn main(
|
|
|
1387
1387
|
y[id * params.y_inc] = -params.s * xi + params.c * yi;
|
|
1388
1388
|
}
|
|
1389
1389
|
}
|
|
1390
|
-
`});var Kt
|
|
1390
|
+
`});var Ut,Kt=Z(()=>{Ut=`// drot: x = c*x + s*y, y = -s*x + c*y \u2014 double-double (Dekker) f64 emulation
|
|
1391
1391
|
// of srot. c, s, x, and y are each split into an f32 (hi, lo) pair. Each
|
|
1392
1392
|
// element costs four ddMulProtected (c*x, s*y, -s*x, c*y) then two
|
|
1393
1393
|
// ddAddProtected (the two sums) \u2014 negS is computed once outside the loop
|
|
@@ -1468,7 +1468,7 @@ fn drot_main(
|
|
|
1468
1468
|
}
|
|
1469
1469
|
}
|
|
1470
1470
|
}
|
|
1471
|
-
`});var
|
|
1471
|
+
`});var Yt,zt=Z(()=>{Yt=`// srotm: applies modified Givens rotation H to vectors x and y.
|
|
1472
1472
|
// param[0] = flag: -1 (full H), 0 (unit diagonal), 1 (unit off-diagonal)
|
|
1473
1473
|
// param = [ flag, h11, h21, h12, h22 ]
|
|
1474
1474
|
// flag == -2 (identity/no-op) is handled in JS before dispatch reaches here.
|
|
@@ -1518,7 +1518,7 @@ fn main(
|
|
|
1518
1518
|
y[id * params.y_inc] = h21 * xi + h22 * yi;
|
|
1519
1519
|
}
|
|
1520
1520
|
}
|
|
1521
|
-
`});var Xt,
|
|
1521
|
+
`});var Xt,Zt=Z(()=>{Xt=`// drotm: applies a modified Givens rotation H to vectors x and y \u2014 double-
|
|
1522
1522
|
// double (Dekker) f64 emulation of srotm. paramHi/paramLo[0] = flag: -1
|
|
1523
1523
|
// (full H), 0 (unit diagonal), 1 (unit off-diagonal). param = [ flag, h11,
|
|
1524
1524
|
// h21, h12, h22 ], each entry an f32 (hi, lo) pair.
|
|
@@ -1617,7 +1617,7 @@ fn drotm_main(
|
|
|
1617
1617
|
}
|
|
1618
1618
|
}
|
|
1619
1619
|
}
|
|
1620
|
-
`});var
|
|
1620
|
+
`});var Ne,$t=Z(()=>{Ne=`// Requires f64/dekker.wgsl concatenated first for the DD struct, and
|
|
1621
1621
|
// f64/utils/add.wgsl (ddSubProtected/ddAddProtected/negf) and
|
|
1622
1622
|
// f64/utils/multiply.wgsl (ddMulProtected).
|
|
1623
1623
|
//
|
|
@@ -1662,7 +1662,7 @@ fn ddDivProtected(a: DD, b: DD, threadSlot: u32) -> DD {
|
|
|
1662
1662
|
let refined = ddAddProtected(DD(q1, 0.0), DD(q2, 0.0), threadSlot);
|
|
1663
1663
|
return DD(select(refined.hi, q1, bIsZero), select(refined.lo, 0.0, bIsZero));
|
|
1664
1664
|
}
|
|
1665
|
-
`});var Jt
|
|
1665
|
+
`});var Qt,Jt=Z(()=>{Qt=`// Requires f64/dekker.wgsl concatenated first for the DD struct, and
|
|
1666
1666
|
// f64/utils/add.wgsl (ddSubProtected/ddAddProtected) and
|
|
1667
1667
|
// f64/utils/multiply.wgsl (twoProdBit \u2014 squaring a plain f32 needs no
|
|
1668
1668
|
// barrier, per multiply.wgsl's own note that twoProdBit is universally safe
|
|
@@ -1707,7 +1707,7 @@ fn ddSqrtProtected(a: DD, threadSlot: u32) -> DD {
|
|
|
1707
1707
|
let result = ddAddProtected(DD(x0, 0.0), DD(correction, 0.0), threadSlot);
|
|
1708
1708
|
return DD(select(result.hi, 0.0, isZero), select(result.lo, 0.0, isZero));
|
|
1709
1709
|
}
|
|
1710
|
-
`});var eo,ro=
|
|
1710
|
+
`});var eo,ro=Z(()=>{eo=`// dnrm2: result = sqrt(sum(x[i] * x[i])), double-double (Dekker) f64
|
|
1711
1711
|
// emulation of snrm2 \u2014 same scaled accumulation (Blue's algorithm), just
|
|
1712
1712
|
// with \`scale\`/\`ssq\` as DD pairs (via ddDivProtected/ddMulProtected/
|
|
1713
1713
|
// ddAddProtected/ddSqrtProtected) instead of plain f32. Squaring still
|
|
@@ -1874,7 +1874,7 @@ fn dnrm2_main(
|
|
|
1874
1874
|
partialsSsqLo[wgid.x] = tileSsqLo[0];
|
|
1875
1875
|
}
|
|
1876
1876
|
}
|
|
1877
|
-
`});var oo,to=
|
|
1877
|
+
`});var oo,to=Z(()=>{oo=`// scaledSum reduction (f64, double-double): collapses 2*WGS (scale, ssq) DD
|
|
1878
1878
|
// partials from dnrm2.wgsl into the final norm \u2014 sqrt(scale\xB2 \xB7 ssq) ==
|
|
1879
1879
|
// scale \xB7 sqrt(ssq), via ddMulProtected/ddSqrtProtected. Mirrors
|
|
1880
1880
|
// reduction/scaledSum.wgsl's shape exactly; ssqMergeProtected is duplicated
|
|
@@ -1967,7 +1967,7 @@ fn reduce_scaled_f64(
|
|
|
1967
1967
|
resultLo[0] = result.lo;
|
|
1968
1968
|
}
|
|
1969
1969
|
}
|
|
1970
|
-
`});var io,ao=
|
|
1970
|
+
`});var io,ao=Z(()=>{io=`// sgemv_n: y = alpha * A * x + beta * y (A is m\xD7n row-major, no-transpose)
|
|
1971
1971
|
//
|
|
1972
1972
|
// One workgroup per output row, with a grid-stride outer loop so the shader
|
|
1973
1973
|
// still covers all rows when m exceeds maxComputeWorkgroupsPerDimension.
|
|
@@ -2044,7 +2044,7 @@ fn main(
|
|
|
2044
2044
|
workgroupBarrier();
|
|
2045
2045
|
}
|
|
2046
2046
|
}
|
|
2047
|
-
`});var no,so=
|
|
2047
|
+
`});var no,so=Z(()=>{no=`// sgemv_t: y = alpha * A^T * x + beta * y (A is m\xD7n row-major, transposed)
|
|
2048
2048
|
// each thread owns one column of A \u2192 one element of y (length n)
|
|
2049
2049
|
// tiles over x (length m) using shared memory; four independent accumulators
|
|
2050
2050
|
// let the GPU pipeline A reads across j within each tile (ILP=4)
|
|
@@ -2111,7 +2111,7 @@ fn main(
|
|
|
2111
2111
|
y[yi] = select(acc, acc + params.beta * y[yi], params.beta != 0.0);
|
|
2112
2112
|
}
|
|
2113
2113
|
}
|
|
2114
|
-
`});var uo,lo=
|
|
2114
|
+
`});var uo,lo=Z(()=>{uo=`// ssymv: y = alpha * A * x + beta * y
|
|
2115
2115
|
// A is n\xD7n symmetric, lower (uplo=0) or upper (uplo=1) triangle stored.
|
|
2116
2116
|
// The logical matrix is fully dense (symmetric), so each row's dot product
|
|
2117
2117
|
// sums over all n columns; entries on the unstored side of the diagonal are
|
|
@@ -2182,7 +2182,7 @@ fn main(
|
|
|
2182
2182
|
}
|
|
2183
2183
|
}
|
|
2184
2184
|
}
|
|
2185
|
-
`});var mo,fo=
|
|
2185
|
+
`});var mo,fo=Z(()=>{mo=`// strmv: y = op(A) * x
|
|
2186
2186
|
// A is n\xD7n triangular, lower (uplo=0) or upper (uplo=1) triangle stored.
|
|
2187
2187
|
// op(A) is A (trans=0) or A^T (trans=1).
|
|
2188
2188
|
// diag=1 (unit) treats the diagonal as 1 without reading A's diagonal values.
|
|
@@ -2285,7 +2285,7 @@ fn main(
|
|
|
2285
2285
|
}
|
|
2286
2286
|
}
|
|
2287
2287
|
}
|
|
2288
|
-
`});var Me,co=
|
|
2288
|
+
`});var Me,co=Z(()=>{Me=`// strsv_invert_block: computes ONE column (workgroup_id.x) of ONE block's
|
|
2289
2289
|
// (workgroup_id.y) explicit inverse, via the same one-row-at-a-time
|
|
2290
2290
|
// substitution as strsv_block.wgsl, but solving against a unit basis vector
|
|
2291
2291
|
// e_col instead of the real right-hand side, and writing to a dense
|
|
@@ -2394,7 +2394,7 @@ fn strsv_invert_block_main(
|
|
|
2394
2394
|
workgroupBarrier();
|
|
2395
2395
|
}
|
|
2396
2396
|
}
|
|
2397
|
-
`});var
|
|
2397
|
+
`});var wo,po=Z(()=>{wo=`// strsv_apply_inverse: given a precomputed block inverse (from
|
|
2398
2398
|
// strsv_invert_block.wgsl), computes this block's solution as a dense
|
|
2399
2399
|
// matrix-vector multiply against the block's current remainder in x \u2014
|
|
2400
2400
|
// replacing what the old strsv_block.wgsl did via a genuinely sequential,
|
|
@@ -2441,7 +2441,7 @@ fn strsv_apply_inverse_main(@builtin(local_invocation_id) lid: vec3u) {
|
|
|
2441
2441
|
}
|
|
2442
2442
|
x[(params.blockStart + lid.x) * params.incx] = acc;
|
|
2443
2443
|
}
|
|
2444
|
-
`});var ho,
|
|
2444
|
+
`});var ho,go=Z(()=>{ho=`// strsv_update: subtracts a solved block's contribution from every
|
|
2445
2445
|
// remaining row in parallel (one workgroup per row, like strmv.wgsl) \u2014
|
|
2446
2446
|
// this is what turns strsv's O(n) sequential stages into O(n/blockSize).
|
|
2447
2447
|
// No diag/masking needed: this region never touches the diagonal.
|
|
@@ -2516,7 +2516,7 @@ fn strsv_update_main(
|
|
|
2516
2516
|
workgroupBarrier();
|
|
2517
2517
|
}
|
|
2518
2518
|
}
|
|
2519
|
-
`});var yo,bo=
|
|
2519
|
+
`});var yo,bo=Z(()=>{yo=`// sger: A := alpha * x * y^T + A (rank-1 update, A is m\xD7n general/dense)
|
|
2520
2520
|
|
|
2521
2521
|
@group(0) @binding(0) var<storage, read> x: array<f32>;
|
|
2522
2522
|
@group(0) @binding(1) var<storage, read> y: array<f32>;
|
|
@@ -2564,7 +2564,84 @@ fn main(
|
|
|
2564
2564
|
}
|
|
2565
2565
|
}
|
|
2566
2566
|
}
|
|
2567
|
-
`});var vo,xo=
|
|
2567
|
+
`});var vo,xo=Z(()=>{vo=`// dger: A := alpha * x * y^T + A, double-double (Dekker) f64 emulation of
|
|
2568
|
+
// sger (rank-1 update). x, y, A, and alpha are each split into an f32
|
|
2569
|
+
// (hi, lo) pair; WGSL has no f64 type. One workgroup per row of A
|
|
2570
|
+
// (grid-stride over rows); within a row, ddMulProtected/ddAddProtected each
|
|
2571
|
+
// carry a workgroupBarrier(), so the column loop uses the same
|
|
2572
|
+
// uniform-main + ragged-tail split dscal.wgsl uses, rather than sger.wgsl's
|
|
2573
|
+
// 4-way ILP unroll \u2014 unrolling would pay the barrier round-trip four times
|
|
2574
|
+
// over per iteration for no benefit here.
|
|
2575
|
+
|
|
2576
|
+
@group(0) @binding(0) var<storage, read> xHi: array<f32>;
|
|
2577
|
+
@group(0) @binding(1) var<storage, read> xLo: array<f32>;
|
|
2578
|
+
@group(0) @binding(2) var<storage, read> yHi: array<f32>;
|
|
2579
|
+
@group(0) @binding(3) var<storage, read> yLo: array<f32>;
|
|
2580
|
+
@group(0) @binding(4) var<storage, read_write> AHi: array<f32>;
|
|
2581
|
+
@group(0) @binding(5) var<storage, read_write> ALo: array<f32>;
|
|
2582
|
+
|
|
2583
|
+
struct Params {
|
|
2584
|
+
m: u32,
|
|
2585
|
+
n: u32,
|
|
2586
|
+
alphaHi: f32,
|
|
2587
|
+
alphaLo: f32,
|
|
2588
|
+
x_inc: u32,
|
|
2589
|
+
y_inc: u32,
|
|
2590
|
+
lda: u32,
|
|
2591
|
+
}
|
|
2592
|
+
|
|
2593
|
+
@group(0) @binding(6) var<uniform> params: Params;
|
|
2594
|
+
|
|
2595
|
+
const WGS: u32 = 64u;
|
|
2596
|
+
|
|
2597
|
+
@compute @workgroup_size(64)
|
|
2598
|
+
fn dger_main(
|
|
2599
|
+
@builtin(workgroup_id) wgid: vec3u,
|
|
2600
|
+
@builtin(local_invocation_id) lid: vec3u,
|
|
2601
|
+
@builtin(num_workgroups) nwg: vec3u,
|
|
2602
|
+
) {
|
|
2603
|
+
let alpha = DD(params.alphaHi, params.alphaLo);
|
|
2604
|
+
|
|
2605
|
+
// Column loop's trip count depends only on n and WGS, not on row \u2014 the
|
|
2606
|
+
// same main/tail split applies uniformly to every row, so every thread
|
|
2607
|
+
// reaches each protected call the same number of times overall.
|
|
2608
|
+
let n_floor = (params.n / WGS) * WGS;
|
|
2609
|
+
let mainIters = n_floor / WGS;
|
|
2610
|
+
let hasTail = select(0u, 1u, n_floor < params.n);
|
|
2611
|
+
|
|
2612
|
+
for (var row = wgid.x; row < params.m; row += nwg.x) {
|
|
2613
|
+
// Every thread in the workgroup redundantly computes the same alpha*x[row]
|
|
2614
|
+
// \u2014 wasteful but harmless, and keeps the per-row protected-call count
|
|
2615
|
+
// trivially identical across threads.
|
|
2616
|
+
let ix = row * params.x_inc;
|
|
2617
|
+
let xi = ddMulProtected(alpha, DD(xHi[ix], xLo[ix]), lid.x);
|
|
2618
|
+
let row_base = row * params.lda;
|
|
2619
|
+
|
|
2620
|
+
for (var iter = 0u; iter < mainIters; iter++) {
|
|
2621
|
+
let col = lid.x + iter * WGS;
|
|
2622
|
+
let idx = row_base + col;
|
|
2623
|
+
let iy = col * params.y_inc;
|
|
2624
|
+
let prod = ddMulProtected(xi, DD(yHi[iy], yLo[iy]), lid.x);
|
|
2625
|
+
let result = ddAddProtected(prod, DD(AHi[idx], ALo[idx]), lid.x);
|
|
2626
|
+
AHi[idx] = result.hi;
|
|
2627
|
+
ALo[idx] = result.lo;
|
|
2628
|
+
}
|
|
2629
|
+
|
|
2630
|
+
for (var iter = 0u; iter < hasTail; iter++) {
|
|
2631
|
+
let col = n_floor + lid.x;
|
|
2632
|
+
let valid = col < params.n;
|
|
2633
|
+
let idx = select(0u, row_base + col, valid);
|
|
2634
|
+
let iy = select(0u, col * params.y_inc, valid);
|
|
2635
|
+
let prod = ddMulProtected(xi, DD(yHi[iy], yLo[iy]), lid.x);
|
|
2636
|
+
let result = ddAddProtected(prod, DD(AHi[idx], ALo[idx]), lid.x);
|
|
2637
|
+
if (valid) {
|
|
2638
|
+
AHi[idx] = result.hi;
|
|
2639
|
+
ALo[idx] = result.lo;
|
|
2640
|
+
}
|
|
2641
|
+
}
|
|
2642
|
+
}
|
|
2643
|
+
}
|
|
2644
|
+
`});var Bo,_o=Z(()=>{Bo=`// ssyr: A := alpha * x * x^T + A (symmetric rank-1 update)
|
|
2568
2645
|
// A is n\xD7n symmetric; only the triangle specified by uplo is referenced/updated,
|
|
2569
2646
|
// the other triangle is implied by symmetry (not touched).
|
|
2570
2647
|
|
|
@@ -2624,7 +2701,91 @@ fn main(
|
|
|
2624
2701
|
}
|
|
2625
2702
|
}
|
|
2626
2703
|
}
|
|
2627
|
-
`});var
|
|
2704
|
+
`});var So,Ao=Z(()=>{So=`// dsyr: A := alpha * x * x^T + A, double-double (Dekker) f64 emulation of
|
|
2705
|
+
// ssyr (symmetric rank-1 update). x, A, and alpha are each split into an f32
|
|
2706
|
+
// (hi, lo) pair; WGSL has no f64 type. Only the triangle specified by uplo
|
|
2707
|
+
// is referenced/updated. One workgroup per row of A (grid-stride over
|
|
2708
|
+
// rows); within a row, ddMulProtected/ddAddProtected each carry a
|
|
2709
|
+
// workgroupBarrier(), so the column loop uses the same uniform-main +
|
|
2710
|
+
// ragged-tail split dger.wgsl uses over its *stored* range, rather than
|
|
2711
|
+
// ssyr.wgsl's 4-way ILP unroll.
|
|
2712
|
+
|
|
2713
|
+
@group(0) @binding(0) var<storage, read> xHi: array<f32>;
|
|
2714
|
+
@group(0) @binding(1) var<storage, read> xLo: array<f32>;
|
|
2715
|
+
@group(0) @binding(2) var<storage, read_write> AHi: array<f32>;
|
|
2716
|
+
@group(0) @binding(3) var<storage, read_write> ALo: array<f32>;
|
|
2717
|
+
|
|
2718
|
+
struct Params {
|
|
2719
|
+
n: u32,
|
|
2720
|
+
alphaHi: f32,
|
|
2721
|
+
alphaLo: f32,
|
|
2722
|
+
incx: u32,
|
|
2723
|
+
lda: u32,
|
|
2724
|
+
uplo: u32, // 0 = lower, 1 = upper
|
|
2725
|
+
}
|
|
2726
|
+
|
|
2727
|
+
@group(0) @binding(4) var<uniform> params: Params;
|
|
2728
|
+
|
|
2729
|
+
const WGS: u32 = 64u;
|
|
2730
|
+
|
|
2731
|
+
@compute @workgroup_size(64)
|
|
2732
|
+
fn dsyr_main(
|
|
2733
|
+
@builtin(workgroup_id) wgid: vec3u,
|
|
2734
|
+
@builtin(local_invocation_id) lid: vec3u,
|
|
2735
|
+
@builtin(num_workgroups) nwg: vec3u,
|
|
2736
|
+
) {
|
|
2737
|
+
let alpha = DD(params.alphaHi, params.alphaLo);
|
|
2738
|
+
|
|
2739
|
+
for (var row = wgid.x; row < params.n; row += nwg.x) {
|
|
2740
|
+
let ix = row * params.incx;
|
|
2741
|
+
let xi = ddMulProtected(alpha, DD(xHi[ix], xLo[ix]), lid.x);
|
|
2742
|
+
let row_base = row * params.lda;
|
|
2743
|
+
|
|
2744
|
+
// Stored-triangle column range for this row: lower [0,row], upper [row,n).
|
|
2745
|
+
var colStart: u32;
|
|
2746
|
+
var colEnd: u32;
|
|
2747
|
+
if params.uplo == 1u {
|
|
2748
|
+
colStart = row;
|
|
2749
|
+
colEnd = params.n;
|
|
2750
|
+
} else {
|
|
2751
|
+
colStart = 0u;
|
|
2752
|
+
colEnd = row + 1u;
|
|
2753
|
+
}
|
|
2754
|
+
|
|
2755
|
+
// Range length varies per row, but every thread in the workgroup runs
|
|
2756
|
+
// the SAME row at the same time (the outer loop is shared), so the
|
|
2757
|
+
// main/tail split computed from colStart/colEnd is already uniform
|
|
2758
|
+
// across threads for this row \u2014 just not the same across different rows.
|
|
2759
|
+
let rangeLen = colEnd - colStart;
|
|
2760
|
+
let range_floor = colStart + (rangeLen / WGS) * WGS;
|
|
2761
|
+
let mainIters = (range_floor - colStart) / WGS;
|
|
2762
|
+
let hasTail = select(0u, 1u, range_floor < colEnd);
|
|
2763
|
+
|
|
2764
|
+
for (var iter = 0u; iter < mainIters; iter++) {
|
|
2765
|
+
let col = colStart + lid.x + iter * WGS;
|
|
2766
|
+
let idx = row_base + col;
|
|
2767
|
+
let ic = col * params.incx;
|
|
2768
|
+
let prod = ddMulProtected(xi, DD(xHi[ic], xLo[ic]), lid.x);
|
|
2769
|
+
let result = ddAddProtected(prod, DD(AHi[idx], ALo[idx]), lid.x);
|
|
2770
|
+
AHi[idx] = result.hi;
|
|
2771
|
+
ALo[idx] = result.lo;
|
|
2772
|
+
}
|
|
2773
|
+
|
|
2774
|
+
for (var iter = 0u; iter < hasTail; iter++) {
|
|
2775
|
+
let col = range_floor + lid.x;
|
|
2776
|
+
let valid = col < colEnd;
|
|
2777
|
+
let idx = select(0u, row_base + col, valid);
|
|
2778
|
+
let ic = select(0u, col * params.incx, valid);
|
|
2779
|
+
let prod = ddMulProtected(xi, DD(xHi[ic], xLo[ic]), lid.x);
|
|
2780
|
+
let result = ddAddProtected(prod, DD(AHi[idx], ALo[idx]), lid.x);
|
|
2781
|
+
if (valid) {
|
|
2782
|
+
AHi[idx] = result.hi;
|
|
2783
|
+
ALo[idx] = result.lo;
|
|
2784
|
+
}
|
|
2785
|
+
}
|
|
2786
|
+
}
|
|
2787
|
+
}
|
|
2788
|
+
`});var Eo,Go=Z(()=>{Eo=`// ssyr2: A := alpha * x * y^T + alpha * y * x^T + A (symmetric rank-2 update)
|
|
2628
2789
|
// A is n\xD7n symmetric; only the triangle specified by uplo is referenced/updated,
|
|
2629
2790
|
// the other triangle is implied by symmetry (not touched).
|
|
2630
2791
|
|
|
@@ -2687,7 +2848,871 @@ fn main(
|
|
|
2687
2848
|
}
|
|
2688
2849
|
}
|
|
2689
2850
|
}
|
|
2690
|
-
`});var
|
|
2851
|
+
`});var Do,ko=Z(()=>{Do=`// dsyr2: A := alpha * x * y^T + alpha * y * x^T + A, double-double (Dekker)
|
|
2852
|
+
// f64 emulation of ssyr2 (symmetric rank-2 update). x, y, A, and alpha are
|
|
2853
|
+
// each split into an f32 (hi, lo) pair; WGSL has no f64 type. Only the
|
|
2854
|
+
// triangle specified by uplo is referenced/updated. One workgroup per row
|
|
2855
|
+
// of A (grid-stride over rows); within a row, ddMulProtected/ddAddProtected
|
|
2856
|
+
// each carry a workgroupBarrier(), so the column loop uses the same
|
|
2857
|
+
// uniform-main + ragged-tail split dsyr.wgsl uses over its *stored* range,
|
|
2858
|
+
// rather than ssyr2.wgsl's 4-way ILP unroll.
|
|
2859
|
+
|
|
2860
|
+
@group(0) @binding(0) var<storage, read> xHi: array<f32>;
|
|
2861
|
+
@group(0) @binding(1) var<storage, read> xLo: array<f32>;
|
|
2862
|
+
@group(0) @binding(2) var<storage, read> yHi: array<f32>;
|
|
2863
|
+
@group(0) @binding(3) var<storage, read> yLo: array<f32>;
|
|
2864
|
+
@group(0) @binding(4) var<storage, read_write> AHi: array<f32>;
|
|
2865
|
+
@group(0) @binding(5) var<storage, read_write> ALo: array<f32>;
|
|
2866
|
+
|
|
2867
|
+
struct Params {
|
|
2868
|
+
n: u32,
|
|
2869
|
+
alphaHi: f32,
|
|
2870
|
+
alphaLo: f32,
|
|
2871
|
+
incx: u32,
|
|
2872
|
+
incy: u32,
|
|
2873
|
+
lda: u32,
|
|
2874
|
+
uplo: u32, // 0 = lower, 1 = upper
|
|
2875
|
+
}
|
|
2876
|
+
|
|
2877
|
+
@group(0) @binding(6) var<uniform> params: Params;
|
|
2878
|
+
|
|
2879
|
+
const WGS: u32 = 64u;
|
|
2880
|
+
|
|
2881
|
+
@compute @workgroup_size(64)
|
|
2882
|
+
fn dsyr2_main(
|
|
2883
|
+
@builtin(workgroup_id) wgid: vec3u,
|
|
2884
|
+
@builtin(local_invocation_id) lid: vec3u,
|
|
2885
|
+
@builtin(num_workgroups) nwg: vec3u,
|
|
2886
|
+
) {
|
|
2887
|
+
let alpha = DD(params.alphaHi, params.alphaLo);
|
|
2888
|
+
|
|
2889
|
+
for (var row = wgid.x; row < params.n; row += nwg.x) {
|
|
2890
|
+
let ix = row * params.incx;
|
|
2891
|
+
let iy = row * params.incy;
|
|
2892
|
+
let xi = ddMulProtected(alpha, DD(xHi[ix], xLo[ix]), lid.x);
|
|
2893
|
+
let yi = ddMulProtected(alpha, DD(yHi[iy], yLo[iy]), lid.x);
|
|
2894
|
+
let row_base = row * params.lda;
|
|
2895
|
+
|
|
2896
|
+
// Stored-triangle column range for this row: lower [0,row], upper [row,n).
|
|
2897
|
+
var colStart: u32;
|
|
2898
|
+
var colEnd: u32;
|
|
2899
|
+
if params.uplo == 1u {
|
|
2900
|
+
colStart = row;
|
|
2901
|
+
colEnd = params.n;
|
|
2902
|
+
} else {
|
|
2903
|
+
colStart = 0u;
|
|
2904
|
+
colEnd = row + 1u;
|
|
2905
|
+
}
|
|
2906
|
+
|
|
2907
|
+
// Range length varies per row, but every thread in the workgroup runs
|
|
2908
|
+
// the SAME row at the same time (the outer loop is shared), so the
|
|
2909
|
+
// main/tail split computed from colStart/colEnd is already uniform
|
|
2910
|
+
// across threads for this row \u2014 just not the same across different rows.
|
|
2911
|
+
let rangeLen = colEnd - colStart;
|
|
2912
|
+
let range_floor = colStart + (rangeLen / WGS) * WGS;
|
|
2913
|
+
let mainIters = (range_floor - colStart) / WGS;
|
|
2914
|
+
let hasTail = select(0u, 1u, range_floor < colEnd);
|
|
2915
|
+
|
|
2916
|
+
for (var iter = 0u; iter < mainIters; iter++) {
|
|
2917
|
+
let col = colStart + lid.x + iter * WGS;
|
|
2918
|
+
let idx = row_base + col;
|
|
2919
|
+
let jc_x = col * params.incx;
|
|
2920
|
+
let jc_y = col * params.incy;
|
|
2921
|
+
let prod1 = ddMulProtected(xi, DD(yHi[jc_y], yLo[jc_y]), lid.x);
|
|
2922
|
+
let prod2 = ddMulProtected(yi, DD(xHi[jc_x], xLo[jc_x]), lid.x);
|
|
2923
|
+
let sum1 = ddAddProtected(prod1, prod2, lid.x);
|
|
2924
|
+
let result = ddAddProtected(sum1, DD(AHi[idx], ALo[idx]), lid.x);
|
|
2925
|
+
AHi[idx] = result.hi;
|
|
2926
|
+
ALo[idx] = result.lo;
|
|
2927
|
+
}
|
|
2928
|
+
|
|
2929
|
+
for (var iter = 0u; iter < hasTail; iter++) {
|
|
2930
|
+
let col = range_floor + lid.x;
|
|
2931
|
+
let valid = col < colEnd;
|
|
2932
|
+
let idx = select(0u, row_base + col, valid);
|
|
2933
|
+
let jc_x = select(0u, col * params.incx, valid);
|
|
2934
|
+
let jc_y = select(0u, col * params.incy, valid);
|
|
2935
|
+
let prod1 = ddMulProtected(xi, DD(yHi[jc_y], yLo[jc_y]), lid.x);
|
|
2936
|
+
let prod2 = ddMulProtected(yi, DD(xHi[jc_x], xLo[jc_x]), lid.x);
|
|
2937
|
+
let sum1 = ddAddProtected(prod1, prod2, lid.x);
|
|
2938
|
+
let result = ddAddProtected(sum1, DD(AHi[idx], ALo[idx]), lid.x);
|
|
2939
|
+
if (valid) {
|
|
2940
|
+
AHi[idx] = result.hi;
|
|
2941
|
+
ALo[idx] = result.lo;
|
|
2942
|
+
}
|
|
2943
|
+
}
|
|
2944
|
+
}
|
|
2945
|
+
}
|
|
2946
|
+
`});var Po,Lo=Z(()=>{Po=`// dgemv_n: y := alpha * A * x + beta * y, double-double (Dekker) f64
|
|
2947
|
+
// emulation of sgemv_n (matrix-vector product, no transpose). A, x, y,
|
|
2948
|
+
// alpha, and beta are each split into an f32 (hi, lo) pair; WGSL has no f64
|
|
2949
|
+
// type. Same one-workgroup-per-output-row shape as sgemv_n.wgsl (grid-stride
|
|
2950
|
+
// over rows), but the per-row dot product is reduced via a full
|
|
2951
|
+
// within-workgroup DD tree reduction \u2014 the same reduction ddot.wgsl uses to
|
|
2952
|
+
// combine 64 lanes down to one \u2014 rather than sgemv_n.wgsl's 4-way ILP
|
|
2953
|
+
// unroll + shared-memory tree (ddMulProtected/ddAddProtected each carry a
|
|
2954
|
+
// workgroupBarrier(), so unrolling would pay that barrier four times over
|
|
2955
|
+
// per iteration for no benefit). Since each row is handled by exactly one
|
|
2956
|
+
// workgroup, no separate cross-workgroup reduction pass (ddot's reduce_f64)
|
|
2957
|
+
// is needed here \u2014 the tree reduction alone finishes the row.
|
|
2958
|
+
|
|
2959
|
+
@group(0) @binding(0) var<storage, read> AHi: array<f32>;
|
|
2960
|
+
@group(0) @binding(1) var<storage, read> ALo: array<f32>;
|
|
2961
|
+
@group(0) @binding(2) var<storage, read> xHi: array<f32>;
|
|
2962
|
+
@group(0) @binding(3) var<storage, read> xLo: array<f32>;
|
|
2963
|
+
@group(0) @binding(4) var<storage, read_write> yHi: array<f32>;
|
|
2964
|
+
@group(0) @binding(5) var<storage, read_write> yLo: array<f32>;
|
|
2965
|
+
|
|
2966
|
+
struct Params {
|
|
2967
|
+
m: u32,
|
|
2968
|
+
n: u32,
|
|
2969
|
+
alphaHi: f32,
|
|
2970
|
+
alphaLo: f32,
|
|
2971
|
+
betaHi: f32,
|
|
2972
|
+
betaLo: f32,
|
|
2973
|
+
incx: u32,
|
|
2974
|
+
incy: u32,
|
|
2975
|
+
lda: u32,
|
|
2976
|
+
}
|
|
2977
|
+
|
|
2978
|
+
@group(0) @binding(6) var<uniform> params: Params;
|
|
2979
|
+
|
|
2980
|
+
const WGS: u32 = 64u;
|
|
2981
|
+
var<workgroup> tile: array<DD, 64>;
|
|
2982
|
+
|
|
2983
|
+
@compute @workgroup_size(64)
|
|
2984
|
+
fn dgemv_n_main(
|
|
2985
|
+
@builtin(workgroup_id) wgid: vec3u,
|
|
2986
|
+
@builtin(local_invocation_id) lid: vec3u,
|
|
2987
|
+
@builtin(num_workgroups) nwg: vec3u,
|
|
2988
|
+
) {
|
|
2989
|
+
let alpha = DD(params.alphaHi, params.alphaLo);
|
|
2990
|
+
let beta = DD(params.betaHi, params.betaLo);
|
|
2991
|
+
let isBetaNonzero = params.betaHi != 0.0 || params.betaLo != 0.0;
|
|
2992
|
+
|
|
2993
|
+
// Column loop's trip count depends only on n and WGS, not on row \u2014 same
|
|
2994
|
+
// main/tail split applies uniformly to every row (see dger.wgsl).
|
|
2995
|
+
let n_floor = (params.n / WGS) * WGS;
|
|
2996
|
+
let mainIters = n_floor / WGS;
|
|
2997
|
+
let hasTail = select(0u, 1u, n_floor < params.n);
|
|
2998
|
+
|
|
2999
|
+
for (var row = wgid.x; row < params.m; row += nwg.x) {
|
|
3000
|
+
let row_base = row * params.lda;
|
|
3001
|
+
var acc = DD(0.0, 0.0);
|
|
3002
|
+
|
|
3003
|
+
for (var iter = 0u; iter < mainIters; iter++) {
|
|
3004
|
+
let j = lid.x + iter * WGS;
|
|
3005
|
+
let ia = row_base + j;
|
|
3006
|
+
let ix = j * params.incx;
|
|
3007
|
+
let prod = ddMulProtected(DD(AHi[ia], ALo[ia]), DD(xHi[ix], xLo[ix]), lid.x);
|
|
3008
|
+
acc = ddAddProtected(acc, prod, lid.x);
|
|
3009
|
+
}
|
|
3010
|
+
|
|
3011
|
+
for (var iter = 0u; iter < hasTail; iter++) {
|
|
3012
|
+
let j = n_floor + lid.x;
|
|
3013
|
+
let valid = j < params.n;
|
|
3014
|
+
let ia = select(0u, row_base + j, valid);
|
|
3015
|
+
let ix = select(0u, j * params.incx, valid);
|
|
3016
|
+
let prod = ddMulProtected(DD(AHi[ia], ALo[ia]), DD(xHi[ix], xLo[ix]), lid.x);
|
|
3017
|
+
let contribution = DD(select(0.0, prod.hi, valid), select(0.0, prod.lo, valid));
|
|
3018
|
+
acc = ddAddProtected(acc, contribution, lid.x);
|
|
3019
|
+
}
|
|
3020
|
+
|
|
3021
|
+
tile[lid.x] = acc;
|
|
3022
|
+
workgroupBarrier();
|
|
3023
|
+
|
|
3024
|
+
// Inactive threads combine against a throwaway partner and discard it
|
|
3025
|
+
// (ddAddProtected must be called unconditionally by every thread).
|
|
3026
|
+
for (var s = WGS / 2u; s > 0u; s >>= 1u) {
|
|
3027
|
+
let partner = select(lid.x, lid.x + s, lid.x < s);
|
|
3028
|
+
let combined = ddAddProtected(tile[lid.x], tile[partner], lid.x);
|
|
3029
|
+
workgroupBarrier(); // all threads must read tile[] above before any write below
|
|
3030
|
+
if (lid.x < s) { tile[lid.x] = combined; }
|
|
3031
|
+
workgroupBarrier();
|
|
3032
|
+
}
|
|
3033
|
+
|
|
3034
|
+
// tile[0] now holds the full row dot product, visible to every lane \u2014
|
|
3035
|
+
// every thread redundantly finishes the O(1) alpha/beta combine so the
|
|
3036
|
+
// protected ops below stay uniformly called (only the write is gated).
|
|
3037
|
+
let dot = tile[0];
|
|
3038
|
+
let scaled = ddMulProtected(alpha, dot, lid.x);
|
|
3039
|
+
let iy = row * params.incy;
|
|
3040
|
+
let yVal = DD(yHi[iy], yLo[iy]);
|
|
3041
|
+
let betaTimesY = ddMulProtected(beta, yVal, lid.x);
|
|
3042
|
+
let withBeta = ddAddProtected(scaled, betaTimesY, lid.x);
|
|
3043
|
+
// BLAS beta==0 semantics: y is written, not accumulated \u2014 the result
|
|
3044
|
+
// must not depend on y's prior value (though it is still read above).
|
|
3045
|
+
let result = DD(
|
|
3046
|
+
select(scaled.hi, withBeta.hi, isBetaNonzero),
|
|
3047
|
+
select(scaled.lo, withBeta.lo, isBetaNonzero),
|
|
3048
|
+
);
|
|
3049
|
+
|
|
3050
|
+
if (lid.x == 0u) {
|
|
3051
|
+
yHi[iy] = result.hi;
|
|
3052
|
+
yLo[iy] = result.lo;
|
|
3053
|
+
}
|
|
3054
|
+
// All 64 threads must agree before the next row reuses tile[].
|
|
3055
|
+
workgroupBarrier();
|
|
3056
|
+
}
|
|
3057
|
+
}
|
|
3058
|
+
`});var Mo,No=Z(()=>{Mo=`// dgemv_t: y := alpha * A^T * x + beta * y, double-double (Dekker) f64
|
|
3059
|
+
// emulation of sgemv_t (matrix-vector product, transposed). A, x, y, alpha,
|
|
3060
|
+
// and beta are each split into an f32 (hi, lo) pair; WGSL has no f64 type.
|
|
3061
|
+
// Same one-thread-per-output-column shape as sgemv_t.wgsl, tiling over x
|
|
3062
|
+
// (length m) via shared memory. Because ddMulProtected/ddAddProtected each
|
|
3063
|
+
// carry a workgroupBarrier(), every thread in the workgroup \u2014 including ones
|
|
3064
|
+
// whose column is out of range (n not a multiple of WGS) \u2014 must call them
|
|
3065
|
+
// the same number of times: unlike sgemv_t.wgsl's \`if (col < n)\` guard
|
|
3066
|
+
// around the whole accumulation, out-of-range threads here compute against
|
|
3067
|
+
// a clamped dummy column unconditionally and simply never write their
|
|
3068
|
+
// result (same technique dger.wgsl/ddot.wgsl use for their ragged tails).
|
|
3069
|
+
|
|
3070
|
+
@group(0) @binding(0) var<storage, read> AHi: array<f32>;
|
|
3071
|
+
@group(0) @binding(1) var<storage, read> ALo: array<f32>;
|
|
3072
|
+
@group(0) @binding(2) var<storage, read> xHi: array<f32>;
|
|
3073
|
+
@group(0) @binding(3) var<storage, read> xLo: array<f32>;
|
|
3074
|
+
@group(0) @binding(4) var<storage, read_write> yHi: array<f32>;
|
|
3075
|
+
@group(0) @binding(5) var<storage, read_write> yLo: array<f32>;
|
|
3076
|
+
|
|
3077
|
+
struct Params {
|
|
3078
|
+
m: u32,
|
|
3079
|
+
n: u32,
|
|
3080
|
+
alphaHi: f32,
|
|
3081
|
+
alphaLo: f32,
|
|
3082
|
+
betaHi: f32,
|
|
3083
|
+
betaLo: f32,
|
|
3084
|
+
incx: u32,
|
|
3085
|
+
incy: u32,
|
|
3086
|
+
lda: u32,
|
|
3087
|
+
}
|
|
3088
|
+
|
|
3089
|
+
@group(0) @binding(6) var<uniform> params: Params;
|
|
3090
|
+
|
|
3091
|
+
const WGS: u32 = 64u;
|
|
3092
|
+
var<workgroup> xTile: array<DD, 64>;
|
|
3093
|
+
|
|
3094
|
+
@compute @workgroup_size(64)
|
|
3095
|
+
fn dgemv_t_main(
|
|
3096
|
+
@builtin(global_invocation_id) gid: vec3u,
|
|
3097
|
+
@builtin(local_invocation_id) lid: vec3u,
|
|
3098
|
+
) {
|
|
3099
|
+
let col = gid.x;
|
|
3100
|
+
let colValid = col < params.n;
|
|
3101
|
+
// Clamp so out-of-range threads still index safely \u2014 their contribution
|
|
3102
|
+
// is computed but never written back.
|
|
3103
|
+
let safeCol = select(0u, col, colValid);
|
|
3104
|
+
|
|
3105
|
+
var acc = DD(0.0, 0.0);
|
|
3106
|
+
|
|
3107
|
+
let m_floor = (params.m / WGS) * WGS;
|
|
3108
|
+
let mainIters = m_floor / WGS;
|
|
3109
|
+
|
|
3110
|
+
for (var iter = 0u; iter < mainIters; iter++) {
|
|
3111
|
+
let base = iter * WGS;
|
|
3112
|
+
// Cooperative load: all 64 threads fill xTile with x[base..base+WGS),
|
|
3113
|
+
// independent of col \u2014 safe regardless of whether this thread's column
|
|
3114
|
+
// is in range.
|
|
3115
|
+
let ix = (base + lid.x) * params.incx;
|
|
3116
|
+
xTile[lid.x] = DD(xHi[ix], xLo[ix]);
|
|
3117
|
+
workgroupBarrier();
|
|
3118
|
+
|
|
3119
|
+
for (var j = 0u; j < WGS; j++) {
|
|
3120
|
+
let ia = (base + j) * params.lda + safeCol;
|
|
3121
|
+
let prod = ddMulProtected(DD(AHi[ia], ALo[ia]), xTile[j], lid.x);
|
|
3122
|
+
acc = ddAddProtected(acc, prod, lid.x);
|
|
3123
|
+
}
|
|
3124
|
+
workgroupBarrier();
|
|
3125
|
+
}
|
|
3126
|
+
|
|
3127
|
+
// Remainder rows (m not a multiple of WGS): the count is the same for
|
|
3128
|
+
// every thread regardless of col, so this loop is already barrier-safe
|
|
3129
|
+
// without needing a second tiling pass.
|
|
3130
|
+
let remCount = params.m - m_floor;
|
|
3131
|
+
for (var k = 0u; k < remCount; k++) {
|
|
3132
|
+
let row = m_floor + k;
|
|
3133
|
+
let ia = row * params.lda + safeCol;
|
|
3134
|
+
let ix = row * params.incx;
|
|
3135
|
+
let prod = ddMulProtected(DD(AHi[ia], ALo[ia]), DD(xHi[ix], xLo[ix]), lid.x);
|
|
3136
|
+
acc = ddAddProtected(acc, prod, lid.x);
|
|
3137
|
+
}
|
|
3138
|
+
|
|
3139
|
+
let alpha = DD(params.alphaHi, params.alphaLo);
|
|
3140
|
+
let beta = DD(params.betaHi, params.betaLo);
|
|
3141
|
+
let scaled = ddMulProtected(alpha, acc, lid.x);
|
|
3142
|
+
|
|
3143
|
+
let iy = safeCol * params.incy;
|
|
3144
|
+
let yVal = DD(yHi[iy], yLo[iy]);
|
|
3145
|
+
let betaTimesY = ddMulProtected(beta, yVal, lid.x);
|
|
3146
|
+
let withBeta = ddAddProtected(scaled, betaTimesY, lid.x);
|
|
3147
|
+
let isBetaNonzero = params.betaHi != 0.0 || params.betaLo != 0.0;
|
|
3148
|
+
// BLAS beta==0 semantics: y is written, not accumulated \u2014 the result
|
|
3149
|
+
// must not depend on y's prior value (though it is still read above).
|
|
3150
|
+
let result = DD(
|
|
3151
|
+
select(scaled.hi, withBeta.hi, isBetaNonzero),
|
|
3152
|
+
select(scaled.lo, withBeta.lo, isBetaNonzero),
|
|
3153
|
+
);
|
|
3154
|
+
|
|
3155
|
+
if (colValid) {
|
|
3156
|
+
yHi[iy] = result.hi;
|
|
3157
|
+
yLo[iy] = result.lo;
|
|
3158
|
+
}
|
|
3159
|
+
}
|
|
3160
|
+
`});var Ro,Io=Z(()=>{Ro=`// dsymv: y := alpha * A * x + beta * y, double-double (Dekker) f64 emulation
|
|
3161
|
+
// of ssymv (symmetric matrix-vector product). A, x, y, alpha, and beta are
|
|
3162
|
+
// each split into an f32 (hi, lo) pair; WGSL has no f64 type. A is n\xD7n
|
|
3163
|
+
// symmetric \u2014 only the triangle specified by uplo is physically stored, so
|
|
3164
|
+
// entries on the unstored side of the diagonal are fetched from their
|
|
3165
|
+
// mirror position (A[i,j] == A[j,i]), same as ssymv.wgsl. Same
|
|
3166
|
+
// one-workgroup-per-row + full within-workgroup DD tree reduction shape as
|
|
3167
|
+
// dgemv_n.wgsl (every row sums over all n columns here, unlike dsyr's
|
|
3168
|
+
// triangle-restricted range, since the logical matrix is fully dense).
|
|
3169
|
+
|
|
3170
|
+
@group(0) @binding(0) var<storage, read> AHi: array<f32>;
|
|
3171
|
+
@group(0) @binding(1) var<storage, read> ALo: array<f32>;
|
|
3172
|
+
@group(0) @binding(2) var<storage, read> xHi: array<f32>;
|
|
3173
|
+
@group(0) @binding(3) var<storage, read> xLo: array<f32>;
|
|
3174
|
+
@group(0) @binding(4) var<storage, read_write> yHi: array<f32>;
|
|
3175
|
+
@group(0) @binding(5) var<storage, read_write> yLo: array<f32>;
|
|
3176
|
+
|
|
3177
|
+
struct Params {
|
|
3178
|
+
n: u32,
|
|
3179
|
+
alphaHi: f32,
|
|
3180
|
+
alphaLo: f32,
|
|
3181
|
+
betaHi: f32,
|
|
3182
|
+
betaLo: f32,
|
|
3183
|
+
incx: u32,
|
|
3184
|
+
incy: u32,
|
|
3185
|
+
lda: u32,
|
|
3186
|
+
uplo: u32, // 0 = lower, 1 = upper
|
|
3187
|
+
}
|
|
3188
|
+
|
|
3189
|
+
@group(0) @binding(6) var<uniform> params: Params;
|
|
3190
|
+
|
|
3191
|
+
const WGS: u32 = 64u;
|
|
3192
|
+
var<workgroup> tile: array<DD, 64>;
|
|
3193
|
+
|
|
3194
|
+
// A[i,j] flat index for the symmetric matrix \u2014 stored position if (i,j) is
|
|
3195
|
+
// on the uplo side of the diagonal, mirrored from (j,i) otherwise. Pure
|
|
3196
|
+
// addressing (no protected op inside), so branching here is safe.
|
|
3197
|
+
fn symIdx(i: u32, j: u32) -> u32 {
|
|
3198
|
+
var row: u32;
|
|
3199
|
+
var col: u32;
|
|
3200
|
+
if params.uplo == 0u {
|
|
3201
|
+
// Lower: stored at (i,j) for j <= i, mirrored from (j,i) otherwise.
|
|
3202
|
+
if j <= i { row = i; col = j; } else { row = j; col = i; }
|
|
3203
|
+
} else {
|
|
3204
|
+
// Upper: stored at (i,j) for j >= i, mirrored from (j,i) otherwise.
|
|
3205
|
+
if j >= i { row = i; col = j; } else { row = j; col = i; }
|
|
3206
|
+
}
|
|
3207
|
+
return row * params.lda + col;
|
|
3208
|
+
}
|
|
3209
|
+
|
|
3210
|
+
@compute @workgroup_size(64)
|
|
3211
|
+
fn dsymv_main(
|
|
3212
|
+
@builtin(workgroup_id) wgid: vec3u,
|
|
3213
|
+
@builtin(local_invocation_id) lid: vec3u,
|
|
3214
|
+
@builtin(num_workgroups) nwg: vec3u,
|
|
3215
|
+
) {
|
|
3216
|
+
let alpha = DD(params.alphaHi, params.alphaLo);
|
|
3217
|
+
let beta = DD(params.betaHi, params.betaLo);
|
|
3218
|
+
let isBetaNonzero = params.betaHi != 0.0 || params.betaLo != 0.0;
|
|
3219
|
+
|
|
3220
|
+
// Column loop's trip count depends only on n and WGS, not on row \u2014 same
|
|
3221
|
+
// main/tail split applies uniformly to every row (see dger.wgsl).
|
|
3222
|
+
let n_floor = (params.n / WGS) * WGS;
|
|
3223
|
+
let mainIters = n_floor / WGS;
|
|
3224
|
+
let hasTail = select(0u, 1u, n_floor < params.n);
|
|
3225
|
+
|
|
3226
|
+
for (var i = wgid.x; i < params.n; i += nwg.x) {
|
|
3227
|
+
var acc = DD(0.0, 0.0);
|
|
3228
|
+
|
|
3229
|
+
for (var iter = 0u; iter < mainIters; iter++) {
|
|
3230
|
+
let j = lid.x + iter * WGS;
|
|
3231
|
+
let idx = symIdx(i, j);
|
|
3232
|
+
let ix = j * params.incx;
|
|
3233
|
+
let prod = ddMulProtected(DD(AHi[idx], ALo[idx]), DD(xHi[ix], xLo[ix]), lid.x);
|
|
3234
|
+
acc = ddAddProtected(acc, prod, lid.x);
|
|
3235
|
+
}
|
|
3236
|
+
|
|
3237
|
+
for (var iter = 0u; iter < hasTail; iter++) {
|
|
3238
|
+
let j = n_floor + lid.x;
|
|
3239
|
+
let valid = j < params.n;
|
|
3240
|
+
let safeJ = select(0u, j, valid);
|
|
3241
|
+
let idx = symIdx(i, safeJ);
|
|
3242
|
+
let ix = safeJ * params.incx;
|
|
3243
|
+
let prod = ddMulProtected(DD(AHi[idx], ALo[idx]), DD(xHi[ix], xLo[ix]), lid.x);
|
|
3244
|
+
let contribution = DD(select(0.0, prod.hi, valid), select(0.0, prod.lo, valid));
|
|
3245
|
+
acc = ddAddProtected(acc, contribution, lid.x);
|
|
3246
|
+
}
|
|
3247
|
+
|
|
3248
|
+
tile[lid.x] = acc;
|
|
3249
|
+
workgroupBarrier();
|
|
3250
|
+
|
|
3251
|
+
// Inactive threads combine against a throwaway partner and discard it
|
|
3252
|
+
// (ddAddProtected must be called unconditionally by every thread).
|
|
3253
|
+
for (var s = WGS / 2u; s > 0u; s >>= 1u) {
|
|
3254
|
+
let partner = select(lid.x, lid.x + s, lid.x < s);
|
|
3255
|
+
let combined = ddAddProtected(tile[lid.x], tile[partner], lid.x);
|
|
3256
|
+
workgroupBarrier(); // all threads must read tile[] above before any write below
|
|
3257
|
+
if (lid.x < s) { tile[lid.x] = combined; }
|
|
3258
|
+
workgroupBarrier();
|
|
3259
|
+
}
|
|
3260
|
+
|
|
3261
|
+
// tile[0] now holds the full row dot product, visible to every lane \u2014
|
|
3262
|
+
// every thread redundantly finishes the O(1) alpha/beta combine so the
|
|
3263
|
+
// protected ops below stay uniformly called (only the write is gated).
|
|
3264
|
+
let dot = tile[0];
|
|
3265
|
+
let scaled = ddMulProtected(alpha, dot, lid.x);
|
|
3266
|
+
let iy = i * params.incy;
|
|
3267
|
+
let yVal = DD(yHi[iy], yLo[iy]);
|
|
3268
|
+
let betaTimesY = ddMulProtected(beta, yVal, lid.x);
|
|
3269
|
+
let withBeta = ddAddProtected(scaled, betaTimesY, lid.x);
|
|
3270
|
+
// BLAS beta==0 semantics: y is written, not accumulated \u2014 the result
|
|
3271
|
+
// must not depend on y's prior value (though it is still read above).
|
|
3272
|
+
let result = DD(
|
|
3273
|
+
select(scaled.hi, withBeta.hi, isBetaNonzero),
|
|
3274
|
+
select(scaled.lo, withBeta.lo, isBetaNonzero),
|
|
3275
|
+
);
|
|
3276
|
+
|
|
3277
|
+
if (lid.x == 0u) {
|
|
3278
|
+
yHi[iy] = result.hi;
|
|
3279
|
+
yLo[iy] = result.lo;
|
|
3280
|
+
}
|
|
3281
|
+
// All 64 threads must agree before the next row reuses tile[].
|
|
3282
|
+
workgroupBarrier();
|
|
3283
|
+
}
|
|
3284
|
+
}
|
|
3285
|
+
`});var Fo,jo=Z(()=>{Fo=`// dtrmv: y := op(A) * x, double-double (Dekker) f64 emulation of strmv
|
|
3286
|
+
// (triangular matrix-vector product). A, x, and y are each split into an f32
|
|
3287
|
+
// (hi, lo) pair; WGSL has no f64 type. A is n\xD7n triangular \u2014 only the
|
|
3288
|
+
// triangle specified by uplo is referenced. Like strmv.wgsl, wgblas's trmv
|
|
3289
|
+
// takes a separate output vector y rather than overwriting x in place (the
|
|
3290
|
+
// standard BLAS signature is in-place), so there is no aliasing/read-write-
|
|
3291
|
+
// ordering concern the way real in-place trmv would have \u2014 this is
|
|
3292
|
+
// structurally just dsymv.wgsl's per-row DD tree reduction with a triangular
|
|
3293
|
+
// (not full-n, not mirrored) column range per row, same shape as dsyr.wgsl's
|
|
3294
|
+
// per-row-varying range (main/tail split computed inside the row loop, since
|
|
3295
|
+
// range length depends on i).
|
|
3296
|
+
|
|
3297
|
+
@group(0) @binding(0) var<storage, read> AHi: array<f32>;
|
|
3298
|
+
@group(0) @binding(1) var<storage, read> ALo: array<f32>;
|
|
3299
|
+
@group(0) @binding(2) var<storage, read> xHi: array<f32>;
|
|
3300
|
+
@group(0) @binding(3) var<storage, read> xLo: array<f32>;
|
|
3301
|
+
@group(0) @binding(4) var<storage, read_write> yHi: array<f32>;
|
|
3302
|
+
@group(0) @binding(5) var<storage, read_write> yLo: array<f32>;
|
|
3303
|
+
|
|
3304
|
+
struct Params {
|
|
3305
|
+
n: u32,
|
|
3306
|
+
incx: u32,
|
|
3307
|
+
incy: u32,
|
|
3308
|
+
lda: u32,
|
|
3309
|
+
trans: u32, // 0 = no-transpose, 1 = transpose
|
|
3310
|
+
uplo: u32, // 0 = lower, 1 = upper
|
|
3311
|
+
diag: u32, // 0 = non-unit, 1 = unit
|
|
3312
|
+
}
|
|
3313
|
+
|
|
3314
|
+
@group(0) @binding(6) var<uniform> params: Params;
|
|
3315
|
+
|
|
3316
|
+
const WGS: u32 = 64u;
|
|
3317
|
+
var<workgroup> tile: array<DD, 64>;
|
|
3318
|
+
|
|
3319
|
+
@compute @workgroup_size(64)
|
|
3320
|
+
fn dtrmv_main(
|
|
3321
|
+
@builtin(workgroup_id) wgid: vec3u,
|
|
3322
|
+
@builtin(local_invocation_id) lid: vec3u,
|
|
3323
|
+
@builtin(num_workgroups) nwg: vec3u,
|
|
3324
|
+
) {
|
|
3325
|
+
// Effective "upper" range for row i: op(A)[i,j] is stored at A[i,j] for
|
|
3326
|
+
// no-transpose+upper or transpose+lower (range [i, n)); at A[j,i] for
|
|
3327
|
+
// no-transpose+lower or transpose+upper (range [0, i]).
|
|
3328
|
+
let isUpperRange = (params.trans == 0u) == (params.uplo == 1u);
|
|
3329
|
+
|
|
3330
|
+
for (var i = wgid.x; i < params.n; i += nwg.x) {
|
|
3331
|
+
let rangeStart = select(0u, i, isUpperRange);
|
|
3332
|
+
let rangeEnd = select(i + 1u, params.n, isUpperRange);
|
|
3333
|
+
|
|
3334
|
+
// Range length varies per row, but every thread in the workgroup runs
|
|
3335
|
+
// the SAME row at the same time, so the main/tail split computed from
|
|
3336
|
+
// rangeStart/rangeEnd is already uniform across threads for this row \u2014
|
|
3337
|
+
// just not the same across different rows (see dsyr.wgsl).
|
|
3338
|
+
let rangeLen = rangeEnd - rangeStart;
|
|
3339
|
+
let range_floor = rangeStart + (rangeLen / WGS) * WGS;
|
|
3340
|
+
let mainIters = (range_floor - rangeStart) / WGS;
|
|
3341
|
+
let hasTail = select(0u, 1u, range_floor < rangeEnd);
|
|
3342
|
+
|
|
3343
|
+
var acc = DD(0.0, 0.0);
|
|
3344
|
+
|
|
3345
|
+
for (var iter = 0u; iter < mainIters; iter++) {
|
|
3346
|
+
let j = rangeStart + lid.x + iter * WGS;
|
|
3347
|
+
let addr = select(j * params.lda + i, i * params.lda + j, params.trans == 0u);
|
|
3348
|
+
let isUnitDiag = params.diag == 1u && j == i;
|
|
3349
|
+
let aVal = DD(
|
|
3350
|
+
select(AHi[addr], 1.0, isUnitDiag),
|
|
3351
|
+
select(ALo[addr], 0.0, isUnitDiag),
|
|
3352
|
+
);
|
|
3353
|
+
let ix = j * params.incx;
|
|
3354
|
+
let prod = ddMulProtected(aVal, DD(xHi[ix], xLo[ix]), lid.x);
|
|
3355
|
+
acc = ddAddProtected(acc, prod, lid.x);
|
|
3356
|
+
}
|
|
3357
|
+
|
|
3358
|
+
for (var iter = 0u; iter < hasTail; iter++) {
|
|
3359
|
+
let j = range_floor + lid.x;
|
|
3360
|
+
let valid = j < rangeEnd;
|
|
3361
|
+
let safeJ = select(rangeStart, j, valid); // rangeLen is always >= 1, so rangeStart is a safe in-range fallback
|
|
3362
|
+
let addr = select(safeJ * params.lda + i, i * params.lda + safeJ, params.trans == 0u);
|
|
3363
|
+
let isUnitDiag = params.diag == 1u && safeJ == i;
|
|
3364
|
+
let aVal = DD(
|
|
3365
|
+
select(AHi[addr], 1.0, isUnitDiag),
|
|
3366
|
+
select(ALo[addr], 0.0, isUnitDiag),
|
|
3367
|
+
);
|
|
3368
|
+
let ix = safeJ * params.incx;
|
|
3369
|
+
let prod = ddMulProtected(aVal, DD(xHi[ix], xLo[ix]), lid.x);
|
|
3370
|
+
let contribution = DD(select(0.0, prod.hi, valid), select(0.0, prod.lo, valid));
|
|
3371
|
+
acc = ddAddProtected(acc, contribution, lid.x);
|
|
3372
|
+
}
|
|
3373
|
+
|
|
3374
|
+
tile[lid.x] = acc;
|
|
3375
|
+
workgroupBarrier();
|
|
3376
|
+
|
|
3377
|
+
// Inactive threads combine against a throwaway partner and discard it
|
|
3378
|
+
// (ddAddProtected must be called unconditionally by every thread).
|
|
3379
|
+
for (var s = WGS / 2u; s > 0u; s >>= 1u) {
|
|
3380
|
+
let partner = select(lid.x, lid.x + s, lid.x < s);
|
|
3381
|
+
let combined = ddAddProtected(tile[lid.x], tile[partner], lid.x);
|
|
3382
|
+
workgroupBarrier(); // all threads must read tile[] above before any write below
|
|
3383
|
+
if (lid.x < s) { tile[lid.x] = combined; }
|
|
3384
|
+
workgroupBarrier();
|
|
3385
|
+
}
|
|
3386
|
+
|
|
3387
|
+
if (lid.x == 0u) {
|
|
3388
|
+
let iy = i * params.incy;
|
|
3389
|
+
yHi[iy] = tile[0].hi;
|
|
3390
|
+
yLo[iy] = tile[0].lo;
|
|
3391
|
+
}
|
|
3392
|
+
// All 64 threads must agree before the next row reuses tile[].
|
|
3393
|
+
workgroupBarrier();
|
|
3394
|
+
}
|
|
3395
|
+
}
|
|
3396
|
+
`});var Ho,qo=Z(()=>{Ho=`// dtrsv_invert_block: double-double (Dekker) f64 emulation of
|
|
3397
|
+
// strsv_invert_block.wgsl \u2014 computes ONE column (workgroup_id.x) of ONE
|
|
3398
|
+
// block's (workgroup_id.y) explicit inverse, via the same one-row-at-a-time
|
|
3399
|
+
// substitution, solving against a unit basis vector e_col. A, Ainv, and the
|
|
3400
|
+
// running accumulation are each split into an f32 (hi, lo) pair; WGSL has no
|
|
3401
|
+
// f64 type.
|
|
3402
|
+
//
|
|
3403
|
+
// This is the first routine in the f64 port order to use ddDivProtected (the
|
|
3404
|
+
// non-unit-diagonal division) \u2014 deliberately last per TODO.md, since
|
|
3405
|
+
// division is where dnrm2 found real double-double edge-case bugs during
|
|
3406
|
+
// the L1 port. The division only runs once per (column, step) \u2014 same
|
|
3407
|
+
// barrier-uniformity requirement as every other protected op here \u2014 so
|
|
3408
|
+
// every thread in the workgroup computes it redundantly from the
|
|
3409
|
+
// already-shared \`tile[0]\` reduction result (same pattern dgemv_n uses for
|
|
3410
|
+
// its O(1) alpha/beta combine after the per-row reduction), with only
|
|
3411
|
+
// \`lid.x==0\` writing the result. \`params.diag\` is uniform across the whole
|
|
3412
|
+
// dispatch (not per-thread), so branching on it to skip the division
|
|
3413
|
+
// entirely for a unit diagonal is safe \u2014 unlike dtrmv.wgsl's per-element
|
|
3414
|
+
// diag check, which varies per thread and needed select() instead.
|
|
3415
|
+
|
|
3416
|
+
@group(0) @binding(0) var<storage, read> AHi: array<f32>;
|
|
3417
|
+
@group(0) @binding(1) var<storage, read> ALo: array<f32>;
|
|
3418
|
+
@group(0) @binding(2) var<storage, read_write> AinvHi: array<f32>;
|
|
3419
|
+
@group(0) @binding(3) var<storage, read_write> AinvLo: array<f32>;
|
|
3420
|
+
|
|
3421
|
+
struct Params {
|
|
3422
|
+
n: u32,
|
|
3423
|
+
lda: u32,
|
|
3424
|
+
trans: u32, // 0 = no-transpose, 1 = transpose
|
|
3425
|
+
uplo: u32, // 0 = lower, 1 = upper
|
|
3426
|
+
diag: u32, // 0 = non-unit, 1 = unit
|
|
3427
|
+
}
|
|
3428
|
+
|
|
3429
|
+
@group(0) @binding(4) var<uniform> params: Params;
|
|
3430
|
+
|
|
3431
|
+
const WGS: u32 = 64u;
|
|
3432
|
+
const BLOCK_SIZE: u32 = 64u;
|
|
3433
|
+
var<workgroup> tile: array<DD, 64>;
|
|
3434
|
+
|
|
3435
|
+
fn readA(i: u32, j: u32) -> DD {
|
|
3436
|
+
let idx = select(j * params.lda + i, i * params.lda + j, params.trans == 0u);
|
|
3437
|
+
return DD(AHi[idx], ALo[idx]);
|
|
3438
|
+
}
|
|
3439
|
+
|
|
3440
|
+
@compute @workgroup_size(64)
|
|
3441
|
+
fn dtrsv_invert_block_main(
|
|
3442
|
+
@builtin(workgroup_id) wgid: vec3u,
|
|
3443
|
+
@builtin(local_invocation_id) lid: vec3u,
|
|
3444
|
+
) {
|
|
3445
|
+
let col = wgid.x;
|
|
3446
|
+
let blockIndex = wgid.y;
|
|
3447
|
+
let blockStart = blockIndex * BLOCK_SIZE;
|
|
3448
|
+
var blockEnd = blockStart + BLOCK_SIZE;
|
|
3449
|
+
if (blockEnd > params.n) { blockEnd = params.n; }
|
|
3450
|
+
let blockLen = blockEnd - blockStart;
|
|
3451
|
+
|
|
3452
|
+
if (col >= blockLen) { return; }
|
|
3453
|
+
|
|
3454
|
+
let ainvBase = blockIndex * BLOCK_SIZE * BLOCK_SIZE;
|
|
3455
|
+
let forward = (params.trans == 0u) == (params.uplo == 0u);
|
|
3456
|
+
|
|
3457
|
+
if forward {
|
|
3458
|
+
for (var r = lid.x; r < col; r += WGS) {
|
|
3459
|
+
AinvHi[ainvBase + r * BLOCK_SIZE + col] = 0.0;
|
|
3460
|
+
AinvLo[ainvBase + r * BLOCK_SIZE + col] = 0.0;
|
|
3461
|
+
}
|
|
3462
|
+
} else {
|
|
3463
|
+
for (var r = col + 1u + lid.x; r < blockLen; r += WGS) {
|
|
3464
|
+
AinvHi[ainvBase + r * BLOCK_SIZE + col] = 0.0;
|
|
3465
|
+
AinvLo[ainvBase + r * BLOCK_SIZE + col] = 0.0;
|
|
3466
|
+
}
|
|
3467
|
+
}
|
|
3468
|
+
storageBarrier();
|
|
3469
|
+
workgroupBarrier();
|
|
3470
|
+
|
|
3471
|
+
let numSteps = select(col + 1u, blockLen - col, forward);
|
|
3472
|
+
for (var step = 0u; step < numSteps; step++) {
|
|
3473
|
+
let localRow = select(col - step, col + step, forward);
|
|
3474
|
+
let i = blockStart + localRow;
|
|
3475
|
+
|
|
3476
|
+
// Accumulation range over lj: [col, localRow) forward, [localRow+1, col+1) backward.
|
|
3477
|
+
// Range length varies per step, but every thread runs the SAME step at
|
|
3478
|
+
// the same time, so the main/tail split is already uniform for this
|
|
3479
|
+
// step \u2014 just not the same across different steps (see dsyr.wgsl).
|
|
3480
|
+
let ljStart = select(localRow + 1u, col, forward);
|
|
3481
|
+
let ljEnd = select(col + 1u, localRow, forward);
|
|
3482
|
+
let rangeLen = ljEnd - ljStart;
|
|
3483
|
+
let range_floor = ljStart + (rangeLen / WGS) * WGS;
|
|
3484
|
+
let mainIters = (range_floor - ljStart) / WGS;
|
|
3485
|
+
let hasTail = select(0u, 1u, range_floor < ljEnd);
|
|
3486
|
+
|
|
3487
|
+
var acc = DD(0.0, 0.0);
|
|
3488
|
+
|
|
3489
|
+
for (var iter = 0u; iter < mainIters; iter++) {
|
|
3490
|
+
let lj = ljStart + lid.x + iter * WGS;
|
|
3491
|
+
let aij = readA(i, blockStart + lj);
|
|
3492
|
+
let aidx = ainvBase + lj * BLOCK_SIZE + col;
|
|
3493
|
+
let ainv = DD(AinvHi[aidx], AinvLo[aidx]);
|
|
3494
|
+
let prod = ddMulProtected(aij, ainv, lid.x);
|
|
3495
|
+
acc = ddAddProtected(acc, prod, lid.x);
|
|
3496
|
+
}
|
|
3497
|
+
|
|
3498
|
+
for (var iter = 0u; iter < hasTail; iter++) {
|
|
3499
|
+
let lj = range_floor + lid.x;
|
|
3500
|
+
let valid = lj < ljEnd;
|
|
3501
|
+
let safeLj = select(ljStart, lj, valid); // ljStart is always in-range when rangeLen > 0, the only case hasTail can be 1
|
|
3502
|
+
let aij = readA(i, blockStart + safeLj);
|
|
3503
|
+
let aidx = ainvBase + safeLj * BLOCK_SIZE + col;
|
|
3504
|
+
let ainv = DD(AinvHi[aidx], AinvLo[aidx]);
|
|
3505
|
+
let prod = ddMulProtected(aij, ainv, lid.x);
|
|
3506
|
+
let contribution = DD(select(0.0, prod.hi, valid), select(0.0, prod.lo, valid));
|
|
3507
|
+
acc = ddAddProtected(acc, contribution, lid.x);
|
|
3508
|
+
}
|
|
3509
|
+
|
|
3510
|
+
tile[lid.x] = acc;
|
|
3511
|
+
workgroupBarrier();
|
|
3512
|
+
|
|
3513
|
+
// Inactive threads combine against a throwaway partner and discard it
|
|
3514
|
+
// (ddAddProtected must be called unconditionally by every thread).
|
|
3515
|
+
for (var s = WGS / 2u; s > 0u; s >>= 1u) {
|
|
3516
|
+
let partner = select(lid.x, lid.x + s, lid.x < s);
|
|
3517
|
+
let combined = ddAddProtected(tile[lid.x], tile[partner], lid.x);
|
|
3518
|
+
workgroupBarrier(); // all threads must read tile[] above before any write below
|
|
3519
|
+
if (lid.x < s) { tile[lid.x] = combined; }
|
|
3520
|
+
workgroupBarrier();
|
|
3521
|
+
}
|
|
3522
|
+
|
|
3523
|
+
// tile[0] now holds the full accumulation, visible to every lane \u2014 every
|
|
3524
|
+
// thread redundantly finishes the O(1) rhs/division so the protected
|
|
3525
|
+
// ops below stay uniformly called (only the write is gated).
|
|
3526
|
+
let e = DD(select(0.0, 1.0, localRow == col), 0.0);
|
|
3527
|
+
let rhs = ddSubProtected(e, tile[0], lid.x);
|
|
3528
|
+
|
|
3529
|
+
var val: DD;
|
|
3530
|
+
if params.diag == 1u {
|
|
3531
|
+
val = rhs;
|
|
3532
|
+
} else {
|
|
3533
|
+
val = ddDivProtected(rhs, readA(i, i), lid.x);
|
|
3534
|
+
}
|
|
3535
|
+
|
|
3536
|
+
if (lid.x == 0u) {
|
|
3537
|
+
AinvHi[ainvBase + localRow * BLOCK_SIZE + col] = val.hi;
|
|
3538
|
+
AinvLo[ainvBase + localRow * BLOCK_SIZE + col] = val.lo;
|
|
3539
|
+
}
|
|
3540
|
+
storageBarrier();
|
|
3541
|
+
workgroupBarrier();
|
|
3542
|
+
}
|
|
3543
|
+
}
|
|
3544
|
+
`});var Co,To=Z(()=>{Co=`// dtrsv_apply_inverse: double-double (Dekker) f64 emulation of
|
|
3545
|
+
// strsv_apply_inverse.wgsl \u2014 given a precomputed block inverse (from
|
|
3546
|
+
// dtrsv_invert_block.wgsl), computes this block's solution as a dense
|
|
3547
|
+
// matrix-vector multiply against the block's current remainder in x.
|
|
3548
|
+
// Ainv, x, and the per-row accumulation are each split into an f32 (hi, lo)
|
|
3549
|
+
// pair; WGSL has no f64 type.
|
|
3550
|
+
//
|
|
3551
|
+
// Unlike dsymv/dtrmv's per-row reduction across 64 threads, each thread here
|
|
3552
|
+
// owns one whole row's dot product independently (blockLen <= WGS, so one
|
|
3553
|
+
// thread per row already covers it, no tree reduction needed) \u2014 same shape
|
|
3554
|
+
// as dgemv_t.wgsl's per-thread accumulation. The f32 original early-returns
|
|
3555
|
+
// threads with \`lid.x >= blockLen\` (the last, possibly-short block); DD
|
|
3556
|
+
// can't do that, since every thread must call ddMulProtected/ddAddProtected
|
|
3557
|
+
// the same number of times. Instead every thread runs the identical
|
|
3558
|
+
// \`blockLen\`-iteration loop (reading past-blockLen rows of Ainv, which the
|
|
3559
|
+
// zero-initialized, never-written buffer backing them makes safe garbage \u2014
|
|
3560
|
+
// see dgemv_t.wgsl's clamped-dummy-index technique) and only the final
|
|
3561
|
+
// write is gated.
|
|
3562
|
+
|
|
3563
|
+
@group(0) @binding(0) var<storage, read> AinvHi: array<f32>;
|
|
3564
|
+
@group(0) @binding(1) var<storage, read> AinvLo: array<f32>;
|
|
3565
|
+
@group(0) @binding(2) var<storage, read_write> xHi: array<f32>;
|
|
3566
|
+
@group(0) @binding(3) var<storage, read_write> xLo: array<f32>;
|
|
3567
|
+
|
|
3568
|
+
struct Params {
|
|
3569
|
+
incx: u32,
|
|
3570
|
+
blockIndex: u32,
|
|
3571
|
+
blockStart: u32,
|
|
3572
|
+
blockEnd: u32,
|
|
3573
|
+
}
|
|
3574
|
+
|
|
3575
|
+
@group(0) @binding(4) var<uniform> params: Params;
|
|
3576
|
+
|
|
3577
|
+
const BLOCK_SIZE: u32 = 64u;
|
|
3578
|
+
var<workgroup> xLocal: array<DD, 64>;
|
|
3579
|
+
|
|
3580
|
+
@compute @workgroup_size(64)
|
|
3581
|
+
fn dtrsv_apply_inverse_main(@builtin(local_invocation_id) lid: vec3u) {
|
|
3582
|
+
let blockLen = params.blockEnd - params.blockStart;
|
|
3583
|
+
|
|
3584
|
+
if (lid.x < blockLen) {
|
|
3585
|
+
let ix = (params.blockStart + lid.x) * params.incx;
|
|
3586
|
+
xLocal[lid.x] = DD(xHi[ix], xLo[ix]);
|
|
3587
|
+
}
|
|
3588
|
+
workgroupBarrier();
|
|
3589
|
+
|
|
3590
|
+
let ainvBase = params.blockIndex * BLOCK_SIZE * BLOCK_SIZE;
|
|
3591
|
+
var acc = DD(0.0, 0.0);
|
|
3592
|
+
for (var j = 0u; j < blockLen; j++) {
|
|
3593
|
+
let aidx = ainvBase + lid.x * BLOCK_SIZE + j;
|
|
3594
|
+
let prod = ddMulProtected(DD(AinvHi[aidx], AinvLo[aidx]), xLocal[j], lid.x);
|
|
3595
|
+
acc = ddAddProtected(acc, prod, lid.x);
|
|
3596
|
+
}
|
|
3597
|
+
|
|
3598
|
+
if (lid.x < blockLen) {
|
|
3599
|
+
let ix = (params.blockStart + lid.x) * params.incx;
|
|
3600
|
+
xHi[ix] = acc.hi;
|
|
3601
|
+
xLo[ix] = acc.lo;
|
|
3602
|
+
}
|
|
3603
|
+
}
|
|
3604
|
+
`});var Vo,Wo=Z(()=>{Vo=`// dtrsv_update: double-double (Dekker) f64 emulation of strsv_update.wgsl \u2014
|
|
3605
|
+
// subtracts a solved block's contribution from every remaining row in
|
|
3606
|
+
// parallel (one workgroup per row, like dtrmv.wgsl). A, x, and the per-row
|
|
3607
|
+
// accumulation are each split into an f32 (hi, lo) pair; WGSL has no f64
|
|
3608
|
+
// type. No diag/masking needed: this region never touches the diagonal.
|
|
3609
|
+
//
|
|
3610
|
+
// The column range [blockStart, blockEnd) is the same fixed width for every
|
|
3611
|
+
// row in a dispatch (not per-row-varying the way dtrmv's triangular range
|
|
3612
|
+
// is), so the main/tail split is computed once, outside the row loop \u2014 same
|
|
3613
|
+
// shape as dger.wgsl's column loop.
|
|
3614
|
+
|
|
3615
|
+
@group(0) @binding(0) var<storage, read> AHi: array<f32>;
|
|
3616
|
+
@group(0) @binding(1) var<storage, read> ALo: array<f32>;
|
|
3617
|
+
@group(0) @binding(2) var<storage, read_write> xHi: array<f32>;
|
|
3618
|
+
@group(0) @binding(3) var<storage, read_write> xLo: array<f32>;
|
|
3619
|
+
|
|
3620
|
+
struct Params {
|
|
3621
|
+
n: u32,
|
|
3622
|
+
incx: u32,
|
|
3623
|
+
lda: u32,
|
|
3624
|
+
trans: u32, // 0 = no-transpose, 1 = transpose
|
|
3625
|
+
uplo: u32, // 0 = lower, 1 = upper
|
|
3626
|
+
blockStart: u32,
|
|
3627
|
+
blockEnd: u32, // exclusive
|
|
3628
|
+
}
|
|
3629
|
+
|
|
3630
|
+
@group(0) @binding(4) var<uniform> params: Params;
|
|
3631
|
+
|
|
3632
|
+
const WGS: u32 = 64u;
|
|
3633
|
+
var<workgroup> tile: array<DD, 64>;
|
|
3634
|
+
|
|
3635
|
+
@compute @workgroup_size(64)
|
|
3636
|
+
fn dtrsv_update_main(
|
|
3637
|
+
@builtin(workgroup_id) wgid: vec3u,
|
|
3638
|
+
@builtin(local_invocation_id) lid: vec3u,
|
|
3639
|
+
@builtin(num_workgroups) nwg: vec3u,
|
|
3640
|
+
) {
|
|
3641
|
+
// forward: remaining rows are [blockEnd,n); backward: [0,blockStart).
|
|
3642
|
+
// Uniform across the whole dispatch (derived from params only), so an
|
|
3643
|
+
// early return here is safe \u2014 never a partial-workgroup divergence.
|
|
3644
|
+
let forward = (params.trans == 0u) == (params.uplo == 0u);
|
|
3645
|
+
|
|
3646
|
+
var rangeStart: u32;
|
|
3647
|
+
var rangeEnd: u32;
|
|
3648
|
+
if forward {
|
|
3649
|
+
rangeStart = params.blockEnd;
|
|
3650
|
+
rangeEnd = params.n;
|
|
3651
|
+
} else {
|
|
3652
|
+
rangeStart = 0u;
|
|
3653
|
+
rangeEnd = params.blockStart;
|
|
3654
|
+
}
|
|
3655
|
+
|
|
3656
|
+
if (rangeStart >= rangeEnd) { return; }
|
|
3657
|
+
let count = rangeEnd - rangeStart;
|
|
3658
|
+
|
|
3659
|
+
let colCount = params.blockEnd - params.blockStart;
|
|
3660
|
+
let col_floor = (colCount / WGS) * WGS;
|
|
3661
|
+
let mainIters = col_floor / WGS;
|
|
3662
|
+
let hasTail = select(0u, 1u, col_floor < colCount);
|
|
3663
|
+
|
|
3664
|
+
for (var idx = wgid.x; idx < count; idx += nwg.x) {
|
|
3665
|
+
let i = rangeStart + idx;
|
|
3666
|
+
var acc = DD(0.0, 0.0);
|
|
3667
|
+
|
|
3668
|
+
for (var iter = 0u; iter < mainIters; iter++) {
|
|
3669
|
+
let j = params.blockStart + lid.x + iter * WGS;
|
|
3670
|
+
let aidx = select(j * params.lda + i, i * params.lda + j, params.trans == 0u);
|
|
3671
|
+
let ix = j * params.incx;
|
|
3672
|
+
let prod = ddMulProtected(DD(AHi[aidx], ALo[aidx]), DD(xHi[ix], xLo[ix]), lid.x);
|
|
3673
|
+
acc = ddAddProtected(acc, prod, lid.x);
|
|
3674
|
+
}
|
|
3675
|
+
|
|
3676
|
+
for (var iter = 0u; iter < hasTail; iter++) {
|
|
3677
|
+
let j = params.blockStart + col_floor + lid.x;
|
|
3678
|
+
let valid = j < params.blockEnd;
|
|
3679
|
+
let safeJ = select(params.blockStart, j, valid);
|
|
3680
|
+
let aidx = select(safeJ * params.lda + i, i * params.lda + safeJ, params.trans == 0u);
|
|
3681
|
+
let ix = safeJ * params.incx;
|
|
3682
|
+
let prod = ddMulProtected(DD(AHi[aidx], ALo[aidx]), DD(xHi[ix], xLo[ix]), lid.x);
|
|
3683
|
+
let contribution = DD(select(0.0, prod.hi, valid), select(0.0, prod.lo, valid));
|
|
3684
|
+
acc = ddAddProtected(acc, contribution, lid.x);
|
|
3685
|
+
}
|
|
3686
|
+
|
|
3687
|
+
tile[lid.x] = acc;
|
|
3688
|
+
workgroupBarrier();
|
|
3689
|
+
|
|
3690
|
+
// Inactive threads combine against a throwaway partner and discard it
|
|
3691
|
+
// (ddAddProtected must be called unconditionally by every thread).
|
|
3692
|
+
for (var s = WGS / 2u; s > 0u; s >>= 1u) {
|
|
3693
|
+
let partner = select(lid.x, lid.x + s, lid.x < s);
|
|
3694
|
+
let combined = ddAddProtected(tile[lid.x], tile[partner], lid.x);
|
|
3695
|
+
workgroupBarrier(); // all threads must read tile[] above before any write below
|
|
3696
|
+
if (lid.x < s) { tile[lid.x] = combined; }
|
|
3697
|
+
workgroupBarrier();
|
|
3698
|
+
}
|
|
3699
|
+
|
|
3700
|
+
let ix_i = i * params.incx;
|
|
3701
|
+
let xVal = DD(xHi[ix_i], xLo[ix_i]);
|
|
3702
|
+
// tile[0] now holds the full subtracted term, visible to every lane \u2014
|
|
3703
|
+
// every thread redundantly finishes the O(1) subtraction so the
|
|
3704
|
+
// protected op below stays uniformly called (only the write is gated).
|
|
3705
|
+
let result = ddSubProtected(xVal, tile[0], lid.x);
|
|
3706
|
+
|
|
3707
|
+
if (lid.x == 0u) {
|
|
3708
|
+
xHi[ix_i] = result.hi;
|
|
3709
|
+
xLo[ix_i] = result.lo;
|
|
3710
|
+
}
|
|
3711
|
+
// All 64 threads must agree before the next row (grid-stride) reuses tile[].
|
|
3712
|
+
workgroupBarrier();
|
|
3713
|
+
}
|
|
3714
|
+
}
|
|
3715
|
+
`});var ue,Oo=Z(()=>{ue=`// sgemm_small: C = alpha * op(A) * op(B) + beta * C \u2014 small-tile half of
|
|
2691
3716
|
// the two-tier autotuned dispatch (see sgemm.mjs and sgemm_large.wgsl).
|
|
2692
3717
|
// BM=BN=32, BK=8, TM=TN=2 \u2014 wins over the large tile below a 6x6=36
|
|
2693
3718
|
// workgroup grid of 64-tiles, where the large tile doesn't have enough
|
|
@@ -2899,7 +3924,7 @@ fn main(
|
|
|
2899
3924
|
}
|
|
2900
3925
|
}
|
|
2901
3926
|
}
|
|
2902
|
-
`});var
|
|
3927
|
+
`});var de,Ko=Z(()=>{de=`// sgemm_large: C = alpha * op(A) * op(B) + beta * C \u2014 large-tile half of
|
|
2903
3928
|
// the two-tier autotuned dispatch (see sgemm.mjs and sgemm_small.wgsl).
|
|
2904
3929
|
// BM=BN=64, BK=8, TM=8, TN=4 (128 threads/workgroup) \u2014 the kernel 9
|
|
2905
3930
|
// autotuning winner (temp/autotune_sweep.mjs, temp/gen_sweep_kernel.mjs,
|
|
@@ -3105,7 +4130,7 @@ fn main(
|
|
|
3105
4130
|
}
|
|
3106
4131
|
}
|
|
3107
4132
|
}
|
|
3108
|
-
`});var xe,
|
|
4133
|
+
`});var xe,Uo=Z(()=>{xe=`// sgemmtr_small: C := uplo(alpha * op(A) * op(B) + beta * C) \u2014 small-tile
|
|
3109
4134
|
// half of a two-tier dispatch, identical to sgemm_small.wgsl except the
|
|
3110
4135
|
// final output write is gated to one triangle of C by \`uplo\` \u2014 see
|
|
3111
4136
|
// sgemmtr_large.wgsl for the full rationale (shared by both tiers).
|
|
@@ -3218,7 +4243,7 @@ fn main(
|
|
|
3218
4243
|
}
|
|
3219
4244
|
}
|
|
3220
4245
|
}
|
|
3221
|
-
`});var ve,
|
|
4246
|
+
`});var ve,zo=Z(()=>{ve=`// sgemmtr_large: C := uplo(alpha * op(A) * op(B) + beta * C) \u2014 large-tile
|
|
3222
4247
|
// half of a two-tier dispatch, identical to sgemm_large.wgsl (see that file
|
|
3223
4248
|
// for the BM/BN/BK/TM/TN autotuning rationale) except the final output write
|
|
3224
4249
|
// is gated to one triangle of C by \`uplo\`, the same convention ssyr/ssyr2
|
|
@@ -3338,7 +4363,7 @@ fn main(
|
|
|
3338
4363
|
}
|
|
3339
4364
|
}
|
|
3340
4365
|
}
|
|
3341
|
-
`});var
|
|
4366
|
+
`});var Zo,Yo=Z(()=>{Zo=`// symmetrize: Adense := full dense expansion of a symmetric matrix stored
|
|
3342
4367
|
// with only its \`uplo\` triangle meaningful (the other triangle is implied
|
|
3343
4368
|
// by symmetry: A[i,j] = A[j,i]). A plain element-wise pass, no tiling or
|
|
3344
4369
|
// shared memory needed \u2014 used to materialize a dense operand for routines
|
|
@@ -3369,7 +4394,7 @@ fn main(@builtin(global_invocation_id) gid: vec3u) {
|
|
|
3369
4394
|
let srcIdx = select(col * params.lda + row, row * params.lda + col, isStored);
|
|
3370
4395
|
Adense[row * params.ldd + col] = A[srcIdx];
|
|
3371
4396
|
}
|
|
3372
|
-
`});var
|
|
4397
|
+
`});var $o,Xo=Z(()=>{$o=`// triangularize: Adense := dense expansion of op(A) (A or A^T per \`trans\`),
|
|
3373
4398
|
// zero-filling the unstored triangle (exact for a matmul) so strmm can reuse
|
|
3374
4399
|
// sgemm's kernel unchanged. \`diag=1\` substitutes 1.0 on the diagonal.
|
|
3375
4400
|
|
|
@@ -3413,7 +4438,7 @@ fn main(@builtin(global_invocation_id) gid: vec3u) {
|
|
|
3413
4438
|
|
|
3414
4439
|
Adense[row * params.ldd + col] = select(0.0, A[srcRow * params.lda + srcCol], isMeaningful);
|
|
3415
4440
|
}
|
|
3416
|
-
`});var
|
|
4441
|
+
`});var Qo,Jo=Z(()=>{Qo=`// block_transfer: gather/scatter/scatter-subtract between a tight (blockLen
|
|
3417
4442
|
// x otherLen) block and a sub-range of a strided (any ld, row/col-major)
|
|
3418
4443
|
// buffer \u2014 needed since block offsets aren't 256-byte-aligned and block
|
|
3419
4444
|
// rows/cols aren't always one contiguous range for copyBufferToBuffer.
|
|
@@ -3455,8 +4480,8 @@ fn main(@builtin(global_invocation_id) gid: vec3u) {
|
|
|
3455
4480
|
strided[stridedIdx] = block[blockIdx];
|
|
3456
4481
|
}
|
|
3457
4482
|
}
|
|
3458
|
-
`});var Lo={};qe(Lo,{routineShaders:()=>or,shaderSources:()=>Ii});var or,Ii,Ro=O(()=>{$e();Ze();Je();et();ot();it();nt();ut();mt();dt();pt();wt();bt();xt();_t();Bt();St();At();Et();kt();Dt();Pt();It();Rt();qt();Ct();jt();Ht();Vt();zt();Yt();$t();Qt();ro();to();ao();so();lo();fo();co();po();wo();bo();xo();_o();So();Ao();Go();Eo();ko();No();Mo();or={};or.sscal={sscal:ke};or.cscal={cscal:Qe};or.sswap={sswap:rt};or.dswap={dswap:tt};or.saxpy={saxpy:at};or.scopy={scopy:st};or.dcopy={dcopy:lt};or.sdot={sdot:ft,"reduction/sum":De};or.sasum={sasum:ct,"reduction/sum":De};or.snrm2={snrm2:gt,"reduction/scaledSum":ht};or.isamax={isamax:yt,"reduction/argmax":vt};or.dasum={"f64/dekker":Kr,"f64/utils/abs":ye,"f64/utils/add":zr,dasum:Gt,"reduction/sumF64":Ne};or.ddot={"f64/dekker":Kr,"f64/utils/add":zr,"f64/utils/multiply":$r,ddot:Nt,"reduction/sumF64":Ne};or.dscal={"f64/dekker":Kr,"f64/utils/add":zr,"f64/utils/multiply":$r,dscal:Mt};or.daxpy={"f64/dekker":Kr,"f64/utils/add":zr,"f64/utils/multiply":$r,daxpy:Lt};or.idamax={"f64/dekker":Kr,"f64/utils/abs":ye,"f64/utils/greater":Pe,"f64/utils/equal":Tt,idamax:Ft,"reduction/argmaxF64":Wt};or.srot={srot:Ot};or.drot={"f64/dekker":Kr,"f64/utils/add":zr,"f64/utils/multiply":$r,drot:Kt};or.srotm={srotm:Ut};or.drotm={"f64/dekker":Kr,"f64/utils/add":zr,"f64/utils/multiply":$r,drotm:Xt};or.dnrm2={"f64/dekker":Kr,"f64/utils/abs":ye,"f64/utils/greater":Pe,"f64/utils/add":zr,"f64/utils/multiply":$r,"f64/utils/divide":Zt,"f64/utils/sqrt":Jt,dnrm2:eo,"reduction/scaledSumF64":oo};or.sgemv={sgemv_n:io,sgemv_t:no};or.ssymv={ssymv:uo};or.strmv={strmv:mo};or.strsv={strsv_invert_block:Me,strsv_apply_inverse:go,strsv_update:ho};or.sger={sger:yo};or.ssyr={ssyr:vo};or.ssyr2={ssyr2:Bo};or.sgemm={sgemm_small:ue,sgemm_large:fe};or.sgemmtr={sgemmtr_small:xe,sgemmtr_large:ve};or.ssyrk={sgemmtr_small:xe,sgemmtr_large:ve};or.ssyr2k={sgemmtr_small:xe,sgemmtr_large:ve};or.ssymm={sgemm_small:ue,sgemm_large:fe,symmetrize:Do};or.strmm={sgemm_small:ue,sgemm_large:fe,triangularize:Po};or.strsm={strsv_invert_block:Me,block_transfer:Io,sscal:ke,sgemm_small:ue,sgemm_large:fe};Ii=Object.assign({},...Object.values(or))});var Ti={};qe(Ti,{Complex32:()=>Wr,Complex32Array:()=>_r,Complex64:()=>jr,Complex64Array:()=>Gr,GpuMatrix:()=>X,GpuVector:()=>N,cleanup:()=>Oe,cscal:()=>To,dasum:()=>Uo,daxpy:()=>Ho,dcopy:()=>Vo,ddot:()=>Yo,dnrm2:()=>$o,drot:()=>ra,drotm:()=>ta,dscal:()=>Co,dswap:()=>jo,gpuName:()=>Ve,idamax:()=>Qo,init:()=>He,isamax:()=>Zo,randomFloat32Array:()=>Ue,randomFloat64Array:()=>Ye,randomTriangularFloat32Array:()=>Xe,sasum:()=>zo,saxpy:()=>Wo,scopy:()=>Oo,sdot:()=>Ko,sgemm:()=>da,sgemmtr:()=>ca,sgemv:()=>oa,sger:()=>ua,snrm2:()=>Xo,srot:()=>Jo,srotm:()=>ea,sscal:()=>qo,sswap:()=>Fo,ssymm:()=>wa,ssymv:()=>aa,ssyr:()=>fa,ssyr2:()=>ma,ssyr2k:()=>ga,ssyrk:()=>pa,strmm:()=>ha,strmv:()=>ia,strsm:()=>ba,strsv:()=>la});function Ce(r,t){return t?r.features.has("timestamp-query")?{requiredFeatures:["timestamp-query"]}:(console.warn("timestamp-query not supported on this device \u2014 benchmark mode disabled."),{}):{}}function Fe(r){if(!je(r))return{querySet:null,passDescriptor:void 0};let t=r.createQuerySet({type:"timestamp",count:2});return{querySet:t,passDescriptor:{timestampWrites:{querySet:t,beginningOfPassWriteIndex:0,endOfPassWriteIndex:1}}}}function Lr(r,t,e){if(!e)return null;let o=r.createBuffer({label:"timestamp-resolve",size:16,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC});t.resolveQuerySet(e,0,2,o,0);let a=r.createBuffer({label:"timestamp-readback",size:16,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});return t.copyBufferToBuffer(o,0,a,0,16),{tsReadBuffer:a,resolveBuffer:o,querySet:e}}async function P(r){if(!r)return;let{tsReadBuffer:t,resolveBuffer:e,querySet:o}=r;await t.mapAsync(GPUMapMode.READ);let a=new BigInt64Array(t.getMappedRange().slice());return t.unmap(),t.destroy(),e.destroy(),o.destroy(),Math.max(0,Number(a[1]-a[0]))/1e6}var Qr=null,Ae=!1,Jr=new Map,le=new WeakMap,Vr=null,We=({powerPreference:r,benchmark:t})=>`${r}::${t}`;async function He({powerPreference:r="high-performance",benchmark:t=!1,dumpShaders:e=!1}={}){let o={powerPreference:r,benchmark:t,dumpShaders:e},a=We(o),i=Jr.get(a);if(i)return i;if(Qr)e!==Ae&&typeof window>"u"&&console.warn(`dumpShaders: ${e} was requested, but the WebGPU instance was already created with dumpShaders: ${Ae}. The first init() call fixes this for the process.`);else if(typeof window>"u"){let{create:m,globals:p}=await import("webgpu");Object.assign(globalThis,p),Qr=m(e?["enable-dawn-features=dump_shaders,disable_symbol_renaming"]:[]),Ae=e}else e&&console.warn("dumpShaders has no effect in the browser \u2014 see init()'s docs."),Qr=navigator.gpu;if(!Qr)throw new Error("WebGPU not supported in this environment.");let s=await Qr.requestAdapter({powerPreference:r})??await Qr.requestAdapter();if(!s)throw new Error("No WebGPU adapter found.");let n=[...Ce(s,t).requiredFeatures??[]],f=await s.requestDevice({requiredFeatures:n});f.addEventListener("uncapturederror",m=>{console.error("Uncaptured GPU error:",m.error.message)});let l=n.includes("timestamp-query");return le.set(f,{adapter:s,benchmark:l,options:o}),Jr.set(a,f),Vr||(Vr=f),f}function Oe(r){if(r===void 0){for(let e of Jr.values())e.destroy();Jr.clear(),Vr=null;return}let t=le.get(r);t&&(Jr.delete(We(t.options)),le.delete(r),r.destroy(),Vr===r&&(Vr=Jr.values().next().value??null))}function Ve(r=Vr){let t=r&&le.get(r);if(!t)throw new Error("WebGPU adapter not initialized \u2014 call init() first.");let{device:e,description:o}=t.adapter.info;return{description:o||"unknown",device:e||"unknown"}}function je(r=Vr){return le.get(r)?.benchmark??!1}function re(){if(!Vr)throw new Error("WebGPU device not initialized \u2014 call init() first.");return Vr}function d(...r){r.flat().forEach(t=>t.destroy())}function Ge(r,t,e){let o=r.limits.maxStorageBufferBindingSize;if(t>o)throw new Error(`Buffer "${e}" needs ${t} bytes, exceeding this device's maxStorageBufferBindingSize (${o} bytes). The operands are too large for this device.`)}function x(r,t,e="blas-input",o=!1){let a=t.byteLength;Ge(r,a,e);let i=o?GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC:GPUBufferUsage.STORAGE,s=r.createBuffer({label:e,size:a,usage:i,mappedAtCreation:!0}),u=t.constructor;return new u(s.getMappedRange()).set(t),s.unmap(),s}function tr(r,t,e="blas-storage",o=0){return Ge(r,t,e),r.createBuffer({label:e,size:t,usage:GPUBufferUsage.STORAGE|o})}function Br(r,t,e="blas-result"){return Ge(r,t,e),r.createBuffer({label:e,size:t,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC})}function G(r,t,e){let o=r.createBuffer({label:"blas-readback",size:e.size,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});return t.copyBufferToBuffer(e,0,o,0,e.size),o}var ee=16,Ke=new WeakMap;function La(r){let t=Ke.get(r);return t||(t=r.createBuffer({label:"blas-vec4-fallback",size:ee,usage:GPUBufferUsage.STORAGE}),Ke.set(r,t)),t}function Ar(r,t){let e=t instanceof GPUBuffer?t:t.buffer,o=t instanceof GPUBuffer?0:t.offset??0,a=t instanceof GPUBuffer?t.size:t.size??e.size-o,i=Math.floor(a/ee)*ee;return i<ee?{buffer:La(r),offset:0,size:ee}:{buffer:e,offset:o,size:i}}function Ee(r,t,e,o){if(t%4!==0)return!1;let a=r instanceof GPUBuffer?r:r.buffer,i=r instanceof GPUBuffer?0:r.offset??0,s=r instanceof GPUBuffer?a.size:r.size??a.size-i,u=Math.floor(s/ee)*4;if(u<=0)return!1;let n=(Math.max(e,1)-1)*t+(Math.max(o,1)-1);return Math.floor(n/4)*4+4<=u}function I(r,t,e="blas-params"){let o=t.length*4,a=Math.ceil(o/16)*16,i=new ArrayBuffer(a),s=new DataView(i);t.forEach(({value:n,type:f},l)=>{let m=l*4;if(f==="u32")s.setUint32(m,n,!0);else if(f==="i32")s.setInt32(m,n,!0);else if(f==="f32")s.setFloat32(m,n,!0);else throw new Error(`Unknown param type "${f}". Use "f32", "u32", or "i32".`)});let u=r.createBuffer({label:e,size:a,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});return r.queue.writeBuffer(u,0,i),u}async function A(r,t=Float32Array){try{await r.mapAsync(GPUMapMode.READ);let e=new t(r.getMappedRange().slice());return r.unmap(),e}finally{r.destroy()}}function rr(r){let t=r.length,e=new Float32Array(t),o=new Float32Array(t);for(let a=0;a<t;a++){let i=Math.fround(r[a]);e[a]=i,o[a]=Math.fround(r[a]-i)}return{hi:e,lo:o}}function dr(r,t){let e=r.length,o=new Float64Array(e);for(let a=0;a<e;a++)o[a]=r[a]+t[a];return o}var jr=class{constructor(t,e){this.re=t,this.im=e}},Gr=class extends Array{constructor(t){if(t===void 0){super();return}if(typeof t=="number"){super(t);for(let o=0;o<t;o++)this[o]=new jr(0,0);return}let e=Array.from(t);if(super(),e.length!==0){if(e[0]instanceof jr){for(let o of e){if(!(o instanceof jr))throw new Error("Complex64Array expects every element to be a Complex64.");this.push(o)}return}if(e.length%2!==0)throw new Error("Complex64Array expects an even number of interleaved [re, im, ...] values.");for(let o=0;o<e.length;o+=2){if(typeof e[o]!="number"||typeof e[o+1]!="number")throw new Error("Complex64Array expects interleaved [re, im, ...] values to be numbers.");this.push(new jr(e[o],e[o+1]))}}}};function te(r,t=r.length){let e=new Float32Array(t*2);for(let o=0;o<t;o++)e[o*2]=r[o].re,e[o*2+1]=r[o].im;return e}function he(r,t=r.length){let e=new Float64Array(t),o=new Float64Array(t);for(let l=0;l<t;l++)e[l]=r[l].re,o[l]=r[l].im;let{hi:a,lo:i}=rr(e),{hi:s,lo:u}=rr(o),n=new Float32Array(t*2),f=new Float32Array(t*2);for(let l=0;l<t;l++)n[l*2]=a[l],n[l*2+1]=s[l],f[l*2]=i[l],f[l*2+1]=u[l];return{hi:n,lo:f}}function be(r,t){let e=r.length/2,o=new Float32Array(e),a=new Float32Array(e),i=new Float32Array(e),s=new Float32Array(e);for(let l=0;l<e;l++)o[l]=r[l*2],i[l]=r[l*2+1],a[l]=t[l*2],s[l]=t[l*2+1];let u=dr(o,a),n=dr(i,s),f=new Gr(e);for(let l=0;l<e;l++)f[l]=new jr(u[l],n[l]);return f}var Wr=class{constructor(t,e){this.re=Math.fround(t),this.im=Math.fround(e)}},_r=class extends Array{constructor(t){if(t===void 0){super();return}if(typeof t=="number"){super(t);for(let o=0;o<t;o++)this[o]=new Wr(0,0);return}let e=Array.from(t);if(super(),e.length!==0){if(e[0]instanceof Wr){for(let o of e){if(!(o instanceof Wr))throw new Error("Complex32Array expects every element to be a Complex32.");this.push(o)}return}if(e.length%2!==0)throw new Error("Complex32Array expects an even number of interleaved [re, im, ...] values.");for(let o=0;o<e.length;o+=2){if(typeof e[o]!="number"||typeof e[o+1]!="number")throw new Error("Complex32Array expects interleaved [re, im, ...] values to be numbers.");this.push(new Wr(e[o],e[o+1]))}}}};var N=class r{constructor(t,e,o=Float32Array,a=null,i=null){this._buf=t,this._loBuf=a,this.length=e,this.dtype=o,this.device=i??re()}static from(t,e){let o=t instanceof GPUDevice,a=o?t:re(),i=o?e:t;if(i instanceof Float64Array){let{hi:u,lo:n}=rr(i),f=x(a,u,"gpu-vector-f64-hi",!0),l=x(a,n,"gpu-vector-f64-lo",!0);return new r(f,i.length,Float64Array,l,a)}if(i instanceof _r){let u=x(a,te(i),"gpu-vector-complex32",!0);return new r(u,i.length,_r,null,a)}if(i instanceof Gr){let{hi:u,lo:n}=he(i),f=x(a,u,"gpu-vector-complex64-hi",!0),l=x(a,n,"gpu-vector-complex64-lo",!0);return new r(f,i.length,Gr,l,a)}if(!(i instanceof Float32Array))throw new Error("GpuVector.from expects a Float32Array, Float64Array, Complex32Array, or Complex64Array.");let s=x(a,i,"gpu-vector",!0);return new r(s,i.length,i.constructor,null,a)}async read(){let t=this.device,e=t.createCommandEncoder(),o=G(t,e,this._buf);if(t.queue.submit([e.finish()]),this.dtype===_r)return new _r(await A(o,Float32Array));if(!this._loBuf)return A(o,this.dtype);let a=t.createCommandEncoder(),i=G(t,a,this._loBuf);t.queue.submit([a.finish()]);let[s,u]=await Promise.all([A(o,Float32Array),A(i,Float32Array)]);return this.dtype===Gr?be(s,u):dr(s,u)}destroy(){this._buf.destroy(),this._loBuf&&this._loBuf.destroy()}};var X=class r{constructor(t,e,o,a,i=null,s="row-major",u=null,n=Float32Array){this._buf=t,this._loBuf=i,this.rows=e,this.cols=o,this.lda=a,this.layout=s,this.dtype=n,this.device=u??re()}static from(t,...e){let o=t instanceof GPUDevice,a=o?t:re(),i=o?e.shift():t,[s,u,n,f="row-major"]=e;if(f!=="row-major"&&f!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");let l=f==="row-major";if(n===void 0&&(n=l?u:s),!(i instanceof Float32Array)&&!(i instanceof Float64Array)&&!(i instanceof _r)&&!(i instanceof Gr))throw new Error("GpuMatrix.from expects a Float32Array, Float64Array, Complex32Array, or Complex64Array.");if(!Number.isInteger(s)||s<=0)throw new Error("rows must be a positive integer.");if(!Number.isInteger(u)||u<=0)throw new Error("cols must be a positive integer.");let m=l?u:s;if(!Number.isInteger(n)||n<m)throw new Error(`lda must be an integer >= ${l?"cols":"rows"}.`);let p=l?s:u;if(i.length<p*n)throw new Error("data does not have enough elements for the given rows, cols, and lda.");if(i instanceof Float64Array){let g=p*n,{hi:w,lo:h}=rr(i.subarray(0,g)),b=x(a,w,"gpu-matrix-f64-hi",!0),y=x(a,h,"gpu-matrix-f64-lo",!0);return new r(b,s,u,n,y,f,a,Float64Array)}if(i instanceof _r){let g=x(a,te(i,p*n),"gpu-matrix-complex32",!0);return new r(g,s,u,n,null,f,a,_r)}if(i instanceof Gr){let{hi:g,lo:w}=he(i,p*n),h=x(a,g,"gpu-matrix-complex64-hi",!0),b=x(a,w,"gpu-matrix-complex64-lo",!0);return new r(h,s,u,n,b,f,a,Gr)}let c=x(a,i.subarray(0,p*n),"gpu-matrix",!0);return new r(c,s,u,n,null,f,a)}async read(){let t=this.device,e=t.createCommandEncoder(),o=G(t,e,this._buf);t.queue.submit([e.finish()]);let a=this.layout!=="column-major",i=a?this.rows:this.cols,s=a?this.cols:this.rows;if(this.dtype===_r){let f=new _r(await A(o,Float32Array));if(this.lda===s)return f;let l=new _r(i*s);for(let m=0;m<i;m++)for(let p=0;p<s;p++)l[m*s+p]=f[m*this.lda+p];return l}if(this._loBuf){let f=t.createCommandEncoder(),l=G(t,f,this._loBuf);t.queue.submit([f.finish()]);let[m,p]=await Promise.all([A(o,Float32Array),A(l,Float32Array)]);if(this.dtype===Gr){let w=be(m,p);if(this.lda===s)return w;let h=new Gr(i*s);for(let b=0;b<i;b++)for(let y=0;y<s;y++)h[b*s+y]=w[b*this.lda+y];return h}let c=dr(m,p);if(this.lda===s)return c;let g=new Float64Array(i*s);for(let w=0;w<i;w++)g.set(c.subarray(w*this.lda,w*this.lda+s),w*s);return g}let u=await A(o,Float32Array);if(this.lda===s)return u;let n=new Float32Array(i*s);for(let f=0;f<i;f++)n.set(u.subarray(f*this.lda,f*this.lda+s),f*s);return n}destroy(){this._buf.destroy(),this._loBuf&&this._loBuf.destroy()}};function ze(r){let t=r>>>0;return function(){t=t+1831565813|0;let e=Math.imul(t^t>>>15,1|t);return e=e+Math.imul(e^e>>>7,61|e)^e,((e^e>>>14)>>>0)/4294967296}}function Ue(r,t=-1,e=1,o){let a=new Float32Array(r),i=o===void 0?Math.random:ze(o);for(let s=0;s<r;s++)a[s]=t+i()*(e-t);return a}function Ye(r,t=-1,e=1,o){let a=new Float64Array(r),i=o===void 0?Math.random:ze(o);for(let s=0;s<r;s++)a[s]=t+i()*(e-t);return a}function Xe(r,t,e="lower",o=-1,a=1,i=5,s=15,u="row-major"){if(e!=="lower"&&e!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(u!=="row-major"&&u!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(t<r)throw new Error("lda must be >= n.");let n=u==="column-major",f=(m,p)=>n?p*t+m:m*t+p,l=new Float32Array(r*t);for(let m=0;m<r;m++){for(let p=0;p<r;p++){if(m===p)continue;(e==="lower"?p<m:p>m)&&(l[f(m,p)]=o+Math.random()*(a-o))}l[f(m,m)]=i+Math.random()*(s-i)}return l}function E(r,t,e,o=0){let a=e.map((i,s)=>({binding:o+s,resource:i instanceof GPUBuffer?{buffer:i}:i}));return r.createBindGroup({layout:t,entries:a})}function M(r,t){r.queue.submit([t.finish()])}function qr(r){let{querySet:t,passDescriptor:e}=Fe(r);return{commandEncoder:r.createCommandEncoder(),querySet:t,passDescriptor:e}}function gr(r,t,e,o,a){let i=r.beginComputePass(a);i.setPipeline(t),i.setBindGroup(0,e),typeof o=="number"?i.dispatchWorkgroups(o):i.dispatchWorkgroups(o.x,o.y,o.z??1),i.end()}function j(r,t,e,o){let{commandEncoder:a,querySet:i,passDescriptor:s}=qr(r);gr(a,t,e,o,s);let u=Lr(r,a,i);return{commandEncoder:a,ts:u}}var qi={},Ie=new WeakMap;async function D(r,t,e="main"){Ie.has(r)||Ie.set(r,new Map);let o=Ie.get(r),a=Array.isArray(t)?t:[t],i=`${a.join("+")}::${e}`;if(!o.has(i)){let s=Ri(r,a,e).catch(u=>{throw o.delete(i),u});o.set(i,s)}return o.get(i)}async function Li(r){if(typeof process>"u"||!process.versions?.node){let{shaderSources:t}=await Promise.resolve().then(()=>(Ro(),Lo)),e=t[r];if(!e)throw new Error(`Shader "${r}" not found in browser bundle.`);return e}else{let{readFileSync:t}=await import("fs"),{fileURLToPath:e}=await import("url"),{dirname:o,join:a}=await import("path"),i=o(e(qi.url));return t(a(i,`../shaders/${r}.wgsl`),"utf8")}}async function Ri(r,t,e="main"){let o=t.join("+"),a=await Promise.all(t.map(Li)),i=0,s=a.map((g,w)=>{let h=g.split(`
|
|
3459
|
-
`).length,b={name:
|
|
3460
|
-
`),
|
|
3461
|
-
${m.map(
|
|
3462
|
-
`)}`);let p=e==="main"?{module:f}:{module:f,entryPoint:e},c=r.createComputePipeline({label:o,layout:"auto",compute:p});return c._shaderModule=f,c}function cr(r,t,e){let o=r.limits.maxComputeWorkgroupsPerDimension;return e===void 0?Math.min(Math.ceil(t/64),o):{x:Math.min(Math.ceil(e/8),o),y:Math.min(Math.ceil(t/8),o)}}function U(r,t,e,o="x"){let a=r.limits.maxComputeWorkgroupsPerDimension;if(t>a)throw new Error(`${e}: this problem needs ${t} workgroups in ${o}, but the device allows ${a} (maxComputeWorkgroupsPerDimension). The operands are too large for this device \u2014 split the operation into smaller blocks.`);return t}function Zr(r,t,e,o){return o===void 0?U(r,Math.ceil(e/64),t):{x:U(r,Math.ceil(o/8),t,"x"),y:U(r,Math.ceil(e/8),t,"y")}}function q(r){if(!(r instanceof GPUDevice))throw new Error("device must be a GPUDevice.")}function T(r,t,e){for(let[o,a]of Object.entries(e))if(!(!(a instanceof N)&&!(a instanceof X))&&a.device!==r)throw new Error(`${t}: ${o} belongs to a different GPUDevice than the one passed in. GPU buffers cannot be shared across devices \u2014 recreate the operand on this device, or call the routine with the device that owns it.`)}async function qo(r,t,e,o,a){let i=o instanceof N;if(q(r),T(r,"sscal",{x:o}),!Number.isInteger(t)||!Number.isInteger(a))throw new Error("n and incx must be integers.");if(typeof e!="number")throw new Error("alpha must be a number.");if(Number.isNaN(e))throw new Error("alpha must not be NaN.");if(!Number.isFinite(e))throw new Error("alpha must be finite.");if(a<=0)throw new Error("incx must be positive.");if(!(o instanceof Float32Array)&&!(o instanceof N))throw new Error("x must be a Float32Array or GpuVector.");if(t<=0)return i?{}:{x:o};if(o.length<(t-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");let s=await D(r,"sscal"),u=null,n=null,f=null;try{u=i?o._buf:x(r,o,"sscal-x",!0),n=I(r,[{value:t,type:"u32"},{value:e,type:"f32"},{value:a,type:"u32"}],"sscal-params");let l=E(r,s.getBindGroupLayout(0),[u,n]),{commandEncoder:m,ts:p}=j(r,s,l,cr(r,t));f=i?null:G(r,m,u),M(r,m);let c=await P(p);if(i)return c!==void 0?{gpuTimeMs:c}:{};let g=await A(f,Float32Array);return f=null,c!==void 0?{x:g,gpuTimeMs:c}:{x:g}}finally{!i&&u&&d(u),n&&d(n),f&&d(f)}}async function To(r,t,e,o,a){let i=o instanceof N;if(q(r),T(r,"cscal",{x:o}),!Number.isInteger(t)||!Number.isInteger(a))throw new Error("n and incx must be integers.");if(!(e instanceof Wr))throw new Error("alpha must be a Complex32.");if(Number.isNaN(e.re)||Number.isNaN(e.im))throw new Error("alpha must not be NaN.");if(!Number.isFinite(e.re)||!Number.isFinite(e.im))throw new Error("alpha must be finite.");if(a<=0)throw new Error("incx must be positive.");if(!(o instanceof _r)&&!i)throw new Error("x must be a Complex32Array or GpuVector.");if(i&&o.dtype!==_r)throw new Error("x must be a Complex32Array-backed GpuVector.");if(t<=0)return i?{}:{x:o};if(o.length<(t-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");let s=await D(r,"cscal"),u=null,n=null,f=null;try{u=i?o._buf:x(r,te(o),"cscal-x",!0),n=I(r,[{value:t,type:"u32"},{value:e.re,type:"f32"},{value:e.im,type:"f32"},{value:a,type:"u32"}],"cscal-params");let l=E(r,s.getBindGroupLayout(0),[u,n]),{commandEncoder:m,ts:p}=j(r,s,l,cr(r,t));f=i?null:G(r,m,u),M(r,m);let c=await P(p);if(i)return c!==void 0?{gpuTimeMs:c}:{};let g=await A(f,Float32Array);f=null;let w=new _r(g);return c!==void 0?{x:w,gpuTimeMs:c}:{x:w}}finally{!i&&u&&d(u),n&&d(n),f&&d(f)}}async function Co(r,t,e,o,a){let i=o instanceof N;if(q(r),!Number.isInteger(t)||!Number.isInteger(a))throw new Error("n and incx must be integers.");if(typeof e!="number")throw new Error("alpha must be a number.");if(Number.isNaN(e))throw new Error("alpha must not be NaN.");if(!Number.isFinite(e))throw new Error("alpha must be finite.");if(!(o instanceof Float64Array)&&!i)throw new Error("x must be a Float64Array or GpuVector.");if(i&&o.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(a<=0)throw new Error("incx must be positive.");if(T(r,"dscal",{x:o}),t<=0)return i?{}:{x:o};if(o.length<(t-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");let u=await D(r,[...["f64/dekker","f64/utils/add","f64/utils/multiply"],"dscal"]),{hi:n,lo:f}=rr(new Float64Array([e])),l=null,m=null,p=null,c=null,g=null;try{if(i)l=o._buf,m=o._loBuf;else{let{hi:k,lo:B}=rr(o);l=x(r,k,"dscal-xHi",!0),m=x(r,B,"dscal-xLo",!0)}p=I(r,[{value:t,type:"u32"},{value:n[0],type:"f32"},{value:f[0],type:"f32"},{value:a,type:"u32"}],"dscal-params");let w=E(r,u.getBindGroupLayout(0),[l,m,p]),{commandEncoder:h,ts:b}=j(r,u,w,cr(r,t));c=i?null:G(r,h,l),g=i?null:G(r,h,m),M(r,h);let y=await P(b);if(i)return y!==void 0?{gpuTimeMs:y}:{};let v=await A(c,Float32Array);c=null;let _=await A(g,Float32Array);g=null;let S=dr(v,_);return y!==void 0?{x:S,gpuTimeMs:y}:{x:S}}finally{!i&&l&&d(l),!i&&m&&d(m),p&&d(p),c&&d(c),g&&d(g)}}async function Fo(r,t,e,o,a,i){let s=e instanceof N,u=a instanceof N;if(q(r),T(r,"sswap",{x:e,y:a}),!Number.isInteger(t)||!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(!(e instanceof Float32Array)&&!(e instanceof N))throw new Error("x must be a Float32Array or GpuVector.");if(!(a instanceof Float32Array)&&!(a instanceof N))throw new Error("y must be a Float32Array or GpuVector.");if(e.constructor!==a.constructor)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(t<=0)return s?{}:{x:e,y:a};if(e.length<(t-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(a.length<(t-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let n=await D(r,"sswap"),f=null,l=null,m=null,p=null,c=null;try{f=s?e._buf:x(r,e,"sswap-x",!0),l=u?a._buf:x(r,a,"sswap-y",!0),m=I(r,[{value:t,type:"u32"},{value:o,type:"u32"},{value:i,type:"u32"}],"sswap-params");let g=E(r,n.getBindGroupLayout(0),[f,l,m]),{commandEncoder:w,ts:h}=j(r,n,g,cr(r,t));p=s?null:G(r,w,f),c=u?null:G(r,w,l),M(r,w);let b=await P(h);if(s)return b!==void 0?{gpuTimeMs:b}:{};let y=await A(p,Float32Array);p=null;let v=await A(c,Float32Array);return c=null,b!==void 0?{x:y,y:v,gpuTimeMs:b}:{x:y,y:v}}finally{!s&&f&&d(f),!u&&l&&d(l),m&&d(m),p&&d(p),c&&d(c)}}async function jo(r,t,e,o,a,i){let s=e instanceof N,u=a instanceof N;if(q(r),T(r,"dswap",{x:e,y:a}),!Number.isInteger(t)||!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(!(e instanceof Float64Array)&&!s)throw new Error("x must be a Float64Array or GpuVector.");if(!(a instanceof Float64Array)&&!u)throw new Error("y must be a Float64Array or GpuVector.");if(s&&e.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(u&&a.dtype!==Float64Array)throw new Error("y must be a Float64Array-backed GpuVector.");if(s!==u)throw new Error("x and y must be the same type (both Float64Array or both GpuVector).");if(t<=0)return s?{}:{x:e,y:a};if(e.length<(t-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(a.length<(t-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let n=await D(r,"dswap"),f=null,l=null,m=null,p=null,c=null,g=null,w=null,h=null,b=null;try{if(s)f=e._buf,l=e._loBuf,m=a._buf,p=a._loBuf;else{let W=rr(e),V=rr(a);f=x(r,W.hi,"dswap-xHi",!0),l=x(r,W.lo,"dswap-xLo",!0),m=x(r,V.hi,"dswap-yHi",!0),p=x(r,V.lo,"dswap-yLo",!0)}c=I(r,[{value:t,type:"u32"},{value:o,type:"u32"},{value:i,type:"u32"}],"dswap-params");let y=E(r,n.getBindGroupLayout(0),[f,l,m,p,c]),{commandEncoder:v,ts:_}=j(r,n,y,cr(r,t));g=s?null:G(r,v,f),w=s?null:G(r,v,l),h=u?null:G(r,v,m),b=u?null:G(r,v,p),M(r,v);let S=await P(_);if(s)return S!==void 0?{gpuTimeMs:S}:{};let k=await A(g,Float32Array);g=null;let B=await A(w,Float32Array);w=null;let L=await A(h,Float32Array);h=null;let C=await A(b,Float32Array);b=null;let R=dr(k,B),F=dr(L,C);return S!==void 0?{x:R,y:F,gpuTimeMs:S}:{x:R,y:F}}finally{!s&&f&&d(f),!s&&l&&d(l),!u&&m&&d(m),!u&&p&&d(p),c&&d(c),g&&d(g),w&&d(w),h&&d(h),b&&d(b)}}async function Wo(r,t,e,o,a,i,s){let u=o instanceof N,n=i instanceof N;if(q(r),T(r,"saxpy",{x:o,y:i}),!Number.isInteger(t)||!Number.isInteger(a)||!Number.isInteger(s))throw new Error("n, incx, and incy must be integers.");if(typeof e!="number")throw new Error("alpha must be a number.");if(Number.isNaN(e))throw new Error("alpha must not be NaN.");if(!Number.isFinite(e))throw new Error("alpha must be finite.");if(a<=0||s<=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(!n&&!(i instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(u!==n)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(t<=0)return n?{}:{y:i};if(o.length<(t-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");if(i.length<(t-1)*s+1)throw new Error("y does not have enough elements for the given n and incy.");let f=await D(r,"saxpy"),l=null,m=null,p=null,c=null;try{l=u?o._buf:x(r,o,"saxpy-x",!1),m=n?i._buf:x(r,i,"saxpy-y",!0),p=I(r,[{value:t,type:"u32"},{value:e,type:"f32"},{value:a,type:"u32"},{value:s,type:"u32"}],"saxpy-params");let g=E(r,f.getBindGroupLayout(0),[l,m,p]),{commandEncoder:w,ts:h}=j(r,f,g,cr(r,t));c=n?null:G(r,w,m),M(r,w);let b=await P(h);if(n)return b!==void 0?{gpuTimeMs:b}:{};let y=await A(c,Float32Array);return c=null,b!==void 0?{y,gpuTimeMs:b}:{y}}finally{!u&&l&&d(l),!n&&m&&d(m),p&&d(p),c&&d(c)}}async function Ho(r,t,e,o,a,i,s){let u=o instanceof N,n=i instanceof N;if(q(r),!Number.isInteger(t)||!Number.isInteger(a)||!Number.isInteger(s))throw new Error("n, incx, and incy must be integers.");if(typeof e!="number")throw new Error("alpha must be a number.");if(Number.isNaN(e))throw new Error("alpha must not be NaN.");if(!Number.isFinite(e))throw new Error("alpha must be finite.");if(!(o instanceof Float64Array)&&!u)throw new Error("x must be a Float64Array or GpuVector.");if(!(i instanceof Float64Array)&&!n)throw new Error("y must be a Float64Array or GpuVector.");if(u&&o.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(n&&i.dtype!==Float64Array)throw new Error("y must be a Float64Array-backed GpuVector.");if(u!==n)throw new Error("x and y must be the same type (both Float64Array or both GpuVector).");if(a<=0||s<=0)throw new Error("incx and incy must be positive.");if(T(r,"daxpy",{x:o,y:i}),t<=0)return n?{}:{y:i};if(o.length<(t-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");if(i.length<(t-1)*s+1)throw new Error("y does not have enough elements for the given n and incy.");let l=await D(r,[...["f64/dekker","f64/utils/add","f64/utils/multiply"],"daxpy"]),{hi:m,lo:p}=rr(new Float64Array([e])),c=null,g=null,w=null,h=null,b=null,y=null,v=null;try{if(u)c=o._buf,g=o._loBuf,w=i._buf,h=i._loBuf;else{let F=rr(o),W=rr(i);c=x(r,F.hi,"daxpy-xHi",!1),g=x(r,F.lo,"daxpy-xLo",!1),w=x(r,W.hi,"daxpy-yHi",!0),h=x(r,W.lo,"daxpy-yLo",!0)}b=I(r,[{value:t,type:"u32"},{value:m[0],type:"f32"},{value:p[0],type:"f32"},{value:a,type:"u32"},{value:s,type:"u32"}],"daxpy-params");let _=E(r,l.getBindGroupLayout(0),[c,g,w,h,b]),{commandEncoder:S,ts:k}=j(r,l,_,cr(r,t));y=n?null:G(r,S,w),v=n?null:G(r,S,h),M(r,S);let B=await P(k);if(n)return B!==void 0?{gpuTimeMs:B}:{};let L=await A(y,Float32Array);y=null;let C=await A(v,Float32Array);v=null;let R=dr(L,C);return B!==void 0?{y:R,gpuTimeMs:B}:{y:R}}finally{!u&&c&&d(c),!u&&g&&d(g),!n&&w&&d(w),!n&&h&&d(h),b&&d(b),y&&d(y),v&&d(v)}}async function Oo(r,t,e,o,a,i){let s=e instanceof N,u=a instanceof N;if(q(r),T(r,"scopy",{x:e,y:a}),!Number.isInteger(t)||!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&&!(e instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!u&&!(a instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(s!==u)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(t<=0)return u?{}:{y:a};if(e.length<(t-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(a.length<(t-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let n=await D(r,"scopy"),f=null,l=null,m=null,p=null;try{f=s?e._buf:x(r,e,"scopy-x",!1),l=u?a._buf:x(r,a,"scopy-y",!0),m=I(r,[{value:t,type:"u32"},{value:o,type:"u32"},{value:i,type:"u32"}],"scopy-params");let c=E(r,n.getBindGroupLayout(0),[f,l,m]),{commandEncoder:g,ts:w}=j(r,n,c,cr(r,t));p=u?null:G(r,g,l),M(r,g);let h=await P(w);if(u)return h!==void 0?{gpuTimeMs:h}:{};let b=await A(p,Float32Array);return p=null,h!==void 0?{y:b,gpuTimeMs:h}:{y:b}}finally{!s&&f&&d(f),!u&&l&&d(l),m&&d(m),p&&d(p)}}async function Vo(r,t,e,o,a,i){let s=e instanceof N,u=a instanceof N;if(q(r),T(r,"dcopy",{x:e,y:a}),!Number.isInteger(t)||!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(!(e instanceof Float64Array)&&!s)throw new Error("x must be a Float64Array or GpuVector.");if(!(a instanceof Float64Array)&&!u)throw new Error("y must be a Float64Array or GpuVector.");if(s&&e.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(u&&a.dtype!==Float64Array)throw new Error("y must be a Float64Array-backed GpuVector.");if(s!==u)throw new Error("x and y must be the same type (both Float64Array or both GpuVector).");if(t<=0)return u?{}:{y:a};if(e.length<(t-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(a.length<(t-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let n=await D(r,"dcopy"),f=null,l=null,m=null,p=null,c=null,g=null,w=null;try{if(s)f=e._buf,l=e._loBuf,m=a._buf,p=a._loBuf;else{let B=rr(e),L=rr(a);f=x(r,B.hi,"dcopy-xHi",!1),l=x(r,B.lo,"dcopy-xLo",!1),m=x(r,L.hi,"dcopy-yHi",!0),p=x(r,L.lo,"dcopy-yLo",!0)}c=I(r,[{value:t,type:"u32"},{value:o,type:"u32"},{value:i,type:"u32"}],"dcopy-params");let h=E(r,n.getBindGroupLayout(0),[f,l,m,p,c]),{commandEncoder:b,ts:y}=j(r,n,h,cr(r,t));g=u?null:G(r,b,m),w=u?null:G(r,b,p),M(r,b);let v=await P(y);if(u)return v!==void 0?{gpuTimeMs:v}:{};let _=await A(g,Float32Array);g=null;let S=await A(w,Float32Array);w=null;let k=dr(_,S);return v!==void 0?{y:k,gpuTimeMs:v}:{y:k}}finally{!s&&f&&d(f),!s&&l&&d(l),!u&&m&&d(m),!u&&p&&d(p),c&&d(c),g&&d(g),w&&d(w)}}async function Ko(r,t,e,o,a,i){let s=e instanceof N,u=a instanceof N;if(q(r),T(r,"sdot",{x:e,y:a}),!Number.isInteger(t)||!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&&!(e instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!u&&!(a instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(s!==u)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(t<=0)return{dot:0};if(e.length<(t-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(a.length<(t-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let n=await D(r,"sdot"),f=await D(r,"reduction/sum"),l=null,m=null,p=null,c=null,g=null,w=null;try{l=s?e._buf:x(r,e,"sdot-x",!1),m=u?a._buf:x(r,a,"sdot-y",!1),p=tr(r,512,"sdot-partials"),c=Br(r,4,"sdot-result"),g=I(r,[{value:t,type:"u32"},{value:o,type:"u32"},{value:i,type:"u32"}],"sdot-params");let h=E(r,n.getBindGroupLayout(0),[l,m,p,g]),{commandEncoder:b,ts:y}=j(r,n,h,128);M(r,b);let v=E(r,f.getBindGroupLayout(0),[p,c]),{commandEncoder:_,ts:S}=j(r,f,v,1);w=G(r,_,c),M(r,_);let k=A(w,Float32Array);w=null;let[B,L,C]=await Promise.all([P(y),P(S),k]);return B!==void 0&&L!==void 0?{dot:C[0],gpuTimeMs:B+L}:{dot:C[0]}}finally{!s&&l&&d(l),!u&&m&&d(m),p&&d(p),c&&d(c),g&&d(g),w&&d(w)}}async function zo(r,t,e,o){let a=e instanceof N;if(q(r),T(r,"sasum",{x:e}),!Number.isInteger(t)||!Number.isInteger(o))throw new Error("n and incx must be integers.");if(o<=0)throw new Error("incx must be positive.");if(!a&&!(e instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(t<=0)return{asum:0};if(e.length<(t-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");let i=await D(r,"sasum"),s=await D(r,"reduction/sum"),u=null,n=null,f=null,l=null,m=null;try{u=a?e._buf:x(r,e,"sasum-x",!1),n=tr(r,512,"sasum-partials"),f=Br(r,4,"sasum-result"),l=I(r,[{value:t,type:"u32"},{value:o,type:"u32"}],"sasum-params");let p=E(r,i.getBindGroupLayout(0),[u,n,l]),{commandEncoder:c,ts:g}=j(r,i,p,128);M(r,c);let w=E(r,s.getBindGroupLayout(0),[n,f]),{commandEncoder:h,ts:b}=j(r,s,w,1);m=G(r,h,f),M(r,h);let y=A(m,Float32Array);m=null;let[v,_,S]=await Promise.all([P(g),P(b),y]);return v!==void 0&&_!==void 0?{asum:S[0],gpuTimeMs:v+_}:{asum:S[0]}}finally{!a&&u&&d(u),n&&d(n),f&&d(f),l&&d(l),m&&d(m)}}async function Uo(r,t,e,o){let a=e instanceof N;if(q(r),T(r,"dasum",{x:e}),!Number.isInteger(t)||!Number.isInteger(o))throw new Error("n and incx must be integers.");if(o<=0)throw new Error("incx must be positive.");if(!a&&!(e instanceof Float64Array))throw new Error("x must be a Float64Array or GpuVector.");if(a&&e.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(t<=0)return{asum:0};if(e.length<(t-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 D(r,[...i,"dasum"]),u=await D(r,[...i,"reduction/sumF64"]),n=null,f=null,l=null,m=null,p=null,c=null,g=null,w=null,h=null;try{if(a)n=e._buf,f=e._loBuf;else{let{hi:z,lo:H}=rr(e.map(Math.abs));n=x(r,z,"dasum-xHi",!1),f=x(r,H,"dasum-xLo",!1)}l=tr(r,512,"dasum-partialsHi"),m=tr(r,512,"dasum-partialsLo"),p=Br(r,4,"dasum-result-hi"),c=Br(r,4,"dasum-result-lo"),g=I(r,[{value:t,type:"u32"},{value:o,type:"u32"}],"dasum-params");let b=E(r,s.getBindGroupLayout(0),[n,f,l,m,g]),{commandEncoder:y,ts:v}=j(r,s,b,128);M(r,y);let _=E(r,u.getBindGroupLayout(0),[l,m,p,c]),{commandEncoder:S,ts:k}=j(r,u,_,1);w=G(r,S,p),h=G(r,S,c),M(r,S);let B=A(w,Float32Array),L=A(h,Float32Array);w=null,h=null;let[C,R,F,W]=await Promise.all([P(v),P(k),B,L]),V=dr(F,W)[0];return C!==void 0&&R!==void 0?{asum:V,gpuTimeMs:C+R}:{asum:V}}finally{!a&&n&&d(n),!a&&f&&d(f),l&&d(l),m&&d(m),p&&d(p),c&&d(c),g&&d(g),w&&d(w),h&&d(h)}}async function Yo(r,t,e,o,a,i){let s=e instanceof N,u=a instanceof N;if(q(r),T(r,"ddot",{x:e,y:a}),!Number.isInteger(t)||!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&&!(e instanceof Float64Array))throw new Error("x must be a Float64Array or GpuVector.");if(!u&&!(a instanceof Float64Array))throw new Error("y must be a Float64Array or GpuVector.");if(s&&e.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(u&&a.dtype!==Float64Array)throw new Error("y must be a Float64Array-backed GpuVector.");if(s!==u)throw new Error("x and y must be the same type (both Float64Array or both GpuVector).");if(t<=0)return{dot:0};if(e.length<(t-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(a.length<(t-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let n=["f64/dekker","f64/utils/add"],f=await D(r,[...n,"f64/utils/multiply","ddot"]),l=await D(r,[...n,"reduction/sumF64"]),m=null,p=null,c=null,g=null,w=null,h=null,b=null,y=null,v=null,_=null,S=null;try{if(s)m=e._buf,p=e._loBuf,c=a._buf,g=a._loBuf;else{let ir=rr(e),lr=rr(a);m=x(r,ir.hi,"ddot-xHi",!1),p=x(r,ir.lo,"ddot-xLo",!1),c=x(r,lr.hi,"ddot-yHi",!1),g=x(r,lr.lo,"ddot-yLo",!1)}w=tr(r,512,"ddot-partialsHi"),h=tr(r,512,"ddot-partialsLo"),b=Br(r,4,"ddot-result-hi"),y=Br(r,4,"ddot-result-lo"),v=I(r,[{value:t,type:"u32"},{value:o,type:"u32"},{value:i,type:"u32"}],"ddot-params");let k=E(r,f.getBindGroupLayout(0),[m,p,c,g,w,h,v]),{commandEncoder:B,ts:L}=j(r,f,k,128);M(r,B);let C=E(r,l.getBindGroupLayout(0),[w,h,b,y]),{commandEncoder:R,ts:F}=j(r,l,C,1);_=G(r,R,b),S=G(r,R,y),M(r,R);let W=A(_,Float32Array),V=A(S,Float32Array);_=null,S=null;let[z,H,$,K]=await Promise.all([P(L),P(F),W,V]),Y=dr($,K)[0];return z!==void 0&&H!==void 0?{dot:Y,gpuTimeMs:z+H}:{dot:Y}}finally{!s&&m&&d(m),!s&&p&&d(p),!u&&c&&d(c),!u&&g&&d(g),w&&d(w),h&&d(h),b&&d(b),y&&d(y),v&&d(v),_&&d(_),S&&d(S)}}async function Xo(r,t,e,o){let a=e instanceof N;if(q(r),T(r,"snrm2",{x:e}),!Number.isInteger(t)||!Number.isInteger(o))throw new Error("n and incx must be integers.");if(o<=0)throw new Error("incx must be positive.");if(!a&&!(e instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(t<=0)return{nrm2:0};if(e.length<(t-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");let i=await D(r,"snrm2"),s=await D(r,"reduction/scaledSum"),u=null,n=null,f=null,l=null,m=null,p=null;try{u=a?e._buf:x(r,e,"snrm2-x",!1),n=tr(r,512,"snrm2-partials-scale"),f=tr(r,512,"snrm2-partials-ssq"),l=Br(r,4,"snrm2-result"),m=I(r,[{value:t,type:"u32"},{value:o,type:"u32"}],"snrm2-params");let c=E(r,i.getBindGroupLayout(0),[u,n,f,m]),{commandEncoder:g,ts:w}=j(r,i,c,128);M(r,g);let h=E(r,s.getBindGroupLayout(0),[n,f,l]),{commandEncoder:b,ts:y}=j(r,s,h,1);p=G(r,b,l),M(r,b);let v=A(p,Float32Array);p=null;let[_,S,k]=await Promise.all([P(w),P(y),v]),B=k[0];return _!==void 0&&S!==void 0?{nrm2:B,gpuTimeMs:_+S}:{nrm2:B}}finally{!a&&u&&d(u),n&&d(n),f&&d(f),l&&d(l),m&&d(m),p&&d(p)}}async function $o(r,t,e,o){let a=e instanceof N;if(q(r),T(r,"dnrm2",{x:e}),!Number.isInteger(t)||!Number.isInteger(o))throw new Error("n and incx must be integers.");if(o<=0)throw new Error("incx must be positive.");if(!a&&!(e instanceof Float64Array))throw new Error("x must be a Float64Array or GpuVector.");if(a&&e.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(t<=0)return{nrm2:0};if(e.length<(t-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/add","f64/utils/multiply","f64/utils/divide","f64/utils/sqrt"],s=await D(r,[...i,"dnrm2"]),u=await D(r,[...i,"reduction/scaledSumF64"]),n=null,f=null,l=null,m=null,p=null,c=null,g=null,w=null,h=null,b=null,y=null;try{if(a)n=e._buf,f=e._loBuf;else{let{hi:$,lo:K}=rr(e);n=x(r,$,"dnrm2-xHi",!1),f=x(r,K,"dnrm2-xLo",!1)}l=tr(r,512,"dnrm2-partials-scaleHi"),m=tr(r,512,"dnrm2-partials-scaleLo"),p=tr(r,512,"dnrm2-partials-ssqHi"),c=tr(r,512,"dnrm2-partials-ssqLo"),g=Br(r,4,"dnrm2-result-hi"),w=Br(r,4,"dnrm2-result-lo"),h=I(r,[{value:t,type:"u32"},{value:o,type:"u32"}],"dnrm2-params");let v=E(r,s.getBindGroupLayout(0),[n,f,l,m,p,c,h]),{commandEncoder:_,ts:S}=j(r,s,v,128);M(r,_);let k=E(r,u.getBindGroupLayout(0),[l,m,p,c,g,w]),{commandEncoder:B,ts:L}=j(r,u,k,1);b=G(r,B,g),y=G(r,B,w),M(r,B);let C=A(b,Float32Array),R=A(y,Float32Array);b=null,y=null;let[F,W,V,z]=await Promise.all([P(S),P(L),C,R]),H=dr(V,z)[0];return F!==void 0&&W!==void 0?{nrm2:H,gpuTimeMs:F+W}:{nrm2:H}}finally{!a&&n&&d(n),!a&&f&&d(f),l&&d(l),m&&d(m),p&&d(p),c&&d(c),g&&d(g),w&&d(w),h&&d(h),b&&d(b),y&&d(y)}}async function Zo(r,t,e,o){let a=e instanceof N;if(q(r),T(r,"isamax",{x:e}),!Number.isInteger(t)||!Number.isInteger(o))throw new Error("n and incx must be integers.");if(o<=0)throw new Error("incx must be positive.");if(!a&&!(e instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(t<=0)return{index:0};if(e.length<(t-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");let i=await D(r,"isamax"),s=await D(r,"reduction/argmax"),u=null,n=null,f=null,l=null,m=null,p=null;try{u=a?e._buf:x(r,e,"isamax-x",!1),n=tr(r,512,"isamax-partials-val"),f=tr(r,512,"isamax-partials-idx"),l=Br(r,4,"isamax-result"),m=I(r,[{value:t,type:"u32"},{value:o,type:"u32"}],"isamax-params");let c=E(r,i.getBindGroupLayout(0),[u,n,f,m]),{commandEncoder:g,ts:w}=j(r,i,c,128);M(r,g);let h=E(r,s.getBindGroupLayout(0),[n,f,l]),{commandEncoder:b,ts:y}=j(r,s,h,1);p=G(r,b,l),M(r,b);let v=A(p,Uint32Array);p=null;let[_,S,k]=await Promise.all([P(w),P(y),v]),B=k[0];return _!==void 0&&S!==void 0?{index:B,gpuTimeMs:_+S}:{index:B}}finally{!a&&u&&d(u),n&&d(n),f&&d(f),l&&d(l),m&&d(m),p&&d(p)}}async function Qo(r,t,e,o){let a=e instanceof N;if(q(r),T(r,"idamax",{x:e}),!Number.isInteger(t)||!Number.isInteger(o))throw new Error("n and incx must be integers.");if(o<=0)throw new Error("incx must be positive.");if(!a&&!(e instanceof Float64Array))throw new Error("x must be a Float64Array or GpuVector.");if(a&&e.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(t<=0)return{index:0};if(e.length<(t-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 D(r,[...i,"idamax"],"idamax_main"),u=await D(r,[...i,"reduction/argmaxF64"],"reduce_f64"),n=null,f=null,l=null,m=null,p=null,c=null,g=null,w=null;try{if(a)n=e._buf,f=e._loBuf;else{let{hi:F,lo:W}=rr(e);n=x(r,F,"idamax-xHi",!1),f=x(r,W,"idamax-xLo",!1)}l=tr(r,512,"idamax-partials-val-hi"),m=tr(r,512,"idamax-partials-val-lo"),p=tr(r,512,"idamax-partials-idx"),c=Br(r,4,"idamax-result"),g=I(r,[{value:t,type:"u32"},{value:o,type:"u32"}],"idamax-params");let h=E(r,s.getBindGroupLayout(0),[n,f,l,m,p,g]),{commandEncoder:b,ts:y}=j(r,s,h,128);M(r,b);let v=E(r,u.getBindGroupLayout(0),[l,m,p,c]),{commandEncoder:_,ts:S}=j(r,u,v,1);w=G(r,_,c),M(r,_);let k=A(w,Uint32Array);w=null;let[B,L,C]=await Promise.all([P(y),P(S),k]),R=C[0];return B!==void 0&&L!==void 0?{index:R,gpuTimeMs:B+L}:{index:R}}finally{!a&&n&&d(n),!a&&f&&d(f),l&&d(l),m&&d(m),p&&d(p),c&&d(c),g&&d(g),w&&d(w)}}async function Jo(r,t,e,o,a,i,s,u){let n=e instanceof N,f=a instanceof N;if(q(r),T(r,"srot",{x:e,y:a}),!Number.isInteger(t)||!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 u!="number")throw new Error("s must be a number.");if(Number.isNaN(s)||Number.isNaN(u))throw new Error("c and s must not be NaN.");if(!Number.isFinite(s))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(!n&&!(e instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!f&&!(a instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(n!==f)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(t<=0)return n?{}:{x:e,y:a};if(e.length<(t-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(a.length<(t-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let l=await D(r,"srot"),m=null,p=null,c=null,g=null,w=null;try{m=n?e._buf:x(r,e,"srot-x",!0),p=f?a._buf:x(r,a,"srot-y",!0),c=I(r,[{value:t,type:"u32"},{value:s,type:"f32"},{value:u,type:"f32"},{value:o,type:"u32"},{value:i,type:"u32"}],"srot-params");let h=E(r,l.getBindGroupLayout(0),[m,p,c]),{commandEncoder:b,ts:y}=j(r,l,h,cr(r,t));g=n?null:G(r,b,m),w=f?null:G(r,b,p),M(r,b);let v=await P(y);if(n)return v!==void 0?{gpuTimeMs:v}:{};let _=A(g,Float32Array),S=A(w,Float32Array);g=null,w=null;let[k,B]=await Promise.all([_,S]);return v!==void 0?{x:k,y:B,gpuTimeMs:v}:{x:k,y:B}}finally{!n&&m&&d(m),!f&&p&&d(p),c&&d(c),g&&d(g),w&&d(w)}}async function ra(r,t,e,o,a,i,s,u){let n=e instanceof N,f=a instanceof N;if(q(r),T(r,"drot",{x:e,y:a}),!Number.isInteger(t)||!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 u!="number")throw new Error("s must be a number.");if(Number.isNaN(s)||Number.isNaN(u))throw new Error("c and s must not be NaN.");if(!Number.isFinite(s))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(!(e instanceof Float64Array)&&!n)throw new Error("x must be a Float64Array or GpuVector.");if(!(a instanceof Float64Array)&&!f)throw new Error("y must be a Float64Array or GpuVector.");if(n&&e.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(f&&a.dtype!==Float64Array)throw new Error("y must be a Float64Array-backed GpuVector.");if(n!==f)throw new Error("x and y must be the same type (both Float64Array or both GpuVector).");if(t<=0)return n?{}:{x:e,y:a};if(e.length<(t-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(a.length<(t-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let m=await D(r,[...["f64/dekker","f64/utils/add","f64/utils/multiply"],"drot"]),{hi:p,lo:c}=rr(new Float64Array([s])),{hi:g,lo:w}=rr(new Float64Array([u])),h=null,b=null,y=null,v=null,_=null,S=null,k=null,B=null,L=null;try{if(n)h=e._buf,b=e._loBuf,y=a._buf,v=a._loBuf;else{let ir=rr(e),lr=rr(a);h=x(r,ir.hi,"drot-xHi",!0),b=x(r,ir.lo,"drot-xLo",!0),y=x(r,lr.hi,"drot-yHi",!0),v=x(r,lr.lo,"drot-yLo",!0)}_=I(r,[{value:t,type:"u32"},{value:p[0],type:"f32"},{value:c[0],type:"f32"},{value:g[0],type:"f32"},{value:w[0],type:"f32"},{value:o,type:"u32"},{value:i,type:"u32"}],"drot-params");let C=E(r,m.getBindGroupLayout(0),[h,b,y,v,_]),{commandEncoder:R,ts:F}=j(r,m,C,cr(r,t));S=n?null:G(r,R,h),k=n?null:G(r,R,b),B=f?null:G(r,R,y),L=f?null:G(r,R,v),M(r,R);let W=await P(F);if(n)return W!==void 0?{gpuTimeMs:W}:{};let V=await A(S,Float32Array);S=null;let z=await A(k,Float32Array);k=null;let H=await A(B,Float32Array);B=null;let $=await A(L,Float32Array);L=null;let K=dr(V,z),Y=dr(H,$);return W!==void 0?{x:K,y:Y,gpuTimeMs:W}:{x:K,y:Y}}finally{!n&&h&&d(h),!n&&b&&d(b),!f&&y&&d(y),!f&&v&&d(v),_&&d(_),S&&d(S),k&&d(k),B&&d(B),L&&d(L)}}async function ea(r,t,e,o,a,i,s){let u=e instanceof N,n=a instanceof N;if(q(r),T(r,"srotm",{x:e,y:a}),!Number.isInteger(t)||!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(s[0]!==-2&&s[0]!==-1&&s[0]!==0&&s[0]!==1)throw new Error("param[0] (flag) must be one of -2, -1, 0, or 1.");if(o<=0||i<=0)throw new Error("incx and incy must be positive.");if(!u&&!(e instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!n&&!(a instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(u!==n)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(t<=0||s[0]===-2)return u?{}:{x:e,y:a};if(e.length<(t-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(a.length<(t-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let f=await D(r,"srotm"),l=null,m=null,p=null,c=null,g=null,w=null;try{l=u?e._buf:x(r,e,"srotm-x",!0),m=n?a._buf:x(r,a,"srotm-y",!0),p=x(r,s,"srotm-param",!1),c=I(r,[{value:t,type:"u32"},{value:o,type:"u32"},{value:i,type:"u32"}],"srotm-params");let h=E(r,f.getBindGroupLayout(0),[l,m,p,c]),{commandEncoder:b,ts:y}=j(r,f,h,cr(r,t));g=u?null:G(r,b,l),w=n?null:G(r,b,m),M(r,b);let v=await P(y);if(u)return v!==void 0?{gpuTimeMs:v}:{};let _=A(g,Float32Array),S=A(w,Float32Array);g=null,w=null;let[k,B]=await Promise.all([_,S]);return v!==void 0?{x:k,y:B,gpuTimeMs:v}:{x:k,y:B}}finally{!u&&l&&d(l),!n&&m&&d(m),p&&d(p),c&&d(c),g&&d(g),w&&d(w)}}async function ta(r,t,e,o,a,i,s){let u=e instanceof N,n=a instanceof N;if(q(r),T(r,"drotm",{x:e,y:a}),!Number.isInteger(t)||!Number.isInteger(o)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(!(s instanceof Float64Array)||s.length!==5)throw new Error("param must be a Float64Array of length 5.");if(s[0]!==-2&&s[0]!==-1&&s[0]!==0&&s[0]!==1)throw new Error("param[0] (flag) must be one of -2, -1, 0, or 1.");if(o<=0||i<=0)throw new Error("incx and incy must be positive.");if(!(e instanceof Float64Array)&&!u)throw new Error("x must be a Float64Array or GpuVector.");if(!(a instanceof Float64Array)&&!n)throw new Error("y must be a Float64Array or GpuVector.");if(u&&e.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(n&&a.dtype!==Float64Array)throw new Error("y must be a Float64Array-backed GpuVector.");if(u!==n)throw new Error("x and y must be the same type (both Float64Array or both GpuVector).");if(t<=0||s[0]===-2)return u?{}:{x:e,y:a};if(e.length<(t-1)*o+1)throw new Error("x does not have enough elements for the given n and incx.");if(a.length<(t-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let l=await D(r,[...["f64/dekker","f64/utils/add","f64/utils/multiply"],"drotm"]),{hi:m,lo:p}=rr(s),c=null,g=null,w=null,h=null,b=null,y=null,v=null,_=null,S=null,k=null,B=null;try{if(u)c=e._buf,g=e._loBuf,w=a._buf,h=a._loBuf;else{let Y=rr(e),ir=rr(a);c=x(r,Y.hi,"drotm-xHi",!0),g=x(r,Y.lo,"drotm-xLo",!0),w=x(r,ir.hi,"drotm-yHi",!0),h=x(r,ir.lo,"drotm-yLo",!0)}b=x(r,m,"drotm-paramHi",!1),y=x(r,p,"drotm-paramLo",!1),v=I(r,[{value:t,type:"u32"},{value:o,type:"u32"},{value:i,type:"u32"}],"drotm-params");let L=E(r,l.getBindGroupLayout(0),[c,g,w,h,b,y,v]),{commandEncoder:C,ts:R}=j(r,l,L,cr(r,t));_=u?null:G(r,C,c),S=u?null:G(r,C,g),k=n?null:G(r,C,w),B=n?null:G(r,C,h),M(r,C);let F=await P(R);if(u)return F!==void 0?{gpuTimeMs:F}:{};let W=await A(_,Float32Array);_=null;let V=await A(S,Float32Array);S=null;let z=await A(k,Float32Array);k=null;let H=await A(B,Float32Array);B=null;let $=dr(W,V),K=dr(z,H);return F!==void 0?{x:$,y:K,gpuTimeMs:F}:{x:$,y:K}}finally{!u&&c&&d(c),!u&&g&&d(g),!n&&w&&d(w),!n&&h&&d(h),b&&d(b),y&&d(y),v&&d(v),_&&d(_),S&&d(S),k&&d(k),B&&d(B)}}async function oa(r,t,e,o,a,i,s,u,n,f,l,m,p="row-major"){let c=i instanceof X,g=u instanceof N,w=l instanceof N;if(q(r),T(r,"sgemv",{A:i,x:u,y:l}),t!=="no-transpose"&&t!=="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 a!="number")throw new Error("alpha must be a number.");if(Number.isNaN(a))throw new Error("alpha must not be NaN.");if(!Number.isFinite(a))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(e)||!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(!g&&!(u instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!w&&!(l 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&&!c)throw new Error("A must be a GpuMatrix when x and y are GpuVectors.");if(c&&!g)throw new Error("x and y must be GpuVectors when A is a GpuMatrix.");if(g&&u._buf===l._buf)throw new Error("x and y must not reference the same GPU buffer when both are GpuVectors.");if(c&&w&&i._buf===l._buf)throw new Error("A and y must not reference the same GPU buffer.");if(c&&s!==i.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(c&&(i.rows<e||i.cols<o))throw new Error("A is too small for the given m and n.");if(e<0||o<0)throw new Error("m and n must be non-negative.");if(e===0||o===0)return w?{}:{y:l};(c?i.layout:p)==="column-major"&&([e,o]=[o,e],t=t==="no-transpose"?"transpose":"no-transpose");let b=t==="no-transpose",y=b?o:e,v=b?e:o;if(s<o)throw new Error("lda must be >= n.");if(!c&&i.length<(e-1)*s+o)throw new Error("A does not have enough elements for the given m, n, and lda.");if(u.length<(y-1)*n+1)throw new Error("x does not have enough elements for the given dimensions and incx.");if(l.length<(v-1)*m+1)throw new Error("y does not have enough elements for the given dimensions and incy.");let S=await D(r,b?"sgemv_n":"sgemv_t"),k=null,B=null,L=null,C=null;try{k=c?i._buf:x(r,i,"sgemv-A",!1),B=g?u._buf:x(r,u,"sgemv-x",!1),L=w?l._buf:x(r,l,"sgemv-y",!0),C=I(r,[{value:e,type:"u32"},{value:o,type:"u32"},{value:a,type:"f32"},{value:f,type:"f32"},{value:n,type:"u32"},{value:m,type:"u32"},{value:s,type:"u32"}],"sgemv-params");let R=E(r,S.getBindGroupLayout(0),[k,B,L,C]),F=b?Math.min(e,r.limits.maxComputeWorkgroupsPerDimension):Zr(r,"sgemv",v),{commandEncoder:W,ts:V}=j(r,S,R,F),z=w?null:G(r,W,L);M(r,W);let H=await P(V);if(w)return H!==void 0?{gpuTimeMs:H}:{};let $=await A(z,Float32Array);return H!==void 0?{y:$,gpuTimeMs:H}:{y:$}}finally{!c&&k&&d(k),!g&&B&&d(B),!w&&L&&d(L),C&&d(C)}}async function aa(r,t,e,o,a,i,s,u,n,f,l,m="row-major"){let p=s instanceof N,c=f instanceof N,g=a instanceof X;if(q(r),T(r,"ssymv",{A:a,x:s,y:f}),t!=="lower"&&t!=="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(e)||!Number.isInteger(u)||!Number.isInteger(l)||!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(u<=0||l<=0)throw new Error("incx and incy must be positive.");if(i<e)throw new Error("lda must be >= n.");if(!g&&!(a instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!p&&!(s instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!c&&!(f instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(p!==c)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(g&&!p)throw new Error("x and y must be GpuVectors when A is a GpuMatrix.");if(p&&s._buf===f._buf)throw new Error("x and y must not reference the same GPU buffer when both are GpuVectors.");if(g&&i!==a.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(g&&(a.rows<e||a.cols<e))throw new Error("A is too small for the given n.");if(e<0)throw new Error("n must be non-negative.");if(e===0)return c?{}:{y:f};if(!g&&a.length<(e-1)*i+e)throw new Error("A does not have enough elements for the given n and lda.");if(s.length<(e-1)*u+1)throw new Error("x does not have enough elements for the given n and incx.");if(f.length<(e-1)*l+1)throw new Error("y does not have enough elements for the given n and incy.");let h=(g?a.layout:m)==="column-major"?t==="upper":t==="lower",b=await D(r,"ssymv"),y=null,v=null,_=null,S=null;try{y=g?a._buf:x(r,a,"ssymv-A",!1),v=p?s._buf:x(r,s,"ssymv-x",!1),_=c?f._buf:x(r,f,"ssymv-y",!0),S=I(r,[{value:e,type:"u32"},{value:o,type:"f32"},{value:n,type:"f32"},{value:u,type:"u32"},{value:l,type:"u32"},{value:i,type:"u32"},{value:h?0:1,type:"u32"}],"ssymv-params");let k=E(r,b.getBindGroupLayout(0),[y,v,_,S]),B=Math.min(e,r.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:L,ts:C}=j(r,b,k,B),R=c?null:G(r,L,_);M(r,L);let F=await P(C);if(c)return F!==void 0?{gpuTimeMs:F}:{};let W=await A(R,Float32Array);return F!==void 0?{y:W,gpuTimeMs:F}:{y:W}}finally{!g&&y&&d(y),!p&&v&&d(v),!c&&_&&d(_),S&&d(S)}}async function ia(r,t,e,o,a,i,s,u,n,f,l,m="row-major"){let p=u instanceof N,c=f instanceof N,g=i instanceof X,w=o==="unit";if(q(r),T(r,"strmv",{A:i,x:u,y:f}),t!=="lower"&&t!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(e!=="no-transpose"&&e!=="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(m!=="row-major"&&m!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(!Number.isInteger(a)||!Number.isInteger(n)||!Number.isInteger(l)||!Number.isInteger(s))throw new Error("n, incx, incy, and lda must be integers.");if(n<=0||l<=0)throw new Error("incx and incy must be positive.");if(s<a)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(!c&&!(f instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(p!==c)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(p&&u._buf===f._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&&!p)throw new Error("x and y must be GpuVectors when A is a GpuMatrix.");if(g&&c&&i._buf===f._buf)throw new Error("A and y must not reference the same GPU buffer.");if(g&&s!==i.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(g&&(i.rows<a||i.cols<a))throw new Error("A is too small for the given n.");if(a<0)throw new Error("n must be non-negative.");if(a===0)return c?{}:{y:f};if(!g&&i.length<(a-1)*s+a)throw new Error("A does not have enough elements for the given n and lda.");if(u.length<(a-1)*n+1)throw new Error("x does not have enough elements for the given n and incx.");if(f.length<(a-1)*l+1)throw new Error("y does not have enough elements for the given n and incy.");let b=(g?i.layout:m)==="column-major",y=b?t==="upper":t==="lower",v=b?e==="transpose":e==="no-transpose",_=await D(r,"strmv"),S=null,k=null,B=null,L=null;try{S=g?i._buf:x(r,i,"strmv-A",!1),k=p?u._buf:x(r,u,"strmv-x",!1),B=c?f._buf:x(r,f,"strmv-y",!0),L=I(r,[{value:a,type:"u32"},{value:n,type:"u32"},{value:l,type:"u32"},{value:s,type:"u32"},{value:v?0:1,type:"u32"},{value:y?0:1,type:"u32"},{value:w?1:0,type:"u32"}],"strmv-params");let C=E(r,_.getBindGroupLayout(0),[S,k,B,L]),R=Math.min(a,r.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:F,ts:W}=j(r,_,C,R),V=c?null:G(r,F,B);M(r,F);let z=await P(W);if(c)return z!==void 0?{gpuTimeMs:z}:{};let H=await A(V,Float32Array);return z!==void 0?{y:H,gpuTimeMs:z}:{y:H}}finally{!g&&S&&d(S),!p&&k&&d(k),!c&&B&&d(B),L&&d(L)}}function sa(r,t,e){let o=new ArrayBuffer(r*t),a=new DataView(o);for(let i=0;i<r;i++){let s=e(i),u=i*t;s.forEach((n,f)=>a.setUint32(u+f*4,n,!0))}return o}function na(r,t,e){let o=r.createBuffer({label:e,size:t.byteLength,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});return r.queue.writeBuffer(o,0,t),o}async function la(r,t,e,o,a,i,s,u,n,f="row-major"){let l=u instanceof N,m=i instanceof X,p=o==="unit";if(q(r),T(r,"strsv",{A:i,x:u}),t!=="lower"&&t!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(e!=="no-transpose"&&e!=="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(f!=="row-major"&&f!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(!Number.isInteger(a)||!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<a)throw new Error("lda must be >= n.");if(!m&&!(i instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!l&&!(u instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(l&&!m)throw new Error("A must be a GpuMatrix when x is a GpuVector.");if(m&&!l)throw new Error("x must be a GpuVector when A is a GpuMatrix.");if(m&&l&&i._buf===u._buf)throw new Error("A and x must not reference the same GPU buffer.");if(m&&s!==i.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(m&&(i.rows<a||i.cols<a))throw new Error("A is too small for the given n.");if(a<0)throw new Error("n must be non-negative.");if(a===0)return l?{}:{x:u};if(!m&&i.length<(a-1)*s+a)throw new Error("A does not have enough elements for the given n and lda.");if(u.length<(a-1)*n+1)throw new Error("x does not have enough elements for the given n and incx.");let g=(m?i.layout:f)==="column-major",w=g?t==="upper":t==="lower",h=g?e==="transpose":e==="no-transpose",b=await D(r,"strsv_invert_block"),y=await D(r,"strsv_apply_inverse"),v=await D(r,"strsv_update"),_=h===w,S=[];for(let H=0;H<a;H+=64)S.push(H);_||S.reverse();let k=S.length,B=r.limits.maxComputeWorkgroupsPerDimension,L=r.limits.minUniformBufferOffsetAlignment,C=null,R=null,F=null,W=null,V=null,z=null;try{C=m?i._buf:x(r,i,"strsv-A",!1),R=l?u._buf:x(r,u,"strsv-x",!0),F=tr(r,k*64*64*4,"strsv-Ainv");let H=sa(k,L,er=>{let Z=er*64,J=Math.min(Z+64,a);return[n,er,Z,J]});W=na(r,H,"strsv-apply-params");let $=sa(k,L,er=>{let Z=er*64,J=Math.min(Z+64,a);return[a,n,s,h?0:1,w?0:1,Z,J]});V=na(r,$,"strsv-update-params");let{commandEncoder:K,querySet:Y}=qr(r);z=I(r,[{value:a,type:"u32"},{value:s,type:"u32"},{value:h?0:1,type:"u32"},{value:w?0:1,type:"u32"},{value:p?1:0,type:"u32"}],"strsv-invert-params");let ir=E(r,b.getBindGroupLayout(0),[C,F,z]);gr(K,b,ir,{x:64,y:k},Y?{timestampWrites:{querySet:Y,beginningOfPassWriteIndex:0}}:void 0);for(let er=0;er<S.length;er++){let Z=S[er],J=Math.min(Z+64,a),sr=Z/64,pr=er===S.length-1,br=sr*L,fr=E(r,y.getBindGroupLayout(0),[F,R,{buffer:W,offset:br,size:16}]);gr(K,y,fr,1,pr&&Y?{timestampWrites:{querySet:Y,endOfPassWriteIndex:1}}:void 0);let yr=_?a-J:Z;if(yr===0)continue;let Cr=E(r,v.getBindGroupLayout(0),[C,R,{buffer:V,offset:br,size:32}]),Rr=Math.min(yr,B);gr(K,v,Cr,Rr)}let hr=Lr(r,K,Y),nr=l?null:G(r,K,R);M(r,K);let mr=await P(hr);if(l)return mr!==void 0?{gpuTimeMs:mr}:{};let Q=await A(nr,Float32Array);return mr!==void 0?{x:Q,gpuTimeMs:mr}:{x:Q}}finally{!m&&C&&d(C),!l&&R&&d(R),F&&d(F),W&&d(W),V&&d(V),z&&d(z)}}async function ua(r,t,e,o,a,i,s,u,n,f,l="row-major"){let m=n instanceof X;if(q(r),T(r,"sger",{A:n,x:a,y:s}),l!=="row-major"&&l!=="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(t)||!Number.isInteger(e)||!Number.isInteger(i)||!Number.isInteger(u)||!Number.isInteger(f))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(!m&&!(n instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(m&&f!==n.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(m&&(n.rows<t||n.cols<e))throw new Error("A is too small for the given m and n.");(m?n.layout:l)==="column-major"&&([t,e]=[e,t],[a,s]=[s,a],[i,u]=[u,i]);let c=a instanceof N,g=s instanceof N;if(f<e)throw new Error("lda must be >= n.");if(!c&&!(a instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!g&&!(s instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(c!==g)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===a._buf)throw new Error("A and x must not reference the same GPU buffer.");if(m&&g&&n._buf===s._buf)throw new Error("A and y must not reference the same GPU buffer.");if(t<0||e<0)throw new Error("m and n must be non-negative.");if(t===0||e===0)return m?{}:{A:n};if(!m&&n.length<(t-1)*f+e)throw new Error("A does not have enough elements for the given m, n, and lda.");if(a.length<(t-1)*i+1)throw new Error("x does not have enough elements for the given m and incx.");if(s.length<(e-1)*u+1)throw new Error("y does not have enough elements for the given n and incy.");let w=await D(r,"sger"),h=null,b=null,y=null,v=null;try{h=c?a._buf:x(r,a,"sger-x",!1),b=g?s._buf:x(r,s,"sger-y",!1),y=m?n._buf:x(r,n,"sger-A",!0),v=I(r,[{value:t,type:"u32"},{value:e,type:"u32"},{value:o,type:"f32"},{value:i,type:"u32"},{value:u,type:"u32"},{value:f,type:"u32"}],"sger-params");let _=E(r,w.getBindGroupLayout(0),[h,b,y,v]),S=Math.min(t,r.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:k,ts:B}=j(r,w,_,S),L=m?null:G(r,k,y);M(r,k);let C=await P(B);if(m)return C!==void 0?{gpuTimeMs:C}:{};let R=await A(L,Float32Array);return C!==void 0?{A:R,gpuTimeMs:C}:{A:R}}finally{!c&&h&&d(h),!g&&b&&d(b),!m&&y&&d(y),v&&d(v)}}async function fa(r,t,e,o,a,i,s,u,n="row-major"){let f=a instanceof N,l=s instanceof X;if(q(r),T(r,"ssyr",{A:s,x:a}),t!=="lower"&&t!=="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(e)||!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<e)throw new Error("lda must be >= n.");if(!l&&!(s instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!f&&!(a instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(f&&!l)throw new Error("A must be a GpuMatrix when x is a GpuVector.");if(l&&!f)throw new Error("x must be a GpuVector when A is a GpuMatrix.");if(l&&f&&s._buf===a._buf)throw new Error("A and x must not reference the same GPU buffer.");if(l&&u!==s.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(l&&(s.rows<e||s.cols<e))throw new Error("A is too small for the given n.");if(e<0)throw new Error("n must be non-negative.");if(e===0)return l?{}:{A:s};if(!l&&s.length<(e-1)*u+e)throw new Error("A does not have enough elements for the given n and lda.");if(a.length<(e-1)*i+1)throw new Error("x does not have enough elements for the given n and incx.");let p=(l?s.layout:n)==="column-major"?t==="upper":t==="lower",c=await D(r,"ssyr"),g=null,w=null,h=null;try{g=f?a._buf:x(r,a,"ssyr-x",!1),w=l?s._buf:x(r,s,"ssyr-A",!0),h=I(r,[{value:e,type:"u32"},{value:o,type:"f32"},{value:i,type:"u32"},{value:u,type:"u32"},{value:p?0:1,type:"u32"}],"ssyr-params");let b=E(r,c.getBindGroupLayout(0),[g,w,h]),y=Math.min(e,r.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:v,ts:_}=j(r,c,b,y),S=l?null:G(r,v,w);M(r,v);let k=await P(_);if(l)return k!==void 0?{gpuTimeMs:k}:{};let B=await A(S,Float32Array);return k!==void 0?{A:B,gpuTimeMs:k}:{A:B}}finally{!f&&g&&d(g),!l&&w&&d(w),h&&d(h)}}async function ma(r,t,e,o,a,i,s,u,n,f,l="row-major"){let m=a instanceof N,p=s instanceof N,c=n instanceof X;if(q(r),T(r,"ssyr2",{A:n,x:a,y:s}),t!=="lower"&&t!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(l!=="row-major"&&l!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(!Number.isInteger(e)||!Number.isInteger(i)||!Number.isInteger(u)||!Number.isInteger(f))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(f<e)throw new Error("lda must be >= n.");if(!c&&!(n instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!m&&!(a 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(m!==p)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===a._buf)throw new Error("A and x must not reference the same GPU buffer.");if(c&&p&&n._buf===s._buf)throw new Error("A and y must not reference the same GPU buffer.");if(m&&a._buf===s._buf)throw new Error("x and y must not reference the same GPU buffer when both are GpuVectors.");if(c&&f!==n.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(c&&(n.rows<e||n.cols<e))throw new Error("A is too small for the given n.");if(e<0)throw new Error("n must be non-negative.");if(e===0)return c?{}:{A:n};if(!c&&n.length<(e-1)*f+e)throw new Error("A does not have enough elements for the given n and lda.");if(a.length<(e-1)*i+1)throw new Error("x does not have enough elements for the given n and incx.");if(s.length<(e-1)*u+1)throw new Error("y does not have enough elements for the given n and incy.");let w=(c?n.layout:l)==="column-major"?t==="upper":t==="lower",h=await D(r,"ssyr2"),b=null,y=null,v=null,_=null;try{b=m?a._buf:x(r,a,"ssyr2-x",!1),y=p?s._buf:x(r,s,"ssyr2-y",!1),v=c?n._buf:x(r,n,"ssyr2-A",!0),_=I(r,[{value:e,type:"u32"},{value:o,type:"f32"},{value:i,type:"u32"},{value:u,type:"u32"},{value:f,type:"u32"},{value:w?0:1,type:"u32"}],"ssyr2-params");let S=E(r,h.getBindGroupLayout(0),[b,y,v,_]),k=Math.min(e,r.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:B,ts:L}=j(r,h,S,k),C=c?null:G(r,B,v);M(r,B);let R=await P(L);if(c)return R!==void 0?{gpuTimeMs:R}:{};let F=await A(C,Float32Array);return R!==void 0?{A:F,gpuTimeMs:R}:{A:F}}finally{!m&&b&&d(b),!p&&y&&d(y),!c&&v&&d(v),_&&d(_)}}async function da(r,t,e,o,a,i,s,u,n,f,l,m,p,c,g="row-major"){let w=u instanceof X,h=f instanceof X,b=p instanceof X;if(q(r),T(r,"sgemm",{A:u,B:f,C:p}),t!=="no-transpose"&&t!=="transpose")throw new Error("transA must be 'no-transpose' or 'transpose'.");if(e!=="no-transpose"&&e!=="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 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(a)||!Number.isInteger(i)||!Number.isInteger(n)||!Number.isInteger(l)||!Number.isInteger(c))throw new Error("m, n, k, lda, ldb, and ldc must be integers.");if(!w&&!(u instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!h&&!(f instanceof Float32Array))throw new Error("B must be a Float32Array or GpuMatrix.");if(!b&&!(p instanceof Float32Array))throw new Error("C must be a Float32Array or GpuMatrix.");if((w||h)&&!b)throw new Error("C must be a GpuMatrix when A or B is a GpuMatrix.");if(b&&(!w||!h))throw new Error("A and B must be GpuMatrix when C is a GpuMatrix.");if(o<0||a<0||i<0)throw new Error("m, n, and k must be non-negative.");if(n<=0||l<=0||c<=0)throw new Error("lda, ldb, and ldc must be positive.");if(o===0||a===0)return b?{}:{C:p};let y=w?u.layout:g,v=h?f.layout:g,_=b?p.layout:g,S=y==="column-major"?i:o,k=y==="column-major"?o:i,B=t==="no-transpose"?S:k,L=t==="no-transpose"?k:S;if(n<L)throw new Error(`lda must be >= ${y==="column-major"?"rows":"cols"} of A as stored.`);if(w){if(n!==u.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");let[J,sr]=t==="no-transpose"?[o,i]:[i,o];if(u.rows<J||u.cols<sr)throw new Error("A is too small for the given m, k, and transA.")}else if(u.length<(B-1)*n+L)throw new Error("A does not have enough elements for the given dimensions and lda.");let C=v==="column-major"?a:i,R=v==="column-major"?i:a,F=e==="no-transpose"?C:R,W=e==="no-transpose"?R:C;if(l<W)throw new Error(`ldb must be >= ${v==="column-major"?"rows":"cols"} of B as stored.`);if(h){if(l!==f.lda)throw new Error("ldb must match B.lda when B is a GpuMatrix.");let[J,sr]=e==="no-transpose"?[i,a]:[a,i];if(f.rows<J||f.cols<sr)throw new Error("B is too small for the given n, k, and transB.")}else if(f.length<(F-1)*l+W)throw new Error("B does not have enough elements for the given dimensions and ldb.");let V=_==="column-major"?a:o,z=_==="column-major"?o:a;if(c<z)throw new Error(`ldc must be >= ${_==="column-major"?"rows":"cols"} of C as stored.`);if(b){if(c!==p.lda)throw new Error("ldc must match C.lda when C is a GpuMatrix.");if(p.rows<o||p.cols<a)throw new Error("C is too small for the given m and n.")}else if(p.length<(V-1)*c+z)throw new Error("C does not have enough elements for the given dimensions and ldc.");y==="column-major"&&(t=t==="no-transpose"?"transpose":"no-transpose"),v==="column-major"&&(e=e==="no-transpose"?"transpose":"no-transpose"),_==="column-major"&&([u,f]=[f,u],[w,h]=[h,w],[n,l]=[l,n],[t,e]=[e==="no-transpose"?"transpose":"no-transpose",t==="no-transpose"?"transpose":"no-transpose"],[o,a]=[a,o]);let H=Math.ceil(a/64),$=Math.ceil(o/64),K=H*$>=36,Y=await D(r,K?"sgemm_large":"sgemm_small"),ir=w?u._buf:x(r,u,"sgemm-A",!1),lr=h?f._buf:x(r,f,"sgemm-B",!1),hr=b?p._buf:x(r,p,"sgemm-C",!0),nr=t==="no-transpose",mr=e==="no-transpose",Q=nr&&Ee(ir,n,o,i),er=Ee(lr,l,mr?i:a,mr?a:i),Z=I(r,[{value:o,type:"u32"},{value:a,type:"u32"},{value:i,type:"u32"},{value:s,type:"f32"},{value:m,type:"f32"},{value:n,type:"u32"},{value:l,type:"u32"},{value:c,type:"u32"},{value:t==="transpose"?1:0,type:"u32"},{value:e==="transpose"?1:0,type:"u32"},{value:Q?1:0,type:"u32"},{value:er?1:0,type:"u32"}],"sgemm-params");try{let J=E(r,Y.getBindGroupLayout(0),[ir,Ar(r,ir),lr,Ar(r,lr),hr,Z]),sr=K?{x:U(r,H,"sgemm","x"),y:U(r,$,"sgemm","y")}:{x:U(r,Math.ceil(a/32),"sgemm","x"),y:U(r,Math.ceil(o/32),"sgemm","y")},{commandEncoder:pr,ts:br}=j(r,Y,J,sr),fr=b?null:G(r,pr,hr);M(r,pr);let ur=await P(br);if(b)return ur!==void 0?{gpuTimeMs:ur}:{};let yr=await A(fr,Float32Array);return ur!==void 0?{C:yr,gpuTimeMs:ur}:{C:yr}}finally{w||d(ir),h||d(lr),b||d(hr),d(Z)}}async function ca(r,t,e,o,a,i,s,u,n,f,l,m,p,c,g,w="row-major"){let h=n instanceof X,b=l instanceof X,y=c instanceof X;if(q(r),T(r,"sgemmtr",{A:n,B:l,C:c}),t!=="lower"&&t!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(e!=="no-transpose"&&e!=="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(w!=="row-major"&&w!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(typeof u!="number")throw new Error("alpha must be a number.");if(Number.isNaN(u))throw new Error("alpha must not be NaN.");if(!Number.isFinite(u))throw new Error("alpha must be finite.");if(typeof p!="number")throw new Error("beta must be a number.");if(Number.isNaN(p))throw new Error("beta must not be NaN.");if(!Number.isFinite(p))throw new Error("beta must be finite.");if(!Number.isInteger(a)||!Number.isInteger(i)||!Number.isInteger(s)||!Number.isInteger(f)||!Number.isInteger(m)||!Number.isInteger(g))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&&!(l instanceof Float32Array))throw new Error("B must be a Float32Array or GpuMatrix.");if(!y&&!(c instanceof Float32Array))throw new Error("C must be a Float32Array or GpuMatrix.");if((h||b)&&!y)throw new Error("C must be a GpuMatrix when A or B is a GpuMatrix.");if(y&&(!h||!b))throw new Error("A and B must be GpuMatrix when C is a GpuMatrix.");if(a<0||i<0||s<0)throw new Error("m, n, and k must be non-negative.");if(f<=0||m<=0||g<=0)throw new Error("lda, ldb, and ldc must be positive.");if(a===0||i===0)return y?{}:{C:c};let v=h?n.layout:w,_=b?l.layout:w,S=y?c.layout:w,k=v==="column-major"?s:a,B=v==="column-major"?a:s,L=e==="no-transpose"?k:B,C=e==="no-transpose"?B:k;if(f<C)throw new Error(`lda must be >= ${v==="column-major"?"rows":"cols"} of A as stored.`);if(h){if(f!==n.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");let[Q,er]=e==="no-transpose"?[a,s]:[s,a];if(n.rows<Q||n.cols<er)throw new Error("A is too small for the given m, k, and transA.")}else if(n.length<(L-1)*f+C)throw new Error("A does not have enough elements for the given dimensions and lda.");let R=_==="column-major"?i:s,F=_==="column-major"?s:i,W=o==="no-transpose"?R:F,V=o==="no-transpose"?F:R;if(m<V)throw new Error(`ldb must be >= ${_==="column-major"?"rows":"cols"} of B as stored.`);if(b){if(m!==l.lda)throw new Error("ldb must match B.lda when B is a GpuMatrix.");let[Q,er]=o==="no-transpose"?[s,i]:[i,s];if(l.rows<Q||l.cols<er)throw new Error("B is too small for the given n, k, and transB.")}else if(l.length<(W-1)*m+V)throw new Error("B does not have enough elements for the given dimensions and ldb.");let z=S==="column-major"?i:a,H=S==="column-major"?a:i;if(g<H)throw new Error(`ldc must be >= ${S==="column-major"?"rows":"cols"} of C as stored.`);if(y){if(g!==c.lda)throw new Error("ldc must match C.lda when C is a GpuMatrix.");if(c.rows<a||c.cols<i)throw new Error("C is too small for the given m and n.")}else if(c.length<(z-1)*g+H)throw new Error("C does not have enough elements for the given dimensions and ldc.");v==="column-major"&&(e=e==="no-transpose"?"transpose":"no-transpose"),_==="column-major"&&(o=o==="no-transpose"?"transpose":"no-transpose"),S==="column-major"&&([n,l]=[l,n],[h,b]=[b,h],[f,m]=[m,f],[e,o]=[o==="no-transpose"?"transpose":"no-transpose",e==="no-transpose"?"transpose":"no-transpose"],[a,i]=[i,a],t=t==="lower"?"upper":"lower");let $=Math.ceil(i/64),K=Math.ceil(a/64),Y=$*K>=36,ir=await D(r,Y?"sgemmtr_large":"sgemmtr_small"),lr=h?n._buf:x(r,n,"sgemmtr-A",!1),hr=b?l._buf:x(r,l,"sgemmtr-B",!1),nr=y?c._buf:x(r,c,"sgemmtr-C",!0),mr=I(r,[{value:a,type:"u32"},{value:i,type:"u32"},{value:s,type:"u32"},{value:u,type:"f32"},{value:p,type:"f32"},{value:f,type:"u32"},{value:m,type:"u32"},{value:g,type:"u32"},{value:e==="transpose"?1:0,type:"u32"},{value:o==="transpose"?1:0,type:"u32"},{value:t==="upper"?1:0,type:"u32"}],"sgemmtr-params");try{let Q=E(r,ir.getBindGroupLayout(0),[lr,hr,nr,mr]),er=Y?{x:U(r,$,"sgemmtr","x"),y:U(r,K,"sgemmtr","y")}:{x:U(r,Math.ceil(i/32),"sgemmtr","x"),y:U(r,Math.ceil(a/32),"sgemmtr","y")},{commandEncoder:Z,ts:J}=j(r,ir,Q,er),sr=y?null:G(r,Z,nr);M(r,Z);let pr=await P(J);if(y)return pr!==void 0?{gpuTimeMs:pr}:{};let br=await A(sr,Float32Array);return pr!==void 0?{C:br,gpuTimeMs:pr}:{C:br}}finally{h||d(lr),b||d(hr),y||d(nr),d(mr)}}async function pa(r,t,e,o,a,i,s,u,n,f,l,m="row-major"){let p=s instanceof X,c=f instanceof X;if(q(r),T(r,"ssyrk",{A:s,C:f}),t!=="lower"&&t!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(e!=="no-transpose"&&e!=="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(a)||!Number.isInteger(u)||!Number.isInteger(l))throw new Error("n, k, lda, and ldc must be integers.");if(!p&&!(s instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!c&&!(f instanceof Float32Array))throw new Error("C must be a Float32Array or GpuMatrix.");if(p&&!c)throw new Error("C must be a GpuMatrix when A is a GpuMatrix.");if(c&&!p)throw new Error("A must be a GpuMatrix when C is a GpuMatrix.");if(o<0||a<0)throw new Error("n and k must be non-negative.");if(u<=0||l<=0)throw new Error("lda and ldc must be positive.");if(o===0)return c?{}:{C:f};let g=p?s.layout:m,w=c?f.layout:m,h=g==="column-major"?a:o,b=g==="column-major"?o:a,y=e==="no-transpose"?h:b,v=e==="no-transpose"?b:h;if(u<v)throw new Error(`lda must be >= ${g==="column-major"?"rows":"cols"} of A as stored.`);if(p){if(u!==s.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");let[H,$]=e==="no-transpose"?[o,a]:[a,o];if(s.rows<H||s.cols<$)throw new Error("A is too small for the given n, k, and trans.")}else if(s.length<(y-1)*u+v)throw new Error("A does not have enough elements for the given dimensions and lda.");if(l<o)throw new Error("ldc must be >= n.");if(c){if(l!==f.lda)throw new Error("ldc must match C.lda when C is a GpuMatrix.");if(f.rows<o||f.cols<o)throw new Error("C is too small for the given n.")}else if(f.length<(o-1)*l+o)throw new Error("C does not have enough elements for the given dimensions and ldc.");let _=e;g==="column-major"&&(_=_==="no-transpose"?"transpose":"no-transpose");let S=_==="no-transpose"?"transpose":"no-transpose",k=t;w==="column-major"&&([_,S]=[S==="no-transpose"?"transpose":"no-transpose",_==="no-transpose"?"transpose":"no-transpose"],k=k==="lower"?"upper":"lower");let B=Math.ceil(o/64),L=Math.ceil(o/64),C=B*L>=36,R=await D(r,C?"sgemmtr_large":"sgemmtr_small"),F=p?s._buf:x(r,s,"ssyrk-A",!1),W=c?f._buf:x(r,f,"ssyrk-C",!0),V=p?tr(r,F.size,"ssyrk-B",GPUBufferUsage.COPY_DST):x(r,s,"ssyrk-B",!1),z=I(r,[{value:o,type:"u32"},{value:o,type:"u32"},{value:a,type:"u32"},{value:i,type:"f32"},{value:n,type:"f32"},{value:u,type:"u32"},{value:u,type:"u32"},{value:l,type:"u32"},{value:_==="transpose"?1:0,type:"u32"},{value:S==="transpose"?1:0,type:"u32"},{value:k==="upper"?1:0,type:"u32"}],"ssyrk-params");try{let H=E(r,R.getBindGroupLayout(0),[F,V,W,z]),$=C?{x:U(r,B,"ssyrk","x"),y:U(r,L,"ssyrk","y")}:{x:U(r,Math.ceil(o/32),"ssyrk","x"),y:U(r,Math.ceil(o/32),"ssyrk","y")},{commandEncoder:K,querySet:Y,passDescriptor:ir}=qr(r);p&&K.copyBufferToBuffer(F,0,V,0,F.size),gr(K,R,H,$,ir);let lr=Lr(r,K,Y),hr=c?null:G(r,K,W);M(r,K);let nr=await P(lr);if(c)return nr!==void 0?{gpuTimeMs:nr}:{};let mr=await A(hr,Float32Array);return nr!==void 0?{C:mr,gpuTimeMs:nr}:{C:mr}}finally{p||d(F),d(V),c||d(W),d(z)}}async function ga(r,t,e,o,a,i,s,u,n,f,l,m,p,c="row-major"){let g=s instanceof X,w=n instanceof X,h=m instanceof X;if(q(r),T(r,"ssyr2k",{A:s,B:n,C:m}),t!=="lower"&&t!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(e!=="no-transpose"&&e!=="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 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(o)||!Number.isInteger(a)||!Number.isInteger(u)||!Number.isInteger(f)||!Number.isInteger(p))throw new Error("n, k, lda, ldb, and ldc must be integers.");if(!g&&!(s instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!w&&!(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((g||w)&&!h)throw new Error("C must be a GpuMatrix when A or B is a GpuMatrix.");if(h&&(!g||!w))throw new Error("A and B must be GpuMatrix when C is a GpuMatrix.");if(o<0||a<0)throw new Error("n and k must be non-negative.");if(u<=0||f<=0||p<=0)throw new Error("lda, ldb, and ldc must be positive.");if(o===0)return h?{}:{C:m};let b=g?s.layout:c,y=w?n.layout:c,v=h?m.layout:c,_=b==="column-major"?a:o,S=b==="column-major"?o:a,k=e==="no-transpose"?_:S,B=e==="no-transpose"?S:_;if(u<B)throw new Error(`lda must be >= ${b==="column-major"?"rows":"cols"} of A as stored.`);if(g){if(u!==s.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");let[J,sr]=e==="no-transpose"?[o,a]:[a,o];if(s.rows<J||s.cols<sr)throw new Error("A is too small for the given n, k, and trans.")}else if(s.length<(k-1)*u+B)throw new Error("A does not have enough elements for the given dimensions and lda.");let L=y==="column-major"?a:o,C=y==="column-major"?o:a,R=e==="no-transpose"?L:C,F=e==="no-transpose"?C:L;if(f<F)throw new Error(`ldb must be >= ${y==="column-major"?"rows":"cols"} of B as stored.`);if(w){if(f!==n.lda)throw new Error("ldb must match B.lda when B is a GpuMatrix.");let[J,sr]=e==="no-transpose"?[o,a]:[a,o];if(n.rows<J||n.cols<sr)throw new Error("B is too small for the given n, k, and trans.")}else if(n.length<(R-1)*f+F)throw new Error("B does not have enough elements for the given dimensions and ldb.");if(p<o)throw new Error("ldc must be >= n.");if(h){if(p!==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)*p+o)throw new Error("C does not have enough elements for the given dimensions and ldc.");let W=e;b==="column-major"&&(W=W==="no-transpose"?"transpose":"no-transpose");let V=e;y==="column-major"&&(V=V==="no-transpose"?"transpose":"no-transpose");let z=v==="column-major"?t==="lower"?"upper":"lower":t,H=J=>J==="no-transpose"?"transpose":"no-transpose";function $(J,sr,pr,br,fr,ur){let yr=J,Cr=H(br);return v!=="column-major"?{transX:yr,X:sr,ldX:pr,transY:Cr,Y:fr,ldY:ur}:{transX:H(Cr),X:fr,ldX:ur,transY:H(yr),Y:sr,ldY:pr}}let K=Math.ceil(o/64),Y=Math.ceil(o/64),ir=K*Y>=36,lr=await D(r,ir?"sgemmtr_large":"sgemmtr_small"),hr=ir?{x:U(r,K,"ssyr2k","x"),y:U(r,Y,"ssyr2k","y")}:{x:U(r,Math.ceil(o/32),"ssyr2k","x"),y:U(r,Math.ceil(o/32),"ssyr2k","y")},nr=g?s._buf:x(r,s,"ssyr2k-A",!1),mr=w?n._buf:x(r,n,"ssyr2k-B",!1),Q=h?m._buf:x(r,m,"ssyr2k-C",!0),er=null,Z=null;try{let J=$(W,nr,u,V,mr,f),sr=$(V,mr,f,W,nr,u),pr=(Ir,Sr)=>I(r,[{value:o,type:"u32"},{value:o,type:"u32"},{value:a,type:"u32"},{value:i,type:"f32"},{value:Sr,type:"f32"},{value:Ir.ldX,type:"u32"},{value:Ir.ldY,type:"u32"},{value:p,type:"u32"},{value:Ir.transX==="transpose"?1:0,type:"u32"},{value:Ir.transY==="transpose"?1:0,type:"u32"},{value:z==="upper"?1:0,type:"u32"}],"ssyr2k-params");er=pr(J,l),Z=pr(sr,1);let br=E(r,lr.getBindGroupLayout(0),[J.X,J.Y,Q,er]),fr=E(r,lr.getBindGroupLayout(0),[sr.X,sr.Y,Q,Z]),{commandEncoder:ur,querySet:yr}=qr(r),Cr=yr?{timestampWrites:{querySet:yr,beginningOfPassWriteIndex:0}}:void 0,Rr=yr?{timestampWrites:{querySet:yr,endOfPassWriteIndex:1}}:void 0;gr(ur,lr,br,hr,Cr),gr(ur,lr,fr,hr,Rr);let Tr=Lr(r,ur,yr),Er=h?null:G(r,ur,Q);M(r,ur);let vr=await P(Tr);if(h)return vr!==void 0?{gpuTimeMs:vr}:{};let xr=await A(Er,Float32Array);return vr!==void 0?{C:xr,gpuTimeMs:vr}:{C:xr}}finally{g||d(nr),w||d(mr),h||d(Q),er&&d(er),Z&&d(Z)}}async function wa(r,t,e,o,a,i,s,u,n,f,l,m,p,c="row-major"){let g=s instanceof X,w=n instanceof X,h=m instanceof X;if(q(r),T(r,"ssymm",{A:s,B:n,C:m}),t!=="left"&&t!=="right")throw new Error("side must be 'left' or 'right'.");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(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 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(o)||!Number.isInteger(a)||!Number.isInteger(u)||!Number.isInteger(f)||!Number.isInteger(p))throw new Error("m, n, lda, ldb, and ldc must be integers.");if(!g&&!(s instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!w&&!(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((g||w)&&!h)throw new Error("C must be a GpuMatrix when A or B is a GpuMatrix.");if(h&&(!g||!w))throw new Error("A and B must be GpuMatrix when C is a GpuMatrix.");if(o<0||a<0)throw new Error("m and n must be non-negative.");if(o===0||a===0)return h?{}:{C:m};let b=g?s.layout:c,y=w?n.layout:c,v=h?m.layout:c,_=t==="left"?o:a;if(u<_)throw new Error("lda must be >= "+(t==="left"?"m":"n")+".");if(g){if(u!==s.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(s.rows<_||s.cols<_)throw new Error("A is too small for the given m/n and side.")}else if(s.length<(_-1)*u+_)throw new Error("A does not have enough elements for the given dimensions and lda.");let S=y==="column-major"?a:o,k=y==="column-major"?o:a;if(f<k)throw new Error(`ldb must be >= ${y==="column-major"?"rows":"cols"} of B as stored.`);if(w){if(f!==n.lda)throw new Error("ldb must match B.lda when B is a GpuMatrix.");if(n.rows<o||n.cols<a)throw new Error("B is too small for the given m and n.")}else if(n.length<(S-1)*f+k)throw new Error("B does not have enough elements for the given dimensions and ldb.");let B=v==="column-major"?a:o,L=v==="column-major"?o:a;if(p<L)throw new Error(`ldc must be >= ${v==="column-major"?"rows":"cols"} of C as stored.`);if(h){if(p!==m.lda)throw new Error("ldc must match C.lda when C is a GpuMatrix.");if(m.rows<o||m.cols<a)throw new Error("C is too small for the given m and n.")}else if(m.length<(B-1)*p+L)throw new Error("C does not have enough elements for the given dimensions and ldc.");let C=b==="column-major"?e==="lower"?"upper":"lower":e,R=y==="column-major"?"transpose":"no-transpose",F="no-transpose",W=o,V=a,z=_,H=t==="left"?F:R,$=t==="left"?R:F,K=ur=>ur==="no-transpose"?"transpose":"no-transpose",Y=t==="right";v==="column-major"&&([H,$]=[K($),K(H)],Y=!Y,[W,V]=[V,W]);let ir=_,lr=Math.ceil(V/64),hr=Math.ceil(W/64),nr=lr*hr>=36,mr=await D(r,nr?"sgemm_large":"sgemm_small"),Q=await D(r,"symmetrize"),er=nr?{x:U(r,lr,"ssymm","x"),y:U(r,hr,"ssymm","y")}:{x:U(r,Math.ceil(V/32),"ssymm","x"),y:U(r,Math.ceil(W/32),"ssymm","y")},Z=g?s._buf:x(r,s,"ssymm-A",!1),J=w?n._buf:x(r,n,"ssymm-B",!1),sr=h?m._buf:x(r,m,"ssymm-C",!0),pr=tr(r,_*ir*4,"ssymm-Adense"),br=null,fr=null;try{br=I(r,[{value:_,type:"u32"},{value:u,type:"u32"},{value:ir,type:"u32"},{value:C==="upper"?1:0,type:"u32"}],"ssymm-sym-params");let ur=E(r,Q.getBindGroupLayout(0),[Z,pr,br]),yr=Y?J:pr,Cr=Y?f:ir,Rr=Y?pr:J;fr=I(r,[{value:W,type:"u32"},{value:V,type:"u32"},{value:z,type:"u32"},{value:i,type:"f32"},{value:l,type:"f32"},{value:Cr,type:"u32"},{value:Y?ir:f,type:"u32"},{value:p,type:"u32"},{value:H==="transpose"?1:0,type:"u32"},{value:$==="transpose"?1:0,type:"u32"}],"ssymm-gemm-params");let Er=E(r,mr.getBindGroupLayout(0),[yr,Ar(r,yr),Rr,Ar(r,Rr),sr,fr]),{commandEncoder:vr,querySet:xr}=qr(r),Ir=xr?{timestampWrites:{querySet:xr,beginningOfPassWriteIndex:0}}:void 0,Sr=xr?{timestampWrites:{querySet:xr,endOfPassWriteIndex:1}}:void 0;gr(vr,Q,ur,{x:Math.ceil(_/8),y:Math.ceil(_/8)},Ir),gr(vr,mr,Er,er,Sr);let Fr=Lr(r,vr,xr),Or=h?null:G(r,vr,sr);M(r,vr);let Ur=await P(Fr);if(h)return Ur!==void 0?{gpuTimeMs:Ur}:{};let me=await A(Or,Float32Array);return Ur!==void 0?{C:me,gpuTimeMs:Ur}:{C:me}}finally{g||d(Z),w||d(J),h||d(sr),d(pr),br&&d(br),fr&&d(fr)}}async function ha(r,t,e,o,a,i,s,u,n,f,l,m,p="row-major"){let c=n instanceof X,g=l instanceof X,w=a==="unit";if(q(r),T(r,"strmm",{A:n,B:l}),t!=="left"&&t!=="right")throw new Error("side must be 'left' or 'right'.");if(e!=="lower"&&e!=="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(!w&&a!=="non-unit")throw new Error("diag must be 'unit' or 'non-unit'.");if(p!=="row-major"&&p!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(typeof u!="number")throw new Error("alpha must be a number.");if(Number.isNaN(u))throw new Error("alpha must not be NaN.");if(!Number.isFinite(u))throw new Error("alpha must be finite.");if(!Number.isInteger(i)||!Number.isInteger(s)||!Number.isInteger(f)||!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(!g&&!(l instanceof Float32Array))throw new Error("B must be a Float32Array or GpuMatrix.");if(c!==g)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 g?{}:{B:l};let h=c?n.layout:p,b=g?l.layout:p,y=t==="left"?i:s;if(f<y)throw new Error("lda must be >= "+(t==="left"?"m":"n")+".");if(c){if(f!==n.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(n.rows<y||n.cols<y)throw new Error("A is too small for the given m/n and side.")}else if(n.length<(y-1)*f+y)throw new Error("A does not have enough elements for the given dimensions and lda.");let v=b==="column-major"?s:i,_=b==="column-major"?i:s;if(m<_)throw new Error(`ldb must be >= ${b==="column-major"?"rows":"cols"} of B as stored.`);if(g){if(m!==l.lda)throw new Error("ldb must match B.lda when B is a GpuMatrix.");if(l.rows<i||l.cols<s)throw new Error("B is too small for the given m and n.")}else if(l.length<(v-1)*m+_)throw new Error("B does not have enough elements for the given dimensions and ldb.");let S=h==="column-major"?e==="lower"?"upper":"lower":e,k=h==="column-major"?o==="no-transpose"?"transpose":"no-transpose":o,B=b==="column-major"?"transpose":"no-transpose",L="no-transpose",C=i,R=s,F=y,W=t==="left"?L:B,V=t==="left"?B:L,z=br=>br==="no-transpose"?"transpose":"no-transpose",H=t==="right";b==="column-major"&&([W,V]=[z(V),z(W)],H=!H,[C,R]=[R,C]);let $=y,K=Math.ceil(R/64),Y=Math.ceil(C/64),ir=K*Y>=36,lr=await D(r,ir?"sgemm_large":"sgemm_small"),hr=await D(r,"triangularize"),nr=ir?{x:U(r,K,"strmm","x"),y:U(r,Y,"strmm","y")}:{x:U(r,Math.ceil(R/32),"strmm","x"),y:U(r,Math.ceil(C/32),"strmm","y")},mr=null,Q=null,er=null,Z=null,J=null,sr=null,pr=!1;try{mr=c?n._buf:x(r,n,"strmm-A",!1),Q=g?l._buf:x(r,l,"strmm-B",!0),er=tr(r,y*$*4,"strmm-Adense"),Z=tr(r,v*m*4,"strmm-out",GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST),J=I(r,[{value:y,type:"u32"},{value:f,type:"u32"},{value:$,type:"u32"},{value:S==="upper"?1:0,type:"u32"},{value:k==="transpose"?1:0,type:"u32"},{value:w?1:0,type:"u32"}],"strmm-tri-params");let br=E(r,hr.getBindGroupLayout(0),[mr,er,J]),fr=H?Q:er,ur=H?m:$,yr=H?er:Q;sr=I(r,[{value:C,type:"u32"},{value:R,type:"u32"},{value:F,type:"u32"},{value:u,type:"f32"},{value:0,type:"f32"},{value:ur,type:"u32"},{value:H?$:m,type:"u32"},{value:m,type:"u32"},{value:W==="transpose"?1:0,type:"u32"},{value:V==="transpose"?1:0,type:"u32"}],"strmm-gemm-params");let Rr=E(r,lr.getBindGroupLayout(0),[fr,Ar(r,fr),yr,Ar(r,yr),Z,sr]),{commandEncoder:Tr,querySet:Er}=qr(r);Tr.copyBufferToBuffer(Q,0,Z,0,Math.min(Q.size,Z.size));let vr=Er?{timestampWrites:{querySet:Er,beginningOfPassWriteIndex:0}}:void 0,xr=Er?{timestampWrites:{querySet:Er,endOfPassWriteIndex:1}}:void 0;gr(Tr,hr,br,{x:Math.ceil(y/8),y:Math.ceil(y/8)},vr),gr(Tr,lr,Rr,nr,xr);let Ir=Lr(r,Tr,Er),Sr=g?null:G(r,Tr,Z);M(r,Tr);let Fr=await P(Ir);if(g)return d(l._buf),l._buf=Z,pr=!0,Fr!==void 0?{gpuTimeMs:Fr}:{};let Or=await A(Sr,Float32Array);return Fr!==void 0?{B:Or,gpuTimeMs:Fr}:{B:Or}}finally{!c&&mr&&d(mr),!g&&Q&&d(Q),er&&d(er),Z&&!pr&&d(Z),J&&d(J),sr&&d(sr)}}async function ba(r,t,e,o,a,i,s,u,n,f,l,m,p="row-major"){let c=n instanceof X,g=l instanceof X,w=a==="unit";if(q(r),T(r,"strsm",{A:n,B:l}),t!=="left"&&t!=="right")throw new Error("side must be 'left' or 'right'.");if(e!=="lower"&&e!=="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(!w&&a!=="non-unit")throw new Error("diag must be 'unit' or 'non-unit'.");if(p!=="row-major"&&p!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(typeof u!="number")throw new Error("alpha must be a number.");if(Number.isNaN(u))throw new Error("alpha must not be NaN.");if(!Number.isFinite(u))throw new Error("alpha must be finite.");if(!Number.isInteger(i)||!Number.isInteger(s)||!Number.isInteger(f)||!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(!g&&!(l instanceof Float32Array))throw new Error("B must be a Float32Array or GpuMatrix.");if(c!==g)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 g?{}:{B:l};let h=c?n.layout:p,b=g?l.layout:p,y=t==="left"?i:s;if(f<y)throw new Error("lda must be >= "+(t==="left"?"m":"n")+".");if(c){if(f!==n.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(n.rows<y||n.cols<y)throw new Error("A is too small for the given m/n and side.")}else if(n.length<(y-1)*f+y)throw new Error("A does not have enough elements for the given dimensions and lda.");let v=b==="column-major"?s:i,_=b==="column-major"?i:s;if(m<_)throw new Error(`ldb must be >= ${b==="column-major"?"rows":"cols"} of B as stored.`);if(g){if(m!==l.lda)throw new Error("ldb must match B.lda when B is a GpuMatrix.");if(l.rows<i||l.cols<s)throw new Error("B is too small for the given m and n.")}else if(l.length<(v-1)*m+_)throw new Error("B does not have enough elements for the given dimensions and ldb.");let S=h==="column-major"?e==="lower"?"upper":"lower":e,k=h==="column-major"?o==="no-transpose"?"transpose":"no-transpose":o,B=t==="left"?s:i,L=t==="left",C=k==="no-transpose"==(S==="lower"),R=t==="left"?C:!C,F=[];for(let Q=0;Q<y;Q+=64)F.push(Q);R||F.reverse();let W=F.length,V=await D(r,"strsv_invert_block"),z=await D(r,"block_transfer"),H=await D(r,"sscal"),$=null,K=null,Y=null,ir=[],lr=[];function hr(Q,er){let Z=tr(r,Q,er);return lr.push(Z),Z}function nr(Q,er){let Z=I(r,Q,er);return ir.push(Z),Z}let mr=(v-1)*m+_;try{$=c?n._buf:x(r,n,"strsm-A",!1),K=g?l._buf:x(r,l,"strsm-B",!0),Y=tr(r,W*64*64*4,"strsm-Ainv");let Q=null;if(u!==1&&u!==0){let Er=nr([{value:mr,type:"u32"},{value:u,type:"f32"},{value:1,type:"u32"}],"strsm-scale-params");Q=E(r,H.getBindGroupLayout(0),[K,Er])}let er=nr([{value:y,type:"u32"},{value:f,type:"u32"},{value:k==="transpose"?1:0,type:"u32"},{value:S==="upper"?1:0,type:"u32"},{value:w?1:0,type:"u32"}],"strsm-invert-params"),Z=E(r,V.getBindGroupLayout(0),[$,Y,er]),J=hr(64*B*4,"strsm-Bblock"),sr=hr(64*B*4,"strsm-Xblock"),pr=hr(y*64*4,"strsm-Aoff"),br=hr(y*B*4,"strsm-delta"),{commandEncoder:fr,querySet:ur}=qr(r);if(u===0){let Er=Math.ceil(_/64),vr=Math.ceil(v/64),xr=Er*vr>=36,Ir=await D(r,xr?"sgemm_large":"sgemm_small"),Sr=nr([{value:v,type:"u32"},{value:_,type:"u32"},{value:0,type:"u32"},{value:0,type:"f32"},{value:0,type:"f32"},{value:1,type:"u32"},{value:1,type:"u32"},{value:m,type:"u32"},{value:0,type:"u32"},{value:0,type:"u32"}],"strsm-zero-params"),Fr=E(r,Ir.getBindGroupLayout(0),[Y,Ar(r,Y),Y,Ar(r,Y),K,Sr]),Or=xr?{x:U(r,Er,"strsm","x"),y:U(r,vr,"strsm","y")}:{x:U(r,Math.ceil(_/32),"strsm","x"),y:U(r,Math.ceil(v/32),"strsm","y")};gr(fr,Ir,Fr,Or,ur?{timestampWrites:{querySet:ur,beginningOfPassWriteIndex:0,endOfPassWriteIndex:1}}:void 0)}else{Q&&gr(fr,H,Q,cr(r,mr)),gr(fr,V,Z,{x:64,y:W},ur?{timestampWrites:{querySet:ur,beginningOfPassWriteIndex:0}}:void 0);for(let vr=0;vr<F.length;vr++){let xr=F[vr],Ir=Math.min(xr+64,y),Sr=Ir-xr,Fr=xr/64,Or=vr===F.length-1,Ur=nr([{value:xr,type:"u32"},{value:Sr,type:"u32"},{value:0,type:"u32"},{value:B,type:"u32"},{value:m,type:"u32"},{value:b==="column-major"?1:0,type:"u32"},{value:L?1:0,type:"u32"},{value:2,type:"u32"}],"strsm-gather-B-params"),me=E(r,z.getBindGroupLayout(0),[J,K,Ur]);gr(fr,z,me,Zr(r,"strsm",Sr,B));{let Yr=Sr,Xr=B,_e=Sr,ae=Math.ceil(Xr/64),ie=Math.ceil(Yr/64),se=ae*ie>=36,ne=await D(r,se?"sgemm_large":"sgemm_small"),Be=nr([{value:Yr,type:"u32"},{value:Xr,type:"u32"},{value:_e,type:"u32"},{value:1,type:"f32"},{value:0,type:"f32"},{value:64,type:"u32"},{value:B,type:"u32"},{value:B,type:"u32"},{value:t==="right"?1:0,type:"u32"},{value:0,type:"u32"}],"strsm-apply-params"),ce={buffer:Y,offset:Fr*64*64*4,size:4096*4},Se=E(r,ne.getBindGroupLayout(0),[ce,Ar(r,ce),J,Ar(r,J),sr,Be]),Ea=se?{x:U(r,ae,"strsm","x"),y:U(r,ie,"strsm","y")}:{x:U(r,Math.ceil(Xr/32),"strsm","x"),y:U(r,Math.ceil(Yr/32),"strsm","y")};gr(fr,ne,Se,Ea)}let de=R?Ir:0,Le=R?y:xr,Re=de<Le,ya=nr([{value:xr,type:"u32"},{value:Sr,type:"u32"},{value:0,type:"u32"},{value:B,type:"u32"},{value:m,type:"u32"},{value:b==="column-major"?1:0,type:"u32"},{value:L?1:0,type:"u32"},{value:0,type:"u32"}],"strsm-scatter-params"),xa=E(r,z.getBindGroupLayout(0),[sr,K,ya]),va=Or&&!Re&&ur?{timestampWrites:{querySet:ur,endOfPassWriteIndex:1}}:void 0;if(gr(fr,z,xa,Zr(r,"strsm",Sr,B),va),!Re)continue;let oe=Le-de,_a=nr([{value:de,type:"u32"},{value:oe,type:"u32"},{value:xr,type:"u32"},{value:Sr,type:"u32"},{value:f,type:"u32"},{value:k==="transpose"?1:0,type:"u32"},{value:L?1:0,type:"u32"},{value:2,type:"u32"}],"strsm-gather-A-params"),Ba=E(r,z.getBindGroupLayout(0),[pr,$,_a]);gr(fr,z,Ba,Zr(r,"strsm",oe,Sr));{let Yr=oe,Xr=B,_e=Sr,ae=Math.ceil(Xr/64),ie=Math.ceil(Yr/64),se=ae*ie>=36,ne=await D(r,se?"sgemm_large":"sgemm_small"),Be=nr([{value:Yr,type:"u32"},{value:Xr,type:"u32"},{value:_e,type:"u32"},{value:1,type:"f32"},{value:0,type:"f32"},{value:Sr,type:"u32"},{value:B,type:"u32"},{value:B,type:"u32"},{value:0,type:"u32"},{value:0,type:"u32"}],"strsm-update-params"),ce=E(r,ne.getBindGroupLayout(0),[pr,Ar(r,pr),sr,Ar(r,sr),br,Be]),Se=se?{x:U(r,ae,"strsm","x"),y:U(r,ie,"strsm","y")}:{x:U(r,Math.ceil(Xr/32),"strsm","x"),y:U(r,Math.ceil(Yr/32),"strsm","y")};gr(fr,ne,ce,Se)}let Sa=nr([{value:de,type:"u32"},{value:oe,type:"u32"},{value:0,type:"u32"},{value:B,type:"u32"},{value:m,type:"u32"},{value:b==="column-major"?1:0,type:"u32"},{value:L?1:0,type:"u32"},{value:1,type:"u32"}],"strsm-scatter-sub-params"),Aa=E(r,z.getBindGroupLayout(0),[br,K,Sa]),Ga=Or&&ur?{timestampWrites:{querySet:ur,endOfPassWriteIndex:1}}:void 0;gr(fr,z,Aa,Zr(r,"strsm",oe,B),Ga)}}let yr=Lr(r,fr,ur),Cr=g?null:G(r,fr,K);M(r,fr);let Rr=await P(yr);if(g)return Rr!==void 0?{gpuTimeMs:Rr}:{};let Tr=await A(Cr,Float32Array);return Rr!==void 0?{B:Tr,gpuTimeMs:Rr}:{B:Tr}}finally{!c&&$&&d($),!g&&K&&d(K),Y&&d(Y),d(lr),d(ir)}}return Ia(Ti);})();
|
|
4483
|
+
`});var ra={};Fe(ra,{routineShaders:()=>ir,shaderSources:()=>bs});var ir,bs,ea=Z(()=>{$e();Je();rt();tt();at();st();lt();dt();mt();ct();wt();ht();yt();vt();Bt();At();St();Gt();kt();Dt();Lt();Nt();It();jt();Ft();Ht();Ct();Vt();Kt();zt();Zt();$t();Jt();ro();to();ao();so();lo();fo();co();po();go();bo();xo();_o();Ao();Go();ko();Lo();No();Io();jo();qo();To();Wo();Oo();Ko();Uo();zo();Yo();Xo();Jo();ir={};ir.sscal={sscal:ke};ir.cscal={cscal:Qe};ir.sswap={sswap:et};ir.dswap={dswap:ot};ir.saxpy={saxpy:it};ir.scopy={scopy:nt};ir.dcopy={dcopy:ut};ir.sdot={sdot:ft,"reduction/sum":De};ir.sasum={sasum:pt,"reduction/sum":De};ir.snrm2={snrm2:gt,"reduction/scaledSum":bt};ir.isamax={isamax:xt,"reduction/argmax":_t};ir.dasum={"f64/dekker":Pr,"f64/utils/abs":ye,"f64/utils/add":Ir,dasum:Et,"reduction/sumF64":Le};ir.ddot={"f64/dekker":Pr,"f64/utils/add":Ir,"f64/utils/multiply":Cr,ddot:Pt,"reduction/sumF64":Le};ir.dscal={"f64/dekker":Pr,"f64/utils/add":Ir,"f64/utils/multiply":Cr,dscal:Mt};ir.daxpy={"f64/dekker":Pr,"f64/utils/add":Ir,"f64/utils/multiply":Cr,daxpy:Rt};ir.idamax={"f64/dekker":Pr,"f64/utils/abs":ye,"f64/utils/greater":Pe,"f64/utils/equal":qt,idamax:Tt,"reduction/argmaxF64":Wt};ir.srot={srot:Ot};ir.drot={"f64/dekker":Pr,"f64/utils/add":Ir,"f64/utils/multiply":Cr,drot:Ut};ir.srotm={srotm:Yt};ir.drotm={"f64/dekker":Pr,"f64/utils/add":Ir,"f64/utils/multiply":Cr,drotm:Xt};ir.dnrm2={"f64/dekker":Pr,"f64/utils/abs":ye,"f64/utils/greater":Pe,"f64/utils/add":Ir,"f64/utils/multiply":Cr,"f64/utils/divide":Ne,"f64/utils/sqrt":Qt,dnrm2:eo,"reduction/scaledSumF64":oo};ir.sgemv={sgemv_n:io,sgemv_t:no};ir.ssymv={ssymv:uo};ir.strmv={strmv:mo};ir.strsv={strsv_invert_block:Me,strsv_apply_inverse:wo,strsv_update:ho};ir.sger={sger:yo};ir.dger={"f64/dekker":Pr,"f64/utils/add":Ir,"f64/utils/multiply":Cr,dger:vo};ir.ssyr={ssyr:Bo};ir.dsyr={"f64/dekker":Pr,"f64/utils/add":Ir,"f64/utils/multiply":Cr,dsyr:So};ir.ssyr2={ssyr2:Eo};ir.dsyr2={"f64/dekker":Pr,"f64/utils/add":Ir,"f64/utils/multiply":Cr,dsyr2:Do};ir.dgemv={"f64/dekker":Pr,"f64/utils/add":Ir,"f64/utils/multiply":Cr,dgemv_n:Po,dgemv_t:Mo};ir.dsymv={"f64/dekker":Pr,"f64/utils/add":Ir,"f64/utils/multiply":Cr,dsymv:Ro};ir.dtrmv={"f64/dekker":Pr,"f64/utils/add":Ir,"f64/utils/multiply":Cr,dtrmv:Fo};ir.dtrsv={"f64/dekker":Pr,"f64/utils/add":Ir,"f64/utils/multiply":Cr,"f64/utils/divide":Ne,dtrsv_invert_block:Ho,dtrsv_apply_inverse:Co,dtrsv_update:Vo};ir.sgemm={sgemm_small:ue,sgemm_large:de};ir.sgemmtr={sgemmtr_small:xe,sgemmtr_large:ve};ir.ssyrk={sgemmtr_small:xe,sgemmtr_large:ve};ir.ssyr2k={sgemmtr_small:xe,sgemmtr_large:ve};ir.ssymm={sgemm_small:ue,sgemm_large:de,symmetrize:Zo};ir.strmm={sgemm_small:ue,sgemm_large:de,triangularize:$o};ir.strsm={strsv_invert_block:Me,block_transfer:Qo,sscal:ke,sgemm_small:ue,sgemm_large:de};bs=Object.assign({},...Object.values(ir))});var _s={};Fe(_s,{Complex32:()=>Or,Complex32Array:()=>Br,Complex64:()=>Vr,Complex64Array:()=>Lr,GpuMatrix:()=>X,GpuVector:()=>M,cleanup:()=>Oe,cscal:()=>oa,dasum:()=>ca,daxpy:()=>la,dcopy:()=>da,ddot:()=>pa,dgemv:()=>Ra,dger:()=>La,dnrm2:()=>ga,drot:()=>xa,drotm:()=>_a,dscal:()=>aa,dswap:()=>sa,dsymv:()=>ja,dsyr:()=>Na,dsyr2:()=>Ia,dtrmv:()=>Fa,dtrsv:()=>Ta,gpuName:()=>Ke,idamax:()=>ba,init:()=>Ve,isamax:()=>ha,randomFloat32Array:()=>Ye,randomFloat64Array:()=>Ze,randomTriangularFloat32Array:()=>Xe,sasum:()=>ma,saxpy:()=>na,scopy:()=>ua,sdot:()=>fa,sgemm:()=>Ca,sgemmtr:()=>Wa,sgemv:()=>Ba,sger:()=>Da,snrm2:()=>wa,srot:()=>ya,srotm:()=>va,sscal:()=>ta,sswap:()=>ia,ssymm:()=>Ka,ssymv:()=>Aa,ssyr:()=>Pa,ssyr2:()=>Ma,ssyr2k:()=>Oa,ssyrk:()=>Va,strmm:()=>Ua,strmv:()=>Sa,strsm:()=>za,strsv:()=>ka});function He(r,o){return o?r.features.has("timestamp-query")?{requiredFeatures:["timestamp-query"]}:(console.warn("timestamp-query not supported on this device \u2014 benchmark mode disabled."),{}):{}}function Te(r){if(!Ce(r))return{querySet:null,passDescriptor:void 0};let o=r.createQuerySet({type:"timestamp",count:2});return{querySet:o,passDescriptor:{timestampWrites:{querySet:o,beginningOfPassWriteIndex:0,endOfPassWriteIndex:1}}}}function kr(r,o,e){if(!e)return null;let a=r.createBuffer({label:"timestamp-resolve",size:16,usage:GPUBufferUsage.QUERY_RESOLVE|GPUBufferUsage.COPY_SRC});o.resolveQuerySet(e,0,2,a,0);let t=r.createBuffer({label:"timestamp-readback",size:16,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});return o.copyBufferToBuffer(a,0,t,0,16),{tsReadBuffer:t,resolveBuffer:a,querySet:e}}async function j(r){if(!r)return;let{tsReadBuffer:o,resolveBuffer:e,querySet:a}=r;await o.mapAsync(GPUMapMode.READ);let t=new BigInt64Array(o.getMappedRange().slice());return o.unmap(),o.destroy(),e.destroy(),a.destroy(),Math.max(0,Number(t[1]-t[0]))/1e6}var Jr=null,Se=!1,Qr=new Map,le=new WeakMap,zr=null,We=({powerPreference:r,benchmark:o})=>`${r}::${o}`;async function Ve({powerPreference:r="high-performance",benchmark:o=!1,dumpShaders:e=!1}={}){let a={powerPreference:r,benchmark:o,dumpShaders:e},t=We(a),i=Qr.get(t);if(i)return i;if(Jr)e!==Se&&typeof window>"u"&&console.warn(`dumpShaders: ${e} was requested, but the WebGPU instance was already created with dumpShaders: ${Se}. The first init() call fixes this for the process.`);else if(typeof window>"u"){let{create:m,globals:w}=await import("webgpu");Object.assign(globalThis,w),Jr=m(e?["enable-dawn-features=dump_shaders,disable_symbol_renaming"]:[]),Se=e}else e&&console.warn("dumpShaders has no effect in the browser \u2014 see init()'s docs."),Jr=navigator.gpu;if(!Jr)throw new Error("WebGPU not supported in this environment.");let s=await Jr.requestAdapter({powerPreference:r})??await Jr.requestAdapter();if(!s)throw new Error("No WebGPU adapter found.");let n=[...He(s,o).requiredFeatures??[]],d=await s.requestDevice({requiredFeatures:n});d.addEventListener("uncapturederror",m=>{console.error("Uncaptured GPU error:",m.error.message)});let l=n.includes("timestamp-query");return le.set(d,{adapter:s,benchmark:l,options:a}),Qr.set(t,d),zr||(zr=d),d}function Oe(r){if(r===void 0){for(let e of Qr.values())e.destroy();Qr.clear(),zr=null;return}let o=le.get(r);o&&(Qr.delete(We(o.options)),le.delete(r),r.destroy(),zr===r&&(zr=Qr.values().next().value??null))}function Ke(r=zr){let o=r&&le.get(r);if(!o)throw new Error("WebGPU adapter not initialized \u2014 call init() first.");let{device:e,description:a}=o.adapter.info;return{description:a||"unknown",device:e||"unknown"}}function Ce(r=zr){return le.get(r)?.benchmark??!1}function re(){if(!zr)throw new Error("WebGPU device not initialized \u2014 call init() first.");return zr}function f(...r){r.flat().forEach(o=>o.destroy())}function Ge(r,o,e){let a=r.limits.maxStorageBufferBindingSize;if(o>a)throw new Error(`Buffer "${e}" needs ${o} bytes, exceeding this device's maxStorageBufferBindingSize (${a} bytes). The operands are too large for this device.`)}function h(r,o,e="blas-input",a=!1){let t=o.byteLength;Ge(r,t,e);let i=a?GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC:GPUBufferUsage.STORAGE,s=r.createBuffer({label:e,size:t,usage:i,mappedAtCreation:!0}),u=o.constructor;return new u(s.getMappedRange()).set(o),s.unmap(),s}function fr(r,o,e="blas-storage",a=0){return Ge(r,o,e),r.createBuffer({label:e,size:o,usage:GPUBufferUsage.STORAGE|a})}function Ar(r,o,e="blas-result"){return Ge(r,o,e),r.createBuffer({label:e,size:o,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_SRC})}function E(r,o,e){let a=r.createBuffer({label:"blas-readback",size:e.size,usage:GPUBufferUsage.COPY_DST|GPUBufferUsage.MAP_READ});return o.copyBufferToBuffer(e,0,a,0,e.size),a}var ee=16,Ue=new WeakMap;function ui(r){let o=Ue.get(r);return o||(o=r.createBuffer({label:"blas-vec4-fallback",size:ee,usage:GPUBufferUsage.STORAGE}),Ue.set(r,o)),o}function Dr(r,o){let e=o instanceof GPUBuffer?o:o.buffer,a=o instanceof GPUBuffer?0:o.offset??0,t=o instanceof GPUBuffer?o.size:o.size??e.size-a,i=Math.floor(t/ee)*ee;return i<ee?{buffer:ui(r),offset:0,size:ee}:{buffer:e,offset:a,size:i}}function Ee(r,o,e,a){if(o%4!==0)return!1;let t=r instanceof GPUBuffer?r:r.buffer,i=r instanceof GPUBuffer?0:r.offset??0,s=r instanceof GPUBuffer?t.size:r.size??t.size-i,u=Math.floor(s/ee)*4;if(u<=0)return!1;let n=(Math.max(e,1)-1)*o+(Math.max(a,1)-1);return Math.floor(n/4)*4+4<=u}function q(r,o,e="blas-params"){let a=o.length*4,t=Math.ceil(a/16)*16,i=new ArrayBuffer(t),s=new DataView(i);o.forEach(({value:n,type:d},l)=>{let m=l*4;if(d==="u32")s.setUint32(m,n,!0);else if(d==="i32")s.setInt32(m,n,!0);else if(d==="f32")s.setFloat32(m,n,!0);else throw new Error(`Unknown param type "${d}". Use "f32", "u32", or "i32".`)});let u=r.createBuffer({label:e,size:t,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});return r.queue.writeBuffer(u,0,i),u}async function G(r,o=Float32Array){try{await r.mapAsync(GPUMapMode.READ);let e=new o(r.getMappedRange().slice());return r.unmap(),e}finally{r.destroy()}}function U(r){let o=r.length,e=new Float32Array(o),a=new Float32Array(o);for(let t=0;t<o;t++){let i=Math.fround(r[t]);e[t]=i,a[t]=Math.fround(r[t]-i)}return{hi:e,lo:a}}function dr(r,o){let e=r.length,a=new Float64Array(e);for(let t=0;t<e;t++)a[t]=r[t]+o[t];return a}var Vr=class{constructor(o,e){this.re=o,this.im=e}},Lr=class extends Array{constructor(o){if(o===void 0){super();return}if(typeof o=="number"){super(o);for(let a=0;a<o;a++)this[a]=new Vr(0,0);return}let e=Array.from(o);if(super(),e.length!==0){if(e[0]instanceof Vr){for(let a of e){if(!(a instanceof Vr))throw new Error("Complex64Array expects every element to be a Complex64.");this.push(a)}return}if(e.length%2!==0)throw new Error("Complex64Array expects an even number of interleaved [re, im, ...] values.");for(let a=0;a<e.length;a+=2){if(typeof e[a]!="number"||typeof e[a+1]!="number")throw new Error("Complex64Array expects interleaved [re, im, ...] values to be numbers.");this.push(new Vr(e[a],e[a+1]))}}}};function te(r,o=r.length){let e=new Float32Array(o*2);for(let a=0;a<o;a++)e[a*2]=r[a].re,e[a*2+1]=r[a].im;return e}function he(r,o=r.length){let e=new Float64Array(o),a=new Float64Array(o);for(let l=0;l<o;l++)e[l]=r[l].re,a[l]=r[l].im;let{hi:t,lo:i}=U(e),{hi:s,lo:u}=U(a),n=new Float32Array(o*2),d=new Float32Array(o*2);for(let l=0;l<o;l++)n[l*2]=t[l],n[l*2+1]=s[l],d[l*2]=i[l],d[l*2+1]=u[l];return{hi:n,lo:d}}function be(r,o){let e=r.length/2,a=new Float32Array(e),t=new Float32Array(e),i=new Float32Array(e),s=new Float32Array(e);for(let l=0;l<e;l++)a[l]=r[l*2],i[l]=r[l*2+1],t[l]=o[l*2],s[l]=o[l*2+1];let u=dr(a,t),n=dr(i,s),d=new Lr(e);for(let l=0;l<e;l++)d[l]=new Vr(u[l],n[l]);return d}var Or=class{constructor(o,e){this.re=Math.fround(o),this.im=Math.fround(e)}},Br=class extends Array{constructor(o){if(o===void 0){super();return}if(typeof o=="number"){super(o);for(let a=0;a<o;a++)this[a]=new Or(0,0);return}let e=Array.from(o);if(super(),e.length!==0){if(e[0]instanceof Or){for(let a of e){if(!(a instanceof Or))throw new Error("Complex32Array expects every element to be a Complex32.");this.push(a)}return}if(e.length%2!==0)throw new Error("Complex32Array expects an even number of interleaved [re, im, ...] values.");for(let a=0;a<e.length;a+=2){if(typeof e[a]!="number"||typeof e[a+1]!="number")throw new Error("Complex32Array expects interleaved [re, im, ...] values to be numbers.");this.push(new Or(e[a],e[a+1]))}}}};var M=class r{constructor(o,e,a=Float32Array,t=null,i=null){this._buf=o,this._loBuf=t,this.length=e,this.dtype=a,this.device=i??re()}static from(o,e){let a=o instanceof GPUDevice,t=a?o:re(),i=a?e:o;if(i instanceof Float64Array){let{hi:u,lo:n}=U(i),d=h(t,u,"gpu-vector-f64-hi",!0),l=h(t,n,"gpu-vector-f64-lo",!0);return new r(d,i.length,Float64Array,l,t)}if(i instanceof Br){let u=h(t,te(i),"gpu-vector-complex32",!0);return new r(u,i.length,Br,null,t)}if(i instanceof Lr){let{hi:u,lo:n}=he(i),d=h(t,u,"gpu-vector-complex64-hi",!0),l=h(t,n,"gpu-vector-complex64-lo",!0);return new r(d,i.length,Lr,l,t)}if(!(i instanceof Float32Array))throw new Error("GpuVector.from expects a Float32Array, Float64Array, Complex32Array, or Complex64Array.");let s=h(t,i,"gpu-vector",!0);return new r(s,i.length,i.constructor,null,t)}async read(){let o=this.device,e=o.createCommandEncoder(),a=E(o,e,this._buf);if(o.queue.submit([e.finish()]),this.dtype===Br)return new Br(await G(a,Float32Array));if(!this._loBuf)return G(a,this.dtype);let t=o.createCommandEncoder(),i=E(o,t,this._loBuf);o.queue.submit([t.finish()]);let[s,u]=await Promise.all([G(a,Float32Array),G(i,Float32Array)]);return this.dtype===Lr?be(s,u):dr(s,u)}destroy(){this._buf.destroy(),this._loBuf&&this._loBuf.destroy()}};var X=class r{constructor(o,e,a,t,i=null,s="row-major",u=null,n=Float32Array){this._buf=o,this._loBuf=i,this.rows=e,this.cols=a,this.lda=t,this.layout=s,this.dtype=n,this.device=u??re()}static from(o,...e){let a=o instanceof GPUDevice,t=a?o:re(),i=a?e.shift():o,[s,u,n,d="row-major"]=e;if(d!=="row-major"&&d!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");let l=d==="row-major";if(n===void 0&&(n=l?u:s),!(i instanceof Float32Array)&&!(i instanceof Float64Array)&&!(i instanceof Br)&&!(i instanceof Lr))throw new Error("GpuMatrix.from expects a Float32Array, Float64Array, Complex32Array, or Complex64Array.");if(!Number.isInteger(s)||s<=0)throw new Error("rows must be a positive integer.");if(!Number.isInteger(u)||u<=0)throw new Error("cols must be a positive integer.");let m=l?u:s;if(!Number.isInteger(n)||n<m)throw new Error(`lda must be an integer >= ${l?"cols":"rows"}.`);let w=l?s:u;if(i.length<w*n)throw new Error("data does not have enough elements for the given rows, cols, and lda.");if(i instanceof Float64Array){let p=w*n,{hi:g,lo:y}=U(i.subarray(0,p)),b=h(t,g,"gpu-matrix-f64-hi",!0),x=h(t,y,"gpu-matrix-f64-lo",!0);return new r(b,s,u,n,x,d,t,Float64Array)}if(i instanceof Br){let p=h(t,te(i,w*n),"gpu-matrix-complex32",!0);return new r(p,s,u,n,null,d,t,Br)}if(i instanceof Lr){let{hi:p,lo:g}=he(i,w*n),y=h(t,p,"gpu-matrix-complex64-hi",!0),b=h(t,g,"gpu-matrix-complex64-lo",!0);return new r(y,s,u,n,b,d,t,Lr)}let c=h(t,i.subarray(0,w*n),"gpu-matrix",!0);return new r(c,s,u,n,null,d,t)}async read(){let o=this.device,e=o.createCommandEncoder(),a=E(o,e,this._buf);o.queue.submit([e.finish()]);let t=this.layout!=="column-major",i=t?this.rows:this.cols,s=t?this.cols:this.rows;if(this.dtype===Br){let d=new Br(await G(a,Float32Array));if(this.lda===s)return d;let l=new Br(i*s);for(let m=0;m<i;m++)for(let w=0;w<s;w++)l[m*s+w]=d[m*this.lda+w];return l}if(this._loBuf){let d=o.createCommandEncoder(),l=E(o,d,this._loBuf);o.queue.submit([d.finish()]);let[m,w]=await Promise.all([G(a,Float32Array),G(l,Float32Array)]);if(this.dtype===Lr){let g=be(m,w);if(this.lda===s)return g;let y=new Lr(i*s);for(let b=0;b<i;b++)for(let x=0;x<s;x++)y[b*s+x]=g[b*this.lda+x];return y}let 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 u=await G(a,Float32Array);if(this.lda===s)return u;let n=new Float32Array(i*s);for(let d=0;d<i;d++)n.set(u.subarray(d*this.lda,d*this.lda+s),d*s);return n}destroy(){this._buf.destroy(),this._loBuf&&this._loBuf.destroy()}};function ze(r){let o=r>>>0;return function(){o=o+1831565813|0;let e=Math.imul(o^o>>>15,1|o);return e=e+Math.imul(e^e>>>7,61|e)^e,((e^e>>>14)>>>0)/4294967296}}function Ye(r,o=-1,e=1,a){let t=new Float32Array(r),i=a===void 0?Math.random:ze(a);for(let s=0;s<r;s++)t[s]=o+i()*(e-o);return t}function Ze(r,o=-1,e=1,a){let t=new Float64Array(r),i=a===void 0?Math.random:ze(a);for(let s=0;s<r;s++)t[s]=o+i()*(e-o);return t}function Xe(r,o,e="lower",a=-1,t=1,i=5,s=15,u="row-major"){if(e!=="lower"&&e!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(u!=="row-major"&&u!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(o<r)throw new Error("lda must be >= n.");let n=u==="column-major",d=(m,w)=>n?w*o+m:m*o+w,l=new Float32Array(r*o);for(let m=0;m<r;m++){for(let w=0;w<r;w++){if(m===w)continue;(e==="lower"?w<m:w>m)&&(l[d(m,w)]=a+Math.random()*(t-a))}l[d(m,m)]=i+Math.random()*(s-i)}return l}function D(r,o,e,a=0){let t=e.map((i,s)=>({binding:a+s,resource:i instanceof GPUBuffer?{buffer:i}:i}));return r.createBindGroup({layout:o,entries:t})}function F(r,o){r.queue.submit([o.finish()])}function Mr(r){let{querySet:o,passDescriptor:e}=Te(r);return{commandEncoder:r.createCommandEncoder(),querySet:o,passDescriptor:e}}function hr(r,o,e,a,t){let i=r.beginComputePass(t);i.setPipeline(o),i.setBindGroup(0,e),typeof a=="number"?i.dispatchWorkgroups(a):i.dispatchWorkgroups(a.x,a.y,a.z??1),i.end()}function O(r,o,e,a){let{commandEncoder:t,querySet:i,passDescriptor:s}=Mr(r);hr(t,o,e,a,s);let u=kr(r,t,i);return{commandEncoder:t,ts:u}}var vs={},Ie=new WeakMap;async function P(r,o,e="main"){Ie.has(r)||Ie.set(r,new Map);let a=Ie.get(r),t=Array.isArray(o)?o:[o],i=`${t.join("+")}::${e}`;if(!a.has(i)){let s=xs(r,t,e).catch(u=>{throw a.delete(i),u});a.set(i,s)}return a.get(i)}async function ys(r){if(typeof process>"u"||!process.versions?.node){let{shaderSources:o}=await Promise.resolve().then(()=>(ea(),ra)),e=o[r];if(!e)throw new Error(`Shader "${r}" not found in browser bundle.`);return e}else{let{readFileSync:o}=await import("fs"),{fileURLToPath:e}=await import("url"),{dirname:a,join:t}=await import("path"),i=a(e(vs.url));return o(t(i,`../shaders/${r}.wgsl`),"utf8")}}async function xs(r,o,e="main"){let a=o.join("+"),t=await Promise.all(o.map(ys)),i=0,s=t.map((p,g)=>{let y=p.split(`
|
|
4484
|
+
`).length,b={name:o[g],startLine:i+1,endLine:i+y};return i+=y,b}),u=p=>{let g=p&&s.find(y=>p>=y.startLine&&p<=y.endLine);return g?`${g.name}.wgsl:${p-g.startLine+1}`:`line ${p}`},n=t.join(`
|
|
4485
|
+
`),d=r.createShaderModule({label:a,code:n}),m=(await d.getCompilationInfo()).messages.filter(p=>p.type==="error");if(m.length>0)throw new Error(`Shader "${a}" compilation failed:
|
|
4486
|
+
${m.map(p=>` ${u(p.lineNum)}: ${p.message}`).join(`
|
|
4487
|
+
`)}`);let w=e==="main"?{module:d}:{module:d,entryPoint:e},c=r.createComputePipeline({label:a,layout:"auto",compute:w});return c._shaderModule=d,c}function br(r,o,e){let a=r.limits.maxComputeWorkgroupsPerDimension;return e===void 0?Math.min(Math.ceil(o/64),a):{x:Math.min(Math.ceil(e/8),a),y:Math.min(Math.ceil(o/8),a)}}function or(r,o,e,a="x"){let t=r.limits.maxComputeWorkgroupsPerDimension;if(o>t)throw new Error(`${e}: this problem needs ${o} workgroups in ${a}, but the device allows ${t} (maxComputeWorkgroupsPerDimension). The operands are too large for this device \u2014 split the operation into smaller blocks.`);return o}function Yr(r,o,e,a){return a===void 0?or(r,Math.ceil(e/64),o):{x:or(r,Math.ceil(a/8),o,"x"),y:or(r,Math.ceil(e/8),o,"y")}}function H(r){if(!(r instanceof GPUDevice))throw new Error("device must be a GPUDevice.")}function T(r,o,e){for(let[a,t]of Object.entries(e))if(!(!(t instanceof M)&&!(t instanceof X))&&t.device!==r)throw new Error(`${o}: ${a} belongs to a different GPUDevice than the one passed in. GPU buffers cannot be shared across devices \u2014 recreate the operand on this device, or call the routine with the device that owns it.`)}async function ta(r,o,e,a,t){let i=a instanceof M;if(H(r),T(r,"sscal",{x:a}),!Number.isInteger(o)||!Number.isInteger(t))throw new Error("n and incx must be integers.");if(typeof e!="number")throw new Error("alpha must be a number.");if(Number.isNaN(e))throw new Error("alpha must not be NaN.");if(!Number.isFinite(e))throw new Error("alpha must be finite.");if(t<=0)throw new Error("incx must be positive.");if(!(a instanceof Float32Array)&&!(a instanceof M))throw new Error("x must be a Float32Array or GpuVector.");if(o<=0)return i?{}:{x:a};if(a.length<(o-1)*t+1)throw new Error("x does not have enough elements for the given n and incx.");let s=await P(r,"sscal"),u=null,n=null,d=null;try{u=i?a._buf:h(r,a,"sscal-x",!0),n=q(r,[{value:o,type:"u32"},{value:e,type:"f32"},{value:t,type:"u32"}],"sscal-params");let l=D(r,s.getBindGroupLayout(0),[u,n]),{commandEncoder:m,ts:w}=O(r,s,l,br(r,o));d=i?null:E(r,m,u),F(r,m);let c=await j(w);if(i)return c!==void 0?{gpuTimeMs:c}:{};let p=await G(d,Float32Array);return d=null,c!==void 0?{x:p,gpuTimeMs:c}:{x:p}}finally{!i&&u&&f(u),n&&f(n),d&&f(d)}}async function oa(r,o,e,a,t){let i=a instanceof M;if(H(r),T(r,"cscal",{x:a}),!Number.isInteger(o)||!Number.isInteger(t))throw new Error("n and incx must be integers.");if(!(e instanceof Or))throw new Error("alpha must be a Complex32.");if(Number.isNaN(e.re)||Number.isNaN(e.im))throw new Error("alpha must not be NaN.");if(!Number.isFinite(e.re)||!Number.isFinite(e.im))throw new Error("alpha must be finite.");if(t<=0)throw new Error("incx must be positive.");if(!(a instanceof Br)&&!i)throw new Error("x must be a Complex32Array or GpuVector.");if(i&&a.dtype!==Br)throw new Error("x must be a Complex32Array-backed GpuVector.");if(o<=0)return i?{}:{x:a};if(a.length<(o-1)*t+1)throw new Error("x does not have enough elements for the given n and incx.");let s=await P(r,"cscal"),u=null,n=null,d=null;try{u=i?a._buf:h(r,te(a),"cscal-x",!0),n=q(r,[{value:o,type:"u32"},{value:e.re,type:"f32"},{value:e.im,type:"f32"},{value:t,type:"u32"}],"cscal-params");let l=D(r,s.getBindGroupLayout(0),[u,n]),{commandEncoder:m,ts:w}=O(r,s,l,br(r,o));d=i?null:E(r,m,u),F(r,m);let c=await j(w);if(i)return c!==void 0?{gpuTimeMs:c}:{};let p=await G(d,Float32Array);d=null;let g=new Br(p);return c!==void 0?{x:g,gpuTimeMs:c}:{x:g}}finally{!i&&u&&f(u),n&&f(n),d&&f(d)}}async function aa(r,o,e,a,t){let i=a instanceof M;if(H(r),!Number.isInteger(o)||!Number.isInteger(t))throw new Error("n and incx must be integers.");if(typeof e!="number")throw new Error("alpha must be a number.");if(Number.isNaN(e))throw new Error("alpha must not be NaN.");if(!Number.isFinite(e))throw new Error("alpha must be finite.");if(!(a instanceof Float64Array)&&!i)throw new Error("x must be a Float64Array or GpuVector.");if(i&&a.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(t<=0)throw new Error("incx must be positive.");if(T(r,"dscal",{x:a}),o<=0)return i?{}:{x:a};if(a.length<(o-1)*t+1)throw new Error("x does not have enough elements for the given n and incx.");let u=await P(r,[...["f64/dekker","f64/utils/add","f64/utils/multiply"],"dscal"]),{hi:n,lo:d}=U(new Float64Array([e])),l=null,m=null,w=null,c=null,p=null;try{if(i)l=a._buf,m=a._loBuf;else{let{hi:S,lo:_}=U(a);l=h(r,S,"dscal-xHi",!0),m=h(r,_,"dscal-xLo",!0)}w=q(r,[{value:o,type:"u32"},{value:n[0],type:"f32"},{value:d[0],type:"f32"},{value:t,type:"u32"}],"dscal-params");let g=D(r,u.getBindGroupLayout(0),[l,m,w]),{commandEncoder:y,ts:b}=O(r,u,g,br(r,o));c=i?null:E(r,y,l),p=i?null:E(r,y,m),F(r,y);let x=await j(b);if(i)return x!==void 0?{gpuTimeMs:x}:{};let v=await G(c,Float32Array);c=null;let B=await G(p,Float32Array);p=null;let A=dr(v,B);return x!==void 0?{x:A,gpuTimeMs:x}:{x:A}}finally{!i&&l&&f(l),!i&&m&&f(m),w&&f(w),c&&f(c),p&&f(p)}}async function ia(r,o,e,a,t,i){let s=e instanceof M,u=t instanceof M;if(H(r),T(r,"sswap",{x:e,y:t}),!Number.isInteger(o)||!Number.isInteger(a)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(a<=0||i<=0)throw new Error("incx and incy must be positive.");if(!(e instanceof Float32Array)&&!(e instanceof M))throw new Error("x must be a Float32Array or GpuVector.");if(!(t instanceof Float32Array)&&!(t instanceof M))throw new Error("y must be a Float32Array or GpuVector.");if(e.constructor!==t.constructor)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(o<=0)return s?{}:{x:e,y:t};if(e.length<(o-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(o-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let n=await P(r,"sswap"),d=null,l=null,m=null,w=null,c=null;try{d=s?e._buf:h(r,e,"sswap-x",!0),l=u?t._buf:h(r,t,"sswap-y",!0),m=q(r,[{value:o,type:"u32"},{value:a,type:"u32"},{value:i,type:"u32"}],"sswap-params");let p=D(r,n.getBindGroupLayout(0),[d,l,m]),{commandEncoder:g,ts:y}=O(r,n,p,br(r,o));w=s?null:E(r,g,d),c=u?null:E(r,g,l),F(r,g);let b=await j(y);if(s)return b!==void 0?{gpuTimeMs:b}:{};let x=await G(w,Float32Array);w=null;let v=await G(c,Float32Array);return c=null,b!==void 0?{x,y:v,gpuTimeMs:b}:{x,y:v}}finally{!s&&d&&f(d),!u&&l&&f(l),m&&f(m),w&&f(w),c&&f(c)}}async function sa(r,o,e,a,t,i){let s=e instanceof M,u=t instanceof M;if(H(r),T(r,"dswap",{x:e,y:t}),!Number.isInteger(o)||!Number.isInteger(a)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(a<=0||i<=0)throw new Error("incx and incy must be positive.");if(!(e instanceof Float64Array)&&!s)throw new Error("x must be a Float64Array or GpuVector.");if(!(t instanceof Float64Array)&&!u)throw new Error("y must be a Float64Array or GpuVector.");if(s&&e.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(u&&t.dtype!==Float64Array)throw new Error("y must be a Float64Array-backed GpuVector.");if(s!==u)throw new Error("x and y must be the same type (both Float64Array or both GpuVector).");if(o<=0)return s?{}:{x:e,y:t};if(e.length<(o-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(o-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let n=await P(r,"dswap"),d=null,l=null,m=null,w=null,c=null,p=null,g=null,y=null,b=null;try{if(s)d=e._buf,l=e._loBuf,m=t._buf,w=t._loBuf;else{let R=U(e),W=U(t);d=h(r,R.hi,"dswap-xHi",!0),l=h(r,R.lo,"dswap-xLo",!0),m=h(r,W.hi,"dswap-yHi",!0),w=h(r,W.lo,"dswap-yLo",!0)}c=q(r,[{value:o,type:"u32"},{value:a,type:"u32"},{value:i,type:"u32"}],"dswap-params");let x=D(r,n.getBindGroupLayout(0),[d,l,m,w,c]),{commandEncoder:v,ts:B}=O(r,n,x,br(r,o));p=s?null:E(r,v,d),g=s?null:E(r,v,l),y=u?null:E(r,v,m),b=u?null:E(r,v,w),F(r,v);let A=await j(B);if(s)return A!==void 0?{gpuTimeMs:A}:{};let S=await G(p,Float32Array);p=null;let _=await G(g,Float32Array);g=null;let N=await G(y,Float32Array);y=null;let I=await G(b,Float32Array);b=null;let k=dr(S,_),L=dr(N,I);return A!==void 0?{x:k,y:L,gpuTimeMs:A}:{x:k,y:L}}finally{!s&&d&&f(d),!s&&l&&f(l),!u&&m&&f(m),!u&&w&&f(w),c&&f(c),p&&f(p),g&&f(g),y&&f(y),b&&f(b)}}async function na(r,o,e,a,t,i,s){let u=a instanceof M,n=i instanceof M;if(H(r),T(r,"saxpy",{x:a,y:i}),!Number.isInteger(o)||!Number.isInteger(t)||!Number.isInteger(s))throw new Error("n, incx, and incy must be integers.");if(typeof e!="number")throw new Error("alpha must be a number.");if(Number.isNaN(e))throw new Error("alpha must not be NaN.");if(!Number.isFinite(e))throw new Error("alpha must be finite.");if(t<=0||s<=0)throw new Error("incx and incy must be positive.");if(!u&&!(a 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(u!==n)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(o<=0)return n?{}:{y:i};if(a.length<(o-1)*t+1)throw new Error("x does not have enough elements for the given n and incx.");if(i.length<(o-1)*s+1)throw new Error("y does not have enough elements for the given n and incy.");let d=await P(r,"saxpy"),l=null,m=null,w=null,c=null;try{l=u?a._buf:h(r,a,"saxpy-x",!1),m=n?i._buf:h(r,i,"saxpy-y",!0),w=q(r,[{value:o,type:"u32"},{value:e,type:"f32"},{value:t,type:"u32"},{value:s,type:"u32"}],"saxpy-params");let p=D(r,d.getBindGroupLayout(0),[l,m,w]),{commandEncoder:g,ts:y}=O(r,d,p,br(r,o));c=n?null:E(r,g,m),F(r,g);let b=await j(y);if(n)return b!==void 0?{gpuTimeMs:b}:{};let x=await G(c,Float32Array);return c=null,b!==void 0?{y:x,gpuTimeMs:b}:{y:x}}finally{!u&&l&&f(l),!n&&m&&f(m),w&&f(w),c&&f(c)}}async function la(r,o,e,a,t,i,s){let u=a instanceof M,n=i instanceof M;if(H(r),!Number.isInteger(o)||!Number.isInteger(t)||!Number.isInteger(s))throw new Error("n, incx, and incy must be integers.");if(typeof e!="number")throw new Error("alpha must be a number.");if(Number.isNaN(e))throw new Error("alpha must not be NaN.");if(!Number.isFinite(e))throw new Error("alpha must be finite.");if(!(a instanceof Float64Array)&&!u)throw new Error("x must be a Float64Array or GpuVector.");if(!(i instanceof Float64Array)&&!n)throw new Error("y must be a Float64Array or GpuVector.");if(u&&a.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(n&&i.dtype!==Float64Array)throw new Error("y must be a Float64Array-backed GpuVector.");if(u!==n)throw new Error("x and y must be the same type (both Float64Array or both GpuVector).");if(t<=0||s<=0)throw new Error("incx and incy must be positive.");if(T(r,"daxpy",{x:a,y:i}),o<=0)return n?{}:{y:i};if(a.length<(o-1)*t+1)throw new Error("x does not have enough elements for the given n and incx.");if(i.length<(o-1)*s+1)throw new Error("y does not have enough elements for the given n and incy.");let l=await P(r,[...["f64/dekker","f64/utils/add","f64/utils/multiply"],"daxpy"]),{hi:m,lo:w}=U(new Float64Array([e])),c=null,p=null,g=null,y=null,b=null,x=null,v=null;try{if(u)c=a._buf,p=a._loBuf,g=i._buf,y=i._loBuf;else{let L=U(a),R=U(i);c=h(r,L.hi,"daxpy-xHi",!1),p=h(r,L.lo,"daxpy-xLo",!1),g=h(r,R.hi,"daxpy-yHi",!0),y=h(r,R.lo,"daxpy-yLo",!0)}b=q(r,[{value:o,type:"u32"},{value:m[0],type:"f32"},{value:w[0],type:"f32"},{value:t,type:"u32"},{value:s,type:"u32"}],"daxpy-params");let B=D(r,l.getBindGroupLayout(0),[c,p,g,y,b]),{commandEncoder:A,ts:S}=O(r,l,B,br(r,o));x=n?null:E(r,A,g),v=n?null:E(r,A,y),F(r,A);let _=await j(S);if(n)return _!==void 0?{gpuTimeMs:_}:{};let N=await G(x,Float32Array);x=null;let I=await G(v,Float32Array);v=null;let k=dr(N,I);return _!==void 0?{y:k,gpuTimeMs:_}:{y:k}}finally{!u&&c&&f(c),!u&&p&&f(p),!n&&g&&f(g),!n&&y&&f(y),b&&f(b),x&&f(x),v&&f(v)}}async function ua(r,o,e,a,t,i){let s=e instanceof M,u=t instanceof M;if(H(r),T(r,"scopy",{x:e,y:t}),!Number.isInteger(o)||!Number.isInteger(a)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(a<=0||i<=0)throw new Error("incx and incy must be positive.");if(!s&&!(e 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(s!==u)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(o<=0)return u?{}:{y:t};if(e.length<(o-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(o-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let n=await P(r,"scopy"),d=null,l=null,m=null,w=null;try{d=s?e._buf:h(r,e,"scopy-x",!1),l=u?t._buf:h(r,t,"scopy-y",!0),m=q(r,[{value:o,type:"u32"},{value:a,type:"u32"},{value:i,type:"u32"}],"scopy-params");let c=D(r,n.getBindGroupLayout(0),[d,l,m]),{commandEncoder:p,ts:g}=O(r,n,c,br(r,o));w=u?null:E(r,p,l),F(r,p);let y=await j(g);if(u)return y!==void 0?{gpuTimeMs:y}:{};let b=await G(w,Float32Array);return w=null,y!==void 0?{y:b,gpuTimeMs:y}:{y:b}}finally{!s&&d&&f(d),!u&&l&&f(l),m&&f(m),w&&f(w)}}async function da(r,o,e,a,t,i){let s=e instanceof M,u=t instanceof M;if(H(r),T(r,"dcopy",{x:e,y:t}),!Number.isInteger(o)||!Number.isInteger(a)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(a<=0||i<=0)throw new Error("incx and incy must be positive.");if(!(e instanceof Float64Array)&&!s)throw new Error("x must be a Float64Array or GpuVector.");if(!(t instanceof Float64Array)&&!u)throw new Error("y must be a Float64Array or GpuVector.");if(s&&e.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(u&&t.dtype!==Float64Array)throw new Error("y must be a Float64Array-backed GpuVector.");if(s!==u)throw new Error("x and y must be the same type (both Float64Array or both GpuVector).");if(o<=0)return u?{}:{y:t};if(e.length<(o-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(o-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let n=await P(r,"dcopy"),d=null,l=null,m=null,w=null,c=null,p=null,g=null;try{if(s)d=e._buf,l=e._loBuf,m=t._buf,w=t._loBuf;else{let _=U(e),N=U(t);d=h(r,_.hi,"dcopy-xHi",!1),l=h(r,_.lo,"dcopy-xLo",!1),m=h(r,N.hi,"dcopy-yHi",!0),w=h(r,N.lo,"dcopy-yLo",!0)}c=q(r,[{value:o,type:"u32"},{value:a,type:"u32"},{value:i,type:"u32"}],"dcopy-params");let y=D(r,n.getBindGroupLayout(0),[d,l,m,w,c]),{commandEncoder:b,ts:x}=O(r,n,y,br(r,o));p=u?null:E(r,b,m),g=u?null:E(r,b,w),F(r,b);let v=await j(x);if(u)return v!==void 0?{gpuTimeMs:v}:{};let B=await G(p,Float32Array);p=null;let A=await G(g,Float32Array);g=null;let S=dr(B,A);return v!==void 0?{y:S,gpuTimeMs:v}:{y:S}}finally{!s&&d&&f(d),!s&&l&&f(l),!u&&m&&f(m),!u&&w&&f(w),c&&f(c),p&&f(p),g&&f(g)}}async function fa(r,o,e,a,t,i){let s=e instanceof M,u=t instanceof M;if(H(r),T(r,"sdot",{x:e,y:t}),!Number.isInteger(o)||!Number.isInteger(a)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(a<=0||i<=0)throw new Error("incx and incy must be positive.");if(!s&&!(e 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(s!==u)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(o<=0)return{dot:0};if(e.length<(o-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(o-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let n=await P(r,"sdot"),d=await P(r,"reduction/sum"),l=null,m=null,w=null,c=null,p=null,g=null;try{l=s?e._buf:h(r,e,"sdot-x",!1),m=u?t._buf:h(r,t,"sdot-y",!1),w=fr(r,512,"sdot-partials"),c=Ar(r,4,"sdot-result"),p=q(r,[{value:o,type:"u32"},{value:a,type:"u32"},{value:i,type:"u32"}],"sdot-params");let y=D(r,n.getBindGroupLayout(0),[l,m,w,p]),{commandEncoder:b,ts:x}=O(r,n,y,128);F(r,b);let v=D(r,d.getBindGroupLayout(0),[w,c]),{commandEncoder:B,ts:A}=O(r,d,v,1);g=E(r,B,c),F(r,B);let S=G(g,Float32Array);g=null;let[_,N,I]=await Promise.all([j(x),j(A),S]);return _!==void 0&&N!==void 0?{dot:I[0],gpuTimeMs:_+N}:{dot:I[0]}}finally{!s&&l&&f(l),!u&&m&&f(m),w&&f(w),c&&f(c),p&&f(p),g&&f(g)}}async function ma(r,o,e,a){let t=e instanceof M;if(H(r),T(r,"sasum",{x:e}),!Number.isInteger(o)||!Number.isInteger(a))throw new Error("n and incx must be integers.");if(a<=0)throw new Error("incx must be positive.");if(!t&&!(e instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(o<=0)return{asum:0};if(e.length<(o-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");let i=await P(r,"sasum"),s=await P(r,"reduction/sum"),u=null,n=null,d=null,l=null,m=null;try{u=t?e._buf:h(r,e,"sasum-x",!1),n=fr(r,512,"sasum-partials"),d=Ar(r,4,"sasum-result"),l=q(r,[{value:o,type:"u32"},{value:a,type:"u32"}],"sasum-params");let w=D(r,i.getBindGroupLayout(0),[u,n,l]),{commandEncoder:c,ts:p}=O(r,i,w,128);F(r,c);let g=D(r,s.getBindGroupLayout(0),[n,d]),{commandEncoder:y,ts:b}=O(r,s,g,1);m=E(r,y,d),F(r,y);let x=G(m,Float32Array);m=null;let[v,B,A]=await Promise.all([j(p),j(b),x]);return v!==void 0&&B!==void 0?{asum:A[0],gpuTimeMs:v+B}:{asum:A[0]}}finally{!t&&u&&f(u),n&&f(n),d&&f(d),l&&f(l),m&&f(m)}}async function ca(r,o,e,a){let t=e instanceof M;if(H(r),T(r,"dasum",{x:e}),!Number.isInteger(o)||!Number.isInteger(a))throw new Error("n and incx must be integers.");if(a<=0)throw new Error("incx must be positive.");if(!t&&!(e instanceof Float64Array))throw new Error("x must be a Float64Array or GpuVector.");if(t&&e.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(o<=0)return{asum:0};if(e.length<(o-1)*a+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 P(r,[...i,"dasum"]),u=await P(r,[...i,"reduction/sumF64"]),n=null,d=null,l=null,m=null,w=null,c=null,p=null,g=null,y=null;try{if(t)n=e._buf,d=e._loBuf;else{let{hi:V,lo:C}=U(e.map(Math.abs));n=h(r,V,"dasum-xHi",!1),d=h(r,C,"dasum-xLo",!1)}l=fr(r,512,"dasum-partialsHi"),m=fr(r,512,"dasum-partialsLo"),w=Ar(r,4,"dasum-result-hi"),c=Ar(r,4,"dasum-result-lo"),p=q(r,[{value:o,type:"u32"},{value:a,type:"u32"}],"dasum-params");let b=D(r,s.getBindGroupLayout(0),[n,d,l,m,p]),{commandEncoder:x,ts:v}=O(r,s,b,128);F(r,x);let B=D(r,u.getBindGroupLayout(0),[l,m,w,c]),{commandEncoder:A,ts:S}=O(r,u,B,1);g=E(r,A,w),y=E(r,A,c),F(r,A);let _=G(g,Float32Array),N=G(y,Float32Array);g=null,y=null;let[I,k,L,R]=await Promise.all([j(v),j(S),_,N]),W=dr(L,R)[0];return I!==void 0&&k!==void 0?{asum:W,gpuTimeMs:I+k}:{asum:W}}finally{!t&&n&&f(n),!t&&d&&f(d),l&&f(l),m&&f(m),w&&f(w),c&&f(c),p&&f(p),g&&f(g),y&&f(y)}}async function pa(r,o,e,a,t,i){let s=e instanceof M,u=t instanceof M;if(H(r),T(r,"ddot",{x:e,y:t}),!Number.isInteger(o)||!Number.isInteger(a)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(a<=0||i<=0)throw new Error("incx and incy must be positive.");if(!s&&!(e instanceof Float64Array))throw new Error("x must be a Float64Array or GpuVector.");if(!u&&!(t instanceof Float64Array))throw new Error("y must be a Float64Array or GpuVector.");if(s&&e.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(u&&t.dtype!==Float64Array)throw new Error("y must be a Float64Array-backed GpuVector.");if(s!==u)throw new Error("x and y must be the same type (both Float64Array or both GpuVector).");if(o<=0)return{dot:0};if(e.length<(o-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(o-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let n=["f64/dekker","f64/utils/add"],d=await P(r,[...n,"f64/utils/multiply","ddot"]),l=await P(r,[...n,"reduction/sumF64"]),m=null,w=null,c=null,p=null,g=null,y=null,b=null,x=null,v=null,B=null,A=null;try{if(s)m=e._buf,w=e._loBuf,c=t._buf,p=t._loBuf;else{let $=U(e),J=U(t);m=h(r,$.hi,"ddot-xHi",!1),w=h(r,$.lo,"ddot-xLo",!1),c=h(r,J.hi,"ddot-yHi",!1),p=h(r,J.lo,"ddot-yLo",!1)}g=fr(r,512,"ddot-partialsHi"),y=fr(r,512,"ddot-partialsLo"),b=Ar(r,4,"ddot-result-hi"),x=Ar(r,4,"ddot-result-lo"),v=q(r,[{value:o,type:"u32"},{value:a,type:"u32"},{value:i,type:"u32"}],"ddot-params");let S=D(r,d.getBindGroupLayout(0),[m,w,c,p,g,y,v]),{commandEncoder:_,ts:N}=O(r,d,S,128);F(r,_);let I=D(r,l.getBindGroupLayout(0),[g,y,b,x]),{commandEncoder:k,ts:L}=O(r,l,I,1);B=E(r,k,b),A=E(r,k,x),F(r,k);let R=G(B,Float32Array),W=G(A,Float32Array);B=null,A=null;let[V,C,z,K]=await Promise.all([j(N),j(L),R,W]),Y=dr(z,K)[0];return V!==void 0&&C!==void 0?{dot:Y,gpuTimeMs:V+C}:{dot:Y}}finally{!s&&m&&f(m),!s&&w&&f(w),!u&&c&&f(c),!u&&p&&f(p),g&&f(g),y&&f(y),b&&f(b),x&&f(x),v&&f(v),B&&f(B),A&&f(A)}}async function wa(r,o,e,a){let t=e instanceof M;if(H(r),T(r,"snrm2",{x:e}),!Number.isInteger(o)||!Number.isInteger(a))throw new Error("n and incx must be integers.");if(a<=0)throw new Error("incx must be positive.");if(!t&&!(e instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(o<=0)return{nrm2:0};if(e.length<(o-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");let i=await P(r,"snrm2"),s=await P(r,"reduction/scaledSum"),u=null,n=null,d=null,l=null,m=null,w=null;try{u=t?e._buf:h(r,e,"snrm2-x",!1),n=fr(r,512,"snrm2-partials-scale"),d=fr(r,512,"snrm2-partials-ssq"),l=Ar(r,4,"snrm2-result"),m=q(r,[{value:o,type:"u32"},{value:a,type:"u32"}],"snrm2-params");let c=D(r,i.getBindGroupLayout(0),[u,n,d,m]),{commandEncoder:p,ts:g}=O(r,i,c,128);F(r,p);let y=D(r,s.getBindGroupLayout(0),[n,d,l]),{commandEncoder:b,ts:x}=O(r,s,y,1);w=E(r,b,l),F(r,b);let v=G(w,Float32Array);w=null;let[B,A,S]=await Promise.all([j(g),j(x),v]),_=S[0];return B!==void 0&&A!==void 0?{nrm2:_,gpuTimeMs:B+A}:{nrm2:_}}finally{!t&&u&&f(u),n&&f(n),d&&f(d),l&&f(l),m&&f(m),w&&f(w)}}async function ga(r,o,e,a){let t=e instanceof M;if(H(r),T(r,"dnrm2",{x:e}),!Number.isInteger(o)||!Number.isInteger(a))throw new Error("n and incx must be integers.");if(a<=0)throw new Error("incx must be positive.");if(!t&&!(e instanceof Float64Array))throw new Error("x must be a Float64Array or GpuVector.");if(t&&e.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(o<=0)return{nrm2:0};if(e.length<(o-1)*a+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/add","f64/utils/multiply","f64/utils/divide","f64/utils/sqrt"],s=await P(r,[...i,"dnrm2"]),u=await P(r,[...i,"reduction/scaledSumF64"]),n=null,d=null,l=null,m=null,w=null,c=null,p=null,g=null,y=null,b=null,x=null;try{if(t)n=e._buf,d=e._loBuf;else{let{hi:z,lo:K}=U(e);n=h(r,z,"dnrm2-xHi",!1),d=h(r,K,"dnrm2-xLo",!1)}l=fr(r,512,"dnrm2-partials-scaleHi"),m=fr(r,512,"dnrm2-partials-scaleLo"),w=fr(r,512,"dnrm2-partials-ssqHi"),c=fr(r,512,"dnrm2-partials-ssqLo"),p=Ar(r,4,"dnrm2-result-hi"),g=Ar(r,4,"dnrm2-result-lo"),y=q(r,[{value:o,type:"u32"},{value:a,type:"u32"}],"dnrm2-params");let v=D(r,s.getBindGroupLayout(0),[n,d,l,m,w,c,y]),{commandEncoder:B,ts:A}=O(r,s,v,128);F(r,B);let S=D(r,u.getBindGroupLayout(0),[l,m,w,c,p,g]),{commandEncoder:_,ts:N}=O(r,u,S,1);b=E(r,_,p),x=E(r,_,g),F(r,_);let I=G(b,Float32Array),k=G(x,Float32Array);b=null,x=null;let[L,R,W,V]=await Promise.all([j(A),j(N),I,k]),C=dr(W,V)[0];return L!==void 0&&R!==void 0?{nrm2:C,gpuTimeMs:L+R}:{nrm2:C}}finally{!t&&n&&f(n),!t&&d&&f(d),l&&f(l),m&&f(m),w&&f(w),c&&f(c),p&&f(p),g&&f(g),y&&f(y),b&&f(b),x&&f(x)}}async function ha(r,o,e,a){let t=e instanceof M;if(H(r),T(r,"isamax",{x:e}),!Number.isInteger(o)||!Number.isInteger(a))throw new Error("n and incx must be integers.");if(a<=0)throw new Error("incx must be positive.");if(!t&&!(e instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(o<=0)return{index:0};if(e.length<(o-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");let i=await P(r,"isamax"),s=await P(r,"reduction/argmax"),u=null,n=null,d=null,l=null,m=null,w=null;try{u=t?e._buf:h(r,e,"isamax-x",!1),n=fr(r,512,"isamax-partials-val"),d=fr(r,512,"isamax-partials-idx"),l=Ar(r,4,"isamax-result"),m=q(r,[{value:o,type:"u32"},{value:a,type:"u32"}],"isamax-params");let c=D(r,i.getBindGroupLayout(0),[u,n,d,m]),{commandEncoder:p,ts:g}=O(r,i,c,128);F(r,p);let y=D(r,s.getBindGroupLayout(0),[n,d,l]),{commandEncoder:b,ts:x}=O(r,s,y,1);w=E(r,b,l),F(r,b);let v=G(w,Uint32Array);w=null;let[B,A,S]=await Promise.all([j(g),j(x),v]),_=S[0];return B!==void 0&&A!==void 0?{index:_,gpuTimeMs:B+A}:{index:_}}finally{!t&&u&&f(u),n&&f(n),d&&f(d),l&&f(l),m&&f(m),w&&f(w)}}async function ba(r,o,e,a){let t=e instanceof M;if(H(r),T(r,"idamax",{x:e}),!Number.isInteger(o)||!Number.isInteger(a))throw new Error("n and incx must be integers.");if(a<=0)throw new Error("incx must be positive.");if(!t&&!(e instanceof Float64Array))throw new Error("x must be a Float64Array or GpuVector.");if(t&&e.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(o<=0)return{index:0};if(e.length<(o-1)*a+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 P(r,[...i,"idamax"],"idamax_main"),u=await P(r,[...i,"reduction/argmaxF64"],"reduce_f64"),n=null,d=null,l=null,m=null,w=null,c=null,p=null,g=null;try{if(t)n=e._buf,d=e._loBuf;else{let{hi:L,lo:R}=U(e);n=h(r,L,"idamax-xHi",!1),d=h(r,R,"idamax-xLo",!1)}l=fr(r,512,"idamax-partials-val-hi"),m=fr(r,512,"idamax-partials-val-lo"),w=fr(r,512,"idamax-partials-idx"),c=Ar(r,4,"idamax-result"),p=q(r,[{value:o,type:"u32"},{value:a,type:"u32"}],"idamax-params");let y=D(r,s.getBindGroupLayout(0),[n,d,l,m,w,p]),{commandEncoder:b,ts:x}=O(r,s,y,128);F(r,b);let v=D(r,u.getBindGroupLayout(0),[l,m,w,c]),{commandEncoder:B,ts:A}=O(r,u,v,1);g=E(r,B,c),F(r,B);let S=G(g,Uint32Array);g=null;let[_,N,I]=await Promise.all([j(x),j(A),S]),k=I[0];return _!==void 0&&N!==void 0?{index:k,gpuTimeMs:_+N}:{index:k}}finally{!t&&n&&f(n),!t&&d&&f(d),l&&f(l),m&&f(m),w&&f(w),c&&f(c),p&&f(p),g&&f(g)}}async function ya(r,o,e,a,t,i,s,u){let n=e instanceof M,d=t instanceof M;if(H(r),T(r,"srot",{x:e,y:t}),!Number.isInteger(o)||!Number.isInteger(a)||!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 u!="number")throw new Error("s must be a number.");if(Number.isNaN(s)||Number.isNaN(u))throw new Error("c and s must not be NaN.");if(!Number.isFinite(s))throw new Error("c must be finite.");if(!Number.isFinite(u))throw new Error("s must be finite.");if(a<=0||i<=0)throw new Error("incx and incy must be positive.");if(!n&&!(e instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!d&&!(t instanceof Float32Array))throw new Error("y must be a Float32Array or GpuVector.");if(n!==d)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(o<=0)return n?{}:{x:e,y:t};if(e.length<(o-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(o-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let l=await P(r,"srot"),m=null,w=null,c=null,p=null,g=null;try{m=n?e._buf:h(r,e,"srot-x",!0),w=d?t._buf:h(r,t,"srot-y",!0),c=q(r,[{value:o,type:"u32"},{value:s,type:"f32"},{value:u,type:"f32"},{value:a,type:"u32"},{value:i,type:"u32"}],"srot-params");let y=D(r,l.getBindGroupLayout(0),[m,w,c]),{commandEncoder:b,ts:x}=O(r,l,y,br(r,o));p=n?null:E(r,b,m),g=d?null:E(r,b,w),F(r,b);let v=await j(x);if(n)return v!==void 0?{gpuTimeMs:v}:{};let B=G(p,Float32Array),A=G(g,Float32Array);p=null,g=null;let[S,_]=await Promise.all([B,A]);return v!==void 0?{x:S,y:_,gpuTimeMs:v}:{x:S,y:_}}finally{!n&&m&&f(m),!d&&w&&f(w),c&&f(c),p&&f(p),g&&f(g)}}async function xa(r,o,e,a,t,i,s,u){let n=e instanceof M,d=t instanceof M;if(H(r),T(r,"drot",{x:e,y:t}),!Number.isInteger(o)||!Number.isInteger(a)||!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 u!="number")throw new Error("s must be a number.");if(Number.isNaN(s)||Number.isNaN(u))throw new Error("c and s must not be NaN.");if(!Number.isFinite(s))throw new Error("c must be finite.");if(!Number.isFinite(u))throw new Error("s must be finite.");if(a<=0||i<=0)throw new Error("incx and incy must be positive.");if(!(e instanceof Float64Array)&&!n)throw new Error("x must be a Float64Array or GpuVector.");if(!(t instanceof Float64Array)&&!d)throw new Error("y must be a Float64Array or GpuVector.");if(n&&e.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(d&&t.dtype!==Float64Array)throw new Error("y must be a Float64Array-backed GpuVector.");if(n!==d)throw new Error("x and y must be the same type (both Float64Array or both GpuVector).");if(o<=0)return n?{}:{x:e,y:t};if(e.length<(o-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(o-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let m=await P(r,[...["f64/dekker","f64/utils/add","f64/utils/multiply"],"drot"]),{hi:w,lo:c}=U(new Float64Array([s])),{hi:p,lo:g}=U(new Float64Array([u])),y=null,b=null,x=null,v=null,B=null,A=null,S=null,_=null,N=null;try{if(n)y=e._buf,b=e._loBuf,x=t._buf,v=t._loBuf;else{let $=U(e),J=U(t);y=h(r,$.hi,"drot-xHi",!0),b=h(r,$.lo,"drot-xLo",!0),x=h(r,J.hi,"drot-yHi",!0),v=h(r,J.lo,"drot-yLo",!0)}B=q(r,[{value:o,type:"u32"},{value:w[0],type:"f32"},{value:c[0],type:"f32"},{value:p[0],type:"f32"},{value:g[0],type:"f32"},{value:a,type:"u32"},{value:i,type:"u32"}],"drot-params");let I=D(r,m.getBindGroupLayout(0),[y,b,x,v,B]),{commandEncoder:k,ts:L}=O(r,m,I,br(r,o));A=n?null:E(r,k,y),S=n?null:E(r,k,b),_=d?null:E(r,k,x),N=d?null:E(r,k,v),F(r,k);let R=await j(L);if(n)return R!==void 0?{gpuTimeMs:R}:{};let W=await G(A,Float32Array);A=null;let V=await G(S,Float32Array);S=null;let C=await G(_,Float32Array);_=null;let z=await G(N,Float32Array);N=null;let K=dr(W,V),Y=dr(C,z);return R!==void 0?{x:K,y:Y,gpuTimeMs:R}:{x:K,y:Y}}finally{!n&&y&&f(y),!n&&b&&f(b),!d&&x&&f(x),!d&&v&&f(v),B&&f(B),A&&f(A),S&&f(S),_&&f(_),N&&f(N)}}async function va(r,o,e,a,t,i,s){let u=e instanceof M,n=t instanceof M;if(H(r),T(r,"srotm",{x:e,y:t}),!Number.isInteger(o)||!Number.isInteger(a)||!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(s[0]!==-2&&s[0]!==-1&&s[0]!==0&&s[0]!==1)throw new Error("param[0] (flag) must be one of -2, -1, 0, or 1.");if(a<=0||i<=0)throw new Error("incx and incy must be positive.");if(!u&&!(e 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(u!==n)throw new Error("x and y must be the same type (both Float32Array or both GpuVector).");if(o<=0||s[0]===-2)return u?{}:{x:e,y:t};if(e.length<(o-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(o-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let d=await P(r,"srotm"),l=null,m=null,w=null,c=null,p=null,g=null;try{l=u?e._buf:h(r,e,"srotm-x",!0),m=n?t._buf:h(r,t,"srotm-y",!0),w=h(r,s,"srotm-param",!1),c=q(r,[{value:o,type:"u32"},{value:a,type:"u32"},{value:i,type:"u32"}],"srotm-params");let y=D(r,d.getBindGroupLayout(0),[l,m,w,c]),{commandEncoder:b,ts:x}=O(r,d,y,br(r,o));p=u?null:E(r,b,l),g=n?null:E(r,b,m),F(r,b);let v=await j(x);if(u)return v!==void 0?{gpuTimeMs:v}:{};let B=G(p,Float32Array),A=G(g,Float32Array);p=null,g=null;let[S,_]=await Promise.all([B,A]);return v!==void 0?{x:S,y:_,gpuTimeMs:v}:{x:S,y:_}}finally{!u&&l&&f(l),!n&&m&&f(m),w&&f(w),c&&f(c),p&&f(p),g&&f(g)}}async function _a(r,o,e,a,t,i,s){let u=e instanceof M,n=t instanceof M;if(H(r),T(r,"drotm",{x:e,y:t}),!Number.isInteger(o)||!Number.isInteger(a)||!Number.isInteger(i))throw new Error("n, incx, and incy must be integers.");if(!(s instanceof Float64Array)||s.length!==5)throw new Error("param must be a Float64Array of length 5.");if(s[0]!==-2&&s[0]!==-1&&s[0]!==0&&s[0]!==1)throw new Error("param[0] (flag) must be one of -2, -1, 0, or 1.");if(a<=0||i<=0)throw new Error("incx and incy must be positive.");if(!(e instanceof Float64Array)&&!u)throw new Error("x must be a Float64Array or GpuVector.");if(!(t instanceof Float64Array)&&!n)throw new Error("y must be a Float64Array or GpuVector.");if(u&&e.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(n&&t.dtype!==Float64Array)throw new Error("y must be a Float64Array-backed GpuVector.");if(u!==n)throw new Error("x and y must be the same type (both Float64Array or both GpuVector).");if(o<=0||s[0]===-2)return u?{}:{x:e,y:t};if(e.length<(o-1)*a+1)throw new Error("x does not have enough elements for the given n and incx.");if(t.length<(o-1)*i+1)throw new Error("y does not have enough elements for the given n and incy.");let l=await P(r,[...["f64/dekker","f64/utils/add","f64/utils/multiply"],"drotm"]),{hi:m,lo:w}=U(s),c=null,p=null,g=null,y=null,b=null,x=null,v=null,B=null,A=null,S=null,_=null;try{if(u)c=e._buf,p=e._loBuf,g=t._buf,y=t._loBuf;else{let Y=U(e),$=U(t);c=h(r,Y.hi,"drotm-xHi",!0),p=h(r,Y.lo,"drotm-xLo",!0),g=h(r,$.hi,"drotm-yHi",!0),y=h(r,$.lo,"drotm-yLo",!0)}b=h(r,m,"drotm-paramHi",!1),x=h(r,w,"drotm-paramLo",!1),v=q(r,[{value:o,type:"u32"},{value:a,type:"u32"},{value:i,type:"u32"}],"drotm-params");let N=D(r,l.getBindGroupLayout(0),[c,p,g,y,b,x,v]),{commandEncoder:I,ts:k}=O(r,l,N,br(r,o));B=u?null:E(r,I,c),A=u?null:E(r,I,p),S=n?null:E(r,I,g),_=n?null:E(r,I,y),F(r,I);let L=await j(k);if(u)return L!==void 0?{gpuTimeMs:L}:{};let R=await G(B,Float32Array);B=null;let W=await G(A,Float32Array);A=null;let V=await G(S,Float32Array);S=null;let C=await G(_,Float32Array);_=null;let z=dr(R,W),K=dr(V,C);return L!==void 0?{x:z,y:K,gpuTimeMs:L}:{x:z,y:K}}finally{!u&&c&&f(c),!u&&p&&f(p),!n&&g&&f(g),!n&&y&&f(y),b&&f(b),x&&f(x),v&&f(v),B&&f(B),A&&f(A),S&&f(S),_&&f(_)}}async function Ba(r,o,e,a,t,i,s,u,n,d,l,m,w="row-major"){let c=i instanceof X,p=u instanceof M,g=l instanceof M;if(H(r),T(r,"sgemv",{A:i,x:u,y:l}),o!=="no-transpose"&&o!=="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 d!="number")throw new Error("beta must be a number.");if(Number.isNaN(d))throw new Error("beta must not be NaN.");if(!Number.isFinite(d))throw new Error("beta must be finite.");if(!Number.isInteger(e)||!Number.isInteger(a)||!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&&!(u instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!g&&!(l 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&&u._buf===l._buf)throw new Error("x and y must not reference the same GPU buffer when both are GpuVectors.");if(c&&g&&i._buf===l._buf)throw new Error("A and y must not reference the same GPU buffer.");if(c&&s!==i.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(c&&(i.rows<e||i.cols<a))throw new Error("A is too small for the given m and n.");if(e<0||a<0)throw new Error("m and n must be non-negative.");if(e===0||a===0)return g?{}:{y:l};(c?i.layout:w)==="column-major"&&([e,a]=[a,e],o=o==="no-transpose"?"transpose":"no-transpose");let b=o==="no-transpose",x=b?a:e,v=b?e:a;if(s<a)throw new Error("lda must be >= n.");if(!c&&i.length<(e-1)*s+a)throw new Error("A does not have enough elements for the given m, n, and lda.");if(u.length<(x-1)*n+1)throw new Error("x does not have enough elements for the given dimensions and incx.");if(l.length<(v-1)*m+1)throw new Error("y does not have enough elements for the given dimensions and incy.");let A=await P(r,b?"sgemv_n":"sgemv_t"),S=null,_=null,N=null,I=null;try{S=c?i._buf:h(r,i,"sgemv-A",!1),_=p?u._buf:h(r,u,"sgemv-x",!1),N=g?l._buf:h(r,l,"sgemv-y",!0),I=q(r,[{value:e,type:"u32"},{value:a,type:"u32"},{value:t,type:"f32"},{value:d,type:"f32"},{value:n,type:"u32"},{value:m,type:"u32"},{value:s,type:"u32"}],"sgemv-params");let k=D(r,A.getBindGroupLayout(0),[S,_,N,I]),L=b?Math.min(e,r.limits.maxComputeWorkgroupsPerDimension):Yr(r,"sgemv",v),{commandEncoder:R,ts:W}=O(r,A,k,L),V=g?null:E(r,R,N);F(r,R);let C=await j(W);if(g)return C!==void 0?{gpuTimeMs:C}:{};let z=await G(V,Float32Array);return C!==void 0?{y:z,gpuTimeMs:C}:{y:z}}finally{!c&&S&&f(S),!p&&_&&f(_),!g&&N&&f(N),I&&f(I)}}async function Aa(r,o,e,a,t,i,s,u,n,d,l,m="row-major"){let w=s instanceof M,c=d instanceof M,p=t instanceof X;if(H(r),T(r,"ssymv",{A:t,x:s,y:d}),o!=="lower"&&o!=="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(e)||!Number.isInteger(u)||!Number.isInteger(l)||!Number.isInteger(i))throw new Error("n, incx, incy, and lda must be integers.");if(typeof a!="number")throw new Error("alpha must be a number.");if(Number.isNaN(a))throw new Error("alpha must not be NaN.");if(!Number.isFinite(a))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(u<=0||l<=0)throw new Error("incx and incy must be positive.");if(i<e)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&&!(d 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===d._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<e||t.cols<e))throw new Error("A is too small for the given n.");if(e<0)throw new Error("n must be non-negative.");if(e===0)return c?{}:{y:d};if(!p&&t.length<(e-1)*i+e)throw new Error("A does not have enough elements for the given n and lda.");if(s.length<(e-1)*u+1)throw new Error("x does not have enough elements for the given n and incx.");if(d.length<(e-1)*l+1)throw new Error("y does not have enough elements for the given n and incy.");let y=(p?t.layout:m)==="column-major"?o==="upper":o==="lower",b=await P(r,"ssymv"),x=null,v=null,B=null,A=null;try{x=p?t._buf:h(r,t,"ssymv-A",!1),v=w?s._buf:h(r,s,"ssymv-x",!1),B=c?d._buf:h(r,d,"ssymv-y",!0),A=q(r,[{value:e,type:"u32"},{value:a,type:"f32"},{value:n,type:"f32"},{value:u,type:"u32"},{value:l,type:"u32"},{value:i,type:"u32"},{value:y?0:1,type:"u32"}],"ssymv-params");let S=D(r,b.getBindGroupLayout(0),[x,v,B,A]),_=Math.min(e,r.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:N,ts:I}=O(r,b,S,_),k=c?null:E(r,N,B);F(r,N);let L=await j(I);if(c)return L!==void 0?{gpuTimeMs:L}:{};let R=await G(k,Float32Array);return L!==void 0?{y:R,gpuTimeMs:L}:{y:R}}finally{!p&&x&&f(x),!w&&v&&f(v),!c&&B&&f(B),A&&f(A)}}async function Sa(r,o,e,a,t,i,s,u,n,d,l,m="row-major"){let w=u instanceof M,c=d instanceof M,p=i instanceof X,g=a==="unit";if(H(r),T(r,"strmv",{A:i,x:u,y:d}),o!=="lower"&&o!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(e!=="no-transpose"&&e!=="transpose")throw new Error("trans must be 'no-transpose' or 'transpose'.");if(!g&&a!=="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(l)||!Number.isInteger(s))throw new Error("n, incx, incy, and lda must be integers.");if(n<=0||l<=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&&!(u instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(!c&&!(d 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&&u._buf===d._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===d._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:d};if(!p&&i.length<(t-1)*s+t)throw new Error("A does not have enough elements for the given n and lda.");if(u.length<(t-1)*n+1)throw new Error("x does not have enough elements for the given n and incx.");if(d.length<(t-1)*l+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?o==="upper":o==="lower",v=b?e==="transpose":e==="no-transpose",B=await P(r,"strmv"),A=null,S=null,_=null,N=null;try{A=p?i._buf:h(r,i,"strmv-A",!1),S=w?u._buf:h(r,u,"strmv-x",!1),_=c?d._buf:h(r,d,"strmv-y",!0),N=q(r,[{value:t,type:"u32"},{value:n,type:"u32"},{value:l,type:"u32"},{value:s,type:"u32"},{value:v?0:1,type:"u32"},{value:x?0:1,type:"u32"},{value:g?1:0,type:"u32"}],"strmv-params");let I=D(r,B.getBindGroupLayout(0),[A,S,_,N]),k=Math.min(t,r.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:L,ts:R}=O(r,B,I,k),W=c?null:E(r,L,_);F(r,L);let V=await j(R);if(c)return V!==void 0?{gpuTimeMs:V}:{};let C=await G(W,Float32Array);return V!==void 0?{y:C,gpuTimeMs:V}:{y:C}}finally{!p&&A&&f(A),!w&&S&&f(S),!c&&_&&f(_),N&&f(N)}}function Ga(r,o,e){let a=new ArrayBuffer(r*o),t=new DataView(a);for(let i=0;i<r;i++){let s=e(i),u=i*o;s.forEach((n,d)=>t.setUint32(u+d*4,n,!0))}return a}function Ea(r,o,e){let a=r.createBuffer({label:e,size:o.byteLength,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});return r.queue.writeBuffer(a,0,o),a}async function ka(r,o,e,a,t,i,s,u,n,d="row-major"){let l=u instanceof M,m=i instanceof X,w=a==="unit";if(H(r),T(r,"strsv",{A:i,x:u}),o!=="lower"&&o!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(e!=="no-transpose"&&e!=="transpose")throw new Error("trans must be 'no-transpose' or 'transpose'.");if(!w&&a!=="non-unit")throw new Error("diag must be 'unit' or 'non-unit'.");if(d!=="row-major"&&d!=="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(!l&&!(u instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(l&&!m)throw new Error("A must be a GpuMatrix when x is a GpuVector.");if(m&&!l)throw new Error("x must be a GpuVector when A is a GpuMatrix.");if(m&&l&&i._buf===u._buf)throw new Error("A and x must not reference the same GPU buffer.");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 l?{}:{x:u};if(!m&&i.length<(t-1)*s+t)throw new Error("A does not have enough elements for the given n and lda.");if(u.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:d)==="column-major",g=p?o==="upper":o==="lower",y=p?e==="transpose":e==="no-transpose",b=await P(r,"strsv_invert_block"),x=await P(r,"strsv_apply_inverse"),v=await P(r,"strsv_update"),B=y===g,A=[];for(let C=0;C<t;C+=64)A.push(C);B||A.reverse();let S=A.length,_=r.limits.maxComputeWorkgroupsPerDimension,N=r.limits.minUniformBufferOffsetAlignment,I=null,k=null,L=null,R=null,W=null,V=null;try{I=m?i._buf:h(r,i,"strsv-A",!1),k=l?u._buf:h(r,u,"strsv-x",!0),L=fr(r,S*64*64*4,"strsv-Ainv");let C=Ga(S,N,ar=>{let sr=ar*64,lr=Math.min(sr+64,t);return[n,ar,sr,lr]});R=Ea(r,C,"strsv-apply-params");let z=Ga(S,N,ar=>{let sr=ar*64,lr=Math.min(sr+64,t);return[t,n,s,y?0:1,g?0:1,sr,lr]});W=Ea(r,z,"strsv-update-params");let{commandEncoder:K,querySet:Y}=Mr(r);V=q(r,[{value:t,type:"u32"},{value:s,type:"u32"},{value:y?0:1,type:"u32"},{value:g?0:1,type:"u32"},{value:w?1:0,type:"u32"}],"strsv-invert-params");let $=D(r,b.getBindGroupLayout(0),[I,L,V]);hr(K,b,$,{x:64,y:S},Y?{timestampWrites:{querySet:Y,beginningOfPassWriteIndex:0}}:void 0);for(let ar=0;ar<A.length;ar++){let sr=A[ar],lr=Math.min(sr+64,t),ur=sr/64,mr=ar===A.length-1,yr=ur*N,wr=D(r,x.getBindGroupLayout(0),[L,k,{buffer:R,offset:yr,size:16}]);hr(K,x,wr,1,mr&&Y?{timestampWrites:{querySet:Y,endOfPassWriteIndex:1}}:void 0);let gr=B?t-lr:sr;if(gr===0)continue;let Gr=D(r,v.getBindGroupLayout(0),[I,k,{buffer:W,offset:yr,size:32}]),Nr=Math.min(gr,_);hr(K,v,Gr,Nr)}let nr=kr(r,K,Y),er=l?null:E(r,K,k);F(r,K);let Q=await j(nr);if(l)return Q!==void 0?{gpuTimeMs:Q}:{};let rr=await G(er,Float32Array);return Q!==void 0?{x:rr,gpuTimeMs:Q}:{x:rr}}finally{!m&&I&&f(I),!l&&k&&f(k),L&&f(L),R&&f(R),W&&f(W),V&&f(V)}}async function Da(r,o,e,a,t,i,s,u,n,d,l="row-major"){let m=n instanceof X;if(H(r),T(r,"sger",{A:n,x:t,y:s}),l!=="row-major"&&l!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(typeof a!="number")throw new Error("alpha must be a number.");if(Number.isNaN(a))throw new Error("alpha must not be NaN.");if(!Number.isFinite(a))throw new Error("alpha must be finite.");if(!Number.isInteger(o)||!Number.isInteger(e)||!Number.isInteger(i)||!Number.isInteger(u)||!Number.isInteger(d))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(!m&&!(n instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(m&&d!==n.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(m&&(n.rows<o||n.cols<e))throw new Error("A is too small for the given m and n.");(m?n.layout:l)==="column-major"&&([o,e]=[e,o],[t,s]=[s,t],[i,u]=[u,i]);let c=t instanceof M,p=s instanceof M;if(d<e)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(o<0||e<0)throw new Error("m and n must be non-negative.");if(o===0||e===0)return m?{}:{A:n};if(!m&&n.length<(o-1)*d+e)throw new Error("A does not have enough elements for the given m, n, and lda.");if(t.length<(o-1)*i+1)throw new Error("x does not have enough elements for the given m and incx.");if(s.length<(e-1)*u+1)throw new Error("y does not have enough elements for the given n and incy.");let g=await P(r,"sger"),y=null,b=null,x=null,v=null;try{y=c?t._buf:h(r,t,"sger-x",!1),b=p?s._buf:h(r,s,"sger-y",!1),x=m?n._buf:h(r,n,"sger-A",!0),v=q(r,[{value:o,type:"u32"},{value:e,type:"u32"},{value:a,type:"f32"},{value:i,type:"u32"},{value:u,type:"u32"},{value:d,type:"u32"}],"sger-params");let B=D(r,g.getBindGroupLayout(0),[y,b,x,v]),A=Math.min(o,r.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:S,ts:_}=O(r,g,B,A),N=m?null:E(r,S,x);F(r,S);let I=await j(_);if(m)return I!==void 0?{gpuTimeMs:I}:{};let k=await G(N,Float32Array);return I!==void 0?{A:k,gpuTimeMs:I}:{A:k}}finally{!c&&y&&f(y),!p&&b&&f(b),!m&&x&&f(x),v&&f(v)}}async function La(r,o,e,a,t,i,s,u,n,d,l="row-major"){let m=n instanceof X;if(H(r),T(r,"dger",{A:n,x:t,y:s}),l!=="row-major"&&l!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(typeof a!="number")throw new Error("alpha must be a number.");if(Number.isNaN(a))throw new Error("alpha must not be NaN.");if(!Number.isFinite(a))throw new Error("alpha must be finite.");if(!Number.isInteger(o)||!Number.isInteger(e)||!Number.isInteger(i)||!Number.isInteger(u)||!Number.isInteger(d))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(!m&&!(n instanceof Float64Array))throw new Error("A must be a Float64Array or GpuMatrix.");if(m&&n.dtype!==Float64Array)throw new Error("A must be a Float64Array-backed GpuMatrix.");if(m&&d!==n.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(m&&(n.rows<o||n.cols<e))throw new Error("A is too small for the given m and n.");(m?n.layout:l)==="column-major"&&([o,e]=[e,o],[t,s]=[s,t],[i,u]=[u,i]);let c=t instanceof M,p=s instanceof M;if(d<e)throw new Error("lda must be >= n.");if(!c&&!(t instanceof Float64Array))throw new Error("x must be a Float64Array or GpuVector.");if(!p&&!(s instanceof Float64Array))throw new Error("y must be a Float64Array or GpuVector.");if(c&&t.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(p&&s.dtype!==Float64Array)throw new Error("y must be a Float64Array-backed GpuVector.");if(c!==p)throw new Error("x and y must be the same type (both Float64Array 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(o<0||e<0)throw new Error("m and n must be non-negative.");if(o===0||e===0)return m?{}:{A:n};if(!m&&n.length<(o-1)*d+e)throw new Error("A does not have enough elements for the given m, n, and lda.");if(t.length<(o-1)*i+1)throw new Error("x does not have enough elements for the given m and incx.");if(s.length<(e-1)*u+1)throw new Error("y does not have enough elements for the given n and incy.");let y=await P(r,[...["f64/dekker","f64/utils/add","f64/utils/multiply"],"dger"],"dger_main"),{hi:b,lo:x}=U(new Float64Array([a])),v=null,B=null,A=null,S=null,_=null,N=null,I=null,k=null,L=null;try{if(c)v=t._buf,B=t._loBuf,A=s._buf,S=s._loBuf,_=n._buf,N=n._loBuf;else{let J=U(t),nr=U(s),er=U(n);v=h(r,J.hi,"dger-xHi",!1),B=h(r,J.lo,"dger-xLo",!1),A=h(r,nr.hi,"dger-yHi",!1),S=h(r,nr.lo,"dger-yLo",!1),_=h(r,er.hi,"dger-AHi",!0),N=h(r,er.lo,"dger-ALo",!0)}I=q(r,[{value:o,type:"u32"},{value:e,type:"u32"},{value:b[0],type:"f32"},{value:x[0],type:"f32"},{value:i,type:"u32"},{value:u,type:"u32"},{value:d,type:"u32"}],"dger-params");let R=D(r,y.getBindGroupLayout(0),[v,B,A,S,_,N,I]),W=Math.min(o,r.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:V,ts:C}=O(r,y,R,W);k=m?null:E(r,V,_),L=m?null:E(r,V,N),F(r,V);let z=await j(C);if(m)return z!==void 0?{gpuTimeMs:z}:{};let K=await G(k,Float32Array);k=null;let Y=await G(L,Float32Array);L=null;let $=dr(K,Y);return z!==void 0?{A:$,gpuTimeMs:z}:{A:$}}finally{!c&&v&&f(v),!c&&B&&f(B),!p&&A&&f(A),!p&&S&&f(S),!m&&_&&f(_),!m&&N&&f(N),I&&f(I),k&&f(k),L&&f(L)}}async function Pa(r,o,e,a,t,i,s,u,n="row-major"){let d=t instanceof M,l=s instanceof X;if(H(r),T(r,"ssyr",{A:s,x:t}),o!=="lower"&&o!=="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(e)||!Number.isInteger(i)||!Number.isInteger(u))throw new Error("n, incx, and lda must be integers.");if(typeof a!="number")throw new Error("alpha must be a number.");if(Number.isNaN(a))throw new Error("alpha must not be NaN.");if(!Number.isFinite(a))throw new Error("alpha must be finite.");if(i<=0)throw new Error("incx must be positive.");if(u<e)throw new Error("lda must be >= n.");if(!l&&!(s instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!d&&!(t instanceof Float32Array))throw new Error("x must be a Float32Array or GpuVector.");if(d&&!l)throw new Error("A must be a GpuMatrix when x is a GpuVector.");if(l&&!d)throw new Error("x must be a GpuVector when A is a GpuMatrix.");if(l&&d&&s._buf===t._buf)throw new Error("A and x must not reference the same GPU buffer.");if(l&&u!==s.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(l&&(s.rows<e||s.cols<e))throw new Error("A is too small for the given n.");if(e<0)throw new Error("n must be non-negative.");if(e===0)return l?{}:{A:s};if(!l&&s.length<(e-1)*u+e)throw new Error("A does not have enough elements for the given n and lda.");if(t.length<(e-1)*i+1)throw new Error("x does not have enough elements for the given n and incx.");let w=(l?s.layout:n)==="column-major"?o==="upper":o==="lower",c=await P(r,"ssyr"),p=null,g=null,y=null;try{p=d?t._buf:h(r,t,"ssyr-x",!1),g=l?s._buf:h(r,s,"ssyr-A",!0),y=q(r,[{value:e,type:"u32"},{value:a,type:"f32"},{value:i,type:"u32"},{value:u,type:"u32"},{value:w?0:1,type:"u32"}],"ssyr-params");let b=D(r,c.getBindGroupLayout(0),[p,g,y]),x=Math.min(e,r.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:v,ts:B}=O(r,c,b,x),A=l?null:E(r,v,g);F(r,v);let S=await j(B);if(l)return S!==void 0?{gpuTimeMs:S}:{};let _=await G(A,Float32Array);return S!==void 0?{A:_,gpuTimeMs:S}:{A:_}}finally{!d&&p&&f(p),!l&&g&&f(g),y&&f(y)}}async function Na(r,o,e,a,t,i,s,u,n="row-major"){let d=t instanceof M,l=s instanceof X;if(H(r),T(r,"dsyr",{A:s,x:t}),o!=="lower"&&o!=="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(e)||!Number.isInteger(i)||!Number.isInteger(u))throw new Error("n, incx, and lda must be integers.");if(typeof a!="number")throw new Error("alpha must be a number.");if(Number.isNaN(a))throw new Error("alpha must not be NaN.");if(!Number.isFinite(a))throw new Error("alpha must be finite.");if(i<=0)throw new Error("incx must be positive.");if(u<e)throw new Error("lda must be >= n.");if(!l&&!(s instanceof Float64Array))throw new Error("A must be a Float64Array or GpuMatrix.");if(l&&s.dtype!==Float64Array)throw new Error("A must be a Float64Array-backed GpuMatrix.");if(!d&&!(t instanceof Float64Array))throw new Error("x must be a Float64Array or GpuVector.");if(d&&t.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(d&&!l)throw new Error("A must be a GpuMatrix when x is a GpuVector.");if(l&&!d)throw new Error("x must be a GpuVector when A is a GpuMatrix.");if(l&&d&&s._buf===t._buf)throw new Error("A and x must not reference the same GPU buffer.");if(l&&u!==s.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(l&&(s.rows<e||s.cols<e))throw new Error("A is too small for the given n.");if(e<0)throw new Error("n must be non-negative.");if(e===0)return l?{}:{A:s};if(!l&&s.length<(e-1)*u+e)throw new Error("A does not have enough elements for the given n and lda.");if(t.length<(e-1)*i+1)throw new Error("x does not have enough elements for the given n and incx.");let w=(l?s.layout:n)==="column-major"?o==="upper":o==="lower",p=await P(r,[...["f64/dekker","f64/utils/add","f64/utils/multiply"],"dsyr"],"dsyr_main"),{hi:g,lo:y}=U(new Float64Array([a])),b=null,x=null,v=null,B=null,A=null,S=null,_=null;try{if(d)b=t._buf,x=t._loBuf,v=s._buf,B=s._loBuf;else{let z=U(t),K=U(s);b=h(r,z.hi,"dsyr-xHi",!1),x=h(r,z.lo,"dsyr-xLo",!1),v=h(r,K.hi,"dsyr-AHi",!0),B=h(r,K.lo,"dsyr-ALo",!0)}A=q(r,[{value:e,type:"u32"},{value:g[0],type:"f32"},{value:y[0],type:"f32"},{value:i,type:"u32"},{value:u,type:"u32"},{value:w?0:1,type:"u32"}],"dsyr-params");let N=D(r,p.getBindGroupLayout(0),[b,x,v,B,A]),I=Math.min(e,r.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:k,ts:L}=O(r,p,N,I);S=l?null:E(r,k,v),_=l?null:E(r,k,B),F(r,k);let R=await j(L);if(l)return R!==void 0?{gpuTimeMs:R}:{};let W=await G(S,Float32Array);S=null;let V=await G(_,Float32Array);_=null;let C=dr(W,V);return R!==void 0?{A:C,gpuTimeMs:R}:{A:C}}finally{!d&&b&&f(b),!d&&x&&f(x),!l&&v&&f(v),!l&&B&&f(B),A&&f(A),S&&f(S),_&&f(_)}}async function Ma(r,o,e,a,t,i,s,u,n,d,l="row-major"){let m=t instanceof M,w=s instanceof M,c=n instanceof X;if(H(r),T(r,"ssyr2",{A:n,x:t,y:s}),o!=="lower"&&o!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(l!=="row-major"&&l!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(!Number.isInteger(e)||!Number.isInteger(i)||!Number.isInteger(u)||!Number.isInteger(d))throw new Error("n, incx, incy, and lda must be integers.");if(typeof a!="number")throw new Error("alpha must be a number.");if(Number.isNaN(a))throw new Error("alpha must not be NaN.");if(!Number.isFinite(a))throw new Error("alpha must be finite.");if(i<=0||u<=0)throw new Error("incx and incy must be positive.");if(d<e)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&&d!==n.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(c&&(n.rows<e||n.cols<e))throw new Error("A is too small for the given n.");if(e<0)throw new Error("n must be non-negative.");if(e===0)return c?{}:{A:n};if(!c&&n.length<(e-1)*d+e)throw new Error("A does not have enough elements for the given n and lda.");if(t.length<(e-1)*i+1)throw new Error("x does not have enough elements for the given n and incx.");if(s.length<(e-1)*u+1)throw new Error("y does not have enough elements for the given n and incy.");let g=(c?n.layout:l)==="column-major"?o==="upper":o==="lower",y=await P(r,"ssyr2"),b=null,x=null,v=null,B=null;try{b=m?t._buf:h(r,t,"ssyr2-x",!1),x=w?s._buf:h(r,s,"ssyr2-y",!1),v=c?n._buf:h(r,n,"ssyr2-A",!0),B=q(r,[{value:e,type:"u32"},{value:a,type:"f32"},{value:i,type:"u32"},{value:u,type:"u32"},{value:d,type:"u32"},{value:g?0:1,type:"u32"}],"ssyr2-params");let A=D(r,y.getBindGroupLayout(0),[b,x,v,B]),S=Math.min(e,r.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:_,ts:N}=O(r,y,A,S),I=c?null:E(r,_,v);F(r,_);let k=await j(N);if(c)return k!==void 0?{gpuTimeMs:k}:{};let L=await G(I,Float32Array);return k!==void 0?{A:L,gpuTimeMs:k}:{A:L}}finally{!m&&b&&f(b),!w&&x&&f(x),!c&&v&&f(v),B&&f(B)}}async function Ia(r,o,e,a,t,i,s,u,n,d,l="row-major"){let m=t instanceof M,w=s instanceof M,c=n instanceof X;if(H(r),T(r,"dsyr2",{A:n,x:t,y:s}),o!=="lower"&&o!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(l!=="row-major"&&l!=="column-major")throw new Error("layout must be 'row-major' or 'column-major'.");if(!Number.isInteger(e)||!Number.isInteger(i)||!Number.isInteger(u)||!Number.isInteger(d))throw new Error("n, incx, incy, and lda must be integers.");if(typeof a!="number")throw new Error("alpha must be a number.");if(Number.isNaN(a))throw new Error("alpha must not be NaN.");if(!Number.isFinite(a))throw new Error("alpha must be finite.");if(i<=0||u<=0)throw new Error("incx and incy must be positive.");if(d<e)throw new Error("lda must be >= n.");if(!c&&!(n instanceof Float64Array))throw new Error("A must be a Float64Array or GpuMatrix.");if(c&&n.dtype!==Float64Array)throw new Error("A must be a Float64Array-backed GpuMatrix.");if(!m&&!(t instanceof Float64Array))throw new Error("x must be a Float64Array or GpuVector.");if(!w&&!(s instanceof Float64Array))throw new Error("y must be a Float64Array or GpuVector.");if(m&&t.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(w&&s.dtype!==Float64Array)throw new Error("y must be a Float64Array-backed GpuVector.");if(m!==w)throw new Error("x and y must be the same type (both Float64Array 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&&d!==n.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(c&&(n.rows<e||n.cols<e))throw new Error("A is too small for the given n.");if(e<0)throw new Error("n must be non-negative.");if(e===0)return c?{}:{A:n};if(!c&&n.length<(e-1)*d+e)throw new Error("A does not have enough elements for the given n and lda.");if(t.length<(e-1)*i+1)throw new Error("x does not have enough elements for the given n and incx.");if(s.length<(e-1)*u+1)throw new Error("y does not have enough elements for the given n and incy.");let g=(c?n.layout:l)==="column-major"?o==="upper":o==="lower",b=await P(r,[...["f64/dekker","f64/utils/add","f64/utils/multiply"],"dsyr2"],"dsyr2_main"),{hi:x,lo:v}=U(new Float64Array([a])),B=null,A=null,S=null,_=null,N=null,I=null,k=null,L=null,R=null;try{if(m)B=t._buf,A=t._loBuf,S=s._buf,_=s._loBuf,N=n._buf,I=n._loBuf;else{let nr=U(t),er=U(s),Q=U(n);B=h(r,nr.hi,"dsyr2-xHi",!1),A=h(r,nr.lo,"dsyr2-xLo",!1),S=h(r,er.hi,"dsyr2-yHi",!1),_=h(r,er.lo,"dsyr2-yLo",!1),N=h(r,Q.hi,"dsyr2-AHi",!0),I=h(r,Q.lo,"dsyr2-ALo",!0)}k=q(r,[{value:e,type:"u32"},{value:x[0],type:"f32"},{value:v[0],type:"f32"},{value:i,type:"u32"},{value:u,type:"u32"},{value:d,type:"u32"},{value:g?0:1,type:"u32"}],"dsyr2-params");let W=D(r,b.getBindGroupLayout(0),[B,A,S,_,N,I,k]),V=Math.min(e,r.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:C,ts:z}=O(r,b,W,V);L=c?null:E(r,C,N),R=c?null:E(r,C,I),F(r,C);let K=await j(z);if(c)return K!==void 0?{gpuTimeMs:K}:{};let Y=await G(L,Float32Array);L=null;let $=await G(R,Float32Array);R=null;let J=dr(Y,$);return K!==void 0?{A:J,gpuTimeMs:K}:{A:J}}finally{!m&&B&&f(B),!m&&A&&f(A),!w&&S&&f(S),!w&&_&&f(_),!c&&N&&f(N),!c&&I&&f(I),k&&f(k),L&&f(L),R&&f(R)}}async function Ra(r,o,e,a,t,i,s,u,n,d,l,m,w="row-major"){let c=i instanceof X,p=u instanceof M,g=l instanceof M;if(H(r),T(r,"dgemv",{A:i,x:u,y:l}),o!=="no-transpose"&&o!=="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 d!="number")throw new Error("beta must be a number.");if(Number.isNaN(d))throw new Error("beta must not be NaN.");if(!Number.isFinite(d))throw new Error("beta must be finite.");if(!Number.isInteger(e)||!Number.isInteger(a)||!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 Float64Array))throw new Error("A must be a Float64Array or GpuMatrix.");if(c&&i.dtype!==Float64Array)throw new Error("A must be a Float64Array-backed GpuMatrix.");if(!p&&!(u instanceof Float64Array))throw new Error("x must be a Float64Array or GpuVector.");if(!g&&!(l instanceof Float64Array))throw new Error("y must be a Float64Array or GpuVector.");if(p&&u.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(g&&l.dtype!==Float64Array)throw new Error("y must be a Float64Array-backed GpuVector.");if(p!==g)throw new Error("x and y must be the same type (both Float64Array 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&&u._buf===l._buf)throw new Error("x and y must not reference the same GPU buffer when both are GpuVectors.");if(c&&g&&i._buf===l._buf)throw new Error("A and y must not reference the same GPU buffer.");if(c&&s!==i.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(c&&(i.rows<e||i.cols<a))throw new Error("A is too small for the given m and n.");if(e<0||a<0)throw new Error("m and n must be non-negative.");if(e===0||a===0)return g?{}:{y:l};(c?i.layout:w)==="column-major"&&([e,a]=[a,e],o=o==="no-transpose"?"transpose":"no-transpose");let b=o==="no-transpose",x=b?a:e,v=b?e:a;if(s<a)throw new Error("lda must be >= n.");if(!c&&i.length<(e-1)*s+a)throw new Error("A does not have enough elements for the given m, n, and lda.");if(u.length<(x-1)*n+1)throw new Error("x does not have enough elements for the given dimensions and incx.");if(l.length<(v-1)*m+1)throw new Error("y does not have enough elements for the given dimensions and incy.");let B=["f64/dekker","f64/utils/add","f64/utils/multiply"],A=b?"dgemv_n":"dgemv_t",S=b?"dgemv_n_main":"dgemv_t_main",_=await P(r,[...B,A],S),{hi:N,lo:I}=U(new Float64Array([t])),{hi:k,lo:L}=U(new Float64Array([d])),R=null,W=null,V=null,C=null,z=null,K=null,Y=null,$=null,J=null;try{if(c)R=i._buf,W=i._loBuf;else{let mr=U(i);R=h(r,mr.hi,"dgemv-AHi",!1),W=h(r,mr.lo,"dgemv-ALo",!1)}if(p)V=u._buf,C=u._loBuf;else{let mr=U(u);V=h(r,mr.hi,"dgemv-xHi",!1),C=h(r,mr.lo,"dgemv-xLo",!1)}if(g)z=l._buf,K=l._loBuf;else{let mr=U(l);z=h(r,mr.hi,"dgemv-yHi",!0),K=h(r,mr.lo,"dgemv-yLo",!0)}Y=q(r,[{value:e,type:"u32"},{value:a,type:"u32"},{value:N[0],type:"f32"},{value:I[0],type:"f32"},{value:k[0],type:"f32"},{value:L[0],type:"f32"},{value:n,type:"u32"},{value:m,type:"u32"},{value:s,type:"u32"}],"dgemv-params");let nr=D(r,_.getBindGroupLayout(0),[R,W,V,C,z,K,Y]),er=b?Math.min(e,r.limits.maxComputeWorkgroupsPerDimension):Yr(r,"dgemv",v),{commandEncoder:Q,ts:rr}=O(r,_,nr,er);$=g?null:E(r,Q,z),J=g?null:E(r,Q,K),F(r,Q);let ar=await j(rr);if(g)return ar!==void 0?{gpuTimeMs:ar}:{};let sr=await G($,Float32Array);$=null;let lr=await G(J,Float32Array);J=null;let ur=dr(sr,lr);return ar!==void 0?{y:ur,gpuTimeMs:ar}:{y:ur}}finally{!c&&R&&f(R),!c&&W&&f(W),!p&&V&&f(V),!p&&C&&f(C),!g&&z&&f(z),!g&&K&&f(K),Y&&f(Y),$&&f($),J&&f(J)}}async function ja(r,o,e,a,t,i,s,u,n,d,l,m="row-major"){let w=s instanceof M,c=d instanceof M,p=t instanceof X;if(H(r),T(r,"dsymv",{A:t,x:s,y:d}),o!=="lower"&&o!=="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(e)||!Number.isInteger(u)||!Number.isInteger(l)||!Number.isInteger(i))throw new Error("n, incx, incy, and lda must be integers.");if(typeof a!="number")throw new Error("alpha must be a number.");if(Number.isNaN(a))throw new Error("alpha must not be NaN.");if(!Number.isFinite(a))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(u<=0||l<=0)throw new Error("incx and incy must be positive.");if(i<e)throw new Error("lda must be >= n.");if(!p&&!(t instanceof Float64Array))throw new Error("A must be a Float64Array or GpuMatrix.");if(p&&t.dtype!==Float64Array)throw new Error("A must be a Float64Array-backed GpuMatrix.");if(!w&&!(s instanceof Float64Array))throw new Error("x must be a Float64Array or GpuVector.");if(!c&&!(d instanceof Float64Array))throw new Error("y must be a Float64Array or GpuVector.");if(w&&s.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(c&&d.dtype!==Float64Array)throw new Error("y must be a Float64Array-backed GpuVector.");if(w!==c)throw new Error("x and y must be the same type (both Float64Array 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===d._buf)throw new Error("x and y must not reference the same GPU buffer when both are GpuVectors.");if(p&&c&&t._buf===d._buf)throw new Error("A and y must not reference the same GPU buffer.");if(p&&i!==t.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(p&&(t.rows<e||t.cols<e))throw new Error("A is too small for the given n.");if(e<0)throw new Error("n must be non-negative.");if(e===0)return c?{}:{y:d};if(!p&&t.length<(e-1)*i+e)throw new Error("A does not have enough elements for the given n and lda.");if(s.length<(e-1)*u+1)throw new Error("x does not have enough elements for the given n and incx.");if(d.length<(e-1)*l+1)throw new Error("y does not have enough elements for the given n and incy.");let y=(p?t.layout:m)==="column-major"?o==="upper":o==="lower",x=await P(r,[...["f64/dekker","f64/utils/add","f64/utils/multiply"],"dsymv"],"dsymv_main"),{hi:v,lo:B}=U(new Float64Array([a])),{hi:A,lo:S}=U(new Float64Array([n])),_=null,N=null,I=null,k=null,L=null,R=null,W=null,V=null,C=null;try{if(p)_=t._buf,N=t._loBuf;else{let rr=U(t);_=h(r,rr.hi,"dsymv-AHi",!1),N=h(r,rr.lo,"dsymv-ALo",!1)}if(w)I=s._buf,k=s._loBuf;else{let rr=U(s);I=h(r,rr.hi,"dsymv-xHi",!1),k=h(r,rr.lo,"dsymv-xLo",!1)}if(c)L=d._buf,R=d._loBuf;else{let rr=U(d);L=h(r,rr.hi,"dsymv-yHi",!0),R=h(r,rr.lo,"dsymv-yLo",!0)}W=q(r,[{value:e,type:"u32"},{value:v[0],type:"f32"},{value:B[0],type:"f32"},{value:A[0],type:"f32"},{value:S[0],type:"f32"},{value:u,type:"u32"},{value:l,type:"u32"},{value:i,type:"u32"},{value:y?0:1,type:"u32"}],"dsymv-params");let z=D(r,x.getBindGroupLayout(0),[_,N,I,k,L,R,W]),K=Math.min(e,r.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:Y,ts:$}=O(r,x,z,K);V=c?null:E(r,Y,L),C=c?null:E(r,Y,R),F(r,Y);let J=await j($);if(c)return J!==void 0?{gpuTimeMs:J}:{};let nr=await G(V,Float32Array);V=null;let er=await G(C,Float32Array);C=null;let Q=dr(nr,er);return J!==void 0?{y:Q,gpuTimeMs:J}:{y:Q}}finally{!p&&_&&f(_),!p&&N&&f(N),!w&&I&&f(I),!w&&k&&f(k),!c&&L&&f(L),!c&&R&&f(R),W&&f(W),V&&f(V),C&&f(C)}}async function Fa(r,o,e,a,t,i,s,u,n,d,l,m="row-major"){let w=u instanceof M,c=d instanceof M,p=i instanceof X,g=a==="unit";if(H(r),T(r,"dtrmv",{A:i,x:u,y:d}),o!=="lower"&&o!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(e!=="no-transpose"&&e!=="transpose")throw new Error("trans must be 'no-transpose' or 'transpose'.");if(!g&&a!=="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(l)||!Number.isInteger(s))throw new Error("n, incx, incy, and lda must be integers.");if(n<=0||l<=0)throw new Error("incx and incy must be positive.");if(s<t)throw new Error("lda must be >= n.");if(!p&&!(i instanceof Float64Array))throw new Error("A must be a Float64Array or GpuMatrix.");if(p&&i.dtype!==Float64Array)throw new Error("A must be a Float64Array-backed GpuMatrix.");if(!w&&!(u instanceof Float64Array))throw new Error("x must be a Float64Array or GpuVector.");if(!c&&!(d instanceof Float64Array))throw new Error("y must be a Float64Array or GpuVector.");if(w&&u.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(c&&d.dtype!==Float64Array)throw new Error("y must be a Float64Array-backed GpuVector.");if(w!==c)throw new Error("x and y must be the same type (both Float64Array or both GpuVector).");if(w&&u._buf===d._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===d._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:d};if(!p&&i.length<(t-1)*s+t)throw new Error("A does not have enough elements for the given n and lda.");if(u.length<(t-1)*n+1)throw new Error("x does not have enough elements for the given n and incx.");if(d.length<(t-1)*l+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?o==="upper":o==="lower",v=b?e==="transpose":e==="no-transpose",A=await P(r,[...["f64/dekker","f64/utils/add","f64/utils/multiply"],"dtrmv"],"dtrmv_main"),S=null,_=null,N=null,I=null,k=null,L=null,R=null,W=null,V=null;try{if(p)S=i._buf,_=i._loBuf;else{let Q=U(i);S=h(r,Q.hi,"dtrmv-AHi",!1),_=h(r,Q.lo,"dtrmv-ALo",!1)}if(w)N=u._buf,I=u._loBuf;else{let Q=U(u);N=h(r,Q.hi,"dtrmv-xHi",!1),I=h(r,Q.lo,"dtrmv-xLo",!1)}if(c)k=d._buf,L=d._loBuf;else{let Q=U(d);k=h(r,Q.hi,"dtrmv-yHi",!0),L=h(r,Q.lo,"dtrmv-yLo",!0)}R=q(r,[{value:t,type:"u32"},{value:n,type:"u32"},{value:l,type:"u32"},{value:s,type:"u32"},{value:v?0:1,type:"u32"},{value:x?0:1,type:"u32"},{value:g?1:0,type:"u32"}],"dtrmv-params");let C=D(r,A.getBindGroupLayout(0),[S,_,N,I,k,L,R]),z=Math.min(t,r.limits.maxComputeWorkgroupsPerDimension),{commandEncoder:K,ts:Y}=O(r,A,C,z);W=c?null:E(r,K,k),V=c?null:E(r,K,L),F(r,K);let $=await j(Y);if(c)return $!==void 0?{gpuTimeMs:$}:{};let J=await G(W,Float32Array);W=null;let nr=await G(V,Float32Array);V=null;let er=dr(J,nr);return $!==void 0?{y:er,gpuTimeMs:$}:{y:er}}finally{!p&&S&&f(S),!p&&_&&f(_),!w&&N&&f(N),!w&&I&&f(I),!c&&k&&f(k),!c&&L&&f(L),R&&f(R),W&&f(W),V&&f(V)}}function qa(r,o,e){let a=new ArrayBuffer(r*o),t=new DataView(a);for(let i=0;i<r;i++){let s=e(i),u=i*o;s.forEach((n,d)=>t.setUint32(u+d*4,n,!0))}return a}function Ha(r,o,e){let a=r.createBuffer({label:e,size:o.byteLength,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});return r.queue.writeBuffer(a,0,o),a}async function Ta(r,o,e,a,t,i,s,u,n,d="row-major"){let l=u instanceof M,m=i instanceof X,w=a==="unit";if(H(r),T(r,"dtrsv",{A:i,x:u}),o!=="lower"&&o!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(e!=="no-transpose"&&e!=="transpose")throw new Error("trans must be 'no-transpose' or 'transpose'.");if(!w&&a!=="non-unit")throw new Error("diag must be 'unit' or 'non-unit'.");if(d!=="row-major"&&d!=="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 Float64Array))throw new Error("A must be a Float64Array or GpuMatrix.");if(m&&i.dtype!==Float64Array)throw new Error("A must be a Float64Array-backed GpuMatrix.");if(!l&&!(u instanceof Float64Array))throw new Error("x must be a Float64Array or GpuVector.");if(l&&u.dtype!==Float64Array)throw new Error("x must be a Float64Array-backed GpuVector.");if(l&&!m)throw new Error("A must be a GpuMatrix when x is a GpuVector.");if(m&&!l)throw new Error("x must be a GpuVector when A is a GpuMatrix.");if(m&&l&&i._buf===u._buf)throw new Error("A and x must not reference the same GPU buffer.");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 l?{}:{x:u};if(!m&&i.length<(t-1)*s+t)throw new Error("A does not have enough elements for the given n and lda.");if(u.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:d)==="column-major",g=p?o==="upper":o==="lower",y=p?e==="transpose":e==="no-transpose",b=["f64/dekker","f64/utils/add","f64/utils/multiply","f64/utils/divide"],x=await P(r,[...b,"dtrsv_invert_block"],"dtrsv_invert_block_main"),v=await P(r,[...b,"dtrsv_apply_inverse"],"dtrsv_apply_inverse_main"),B=await P(r,[...b,"dtrsv_update"],"dtrsv_update_main"),A=y===g,S=[];for(let nr=0;nr<t;nr+=64)S.push(nr);A||S.reverse();let _=S.length,N=r.limits.maxComputeWorkgroupsPerDimension,I=r.limits.minUniformBufferOffsetAlignment,k=null,L=null,R=null,W=null,V=null,C=null,z=null,K=null,Y=null,$=null,J=null;try{if(m)k=i._buf,L=i._loBuf;else{let tr=U(i);k=h(r,tr.hi,"dtrsv-AHi",!1),L=h(r,tr.lo,"dtrsv-ALo",!1)}if(l)R=u._buf,W=u._loBuf;else{let tr=U(u);R=h(r,tr.hi,"dtrsv-xHi",!0),W=h(r,tr.lo,"dtrsv-xLo",!0)}V=fr(r,_*64*64*4,"dtrsv-AinvHi"),C=fr(r,_*64*64*4,"dtrsv-AinvLo");let nr=qa(_,I,tr=>{let gr=tr*64,Gr=Math.min(gr+64,t);return[n,tr,gr,Gr]});z=Ha(r,nr,"dtrsv-apply-params");let er=qa(_,I,tr=>{let gr=tr*64,Gr=Math.min(gr+64,t);return[t,n,s,y?0:1,g?0:1,gr,Gr]});K=Ha(r,er,"dtrsv-update-params");let{commandEncoder:Q,querySet:rr}=Mr(r);Y=q(r,[{value:t,type:"u32"},{value:s,type:"u32"},{value:y?0:1,type:"u32"},{value:g?0:1,type:"u32"},{value:w?1:0,type:"u32"}],"dtrsv-invert-params");let ar=D(r,x.getBindGroupLayout(0),[k,L,V,C,Y]);hr(Q,x,ar,{x:64,y:_},rr?{timestampWrites:{querySet:rr,beginningOfPassWriteIndex:0}}:void 0);for(let tr=0;tr<S.length;tr++){let gr=S[tr],Gr=Math.min(gr+64,t),Nr=gr/64,Tr=tr===S.length-1,Sr=Nr*I,xr=D(r,v.getBindGroupLayout(0),[V,C,R,W,{buffer:z,offset:Sr,size:16}]);hr(Q,v,xr,1,Tr&&rr?{timestampWrites:{querySet:rr,endOfPassWriteIndex:1}}:void 0);let Er=A?t-Gr:gr;if(Er===0)continue;let _r=D(r,B.getBindGroupLayout(0),[k,L,R,W,{buffer:K,offset:Sr,size:32}]),Wr=Math.min(Er,N);hr(Q,B,_r,Wr)}let lr=kr(r,Q,rr);$=l?null:E(r,Q,R),J=l?null:E(r,Q,W),F(r,Q);let ur=await j(lr);if(l)return ur!==void 0?{gpuTimeMs:ur}:{};let mr=await G($,Float32Array);$=null;let yr=await G(J,Float32Array);J=null;let wr=dr(mr,yr);return ur!==void 0?{x:wr,gpuTimeMs:ur}:{x:wr}}finally{!m&&k&&f(k),!m&&L&&f(L),!l&&R&&f(R),!l&&W&&f(W),V&&f(V),C&&f(C),z&&f(z),K&&f(K),Y&&f(Y),$&&f($),J&&f(J)}}async function Ca(r,o,e,a,t,i,s,u,n,d,l,m,w,c,p="row-major"){let g=u instanceof X,y=d instanceof X,b=w instanceof X;if(H(r),T(r,"sgemm",{A:u,B:d,C:w}),o!=="no-transpose"&&o!=="transpose")throw new Error("transA must be 'no-transpose' or 'transpose'.");if(e!=="no-transpose"&&e!=="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(a)||!Number.isInteger(t)||!Number.isInteger(i)||!Number.isInteger(n)||!Number.isInteger(l)||!Number.isInteger(c))throw new Error("m, n, k, lda, ldb, and ldc must be integers.");if(!g&&!(u instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!y&&!(d 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||y)&&!b)throw new Error("C must be a GpuMatrix when A or B is a GpuMatrix.");if(b&&(!g||!y))throw new Error("A and B must be GpuMatrix when C is a GpuMatrix.");if(a<0||t<0||i<0)throw new Error("m, n, and k must be non-negative.");if(n<=0||l<=0||c<=0)throw new Error("lda, ldb, and ldc must be positive.");if(a===0||t===0)return b?{}:{C:w};let x=g?u.layout:p,v=y?d.layout:p,B=b?w.layout:p,A=x==="column-major"?i:a,S=x==="column-major"?a:i,_=o==="no-transpose"?A:S,N=o==="no-transpose"?S:A;if(n<N)throw new Error(`lda must be >= ${x==="column-major"?"rows":"cols"} of A as stored.`);if(g){if(n!==u.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");let[lr,ur]=o==="no-transpose"?[a,i]:[i,a];if(u.rows<lr||u.cols<ur)throw new Error("A is too small for the given m, k, and transA.")}else if(u.length<(_-1)*n+N)throw new Error("A does not have enough elements for the given dimensions and lda.");let I=v==="column-major"?t:i,k=v==="column-major"?i:t,L=e==="no-transpose"?I:k,R=e==="no-transpose"?k:I;if(l<R)throw new Error(`ldb must be >= ${v==="column-major"?"rows":"cols"} of B as stored.`);if(y){if(l!==d.lda)throw new Error("ldb must match B.lda when B is a GpuMatrix.");let[lr,ur]=e==="no-transpose"?[i,t]:[t,i];if(d.rows<lr||d.cols<ur)throw new Error("B is too small for the given n, k, and transB.")}else if(d.length<(L-1)*l+R)throw new Error("B does not have enough elements for the given dimensions and ldb.");let W=B==="column-major"?t:a,V=B==="column-major"?a:t;if(c<V)throw new Error(`ldc must be >= ${B==="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<a||w.cols<t)throw new Error("C is too small for the given m and n.")}else if(w.length<(W-1)*c+V)throw new Error("C does not have enough elements for the given dimensions and ldc.");x==="column-major"&&(o=o==="no-transpose"?"transpose":"no-transpose"),v==="column-major"&&(e=e==="no-transpose"?"transpose":"no-transpose"),B==="column-major"&&([u,d]=[d,u],[g,y]=[y,g],[n,l]=[l,n],[o,e]=[e==="no-transpose"?"transpose":"no-transpose",o==="no-transpose"?"transpose":"no-transpose"],[a,t]=[t,a]);let C=Math.ceil(t/64),z=Math.ceil(a/64),K=C*z>=36,Y=await P(r,K?"sgemm_large":"sgemm_small"),$=g?u._buf:h(r,u,"sgemm-A",!1),J=y?d._buf:h(r,d,"sgemm-B",!1),nr=b?w._buf:h(r,w,"sgemm-C",!0),er=o==="no-transpose",Q=e==="no-transpose",rr=er&&Ee($,n,a,i),ar=Ee(J,l,Q?i:t,Q?t:i),sr=q(r,[{value:a,type:"u32"},{value:t,type:"u32"},{value:i,type:"u32"},{value:s,type:"f32"},{value:m,type:"f32"},{value:n,type:"u32"},{value:l,type:"u32"},{value:c,type:"u32"},{value:o==="transpose"?1:0,type:"u32"},{value:e==="transpose"?1:0,type:"u32"},{value:rr?1:0,type:"u32"},{value:ar?1:0,type:"u32"}],"sgemm-params");try{let lr=D(r,Y.getBindGroupLayout(0),[$,Dr(r,$),J,Dr(r,J),nr,sr]),ur=K?{x:or(r,C,"sgemm","x"),y:or(r,z,"sgemm","y")}:{x:or(r,Math.ceil(t/32),"sgemm","x"),y:or(r,Math.ceil(a/32),"sgemm","y")},{commandEncoder:mr,ts:yr}=O(r,Y,lr,ur),wr=b?null:E(r,mr,nr);F(r,mr);let tr=await j(yr);if(b)return tr!==void 0?{gpuTimeMs:tr}:{};let gr=await G(wr,Float32Array);return tr!==void 0?{C:gr,gpuTimeMs:tr}:{C:gr}}finally{g||f($),y||f(J),b||f(nr),f(sr)}}async function Wa(r,o,e,a,t,i,s,u,n,d,l,m,w,c,p,g="row-major"){let y=n instanceof X,b=l instanceof X,x=c instanceof X;if(H(r),T(r,"sgemmtr",{A:n,B:l,C:c}),o!=="lower"&&o!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(e!=="no-transpose"&&e!=="transpose")throw new Error("transA must be 'no-transpose' or 'transpose'.");if(a!=="no-transpose"&&a!=="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 u!="number")throw new Error("alpha must be a number.");if(Number.isNaN(u))throw new Error("alpha must not be NaN.");if(!Number.isFinite(u))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(d)||!Number.isInteger(m)||!Number.isInteger(p))throw new Error("m, n, k, lda, ldb, and ldc must be integers.");if(!y&&!(n instanceof Float32Array))throw new Error("A must be a Float32Array or GpuMatrix.");if(!b&&!(l 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((y||b)&&!x)throw new Error("C must be a GpuMatrix when A or B is a GpuMatrix.");if(x&&(!y||!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(d<=0||m<=0||p<=0)throw new Error("lda, ldb, and ldc must be positive.");if(t===0||i===0)return x?{}:{C:c};let v=y?n.layout:g,B=b?l.layout:g,A=x?c.layout:g,S=v==="column-major"?s:t,_=v==="column-major"?t:s,N=e==="no-transpose"?S:_,I=e==="no-transpose"?_:S;if(d<I)throw new Error(`lda must be >= ${v==="column-major"?"rows":"cols"} of A as stored.`);if(y){if(d!==n.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");let[rr,ar]=e==="no-transpose"?[t,s]:[s,t];if(n.rows<rr||n.cols<ar)throw new Error("A is too small for the given m, k, and transA.")}else if(n.length<(N-1)*d+I)throw new Error("A does not have enough elements for the given dimensions and lda.");let k=B==="column-major"?i:s,L=B==="column-major"?s:i,R=a==="no-transpose"?k:L,W=a==="no-transpose"?L:k;if(m<W)throw new Error(`ldb must be >= ${B==="column-major"?"rows":"cols"} of B as stored.`);if(b){if(m!==l.lda)throw new Error("ldb must match B.lda when B is a GpuMatrix.");let[rr,ar]=a==="no-transpose"?[s,i]:[i,s];if(l.rows<rr||l.cols<ar)throw new Error("B is too small for the given n, k, and transB.")}else if(l.length<(R-1)*m+W)throw new Error("B does not have enough elements for the given dimensions and ldb.");let V=A==="column-major"?i:t,C=A==="column-major"?t:i;if(p<C)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<(V-1)*p+C)throw new Error("C does not have enough elements for the given dimensions and ldc.");v==="column-major"&&(e=e==="no-transpose"?"transpose":"no-transpose"),B==="column-major"&&(a=a==="no-transpose"?"transpose":"no-transpose"),A==="column-major"&&([n,l]=[l,n],[y,b]=[b,y],[d,m]=[m,d],[e,a]=[a==="no-transpose"?"transpose":"no-transpose",e==="no-transpose"?"transpose":"no-transpose"],[t,i]=[i,t],o=o==="lower"?"upper":"lower");let z=Math.ceil(i/64),K=Math.ceil(t/64),Y=z*K>=36,$=await P(r,Y?"sgemmtr_large":"sgemmtr_small"),J=y?n._buf:h(r,n,"sgemmtr-A",!1),nr=b?l._buf:h(r,l,"sgemmtr-B",!1),er=x?c._buf:h(r,c,"sgemmtr-C",!0),Q=q(r,[{value:t,type:"u32"},{value:i,type:"u32"},{value:s,type:"u32"},{value:u,type:"f32"},{value:w,type:"f32"},{value:d,type:"u32"},{value:m,type:"u32"},{value:p,type:"u32"},{value:e==="transpose"?1:0,type:"u32"},{value:a==="transpose"?1:0,type:"u32"},{value:o==="upper"?1:0,type:"u32"}],"sgemmtr-params");try{let rr=D(r,$.getBindGroupLayout(0),[J,nr,er,Q]),ar=Y?{x:or(r,z,"sgemmtr","x"),y:or(r,K,"sgemmtr","y")}:{x:or(r,Math.ceil(i/32),"sgemmtr","x"),y:or(r,Math.ceil(t/32),"sgemmtr","y")},{commandEncoder:sr,ts:lr}=O(r,$,rr,ar),ur=x?null:E(r,sr,er);F(r,sr);let mr=await j(lr);if(x)return mr!==void 0?{gpuTimeMs:mr}:{};let yr=await G(ur,Float32Array);return mr!==void 0?{C:yr,gpuTimeMs:mr}:{C:yr}}finally{y||f(J),b||f(nr),x||f(er),f(Q)}}async function Va(r,o,e,a,t,i,s,u,n,d,l,m="row-major"){let w=s instanceof X,c=d instanceof X;if(H(r),T(r,"ssyrk",{A:s,C:d}),o!=="lower"&&o!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(e!=="no-transpose"&&e!=="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(a)||!Number.isInteger(t)||!Number.isInteger(u)||!Number.isInteger(l))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&&!(d 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(a<0||t<0)throw new Error("n and k must be non-negative.");if(u<=0||l<=0)throw new Error("lda and ldc must be positive.");if(a===0)return c?{}:{C:d};let p=w?s.layout:m,g=c?d.layout:m,y=p==="column-major"?t:a,b=p==="column-major"?a:t,x=e==="no-transpose"?y:b,v=e==="no-transpose"?b:y;if(u<v)throw new Error(`lda must be >= ${p==="column-major"?"rows":"cols"} of A as stored.`);if(w){if(u!==s.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");let[C,z]=e==="no-transpose"?[a,t]:[t,a];if(s.rows<C||s.cols<z)throw new Error("A is too small for the given n, k, and trans.")}else if(s.length<(x-1)*u+v)throw new Error("A does not have enough elements for the given dimensions and lda.");if(l<a)throw new Error("ldc must be >= n.");if(c){if(l!==d.lda)throw new Error("ldc must match C.lda when C is a GpuMatrix.");if(d.rows<a||d.cols<a)throw new Error("C is too small for the given n.")}else if(d.length<(a-1)*l+a)throw new Error("C does not have enough elements for the given dimensions and ldc.");let B=e;p==="column-major"&&(B=B==="no-transpose"?"transpose":"no-transpose");let A=B==="no-transpose"?"transpose":"no-transpose",S=o;g==="column-major"&&([B,A]=[A==="no-transpose"?"transpose":"no-transpose",B==="no-transpose"?"transpose":"no-transpose"],S=S==="lower"?"upper":"lower");let _=Math.ceil(a/64),N=Math.ceil(a/64),I=_*N>=36,k=await P(r,I?"sgemmtr_large":"sgemmtr_small"),L=w?s._buf:h(r,s,"ssyrk-A",!1),R=c?d._buf:h(r,d,"ssyrk-C",!0),W=w?fr(r,L.size,"ssyrk-B",GPUBufferUsage.COPY_DST):h(r,s,"ssyrk-B",!1),V=q(r,[{value:a,type:"u32"},{value:a,type:"u32"},{value:t,type:"u32"},{value:i,type:"f32"},{value:n,type:"f32"},{value:u,type:"u32"},{value:u,type:"u32"},{value:l,type:"u32"},{value:B==="transpose"?1:0,type:"u32"},{value:A==="transpose"?1:0,type:"u32"},{value:S==="upper"?1:0,type:"u32"}],"ssyrk-params");try{let C=D(r,k.getBindGroupLayout(0),[L,W,R,V]),z=I?{x:or(r,_,"ssyrk","x"),y:or(r,N,"ssyrk","y")}:{x:or(r,Math.ceil(a/32),"ssyrk","x"),y:or(r,Math.ceil(a/32),"ssyrk","y")},{commandEncoder:K,querySet:Y,passDescriptor:$}=Mr(r);w&&K.copyBufferToBuffer(L,0,W,0,L.size),hr(K,k,C,z,$);let J=kr(r,K,Y),nr=c?null:E(r,K,R);F(r,K);let er=await j(J);if(c)return er!==void 0?{gpuTimeMs:er}:{};let Q=await G(nr,Float32Array);return er!==void 0?{C:Q,gpuTimeMs:er}:{C:Q}}finally{w||f(L),f(W),c||f(R),f(V)}}async function Oa(r,o,e,a,t,i,s,u,n,d,l,m,w,c="row-major"){let p=s instanceof X,g=n instanceof X,y=m instanceof X;if(H(r),T(r,"ssyr2k",{A:s,B:n,C:m}),o!=="lower"&&o!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(e!=="no-transpose"&&e!=="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 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(a)||!Number.isInteger(t)||!Number.isInteger(u)||!Number.isInteger(d)||!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(!y&&!(m instanceof Float32Array))throw new Error("C must be a Float32Array or GpuMatrix.");if((p||g)&&!y)throw new Error("C must be a GpuMatrix when A or B is a GpuMatrix.");if(y&&(!p||!g))throw new Error("A and B must be GpuMatrix when C is a GpuMatrix.");if(a<0||t<0)throw new Error("n and k must be non-negative.");if(u<=0||d<=0||w<=0)throw new Error("lda, ldb, and ldc must be positive.");if(a===0)return y?{}:{C:m};let b=p?s.layout:c,x=g?n.layout:c,v=y?m.layout:c,B=b==="column-major"?t:a,A=b==="column-major"?a:t,S=e==="no-transpose"?B:A,_=e==="no-transpose"?A:B;if(u<_)throw new Error(`lda must be >= ${b==="column-major"?"rows":"cols"} of A as stored.`);if(p){if(u!==s.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");let[lr,ur]=e==="no-transpose"?[a,t]:[t,a];if(s.rows<lr||s.cols<ur)throw new Error("A is too small for the given n, k, and trans.")}else if(s.length<(S-1)*u+_)throw new Error("A does not have enough elements for the given dimensions and lda.");let N=x==="column-major"?t:a,I=x==="column-major"?a:t,k=e==="no-transpose"?N:I,L=e==="no-transpose"?I:N;if(d<L)throw new Error(`ldb must be >= ${x==="column-major"?"rows":"cols"} of B as stored.`);if(g){if(d!==n.lda)throw new Error("ldb must match B.lda when B is a GpuMatrix.");let[lr,ur]=e==="no-transpose"?[a,t]:[t,a];if(n.rows<lr||n.cols<ur)throw new Error("B is too small for the given n, k, and trans.")}else if(n.length<(k-1)*d+L)throw new Error("B does not have enough elements for the given dimensions and ldb.");if(w<a)throw new Error("ldc must be >= n.");if(y){if(w!==m.lda)throw new Error("ldc must match C.lda when C is a GpuMatrix.");if(m.rows<a||m.cols<a)throw new Error("C is too small for the given n.")}else if(m.length<(a-1)*w+a)throw new Error("C does not have enough elements for the given dimensions and ldc.");let R=e;b==="column-major"&&(R=R==="no-transpose"?"transpose":"no-transpose");let W=e;x==="column-major"&&(W=W==="no-transpose"?"transpose":"no-transpose");let V=v==="column-major"?o==="lower"?"upper":"lower":o,C=lr=>lr==="no-transpose"?"transpose":"no-transpose";function z(lr,ur,mr,yr,wr,tr){let gr=lr,Gr=C(yr);return v!=="column-major"?{transX:gr,X:ur,ldX:mr,transY:Gr,Y:wr,ldY:tr}:{transX:C(Gr),X:wr,ldX:tr,transY:C(gr),Y:ur,ldY:mr}}let K=Math.ceil(a/64),Y=Math.ceil(a/64),$=K*Y>=36,J=await P(r,$?"sgemmtr_large":"sgemmtr_small"),nr=$?{x:or(r,K,"ssyr2k","x"),y:or(r,Y,"ssyr2k","y")}:{x:or(r,Math.ceil(a/32),"ssyr2k","x"),y:or(r,Math.ceil(a/32),"ssyr2k","y")},er=p?s._buf:h(r,s,"ssyr2k-A",!1),Q=g?n._buf:h(r,n,"ssyr2k-B",!1),rr=y?m._buf:h(r,m,"ssyr2k-C",!0),ar=null,sr=null;try{let lr=z(R,er,u,W,Q,d),ur=z(W,Q,d,R,er,u),mr=(Er,_r)=>q(r,[{value:a,type:"u32"},{value:a,type:"u32"},{value:t,type:"u32"},{value:i,type:"f32"},{value:_r,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:V==="upper"?1:0,type:"u32"}],"ssyr2k-params");ar=mr(lr,l),sr=mr(ur,1);let yr=D(r,J.getBindGroupLayout(0),[lr.X,lr.Y,rr,ar]),wr=D(r,J.getBindGroupLayout(0),[ur.X,ur.Y,rr,sr]),{commandEncoder:tr,querySet:gr}=Mr(r),Gr=gr?{timestampWrites:{querySet:gr,beginningOfPassWriteIndex:0}}:void 0,Nr=gr?{timestampWrites:{querySet:gr,endOfPassWriteIndex:1}}:void 0;hr(tr,J,yr,nr,Gr),hr(tr,J,wr,nr,Nr);let Tr=kr(r,tr,gr),Sr=y?null:E(r,tr,rr);F(r,tr);let xr=await j(Tr);if(y)return xr!==void 0?{gpuTimeMs:xr}:{};let vr=await G(Sr,Float32Array);return xr!==void 0?{C:vr,gpuTimeMs:xr}:{C:vr}}finally{p||f(er),g||f(Q),y||f(rr),ar&&f(ar),sr&&f(sr)}}async function Ka(r,o,e,a,t,i,s,u,n,d,l,m,w,c="row-major"){let p=s instanceof X,g=n instanceof X,y=m instanceof X;if(H(r),T(r,"ssymm",{A:s,B:n,C:m}),o!=="left"&&o!=="right")throw new Error("side must be 'left' or 'right'.");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(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 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(a)||!Number.isInteger(t)||!Number.isInteger(u)||!Number.isInteger(d)||!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(!y&&!(m instanceof Float32Array))throw new Error("C must be a Float32Array or GpuMatrix.");if((p||g)&&!y)throw new Error("C must be a GpuMatrix when A or B is a GpuMatrix.");if(y&&(!p||!g))throw new Error("A and B must be GpuMatrix when C is a GpuMatrix.");if(a<0||t<0)throw new Error("m and n must be non-negative.");if(a===0||t===0)return y?{}:{C:m};let b=p?s.layout:c,x=g?n.layout:c,v=y?m.layout:c,B=o==="left"?a:t;if(u<B)throw new Error("lda must be >= "+(o==="left"?"m":"n")+".");if(p){if(u!==s.lda)throw new Error("lda must match A.lda when A is a GpuMatrix.");if(s.rows<B||s.cols<B)throw new Error("A is too small for the given m/n and side.")}else if(s.length<(B-1)*u+B)throw new Error("A does not have enough elements for the given dimensions and lda.");let A=x==="column-major"?t:a,S=x==="column-major"?a:t;if(d<S)throw new Error(`ldb must be >= ${x==="column-major"?"rows":"cols"} of B as stored.`);if(g){if(d!==n.lda)throw new Error("ldb must match B.lda when B is a GpuMatrix.");if(n.rows<a||n.cols<t)throw new Error("B is too small for the given m and n.")}else if(n.length<(A-1)*d+S)throw new Error("B does not have enough elements for the given dimensions and ldb.");let _=v==="column-major"?t:a,N=v==="column-major"?a:t;if(w<N)throw new Error(`ldc must be >= ${v==="column-major"?"rows":"cols"} of C as stored.`);if(y){if(w!==m.lda)throw new Error("ldc must match C.lda when C is a GpuMatrix.");if(m.rows<a||m.cols<t)throw new Error("C is too small for the given m and n.")}else if(m.length<(_-1)*w+N)throw new Error("C does not have enough elements for the given dimensions and ldc.");let I=b==="column-major"?e==="lower"?"upper":"lower":e,k=x==="column-major"?"transpose":"no-transpose",L="no-transpose",R=a,W=t,V=B,C=o==="left"?L:k,z=o==="left"?k:L,K=tr=>tr==="no-transpose"?"transpose":"no-transpose",Y=o==="right";v==="column-major"&&([C,z]=[K(z),K(C)],Y=!Y,[R,W]=[W,R]);let $=B,J=Math.ceil(W/64),nr=Math.ceil(R/64),er=J*nr>=36,Q=await P(r,er?"sgemm_large":"sgemm_small"),rr=await P(r,"symmetrize"),ar=er?{x:or(r,J,"ssymm","x"),y:or(r,nr,"ssymm","y")}:{x:or(r,Math.ceil(W/32),"ssymm","x"),y:or(r,Math.ceil(R/32),"ssymm","y")},sr=p?s._buf:h(r,s,"ssymm-A",!1),lr=g?n._buf:h(r,n,"ssymm-B",!1),ur=y?m._buf:h(r,m,"ssymm-C",!0),mr=fr(r,B*$*4,"ssymm-Adense"),yr=null,wr=null;try{yr=q(r,[{value:B,type:"u32"},{value:u,type:"u32"},{value:$,type:"u32"},{value:I==="upper"?1:0,type:"u32"}],"ssymm-sym-params");let tr=D(r,rr.getBindGroupLayout(0),[sr,mr,yr]),gr=Y?lr:mr,Gr=Y?d:$,Nr=Y?mr:lr;wr=q(r,[{value:R,type:"u32"},{value:W,type:"u32"},{value:V,type:"u32"},{value:i,type:"f32"},{value:l,type:"f32"},{value:Gr,type:"u32"},{value:Y?$:d,type:"u32"},{value:w,type:"u32"},{value:C==="transpose"?1:0,type:"u32"},{value:z==="transpose"?1:0,type:"u32"}],"ssymm-gemm-params");let Sr=D(r,Q.getBindGroupLayout(0),[gr,Dr(r,gr),Nr,Dr(r,Nr),ur,wr]),{commandEncoder:xr,querySet:vr}=Mr(r),Er=vr?{timestampWrites:{querySet:vr,beginningOfPassWriteIndex:0}}:void 0,_r=vr?{timestampWrites:{querySet:vr,endOfPassWriteIndex:1}}:void 0;hr(xr,rr,tr,{x:Math.ceil(B/8),y:Math.ceil(B/8)},Er),hr(xr,Q,Sr,ar,_r);let Wr=kr(r,xr,vr),Ur=y?null:E(r,xr,ur);F(r,xr);let Zr=await j(Wr);if(y)return Zr!==void 0?{gpuTimeMs:Zr}:{};let fe=await G(Ur,Float32Array);return Zr!==void 0?{C:fe,gpuTimeMs:Zr}:{C:fe}}finally{p||f(sr),g||f(lr),y||f(ur),f(mr),yr&&f(yr),wr&&f(wr)}}async function Ua(r,o,e,a,t,i,s,u,n,d,l,m,w="row-major"){let c=n instanceof X,p=l instanceof X,g=t==="unit";if(H(r),T(r,"strmm",{A:n,B:l}),o!=="left"&&o!=="right")throw new Error("side must be 'left' or 'right'.");if(e!=="lower"&&e!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(a!=="no-transpose"&&a!=="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 u!="number")throw new Error("alpha must be a number.");if(Number.isNaN(u))throw new Error("alpha must not be NaN.");if(!Number.isFinite(u))throw new Error("alpha must be finite.");if(!Number.isInteger(i)||!Number.isInteger(s)||!Number.isInteger(d)||!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&&!(l 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:l};let y=c?n.layout:w,b=p?l.layout:w,x=o==="left"?i:s;if(d<x)throw new Error("lda must be >= "+(o==="left"?"m":"n")+".");if(c){if(d!==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)*d+x)throw new Error("A does not have enough elements for the given dimensions and lda.");let v=b==="column-major"?s:i,B=b==="column-major"?i:s;if(m<B)throw new Error(`ldb must be >= ${b==="column-major"?"rows":"cols"} of B as stored.`);if(p){if(m!==l.lda)throw new Error("ldb must match B.lda when B is a GpuMatrix.");if(l.rows<i||l.cols<s)throw new Error("B is too small for the given m and n.")}else if(l.length<(v-1)*m+B)throw new Error("B does not have enough elements for the given dimensions and ldb.");let A=y==="column-major"?e==="lower"?"upper":"lower":e,S=y==="column-major"?a==="no-transpose"?"transpose":"no-transpose":a,_=b==="column-major"?"transpose":"no-transpose",N="no-transpose",I=i,k=s,L=x,R=o==="left"?N:_,W=o==="left"?_:N,V=yr=>yr==="no-transpose"?"transpose":"no-transpose",C=o==="right";b==="column-major"&&([R,W]=[V(W),V(R)],C=!C,[I,k]=[k,I]);let z=x,K=Math.ceil(k/64),Y=Math.ceil(I/64),$=K*Y>=36,J=await P(r,$?"sgemm_large":"sgemm_small"),nr=await P(r,"triangularize"),er=$?{x:or(r,K,"strmm","x"),y:or(r,Y,"strmm","y")}:{x:or(r,Math.ceil(k/32),"strmm","x"),y:or(r,Math.ceil(I/32),"strmm","y")},Q=null,rr=null,ar=null,sr=null,lr=null,ur=null,mr=!1;try{Q=c?n._buf:h(r,n,"strmm-A",!1),rr=p?l._buf:h(r,l,"strmm-B",!0),ar=fr(r,x*z*4,"strmm-Adense"),sr=fr(r,v*m*4,"strmm-out",GPUBufferUsage.COPY_SRC|GPUBufferUsage.COPY_DST),lr=q(r,[{value:x,type:"u32"},{value:d,type:"u32"},{value:z,type:"u32"},{value:A==="upper"?1:0,type:"u32"},{value:S==="transpose"?1:0,type:"u32"},{value:g?1:0,type:"u32"}],"strmm-tri-params");let yr=D(r,nr.getBindGroupLayout(0),[Q,ar,lr]),wr=C?rr:ar,tr=C?m:z,gr=C?ar:rr;ur=q(r,[{value:I,type:"u32"},{value:k,type:"u32"},{value:L,type:"u32"},{value:u,type:"f32"},{value:0,type:"f32"},{value:tr,type:"u32"},{value:C?z:m,type:"u32"},{value:m,type:"u32"},{value:R==="transpose"?1:0,type:"u32"},{value:W==="transpose"?1:0,type:"u32"}],"strmm-gemm-params");let Nr=D(r,J.getBindGroupLayout(0),[wr,Dr(r,wr),gr,Dr(r,gr),sr,ur]),{commandEncoder:Tr,querySet:Sr}=Mr(r);Tr.copyBufferToBuffer(rr,0,sr,0,Math.min(rr.size,sr.size));let xr=Sr?{timestampWrites:{querySet:Sr,beginningOfPassWriteIndex:0}}:void 0,vr=Sr?{timestampWrites:{querySet:Sr,endOfPassWriteIndex:1}}:void 0;hr(Tr,nr,yr,{x:Math.ceil(x/8),y:Math.ceil(x/8)},xr),hr(Tr,J,Nr,er,vr);let Er=kr(r,Tr,Sr),_r=p?null:E(r,Tr,sr);F(r,Tr);let Wr=await j(Er);if(p)return f(l._buf),l._buf=sr,mr=!0,Wr!==void 0?{gpuTimeMs:Wr}:{};let Ur=await G(_r,Float32Array);return Wr!==void 0?{B:Ur,gpuTimeMs:Wr}:{B:Ur}}finally{!c&&Q&&f(Q),!p&&rr&&f(rr),ar&&f(ar),sr&&!mr&&f(sr),lr&&f(lr),ur&&f(ur)}}async function za(r,o,e,a,t,i,s,u,n,d,l,m,w="row-major"){let c=n instanceof X,p=l instanceof X,g=t==="unit";if(H(r),T(r,"strsm",{A:n,B:l}),o!=="left"&&o!=="right")throw new Error("side must be 'left' or 'right'.");if(e!=="lower"&&e!=="upper")throw new Error("uplo must be 'lower' or 'upper'.");if(a!=="no-transpose"&&a!=="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 u!="number")throw new Error("alpha must be a number.");if(Number.isNaN(u))throw new Error("alpha must not be NaN.");if(!Number.isFinite(u))throw new Error("alpha must be finite.");if(!Number.isInteger(i)||!Number.isInteger(s)||!Number.isInteger(d)||!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&&!(l 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:l};let y=c?n.layout:w,b=p?l.layout:w,x=o==="left"?i:s;if(d<x)throw new Error("lda must be >= "+(o==="left"?"m":"n")+".");if(c){if(d!==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)*d+x)throw new Error("A does not have enough elements for the given dimensions and lda.");let v=b==="column-major"?s:i,B=b==="column-major"?i:s;if(m<B)throw new Error(`ldb must be >= ${b==="column-major"?"rows":"cols"} of B as stored.`);if(p){if(m!==l.lda)throw new Error("ldb must match B.lda when B is a GpuMatrix.");if(l.rows<i||l.cols<s)throw new Error("B is too small for the given m and n.")}else if(l.length<(v-1)*m+B)throw new Error("B does not have enough elements for the given dimensions and ldb.");let A=y==="column-major"?e==="lower"?"upper":"lower":e,S=y==="column-major"?a==="no-transpose"?"transpose":"no-transpose":a,_=o==="left"?s:i,N=o==="left",I=S==="no-transpose"==(A==="lower"),k=o==="left"?I:!I,L=[];for(let rr=0;rr<x;rr+=64)L.push(rr);k||L.reverse();let R=L.length,W=await P(r,"strsv_invert_block"),V=await P(r,"block_transfer"),C=await P(r,"sscal"),z=null,K=null,Y=null,$=[],J=[];function nr(rr,ar){let sr=fr(r,rr,ar);return J.push(sr),sr}function er(rr,ar){let sr=q(r,rr,ar);return $.push(sr),sr}let Q=(v-1)*m+B;try{z=c?n._buf:h(r,n,"strsm-A",!1),K=p?l._buf:h(r,l,"strsm-B",!0),Y=fr(r,R*64*64*4,"strsm-Ainv");let rr=null;if(u!==1&&u!==0){let Sr=er([{value:Q,type:"u32"},{value:u,type:"f32"},{value:1,type:"u32"}],"strsm-scale-params");rr=D(r,C.getBindGroupLayout(0),[K,Sr])}let ar=er([{value:x,type:"u32"},{value:d,type:"u32"},{value:S==="transpose"?1:0,type:"u32"},{value:A==="upper"?1:0,type:"u32"},{value:g?1:0,type:"u32"}],"strsm-invert-params"),sr=D(r,W.getBindGroupLayout(0),[z,Y,ar]),lr=nr(64*_*4,"strsm-Bblock"),ur=nr(64*_*4,"strsm-Xblock"),mr=nr(x*64*4,"strsm-Aoff"),yr=nr(x*_*4,"strsm-delta"),{commandEncoder:wr,querySet:tr}=Mr(r);if(u===0){let Sr=Math.ceil(B/64),xr=Math.ceil(v/64),vr=Sr*xr>=36,Er=await P(r,vr?"sgemm_large":"sgemm_small"),_r=er([{value:v,type:"u32"},{value:B,type:"u32"},{value:0,type:"u32"},{value:0,type:"f32"},{value:0,type:"f32"},{value:1,type:"u32"},{value:1,type:"u32"},{value:m,type:"u32"},{value:0,type:"u32"},{value:0,type:"u32"}],"strsm-zero-params"),Wr=D(r,Er.getBindGroupLayout(0),[Y,Dr(r,Y),Y,Dr(r,Y),K,_r]),Ur=vr?{x:or(r,Sr,"strsm","x"),y:or(r,xr,"strsm","y")}:{x:or(r,Math.ceil(B/32),"strsm","x"),y:or(r,Math.ceil(v/32),"strsm","y")};hr(wr,Er,Wr,Ur,tr?{timestampWrites:{querySet:tr,beginningOfPassWriteIndex:0,endOfPassWriteIndex:1}}:void 0)}else{rr&&hr(wr,C,rr,br(r,Q)),hr(wr,W,sr,{x:64,y:R},tr?{timestampWrites:{querySet:tr,beginningOfPassWriteIndex:0}}:void 0);for(let xr=0;xr<L.length;xr++){let vr=L[xr],Er=Math.min(vr+64,x),_r=Er-vr,Wr=vr/64,Ur=xr===L.length-1,Zr=er([{value:vr,type:"u32"},{value:_r,type:"u32"},{value:0,type:"u32"},{value:_,type:"u32"},{value:m,type:"u32"},{value:b==="column-major"?1:0,type:"u32"},{value:N?1:0,type:"u32"},{value:2,type:"u32"}],"strsm-gather-B-params"),fe=D(r,V.getBindGroupLayout(0),[lr,K,Zr]);hr(wr,V,fe,Yr(r,"strsm",_r,_));{let Xr=_r,$r=_,_e=_r,ae=Math.ceil($r/64),ie=Math.ceil(Xr/64),se=ae*ie>=36,ne=await P(r,se?"sgemm_large":"sgemm_small"),Be=er([{value:Xr,type:"u32"},{value:$r,type:"u32"},{value:_e,type:"u32"},{value:1,type:"f32"},{value:0,type:"f32"},{value:64,type:"u32"},{value:_,type:"u32"},{value:_,type:"u32"},{value:o==="right"?1:0,type:"u32"},{value:0,type:"u32"}],"strsm-apply-params"),ce={buffer:Y,offset:Wr*64*64*4,size:4096*4},Ae=D(r,ne.getBindGroupLayout(0),[ce,Dr(r,ce),lr,Dr(r,lr),ur,Be]),ti=se?{x:or(r,ae,"strsm","x"),y:or(r,ie,"strsm","y")}:{x:or(r,Math.ceil($r/32),"strsm","x"),y:or(r,Math.ceil(Xr/32),"strsm","y")};hr(wr,ne,Ae,ti)}let me=k?Er:0,Re=k?x:vr,je=me<Re,Ya=er([{value:vr,type:"u32"},{value:_r,type:"u32"},{value:0,type:"u32"},{value:_,type:"u32"},{value:m,type:"u32"},{value:b==="column-major"?1:0,type:"u32"},{value:N?1:0,type:"u32"},{value:0,type:"u32"}],"strsm-scatter-params"),Za=D(r,V.getBindGroupLayout(0),[ur,K,Ya]),Xa=Ur&&!je&&tr?{timestampWrites:{querySet:tr,endOfPassWriteIndex:1}}:void 0;if(hr(wr,V,Za,Yr(r,"strsm",_r,_),Xa),!je)continue;let oe=Re-me,$a=er([{value:me,type:"u32"},{value:oe,type:"u32"},{value:vr,type:"u32"},{value:_r,type:"u32"},{value:d,type:"u32"},{value:S==="transpose"?1:0,type:"u32"},{value:N?1:0,type:"u32"},{value:2,type:"u32"}],"strsm-gather-A-params"),Ja=D(r,V.getBindGroupLayout(0),[mr,z,$a]);hr(wr,V,Ja,Yr(r,"strsm",oe,_r));{let Xr=oe,$r=_,_e=_r,ae=Math.ceil($r/64),ie=Math.ceil(Xr/64),se=ae*ie>=36,ne=await P(r,se?"sgemm_large":"sgemm_small"),Be=er([{value:Xr,type:"u32"},{value:$r,type:"u32"},{value:_e,type:"u32"},{value:1,type:"f32"},{value:0,type:"f32"},{value:_r,type:"u32"},{value:_,type:"u32"},{value:_,type:"u32"},{value:0,type:"u32"},{value:0,type:"u32"}],"strsm-update-params"),ce=D(r,ne.getBindGroupLayout(0),[mr,Dr(r,mr),ur,Dr(r,ur),yr,Be]),Ae=se?{x:or(r,ae,"strsm","x"),y:or(r,ie,"strsm","y")}:{x:or(r,Math.ceil($r/32),"strsm","x"),y:or(r,Math.ceil(Xr/32),"strsm","y")};hr(wr,ne,ce,Ae)}let Qa=er([{value:me,type:"u32"},{value:oe,type:"u32"},{value:0,type:"u32"},{value:_,type:"u32"},{value:m,type:"u32"},{value:b==="column-major"?1:0,type:"u32"},{value:N?1:0,type:"u32"},{value:1,type:"u32"}],"strsm-scatter-sub-params"),ri=D(r,V.getBindGroupLayout(0),[yr,K,Qa]),ei=Ur&&tr?{timestampWrites:{querySet:tr,endOfPassWriteIndex:1}}:void 0;hr(wr,V,ri,Yr(r,"strsm",oe,_),ei)}}let gr=kr(r,wr,tr),Gr=p?null:E(r,wr,K);F(r,wr);let Nr=await j(gr);if(p)return Nr!==void 0?{gpuTimeMs:Nr}:{};let Tr=await G(Gr,Float32Array);return Nr!==void 0?{B:Tr,gpuTimeMs:Nr}:{B:Tr}}finally{!c&&z&&f(z),!p&&K&&f(K),Y&&f(Y),f(J),f($)}}return li(_s);})();
|