volvoxai 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +145 -0
- package/bin/volvox.js +72 -0
- package/dist/v0.1.0/volvoxai.js +4664 -0
- package/dist/v0.1.0/volvoxai.min.js +1848 -0
- package/dist/v0.1.0/volvoxai.wasm +0 -0
- package/dist/volvoxai.js +4664 -0
- package/dist/volvoxai.min.js +1848 -0
- package/dist/volvoxai.wasm +0 -0
- package/docs/README.md +22 -0
- package/docs/browser-runtime.md +87 -0
- package/docs/efficientdet_tflite_vs_volvoxai.md +445 -0
- package/docs/microkernel_optimization_guide.md +153 -0
- package/docs/model-format.md +108 -0
- package/docs/models.md +103 -0
- package/docs/native-runtime.md +189 -0
- package/docs/operation_list.md +232 -0
- package/docs/operator_fusion_patterns.md +58 -0
- package/docs/quickstart.md +115 -0
- package/docs/roadmap.md +19 -0
- package/docs/testing.md +97 -0
- package/docs/textbook/01-foundations.md +233 -0
- package/docs/textbook/02-tinystories-language-model.md +300 -0
- package/docs/textbook/03-efficientdet-vision-model.md +281 -0
- package/docs/textbook/04-precision-and-quantization.md +208 -0
- package/docs/textbook/05-inside-the-engine.md +155 -0
- package/docs/textbook/06-native-engine-architecture.md +338 -0
- package/docs/textbook/07-glossary-and-next-steps.md +258 -0
- package/docs/textbook/README.md +85 -0
- package/docs/textbook/ko/01-foundations.md +231 -0
- package/docs/textbook/ko/02-tinystories-language-model.md +300 -0
- package/docs/textbook/ko/03-efficientdet-vision-model.md +277 -0
- package/docs/textbook/ko/04-precision-and-quantization.md +206 -0
- package/docs/textbook/ko/05-inside-the-engine.md +154 -0
- package/docs/textbook/ko/06-native-engine-architecture.md +333 -0
- package/docs/textbook/ko/07-glossary-and-next-steps.md +253 -0
- package/docs/textbook/ko/README.md +83 -0
- package/docs/xnnpack_optimization_guide.md +197 -0
- package/js/CPUEngine.js +241 -0
- package/js/Graph.js +49 -0
- package/js/GraphExecutor.js +1020 -0
- package/js/GraphLoader.js +282 -0
- package/js/ShaderLibrary.js +236 -0
- package/js/Tensor.js +25 -0
- package/js/Tokenizer.js +266 -0
- package/js/VolvoxAI.js +130 -0
- package/js/WasmEngine.js +378 -0
- package/js/WebNNEngine.js +169 -0
- package/js/index.js +11 -0
- package/js/ops/add.js +31 -0
- package/js/ops/argMax.js +33 -0
- package/js/ops/averagePool2D.js +38 -0
- package/js/ops/batchNorm2D.js +28 -0
- package/js/ops/cast.js +19 -0
- package/js/ops/clip.js +15 -0
- package/js/ops/concat2.js +18 -0
- package/js/ops/conv1D.js +35 -0
- package/js/ops/conv2D.js +70 -0
- package/js/ops/convTranspose2D.js +45 -0
- package/js/ops/crossAttention.js +69 -0
- package/js/ops/crossSDPA.js +41 -0
- package/js/ops/dequantizeLinear.js +9 -0
- package/js/ops/div.js +15 -0
- package/js/ops/embedding.js +14 -0
- package/js/ops/expand.js +24 -0
- package/js/ops/gELU.js +9 -0
- package/js/ops/gather.js +51 -0
- package/js/ops/gatherElements.js +33 -0
- package/js/ops/globalAveragePool.js +21 -0
- package/js/ops/hardSigmoid.js +12 -0
- package/js/ops/hardSwish.js +12 -0
- package/js/ops/interp1D.js +25 -0
- package/js/ops/layerNorm.js +25 -0
- package/js/ops/leakyReLU.js +10 -0
- package/js/ops/logSoftmax.js +15 -0
- package/js/ops/matMul.js +35 -0
- package/js/ops/maxPool2D.js +36 -0
- package/js/ops/meanHeight.js +17 -0
- package/js/ops/mul.js +31 -0
- package/js/ops/nonMaxSuppression.js +72 -0
- package/js/ops/pReLU.js +11 -0
- package/js/ops/pad.js +35 -0
- package/js/ops/profileX.js +22 -0
- package/js/ops/profileY.js +22 -0
- package/js/ops/rMSNorm.js +14 -0
- package/js/ops/reLU.js +8 -0
- package/js/ops/reduceMean.js +17 -0
- package/js/ops/reduceSum.js +19 -0
- package/js/ops/reshape.js +6 -0
- package/js/ops/resize.js +44 -0
- package/js/ops/sDPA.js +44 -0
- package/js/ops/siLU.js +8 -0
- package/js/ops/sigmoid.js +6 -0
- package/js/ops/slice.js +36 -0
- package/js/ops/softmax.js +18 -0
- package/js/ops/spatialSoftargmaxY.js +28 -0
- package/js/ops/split.js +24 -0
- package/js/ops/sub.js +11 -0
- package/js/ops/tanh.js +7 -0
- package/js/ops/transpose.js +34 -0
- package/js/ops/upsample2x.js +23 -0
- package/js/ops/where.js +15 -0
- package/package.json +33 -0
- package/shaders/add.wgsl +13 -0
- package/shaders/add3Relu.wgsl +23 -0
- package/shaders/addRelu.wgsl +22 -0
- package/shaders/averagePool2D.wgsl +24 -0
- package/shaders/batchNorm2D.wgsl +21 -0
- package/shaders/binaryBroadcast.wgsl +34 -0
- package/shaders/broadcastBinary.wgsl +26 -0
- package/shaders/clip.wgsl +10 -0
- package/shaders/concat2.wgsl +16 -0
- package/shaders/concatCopy.wgsl +10 -0
- package/shaders/concatSigmoidCopy.wgsl +16 -0
- package/shaders/conv1D.wgsl +37 -0
- package/shaders/conv2D.wgsl +80 -0
- package/shaders/conv2DDepthwise4.wgsl +74 -0
- package/shaders/conv2DDepthwise8.wgsl +66 -0
- package/shaders/conv2DPointwise16.wgsl +67 -0
- package/shaders/conv2DPointwise16Tile.wgsl +86 -0
- package/shaders/conv2DPointwise8.wgsl +85 -0
- package/shaders/conv2DPointwise8Vec2.wgsl +70 -0
- package/shaders/conv2DPointwise8Vec4.wgsl +65 -0
- package/shaders/conv2DRegularC3Out16.wgsl +75 -0
- package/shaders/convTranspose2D.wgsl +33 -0
- package/shaders/copy.wgsl +13 -0
- package/shaders/crossAttention.wgsl +140 -0
- package/shaders/crossAttentionF32.wgsl +98 -0
- package/shaders/crossSDPA.wgsl +74 -0
- package/shaders/dequantizeLinear.wgsl +14 -0
- package/shaders/div.wgsl +34 -0
- package/shaders/elementwise.wgsl +13 -0
- package/shaders/embedding.wgsl +22 -0
- package/shaders/expand.wgsl +18 -0
- package/shaders/gELU.wgsl +13 -0
- package/shaders/gather.wgsl +17 -0
- package/shaders/generalTranspose.wgsl +19 -0
- package/shaders/globalAveragePool.wgsl +19 -0
- package/shaders/hardSigmoid.wgsl +13 -0
- package/shaders/hardSwish.wgsl +13 -0
- package/shaders/interp1D.wgsl +28 -0
- package/shaders/layerNorm.wgsl +33 -0
- package/shaders/leakyReLU.wgsl +11 -0
- package/shaders/linearF32.wgsl +33 -0
- package/shaders/linearF32RowMajor.wgsl +24 -0
- package/shaders/linearInt8.wgsl +42 -0
- package/shaders/logSoftmax.wgsl +22 -0
- package/shaders/maxPool2D.wgsl +37 -0
- package/shaders/meanHeight.wgsl +18 -0
- package/shaders/mul.wgsl +32 -0
- package/shaders/nonMaxSuppression.wgsl +92 -0
- package/shaders/pReLU.wgsl +14 -0
- package/shaders/pad.wgsl +19 -0
- package/shaders/profileX.wgsl +28 -0
- package/shaders/profileY.wgsl +28 -0
- package/shaders/quantizeLinear.wgsl +69 -0
- package/shaders/rMSNorm.wgsl +21 -0
- package/shaders/reLU.wgsl +13 -0
- package/shaders/reduce.wgsl +17 -0
- package/shaders/resize.wgsl +52 -0
- package/shaders/sDPA.wgsl +71 -0
- package/shaders/siLU.wgsl +13 -0
- package/shaders/sigmoid.wgsl +13 -0
- package/shaders/slice.wgsl +26 -0
- package/shaders/softmax.wgsl +23 -0
- package/shaders/spatialSoftargmaxY.wgsl +32 -0
- package/shaders/split.wgsl +15 -0
- package/shaders/sub.wgsl +34 -0
- package/shaders/tanh.wgsl +13 -0
- package/shaders/upsample2x.wgsl +24 -0
- package/shaders/where.wgsl +12 -0
- package/volvoxai.wasm +0 -0
|
@@ -0,0 +1,1848 @@
|
|
|
1
|
+
var cs=Object.defineProperty;var k=(p,t,r)=>()=>{if(r)throw r[0];try{return p&&(t=p(p=0)),t}catch(e){throw r=[e],e}};var fs=(p,t)=>{for(var r in t)cs(p,r,{get:t[r],enumerable:!0})};var Jt,Qt=k(()=>{Jt=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
2
|
+
@group(0) @binding(1) var<storage, read> weight_f32 : array<f32>;
|
|
3
|
+
@group(0) @binding(2) var<storage, read> dummyScale : array<f32>;
|
|
4
|
+
@group(0) @binding(3) var<storage, read> bias : array<f32>;
|
|
5
|
+
@group(0) @binding(4) var<storage, read_write> output : array<f32>;
|
|
6
|
+
|
|
7
|
+
struct Params {
|
|
8
|
+
seq_len : u32,
|
|
9
|
+
d_in : u32,
|
|
10
|
+
d_out : u32,
|
|
11
|
+
}
|
|
12
|
+
@group(0) @binding(5) var<uniform> params : Params;
|
|
13
|
+
|
|
14
|
+
@compute @workgroup_size(64, 1, 1)
|
|
15
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
16
|
+
let row = global_id.y;
|
|
17
|
+
let col = global_id.x;
|
|
18
|
+
|
|
19
|
+
if (row >= params.seq_len || col >= params.d_out) { return; }
|
|
20
|
+
|
|
21
|
+
var sum : f32 = 0.0;
|
|
22
|
+
|
|
23
|
+
for (var k = 0u; k < params.d_in; k = k + 1u) {
|
|
24
|
+
let in_val = input[row * params.d_in + k];
|
|
25
|
+
let w_val = weight_f32[col * params.d_in + k];
|
|
26
|
+
sum = sum + in_val * w_val;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
let b_val = bias[col];
|
|
30
|
+
// dummyScale is passed just to keep bindings consistent but not used here.
|
|
31
|
+
|
|
32
|
+
output[row * params.d_out + col] = sum + b_val;
|
|
33
|
+
}
|
|
34
|
+
`});var te,Zt=k(()=>{te=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
35
|
+
@group(0) @binding(1) var<storage, read> weight_int8_packed : array<u32>;
|
|
36
|
+
@group(0) @binding(2) var<storage, read> weight_scales : array<f32>;
|
|
37
|
+
@group(0) @binding(3) var<storage, read> bias : array<f32>;
|
|
38
|
+
@group(0) @binding(4) var<storage, read_write> output : array<f32>;
|
|
39
|
+
|
|
40
|
+
struct Params {
|
|
41
|
+
seq_len : u32,
|
|
42
|
+
d_in : u32,
|
|
43
|
+
d_out : u32,
|
|
44
|
+
}
|
|
45
|
+
@group(0) @binding(5) var<uniform> params : Params;
|
|
46
|
+
|
|
47
|
+
// Unpack one signed 8-bit integer from a 32-bit packed block
|
|
48
|
+
fn unpack_i8(packed: u32, byte_idx: u32) -> f32 {
|
|
49
|
+
let val_i32 = extractBits(i32(packed), byte_idx * 8u, 8u);
|
|
50
|
+
return f32(val_i32);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
@compute @workgroup_size(64, 1, 1)
|
|
54
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
55
|
+
let row = global_id.y;
|
|
56
|
+
let col = global_id.x;
|
|
57
|
+
|
|
58
|
+
if (row >= params.seq_len || col >= params.d_out) { return; }
|
|
59
|
+
|
|
60
|
+
var sum : f32 = 0.0;
|
|
61
|
+
let d_in_4 = params.d_in / 4u;
|
|
62
|
+
|
|
63
|
+
for (var i = 0u; i < d_in_4; i = i + 1u) {
|
|
64
|
+
let w_packed = weight_int8_packed[col * d_in_4 + i];
|
|
65
|
+
let in_base = row * params.d_in + i * 4u;
|
|
66
|
+
|
|
67
|
+
sum = sum + input[in_base + 0u] * f32(extractBits(i32(w_packed), 0u, 8u));
|
|
68
|
+
sum = sum + input[in_base + 1u] * f32(extractBits(i32(w_packed), 8u, 8u));
|
|
69
|
+
sum = sum + input[in_base + 2u] * f32(extractBits(i32(w_packed), 16u, 8u));
|
|
70
|
+
sum = sum + input[in_base + 3u] * f32(extractBits(i32(w_packed), 24u, 8u));
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
let scale = weight_scales[col];
|
|
74
|
+
output[row * params.d_out + col] = (sum * scale) + bias[col];
|
|
75
|
+
}
|
|
76
|
+
`});var ae,ee=k(()=>{ae=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
77
|
+
@group(0) @binding(1) var<storage, read> weight : array<f32>;
|
|
78
|
+
@group(0) @binding(2) var<storage, read> bias : array<f32>;
|
|
79
|
+
@group(0) @binding(3) var<storage, read_write> output : array<f32>;
|
|
80
|
+
|
|
81
|
+
struct Params {
|
|
82
|
+
n : u32,
|
|
83
|
+
in_h : u32,
|
|
84
|
+
in_w : u32,
|
|
85
|
+
in_c : u32,
|
|
86
|
+
out_c : u32,
|
|
87
|
+
out_h : u32,
|
|
88
|
+
out_w : u32,
|
|
89
|
+
kh : u32,
|
|
90
|
+
kw : u32,
|
|
91
|
+
sy : u32,
|
|
92
|
+
sx : u32,
|
|
93
|
+
pt : u32,
|
|
94
|
+
pl : u32,
|
|
95
|
+
groups : u32,
|
|
96
|
+
relu : u32,
|
|
97
|
+
dy : u32,
|
|
98
|
+
dx : u32,
|
|
99
|
+
}
|
|
100
|
+
@group(0) @binding(4) var<uniform> params : Params;
|
|
101
|
+
|
|
102
|
+
@compute @workgroup_size(8, 8, 1)
|
|
103
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
104
|
+
let ox = gid.x;
|
|
105
|
+
let oy = gid.y;
|
|
106
|
+
let z = gid.z;
|
|
107
|
+
let nb = z / params.out_c;
|
|
108
|
+
let oc = z - nb * params.out_c;
|
|
109
|
+
if (nb >= params.n || ox >= params.out_w || oy >= params.out_h) { return; }
|
|
110
|
+
|
|
111
|
+
var sum = 0.0;
|
|
112
|
+
if (params.groups == params.in_c) {
|
|
113
|
+
let mult = params.out_c / params.in_c;
|
|
114
|
+
let ic = oc / mult;
|
|
115
|
+
let m = oc - ic * mult;
|
|
116
|
+
for (var yy = 0u; yy < params.kh; yy = yy + 1u) {
|
|
117
|
+
let iy = i32(oy * params.sy + yy * params.dy) - i32(params.pt);
|
|
118
|
+
if (iy < 0 || iy >= i32(params.in_h)) { continue; }
|
|
119
|
+
for (var xx = 0u; xx < params.kw; xx = xx + 1u) {
|
|
120
|
+
let ix = i32(ox * params.sx + xx * params.dx) - i32(params.pl);
|
|
121
|
+
if (ix < 0 || ix >= i32(params.in_w)) { continue; }
|
|
122
|
+
let ii = ((nb * params.in_h + u32(iy)) * params.in_w + u32(ix)) * params.in_c + ic;
|
|
123
|
+
let wi = (((yy * params.kw + xx) * params.in_c + ic) * mult) + m;
|
|
124
|
+
sum = sum + input[ii] * weight[wi];
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
} else {
|
|
128
|
+
let out_per_g = params.out_c / params.groups;
|
|
129
|
+
let in_per_g = params.in_c / params.groups;
|
|
130
|
+
let g = oc / out_per_g;
|
|
131
|
+
let ic0 = g * in_per_g;
|
|
132
|
+
for (var icl = 0u; icl < in_per_g; icl = icl + 1u) {
|
|
133
|
+
let ic = ic0 + icl;
|
|
134
|
+
for (var yy = 0u; yy < params.kh; yy = yy + 1u) {
|
|
135
|
+
let iy = i32(oy * params.sy + yy * params.dy) - i32(params.pt);
|
|
136
|
+
if (iy < 0 || iy >= i32(params.in_h)) { continue; }
|
|
137
|
+
for (var xx = 0u; xx < params.kw; xx = xx + 1u) {
|
|
138
|
+
let ix = i32(ox * params.sx + xx * params.dx) - i32(params.pl);
|
|
139
|
+
if (ix < 0 || ix >= i32(params.in_w)) { continue; }
|
|
140
|
+
let ii = ((nb * params.in_h + u32(iy)) * params.in_w + u32(ix)) * params.in_c + ic;
|
|
141
|
+
let wi = (((yy * params.kw + xx) * params.in_c + ic) * params.out_c) + oc;
|
|
142
|
+
sum = sum + input[ii] * weight[wi];
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
var v = sum + bias[oc];
|
|
149
|
+
if (params.relu == 1u) {
|
|
150
|
+
v = max(v, 0.0);
|
|
151
|
+
} else if (params.relu >= 2u) {
|
|
152
|
+
v = min(max(v, 0.0), 6.0);
|
|
153
|
+
}
|
|
154
|
+
output[((nb * params.out_h + oy) * params.out_w + ox) * params.out_c + oc] = v;
|
|
155
|
+
}
|
|
156
|
+
`});var re,se=k(()=>{re=`@group(0) @binding(0) var<storage, read> input : array<vec4<f32>>;
|
|
157
|
+
@group(0) @binding(1) var<storage, read> weight : array<vec4<f32>>;
|
|
158
|
+
@group(0) @binding(2) var<storage, read> bias : array<vec4<f32>>;
|
|
159
|
+
@group(0) @binding(3) var<storage, read_write> output : array<vec4<f32>>;
|
|
160
|
+
|
|
161
|
+
struct Params {
|
|
162
|
+
n : u32,
|
|
163
|
+
in_h : u32,
|
|
164
|
+
in_w : u32,
|
|
165
|
+
in_c : u32,
|
|
166
|
+
out_c : u32,
|
|
167
|
+
out_h : u32,
|
|
168
|
+
out_w : u32,
|
|
169
|
+
kh : u32,
|
|
170
|
+
kw : u32,
|
|
171
|
+
sy : u32,
|
|
172
|
+
sx : u32,
|
|
173
|
+
pt : u32,
|
|
174
|
+
pl : u32,
|
|
175
|
+
groups : u32,
|
|
176
|
+
relu : u32,
|
|
177
|
+
dy : u32,
|
|
178
|
+
dx : u32,
|
|
179
|
+
}
|
|
180
|
+
@group(0) @binding(4) var<uniform> params : Params;
|
|
181
|
+
|
|
182
|
+
fn apply_relu4(v_in : vec4<f32>) -> vec4<f32> {
|
|
183
|
+
var v = v_in;
|
|
184
|
+
if (params.relu == 1u) {
|
|
185
|
+
v = max(v, vec4<f32>(0.0));
|
|
186
|
+
} else if (params.relu >= 2u) {
|
|
187
|
+
v = min(max(v, vec4<f32>(0.0)), vec4<f32>(6.0));
|
|
188
|
+
}
|
|
189
|
+
return v;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
@compute @workgroup_size(8, 8, 1)
|
|
193
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
194
|
+
let ox = gid.x;
|
|
195
|
+
let oy = gid.y;
|
|
196
|
+
let c8_count = (params.out_c + 7u) / 8u;
|
|
197
|
+
let nb = gid.z / c8_count;
|
|
198
|
+
let ch0 = (gid.z - nb * c8_count) * 8u;
|
|
199
|
+
if (nb >= params.n || ox >= params.out_w || oy >= params.out_h || ch0 >= params.out_c) { return; }
|
|
200
|
+
|
|
201
|
+
var sum0 = vec4<f32>(0.0);
|
|
202
|
+
var sum1 = vec4<f32>(0.0);
|
|
203
|
+
|
|
204
|
+
for (var yy = 0u; yy < params.kh; yy = yy + 1u) {
|
|
205
|
+
let iy = i32(oy * params.sy + yy * params.dy) - i32(params.pt);
|
|
206
|
+
if (iy < 0 || iy >= i32(params.in_h)) { continue; }
|
|
207
|
+
for (var xx = 0u; xx < params.kw; xx = xx + 1u) {
|
|
208
|
+
let ix = i32(ox * params.sx + xx * params.dx) - i32(params.pl);
|
|
209
|
+
if (ix < 0 || ix >= i32(params.in_w)) { continue; }
|
|
210
|
+
let input_base = (((nb * params.in_h + u32(iy)) * params.in_w + u32(ix)) * params.in_c + ch0) / 4u;
|
|
211
|
+
let weight_base = (((yy * params.kw + xx) * params.in_c) + ch0) / 4u;
|
|
212
|
+
sum0 = sum0 + input[input_base] * weight[weight_base];
|
|
213
|
+
sum1 = sum1 + input[input_base + 1u] * weight[weight_base + 1u];
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
let output_base = (((nb * params.out_h + oy) * params.out_w + ox) * params.out_c + ch0) / 4u;
|
|
218
|
+
let bias_base = ch0 / 4u;
|
|
219
|
+
output[output_base] = apply_relu4(sum0 + bias[bias_base]);
|
|
220
|
+
output[output_base + 1u] = apply_relu4(sum1 + bias[bias_base + 1u]);
|
|
221
|
+
}
|
|
222
|
+
`});var ue,ie=k(()=>{ue=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
223
|
+
@group(0) @binding(1) var<storage, read> weight : array<vec4<f32>>;
|
|
224
|
+
@group(0) @binding(2) var<storage, read> bias : array<vec4<f32>>;
|
|
225
|
+
@group(0) @binding(3) var<storage, read_write> output : array<vec4<f32>>;
|
|
226
|
+
|
|
227
|
+
struct Params {
|
|
228
|
+
n : u32,
|
|
229
|
+
in_h : u32,
|
|
230
|
+
in_w : u32,
|
|
231
|
+
in_c : u32,
|
|
232
|
+
out_c : u32,
|
|
233
|
+
out_h : u32,
|
|
234
|
+
out_w : u32,
|
|
235
|
+
kh : u32,
|
|
236
|
+
kw : u32,
|
|
237
|
+
sy : u32,
|
|
238
|
+
sx : u32,
|
|
239
|
+
pt : u32,
|
|
240
|
+
pl : u32,
|
|
241
|
+
groups : u32,
|
|
242
|
+
relu : u32,
|
|
243
|
+
dy : u32,
|
|
244
|
+
dx : u32,
|
|
245
|
+
}
|
|
246
|
+
@group(0) @binding(4) var<uniform> params : Params;
|
|
247
|
+
|
|
248
|
+
fn apply_relu4(v_in : vec4<f32>) -> vec4<f32> {
|
|
249
|
+
var v = v_in;
|
|
250
|
+
if (params.relu == 1u) {
|
|
251
|
+
v = max(v, vec4<f32>(0.0));
|
|
252
|
+
} else if (params.relu >= 2u) {
|
|
253
|
+
v = min(max(v, vec4<f32>(0.0)), vec4<f32>(6.0));
|
|
254
|
+
}
|
|
255
|
+
return v;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
@compute @workgroup_size(8, 8, 1)
|
|
259
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
260
|
+
let ox = gid.x;
|
|
261
|
+
let oy = gid.y;
|
|
262
|
+
let oc16_count = (params.out_c + 15u) / 16u;
|
|
263
|
+
let nb = gid.z / oc16_count;
|
|
264
|
+
let oc0 = (gid.z - nb * oc16_count) * 16u;
|
|
265
|
+
if (nb >= params.n || ox >= params.out_w || oy >= params.out_h || oc0 >= params.out_c) { return; }
|
|
266
|
+
|
|
267
|
+
var sum0 = vec4<f32>(0.0);
|
|
268
|
+
var sum1 = vec4<f32>(0.0);
|
|
269
|
+
var sum2 = vec4<f32>(0.0);
|
|
270
|
+
var sum3 = vec4<f32>(0.0);
|
|
271
|
+
|
|
272
|
+
let input_base = ((nb * params.in_h + oy) * params.in_w + ox) * params.in_c;
|
|
273
|
+
for (var ic = 0u; ic < params.in_c; ic = ic + 1u) {
|
|
274
|
+
let x = input[input_base + ic];
|
|
275
|
+
let wbase = (ic * params.out_c + oc0) / 4u;
|
|
276
|
+
sum0 = sum0 + x * weight[wbase];
|
|
277
|
+
sum1 = sum1 + x * weight[wbase + 1u];
|
|
278
|
+
sum2 = sum2 + x * weight[wbase + 2u];
|
|
279
|
+
sum3 = sum3 + x * weight[wbase + 3u];
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
let output_base = (((nb * params.out_h + oy) * params.out_w + ox) * params.out_c + oc0) / 4u;
|
|
283
|
+
let bias_base = oc0 / 4u;
|
|
284
|
+
output[output_base] = apply_relu4(sum0 + bias[bias_base]);
|
|
285
|
+
output[output_base + 1u] = apply_relu4(sum1 + bias[bias_base + 1u]);
|
|
286
|
+
output[output_base + 2u] = apply_relu4(sum2 + bias[bias_base + 2u]);
|
|
287
|
+
output[output_base + 3u] = apply_relu4(sum3 + bias[bias_base + 3u]);
|
|
288
|
+
}
|
|
289
|
+
`});var ne,oe=k(()=>{ne=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
290
|
+
@group(0) @binding(1) var<storage, read> weight : array<vec4<f32>>;
|
|
291
|
+
@group(0) @binding(2) var<storage, read> bias : array<vec4<f32>>;
|
|
292
|
+
@group(0) @binding(3) var<storage, read_write> output : array<vec4<f32>>;
|
|
293
|
+
|
|
294
|
+
struct Params {
|
|
295
|
+
n : u32,
|
|
296
|
+
in_h : u32,
|
|
297
|
+
in_w : u32,
|
|
298
|
+
in_c : u32,
|
|
299
|
+
out_c : u32,
|
|
300
|
+
out_h : u32,
|
|
301
|
+
out_w : u32,
|
|
302
|
+
kh : u32,
|
|
303
|
+
kw : u32,
|
|
304
|
+
sy : u32,
|
|
305
|
+
sx : u32,
|
|
306
|
+
pt : u32,
|
|
307
|
+
pl : u32,
|
|
308
|
+
groups : u32,
|
|
309
|
+
relu : u32,
|
|
310
|
+
dy : u32,
|
|
311
|
+
dx : u32,
|
|
312
|
+
}
|
|
313
|
+
@group(0) @binding(4) var<uniform> params : Params;
|
|
314
|
+
|
|
315
|
+
const TILE_C : u32 = 64u;
|
|
316
|
+
var<workgroup> tile_weight : array<vec4<f32>, 256>;
|
|
317
|
+
|
|
318
|
+
fn apply_relu4(v_in : vec4<f32>) -> vec4<f32> {
|
|
319
|
+
var v = v_in;
|
|
320
|
+
if (params.relu == 1u) {
|
|
321
|
+
v = max(v, vec4<f32>(0.0));
|
|
322
|
+
} else if (params.relu >= 2u) {
|
|
323
|
+
v = min(max(v, vec4<f32>(0.0)), vec4<f32>(6.0));
|
|
324
|
+
}
|
|
325
|
+
return v;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
@compute @workgroup_size(8, 8, 1)
|
|
329
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>,
|
|
330
|
+
@builtin(local_invocation_id) lid3 : vec3<u32>) {
|
|
331
|
+
let ox = gid.x;
|
|
332
|
+
let oy = gid.y;
|
|
333
|
+
let oc16_count = params.out_c / 16u;
|
|
334
|
+
let nb = gid.z / oc16_count;
|
|
335
|
+
let oc0 = (gid.z - nb * oc16_count) * 16u;
|
|
336
|
+
let lid = lid3.y * 8u + lid3.x;
|
|
337
|
+
let in_bounds = nb < params.n && ox < params.out_w && oy < params.out_h;
|
|
338
|
+
|
|
339
|
+
var sum0 = vec4<f32>(0.0);
|
|
340
|
+
var sum1 = vec4<f32>(0.0);
|
|
341
|
+
var sum2 = vec4<f32>(0.0);
|
|
342
|
+
var sum3 = vec4<f32>(0.0);
|
|
343
|
+
let input_base = ((nb * params.in_h + oy) * params.in_w + ox) * params.in_c;
|
|
344
|
+
|
|
345
|
+
for (var tile_start = 0u; tile_start < params.in_c; tile_start = tile_start + TILE_C) {
|
|
346
|
+
let tile_count = min(TILE_C, params.in_c - tile_start);
|
|
347
|
+
for (var wi = lid; wi < tile_count * 4u; wi = wi + 64u) {
|
|
348
|
+
let ic = tile_start + wi / 4u;
|
|
349
|
+
let oc_vec = wi - (wi / 4u) * 4u;
|
|
350
|
+
tile_weight[wi] = weight[(ic * params.out_c + oc0) / 4u + oc_vec];
|
|
351
|
+
}
|
|
352
|
+
workgroupBarrier();
|
|
353
|
+
|
|
354
|
+
if (in_bounds) {
|
|
355
|
+
for (var ti = 0u; ti < tile_count; ti = ti + 1u) {
|
|
356
|
+
let x = input[input_base + tile_start + ti];
|
|
357
|
+
let wbase = ti * 4u;
|
|
358
|
+
sum0 = sum0 + x * tile_weight[wbase];
|
|
359
|
+
sum1 = sum1 + x * tile_weight[wbase + 1u];
|
|
360
|
+
sum2 = sum2 + x * tile_weight[wbase + 2u];
|
|
361
|
+
sum3 = sum3 + x * tile_weight[wbase + 3u];
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
workgroupBarrier();
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
if (!in_bounds) { return; }
|
|
368
|
+
let output_base = (((nb * params.out_h + oy) * params.out_w + ox) * params.out_c + oc0) / 4u;
|
|
369
|
+
let bias_base = oc0 / 4u;
|
|
370
|
+
output[output_base] = apply_relu4(sum0 + bias[bias_base]);
|
|
371
|
+
output[output_base + 1u] = apply_relu4(sum1 + bias[bias_base + 1u]);
|
|
372
|
+
output[output_base + 2u] = apply_relu4(sum2 + bias[bias_base + 2u]);
|
|
373
|
+
output[output_base + 3u] = apply_relu4(sum3 + bias[bias_base + 3u]);
|
|
374
|
+
}
|
|
375
|
+
`});var ce,pe=k(()=>{ce=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
376
|
+
@group(0) @binding(1) var<storage, read> weight : array<vec2<f32>>;
|
|
377
|
+
@group(0) @binding(2) var<storage, read> bias : array<vec2<f32>>;
|
|
378
|
+
@group(0) @binding(3) var<storage, read_write> output : array<vec2<f32>>;
|
|
379
|
+
|
|
380
|
+
struct Params {
|
|
381
|
+
n : u32,
|
|
382
|
+
in_h : u32,
|
|
383
|
+
in_w : u32,
|
|
384
|
+
in_c : u32,
|
|
385
|
+
out_c : u32,
|
|
386
|
+
out_h : u32,
|
|
387
|
+
out_w : u32,
|
|
388
|
+
kh : u32,
|
|
389
|
+
kw : u32,
|
|
390
|
+
sy : u32,
|
|
391
|
+
sx : u32,
|
|
392
|
+
pt : u32,
|
|
393
|
+
pl : u32,
|
|
394
|
+
groups : u32,
|
|
395
|
+
relu : u32,
|
|
396
|
+
dy : u32,
|
|
397
|
+
dx : u32,
|
|
398
|
+
}
|
|
399
|
+
@group(0) @binding(4) var<uniform> params : Params;
|
|
400
|
+
|
|
401
|
+
fn apply_relu2(v_in : vec2<f32>) -> vec2<f32> {
|
|
402
|
+
var v = v_in;
|
|
403
|
+
if (params.relu == 1u) {
|
|
404
|
+
v = max(v, vec2<f32>(0.0));
|
|
405
|
+
} else if (params.relu >= 2u) {
|
|
406
|
+
v = min(max(v, vec2<f32>(0.0)), vec2<f32>(6.0));
|
|
407
|
+
}
|
|
408
|
+
return v;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
@compute @workgroup_size(8, 8, 1)
|
|
412
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
413
|
+
let ox = gid.x;
|
|
414
|
+
let oy = gid.y;
|
|
415
|
+
let oc8_count = (params.out_c + 7u) / 8u;
|
|
416
|
+
let nb = gid.z / oc8_count;
|
|
417
|
+
let oc0 = (gid.z - nb * oc8_count) * 8u;
|
|
418
|
+
if (nb >= params.n || ox >= params.out_w || oy >= params.out_h || oc0 >= params.out_c) { return; }
|
|
419
|
+
|
|
420
|
+
let has1 = oc0 + 2u < params.out_c;
|
|
421
|
+
let has2 = oc0 + 4u < params.out_c;
|
|
422
|
+
let has3 = oc0 + 6u < params.out_c;
|
|
423
|
+
var sum0 = vec2<f32>(0.0);
|
|
424
|
+
var sum1 = vec2<f32>(0.0);
|
|
425
|
+
var sum2 = vec2<f32>(0.0);
|
|
426
|
+
var sum3 = vec2<f32>(0.0);
|
|
427
|
+
|
|
428
|
+
let input_base = ((nb * params.in_h + oy) * params.in_w + ox) * params.in_c;
|
|
429
|
+
for (var ic = 0u; ic < params.in_c; ic = ic + 1u) {
|
|
430
|
+
let x = input[input_base + ic];
|
|
431
|
+
let wbase = (ic * params.out_c + oc0) / 2u;
|
|
432
|
+
sum0 = sum0 + x * weight[wbase];
|
|
433
|
+
if (has1) { sum1 = sum1 + x * weight[wbase + 1u]; }
|
|
434
|
+
if (has2) { sum2 = sum2 + x * weight[wbase + 2u]; }
|
|
435
|
+
if (has3) { sum3 = sum3 + x * weight[wbase + 3u]; }
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
let output_base = (((nb * params.out_h + oy) * params.out_w + ox) * params.out_c + oc0) / 2u;
|
|
439
|
+
let bias_base = oc0 / 2u;
|
|
440
|
+
output[output_base] = apply_relu2(sum0 + bias[bias_base]);
|
|
441
|
+
if (has1) { output[output_base + 1u] = apply_relu2(sum1 + bias[bias_base + 1u]); }
|
|
442
|
+
if (has2) { output[output_base + 2u] = apply_relu2(sum2 + bias[bias_base + 2u]); }
|
|
443
|
+
if (has3) { output[output_base + 3u] = apply_relu2(sum3 + bias[bias_base + 3u]); }
|
|
444
|
+
}
|
|
445
|
+
`});var le,fe=k(()=>{le=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
446
|
+
@group(0) @binding(1) var<storage, read> weight : array<vec4<f32>>;
|
|
447
|
+
@group(0) @binding(2) var<storage, read> bias : array<vec4<f32>>;
|
|
448
|
+
@group(0) @binding(3) var<storage, read_write> output : array<vec4<f32>>;
|
|
449
|
+
|
|
450
|
+
struct Params {
|
|
451
|
+
n : u32,
|
|
452
|
+
in_h : u32,
|
|
453
|
+
in_w : u32,
|
|
454
|
+
in_c : u32,
|
|
455
|
+
out_c : u32,
|
|
456
|
+
out_h : u32,
|
|
457
|
+
out_w : u32,
|
|
458
|
+
kh : u32,
|
|
459
|
+
kw : u32,
|
|
460
|
+
sy : u32,
|
|
461
|
+
sx : u32,
|
|
462
|
+
pt : u32,
|
|
463
|
+
pl : u32,
|
|
464
|
+
groups : u32,
|
|
465
|
+
relu : u32,
|
|
466
|
+
dy : u32,
|
|
467
|
+
dx : u32,
|
|
468
|
+
}
|
|
469
|
+
@group(0) @binding(4) var<uniform> params : Params;
|
|
470
|
+
|
|
471
|
+
fn apply_relu4(v_in : vec4<f32>) -> vec4<f32> {
|
|
472
|
+
var v = v_in;
|
|
473
|
+
if (params.relu == 1u) {
|
|
474
|
+
v = max(v, vec4<f32>(0.0));
|
|
475
|
+
} else if (params.relu >= 2u) {
|
|
476
|
+
v = min(max(v, vec4<f32>(0.0)), vec4<f32>(6.0));
|
|
477
|
+
}
|
|
478
|
+
return v;
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
@compute @workgroup_size(8, 8, 1)
|
|
482
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
483
|
+
let ox = gid.x;
|
|
484
|
+
let oy = gid.y;
|
|
485
|
+
let oc8_count = (params.out_c + 7u) / 8u;
|
|
486
|
+
let nb = gid.z / oc8_count;
|
|
487
|
+
let oc0 = (gid.z - nb * oc8_count) * 8u;
|
|
488
|
+
if (nb >= params.n || ox >= params.out_w || oy >= params.out_h || oc0 >= params.out_c) { return; }
|
|
489
|
+
|
|
490
|
+
var sum0 = vec4<f32>(0.0);
|
|
491
|
+
var sum1 = vec4<f32>(0.0);
|
|
492
|
+
let input_base = ((nb * params.in_h + oy) * params.in_w + ox) * params.in_c;
|
|
493
|
+
let has_second = oc0 + 4u < params.out_c;
|
|
494
|
+
for (var ic = 0u; ic < params.in_c; ic = ic + 1u) {
|
|
495
|
+
let x = input[input_base + ic];
|
|
496
|
+
let wbase = (ic * params.out_c + oc0) / 4u;
|
|
497
|
+
sum0 = sum0 + x * weight[wbase];
|
|
498
|
+
if (has_second) {
|
|
499
|
+
sum1 = sum1 + x * weight[wbase + 1u];
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
let output_base = (((nb * params.out_h + oy) * params.out_w + ox) * params.out_c + oc0) / 4u;
|
|
504
|
+
let bias_base = oc0 / 4u;
|
|
505
|
+
output[output_base] = apply_relu4(sum0 + bias[bias_base]);
|
|
506
|
+
if (has_second) {
|
|
507
|
+
output[output_base + 1u] = apply_relu4(sum1 + bias[bias_base + 1u]);
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
`});var _e,me=k(()=>{_e=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
511
|
+
@group(0) @binding(1) var<storage, read> weight : array<vec4<f32>>;
|
|
512
|
+
@group(0) @binding(2) var<storage, read> bias : array<vec4<f32>>;
|
|
513
|
+
@group(0) @binding(3) var<storage, read_write> output : array<vec4<f32>>;
|
|
514
|
+
|
|
515
|
+
struct Params {
|
|
516
|
+
n : u32,
|
|
517
|
+
in_h : u32,
|
|
518
|
+
in_w : u32,
|
|
519
|
+
in_c : u32,
|
|
520
|
+
out_c : u32,
|
|
521
|
+
out_h : u32,
|
|
522
|
+
out_w : u32,
|
|
523
|
+
kh : u32,
|
|
524
|
+
kw : u32,
|
|
525
|
+
sy : u32,
|
|
526
|
+
sx : u32,
|
|
527
|
+
pt : u32,
|
|
528
|
+
pl : u32,
|
|
529
|
+
groups : u32,
|
|
530
|
+
relu : u32,
|
|
531
|
+
dy : u32,
|
|
532
|
+
dx : u32,
|
|
533
|
+
}
|
|
534
|
+
@group(0) @binding(4) var<uniform> params : Params;
|
|
535
|
+
|
|
536
|
+
fn apply_relu4(v_in : vec4<f32>) -> vec4<f32> {
|
|
537
|
+
var v = v_in;
|
|
538
|
+
if (params.relu == 1u) {
|
|
539
|
+
v = max(v, vec4<f32>(0.0));
|
|
540
|
+
} else if (params.relu >= 2u) {
|
|
541
|
+
v = min(max(v, vec4<f32>(0.0)), vec4<f32>(6.0));
|
|
542
|
+
}
|
|
543
|
+
return v;
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
@compute @workgroup_size(8, 8, 1)
|
|
547
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
548
|
+
let ox = gid.x;
|
|
549
|
+
let oy = gid.y;
|
|
550
|
+
let oc16_count = params.out_c / 16u;
|
|
551
|
+
let nb = gid.z / oc16_count;
|
|
552
|
+
let oc0 = (gid.z - nb * oc16_count) * 16u;
|
|
553
|
+
if (nb >= params.n || ox >= params.out_w || oy >= params.out_h) { return; }
|
|
554
|
+
|
|
555
|
+
var sum0 = vec4<f32>(0.0);
|
|
556
|
+
var sum1 = vec4<f32>(0.0);
|
|
557
|
+
var sum2 = vec4<f32>(0.0);
|
|
558
|
+
var sum3 = vec4<f32>(0.0);
|
|
559
|
+
for (var yy = 0u; yy < params.kh; yy = yy + 1u) {
|
|
560
|
+
let iy = i32(oy * params.sy + yy * params.dy) - i32(params.pt);
|
|
561
|
+
if (iy < 0 || iy >= i32(params.in_h)) { continue; }
|
|
562
|
+
for (var xx = 0u; xx < params.kw; xx = xx + 1u) {
|
|
563
|
+
let ix = i32(ox * params.sx + xx * params.dx) - i32(params.pl);
|
|
564
|
+
if (ix < 0 || ix >= i32(params.in_w)) { continue; }
|
|
565
|
+
let input_base = ((nb * params.in_h + u32(iy)) * params.in_w + u32(ix)) * 3u;
|
|
566
|
+
let weight_base = (((yy * params.kw + xx) * 3u) * params.out_c + oc0) / 4u;
|
|
567
|
+
for (var ic = 0u; ic < 3u; ic = ic + 1u) {
|
|
568
|
+
let x = input[input_base + ic];
|
|
569
|
+
let wbase = weight_base + ic * (params.out_c / 4u);
|
|
570
|
+
sum0 = sum0 + x * weight[wbase];
|
|
571
|
+
sum1 = sum1 + x * weight[wbase + 1u];
|
|
572
|
+
sum2 = sum2 + x * weight[wbase + 2u];
|
|
573
|
+
sum3 = sum3 + x * weight[wbase + 3u];
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
let output_base = (((nb * params.out_h + oy) * params.out_w + ox) * params.out_c + oc0) / 4u;
|
|
579
|
+
let bias_base = oc0 / 4u;
|
|
580
|
+
output[output_base] = apply_relu4(sum0 + bias[bias_base]);
|
|
581
|
+
output[output_base + 1u] = apply_relu4(sum1 + bias[bias_base + 1u]);
|
|
582
|
+
output[output_base + 2u] = apply_relu4(sum2 + bias[bias_base + 2u]);
|
|
583
|
+
output[output_base + 3u] = apply_relu4(sum3 + bias[bias_base + 3u]);
|
|
584
|
+
}
|
|
585
|
+
`});var ge,de=k(()=>{ge=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
586
|
+
@group(0) @binding(1) var<storage, read> weight : array<f32>;
|
|
587
|
+
@group(0) @binding(2) var<storage, read> bias : array<f32>;
|
|
588
|
+
@group(0) @binding(3) var<storage, read_write> output : array<f32>;
|
|
589
|
+
|
|
590
|
+
struct Params { rows : u32, d_model : u32 }
|
|
591
|
+
@group(0) @binding(4) var<uniform> params : Params;
|
|
592
|
+
|
|
593
|
+
@compute @workgroup_size(64)
|
|
594
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
595
|
+
let row = global_id.x;
|
|
596
|
+
if (row >= params.rows) { return; }
|
|
597
|
+
let d_model = params.d_model;
|
|
598
|
+
let offset = row * d_model;
|
|
599
|
+
|
|
600
|
+
var sum : f32 = 0.0;
|
|
601
|
+
var sq_sum : f32 = 0.0;
|
|
602
|
+
|
|
603
|
+
for (var i = 0u; i < d_model; i = i + 1u) {
|
|
604
|
+
let val = input[offset + i];
|
|
605
|
+
sum = sum + val;
|
|
606
|
+
sq_sum = sq_sum + (val * val);
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
let mean = sum / f32(d_model);
|
|
610
|
+
let variance = (sq_sum / f32(d_model)) - (mean * mean);
|
|
611
|
+
let inv_std = inverseSqrt(variance + 1e-5);
|
|
612
|
+
|
|
613
|
+
for (var i = 0u; i < d_model; i = i + 1u) {
|
|
614
|
+
let norm_val = (input[offset + i] - mean) * inv_std;
|
|
615
|
+
output[offset + i] = norm_val * weight[i] + bias[i];
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
`});var be,he=k(()=>{be=`@group(0) @binding(0) var<storage, read> a : array<f32>;
|
|
619
|
+
@group(0) @binding(1) var<storage, read> b : array<f32>;
|
|
620
|
+
@group(0) @binding(2) var<storage, read_write> output : array<f32>;
|
|
621
|
+
|
|
622
|
+
struct Params { size : u32, is_b_scalar : u32, b_size : u32, a_size: u32, is_a_scalar: u32 }
|
|
623
|
+
@group(0) @binding(3) var<uniform> params : Params;
|
|
624
|
+
|
|
625
|
+
@compute @workgroup_size(64)
|
|
626
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
627
|
+
let idx = global_id.x;
|
|
628
|
+
if (idx >= params.size) { return; }
|
|
629
|
+
|
|
630
|
+
var a_val : f32 = 0.0;
|
|
631
|
+
if (params.is_a_scalar == 1u) {
|
|
632
|
+
a_val = a[0];
|
|
633
|
+
} else if (params.a_size < params.size && params.a_size > 0u) {
|
|
634
|
+
a_val = a[idx % params.a_size];
|
|
635
|
+
} else {
|
|
636
|
+
a_val = a[idx];
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
var b_val : f32 = 0.0;
|
|
640
|
+
if (params.is_b_scalar == 1u) {
|
|
641
|
+
b_val = b[0];
|
|
642
|
+
} else if (params.b_size < params.size && params.b_size > 0u) {
|
|
643
|
+
b_val = b[idx % params.b_size];
|
|
644
|
+
} else {
|
|
645
|
+
b_val = b[idx];
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
var out_val : f32 = 0.0;
|
|
649
|
+
undefined
|
|
650
|
+
output[idx] = out_val;
|
|
651
|
+
}
|
|
652
|
+
`});var xe,ve=k(()=>{xe=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
653
|
+
@group(0) @binding(1) var<storage, read_write> output : array<f32>;
|
|
654
|
+
struct Params { size : u32 }
|
|
655
|
+
@group(0) @binding(2) var<uniform> params : Params;
|
|
656
|
+
@compute @workgroup_size(64)
|
|
657
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
658
|
+
let idx = global_id.x;
|
|
659
|
+
if (idx >= params.size) { return; }
|
|
660
|
+
let x = input[idx];
|
|
661
|
+
var out_val = x;
|
|
662
|
+
undefined
|
|
663
|
+
output[idx] = out_val;
|
|
664
|
+
}
|
|
665
|
+
`});var we,ye=k(()=>{we=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
666
|
+
@group(0) @binding(1) var<storage, read_write> output : array<f32>;
|
|
667
|
+
|
|
668
|
+
struct Params {
|
|
669
|
+
n : u32,
|
|
670
|
+
h : u32,
|
|
671
|
+
w : u32,
|
|
672
|
+
c : u32,
|
|
673
|
+
out_h : u32,
|
|
674
|
+
out_w : u32,
|
|
675
|
+
mode : u32,
|
|
676
|
+
}
|
|
677
|
+
@group(0) @binding(2) var<uniform> params : Params;
|
|
678
|
+
|
|
679
|
+
@compute @workgroup_size(8, 8, 1)
|
|
680
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
681
|
+
let ox = gid.x;
|
|
682
|
+
let oy = gid.y;
|
|
683
|
+
let z = gid.z;
|
|
684
|
+
let nb = z / params.c;
|
|
685
|
+
let ch = z - nb * params.c;
|
|
686
|
+
if (nb >= params.n || ox >= params.out_w || oy >= params.out_h) { return; }
|
|
687
|
+
|
|
688
|
+
if (params.mode == 0u) {
|
|
689
|
+
let iy = (oy * params.h) / params.out_h;
|
|
690
|
+
let ix = (ox * params.w) / params.out_w;
|
|
691
|
+
output[((nb * params.out_h + oy) * params.out_w + ox) * params.c + ch] =
|
|
692
|
+
input[((nb * params.h + iy) * params.w + ix) * params.c + ch];
|
|
693
|
+
return;
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
let scale_y = f32(params.h) / f32(params.out_h);
|
|
697
|
+
let scale_x = f32(params.w) / f32(params.out_w);
|
|
698
|
+
var fy = (f32(oy) + 0.5) * scale_y - 0.5;
|
|
699
|
+
var fx = (f32(ox) + 0.5) * scale_x - 0.5;
|
|
700
|
+
if (fy < 0.0) { fy = 0.0; }
|
|
701
|
+
if (fx < 0.0) { fx = 0.0; }
|
|
702
|
+
let y0 = u32(fy);
|
|
703
|
+
let x0 = u32(fx);
|
|
704
|
+
let y1 = min(y0 + 1u, params.h - 1u);
|
|
705
|
+
let x1 = min(x0 + 1u, params.w - 1u);
|
|
706
|
+
let dy = fy - f32(y0);
|
|
707
|
+
let dx = fx - f32(x0);
|
|
708
|
+
let base = nb * params.h * params.w * params.c;
|
|
709
|
+
let v00 = input[base + (y0 * params.w + x0) * params.c + ch];
|
|
710
|
+
let v01 = input[base + (y0 * params.w + x1) * params.c + ch];
|
|
711
|
+
let v10 = input[base + (y1 * params.w + x0) * params.c + ch];
|
|
712
|
+
let v11 = input[base + (y1 * params.w + x1) * params.c + ch];
|
|
713
|
+
let val = v00 * (1.0 - dy) * (1.0 - dx) + v01 * (1.0 - dy) * dx +
|
|
714
|
+
v10 * dy * (1.0 - dx) + v11 * dy * dx;
|
|
715
|
+
output[((nb * params.out_h + oy) * params.out_w + ox) * params.c + ch] = val;
|
|
716
|
+
}
|
|
717
|
+
`});var ke,Be=k(()=>{ke=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
718
|
+
@group(0) @binding(1) var<storage, read_write> output : array<f32>;
|
|
719
|
+
// General strided slice over 4 dims (leading dims are padded to 1). For each
|
|
720
|
+
// output element the source coord along axis k is start[k] + out_coord * step[k].
|
|
721
|
+
struct Params {
|
|
722
|
+
out_b: u32, out_c: u32, out_h: u32, out_w: u32,
|
|
723
|
+
in_c: u32, in_h: u32, in_w: u32,
|
|
724
|
+
s0: u32, s1: u32, s2: u32, s3: u32,
|
|
725
|
+
st0: u32, st1: u32, st2: u32, st3: u32,
|
|
726
|
+
total: u32
|
|
727
|
+
}
|
|
728
|
+
@group(0) @binding(2) var<uniform> p : Params;
|
|
729
|
+
@compute @workgroup_size(64)
|
|
730
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
731
|
+
let idx = gid.x;
|
|
732
|
+
if (idx >= p.total) { return; }
|
|
733
|
+
let ow = idx % p.out_w;
|
|
734
|
+
let oh = (idx / p.out_w) % p.out_h;
|
|
735
|
+
let oc = (idx / (p.out_w * p.out_h)) % p.out_c;
|
|
736
|
+
let ob = idx / (p.out_w * p.out_h * p.out_c);
|
|
737
|
+
let ib = p.s0 + ob * p.st0;
|
|
738
|
+
let ic = p.s1 + oc * p.st1;
|
|
739
|
+
let ih = p.s2 + oh * p.st2;
|
|
740
|
+
let iw = p.s3 + ow * p.st3;
|
|
741
|
+
output[idx] = input[((ib * p.in_c + ic) * p.in_h + ih) * p.in_w + iw];
|
|
742
|
+
}
|
|
743
|
+
`});var Pe,Se=k(()=>{Pe=`@group(0) @binding(0) var<storage, read> a : array<f32>;
|
|
744
|
+
@group(0) @binding(1) var<storage, read> b : array<f32>;
|
|
745
|
+
@group(0) @binding(2) var<storage, read_write> output : array<f32>;
|
|
746
|
+
|
|
747
|
+
struct Params { size : u32, is_b_scalar : u32, b_size : u32, a_size: u32, is_a_scalar: u32 }
|
|
748
|
+
@group(0) @binding(3) var<uniform> params : Params;
|
|
749
|
+
|
|
750
|
+
@compute @workgroup_size(64)
|
|
751
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
752
|
+
let idx = global_id.x;
|
|
753
|
+
if (idx >= params.size) { return; }
|
|
754
|
+
|
|
755
|
+
var a_val : f32 = 0.0;
|
|
756
|
+
if (params.is_a_scalar == 1u) {
|
|
757
|
+
a_val = a[0];
|
|
758
|
+
} else if (params.a_size < params.size && params.a_size > 0u) {
|
|
759
|
+
a_val = a[idx % params.a_size];
|
|
760
|
+
} else {
|
|
761
|
+
a_val = a[idx];
|
|
762
|
+
}
|
|
763
|
+
|
|
764
|
+
var b_val : f32 = 0.0;
|
|
765
|
+
if (params.is_b_scalar == 1u) {
|
|
766
|
+
b_val = b[0];
|
|
767
|
+
} else if (params.b_size < params.size && params.b_size > 0u) {
|
|
768
|
+
b_val = b[idx % params.b_size];
|
|
769
|
+
} else {
|
|
770
|
+
b_val = b[idx];
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
var out_val : f32 = 0.0;
|
|
774
|
+
out_val = a_val - b_val;
|
|
775
|
+
output[idx] = out_val;
|
|
776
|
+
}
|
|
777
|
+
`});var ze,Ue=k(()=>{ze=`@group(0) @binding(0) var<storage, read> a : array<f32>;
|
|
778
|
+
@group(0) @binding(1) var<storage, read> b : array<f32>;
|
|
779
|
+
@group(0) @binding(2) var<storage, read_write> output : array<f32>;
|
|
780
|
+
|
|
781
|
+
struct Params { size : u32, is_b_scalar : u32, b_size : u32, a_size: u32, is_a_scalar: u32 }
|
|
782
|
+
@group(0) @binding(3) var<uniform> params : Params;
|
|
783
|
+
|
|
784
|
+
@compute @workgroup_size(64)
|
|
785
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
786
|
+
let idx = global_id.x;
|
|
787
|
+
if (idx >= params.size) { return; }
|
|
788
|
+
|
|
789
|
+
var a_val : f32 = 0.0;
|
|
790
|
+
if (params.is_a_scalar == 1u) {
|
|
791
|
+
a_val = a[0];
|
|
792
|
+
} else if (params.a_size < params.size && params.a_size > 0u) {
|
|
793
|
+
a_val = a[idx % params.a_size];
|
|
794
|
+
} else {
|
|
795
|
+
a_val = a[idx];
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
var b_val : f32 = 0.0;
|
|
799
|
+
if (params.is_b_scalar == 1u) {
|
|
800
|
+
b_val = b[0];
|
|
801
|
+
} else if (params.b_size < params.size && params.b_size > 0u) {
|
|
802
|
+
b_val = b[idx % params.b_size];
|
|
803
|
+
} else {
|
|
804
|
+
b_val = b[idx];
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
var out_val : f32 = 0.0;
|
|
808
|
+
out_val = a_val / b_val;
|
|
809
|
+
output[idx] = out_val;
|
|
810
|
+
}
|
|
811
|
+
`});var Me,Te=k(()=>{Me=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
812
|
+
@group(0) @binding(1) var<storage, read_write> output : array<f32>;
|
|
813
|
+
struct Params { size : u32 }
|
|
814
|
+
@group(0) @binding(2) var<uniform> params : Params;
|
|
815
|
+
@compute @workgroup_size(64)
|
|
816
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
817
|
+
let idx = global_id.x;
|
|
818
|
+
if (idx >= params.size) { return; }
|
|
819
|
+
let x = input[idx];
|
|
820
|
+
var out_val = x;
|
|
821
|
+
out_val = x * (1.0 / (1.0 + exp(-x)));
|
|
822
|
+
output[idx] = out_val;
|
|
823
|
+
}
|
|
824
|
+
`});var qe,Ae=k(()=>{qe=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
825
|
+
@group(0) @binding(1) var<storage, read_write> output : array<f32>;
|
|
826
|
+
struct Params { size : u32, alpha : f32 }
|
|
827
|
+
@group(0) @binding(2) var<uniform> params : Params;
|
|
828
|
+
@compute @workgroup_size(64)
|
|
829
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
830
|
+
let idx = global_id.x;
|
|
831
|
+
if (idx >= params.size) { return; }
|
|
832
|
+
let x = input[idx];
|
|
833
|
+
if (x > 0.0) { output[idx] = x; } else { output[idx] = x * params.alpha; }
|
|
834
|
+
}
|
|
835
|
+
`});var De,Ce=k(()=>{De=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
836
|
+
@group(0) @binding(1) var<storage, read_write> output : array<f32>;
|
|
837
|
+
struct Params { size : u32 }
|
|
838
|
+
@group(0) @binding(2) var<uniform> params : Params;
|
|
839
|
+
@compute @workgroup_size(64)
|
|
840
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
841
|
+
let idx = global_id.x;
|
|
842
|
+
if (idx >= params.size) { return; }
|
|
843
|
+
let x = input[idx];
|
|
844
|
+
var out_val = x;
|
|
845
|
+
let e2x = exp(2.0 * x); out_val = (e2x - 1.0) / (e2x + 1.0);
|
|
846
|
+
output[idx] = out_val;
|
|
847
|
+
}
|
|
848
|
+
`});var Le,Ge=k(()=>{Le=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
849
|
+
@group(0) @binding(1) var<storage, read_write> output : array<f32>;
|
|
850
|
+
struct Params { size : u32, min_v : f32, max_v : f32 }
|
|
851
|
+
@group(0) @binding(2) var<uniform> params : Params;
|
|
852
|
+
@compute @workgroup_size(64)
|
|
853
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
854
|
+
let idx = global_id.x;
|
|
855
|
+
if (idx >= params.size) { return; }
|
|
856
|
+
output[idx] = clamp(input[idx], params.min_v, params.max_v);
|
|
857
|
+
}
|
|
858
|
+
`});var Ne,Ie=k(()=>{Ne=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
859
|
+
@group(0) @binding(1) var<storage, read> weight : array<f32>;
|
|
860
|
+
@group(0) @binding(2) var<storage, read_write> output : array<f32>;
|
|
861
|
+
struct Params { seq_len : u32, d_model : u32, eps : f32 }
|
|
862
|
+
@group(0) @binding(3) var<uniform> params : Params;
|
|
863
|
+
@compute @workgroup_size(64)
|
|
864
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
865
|
+
let s = global_id.x;
|
|
866
|
+
if (s >= params.seq_len) { return; }
|
|
867
|
+
var var_val = 0.0;
|
|
868
|
+
let offset = s * params.d_model;
|
|
869
|
+
for (var d = 0u; d < params.d_model; d = d + 1u) {
|
|
870
|
+
let v = input[offset + d];
|
|
871
|
+
var_val = var_val + v * v;
|
|
872
|
+
}
|
|
873
|
+
var_val = var_val / f32(params.d_model);
|
|
874
|
+
let inv_std = 1.0 / sqrt(var_val + params.eps);
|
|
875
|
+
for (var d = 0u; d < params.d_model; d = d + 1u) {
|
|
876
|
+
output[offset + d] = input[offset + d] * inv_std * weight[d];
|
|
877
|
+
}
|
|
878
|
+
}
|
|
879
|
+
`});var Re,Oe=k(()=>{Re=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
880
|
+
@group(0) @binding(1) var<storage, read_write> output : array<f32>;
|
|
881
|
+
struct Params { b : u32, d : u32 }
|
|
882
|
+
@group(0) @binding(2) var<uniform> params : Params;
|
|
883
|
+
@compute @workgroup_size(64)
|
|
884
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
885
|
+
let i = global_id.x;
|
|
886
|
+
if (i >= params.b) { return; }
|
|
887
|
+
let offset = i * params.d;
|
|
888
|
+
var max_val = -100000.0;
|
|
889
|
+
for (var j = 0u; j < params.d; j = j + 1u) {
|
|
890
|
+
if (input[offset + j] > max_val) { max_val = input[offset + j]; }
|
|
891
|
+
}
|
|
892
|
+
var sum = 0.0;
|
|
893
|
+
for (var j = 0u; j < params.d; j = j + 1u) {
|
|
894
|
+
let e = exp(input[offset + j] - max_val);
|
|
895
|
+
output[offset + j] = e;
|
|
896
|
+
sum = sum + e;
|
|
897
|
+
}
|
|
898
|
+
for (var j = 0u; j < params.d; j = j + 1u) {
|
|
899
|
+
output[offset + j] = output[offset + j] / sum;
|
|
900
|
+
}
|
|
901
|
+
}
|
|
902
|
+
`});var Ee,Fe=k(()=>{Ee=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
903
|
+
@group(0) @binding(1) var<storage, read> weight : array<f32>;
|
|
904
|
+
@group(0) @binding(2) var<storage, read_write> output : array<f32>;
|
|
905
|
+
struct Params { size : u32, c : u32 }
|
|
906
|
+
@group(0) @binding(3) var<uniform> params : Params;
|
|
907
|
+
@compute @workgroup_size(64)
|
|
908
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
909
|
+
let idx = global_id.x;
|
|
910
|
+
if (idx >= params.size) { return; }
|
|
911
|
+
let c_idx = idx % params.c;
|
|
912
|
+
let alpha = weight[c_idx];
|
|
913
|
+
let v = input[idx];
|
|
914
|
+
if (v > 0.0) { output[idx] = v; } else { output[idx] = v * alpha; }
|
|
915
|
+
}
|
|
916
|
+
`});var je,We=k(()=>{je=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
917
|
+
@group(0) @binding(1) var<storage, read_write> output : array<f32>;
|
|
918
|
+
struct Params { b : u32, d : u32 }
|
|
919
|
+
@group(0) @binding(2) var<uniform> params : Params;
|
|
920
|
+
@compute @workgroup_size(64)
|
|
921
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
922
|
+
let i = global_id.x;
|
|
923
|
+
if (i >= params.b) { return; }
|
|
924
|
+
let offset = i * params.d;
|
|
925
|
+
var max_val = -100000.0;
|
|
926
|
+
for (var j = 0u; j < params.d; j = j + 1u) {
|
|
927
|
+
if (input[offset + j] > max_val) { max_val = input[offset + j]; }
|
|
928
|
+
}
|
|
929
|
+
var sum = 0.0;
|
|
930
|
+
for (var j = 0u; j < params.d; j = j + 1u) {
|
|
931
|
+
sum = sum + exp(input[offset + j] - max_val);
|
|
932
|
+
}
|
|
933
|
+
let logSum = log(sum);
|
|
934
|
+
for (var j = 0u; j < params.d; j = j + 1u) {
|
|
935
|
+
output[offset + j] = (input[offset + j] - max_val) - logSum;
|
|
936
|
+
}
|
|
937
|
+
}
|
|
938
|
+
`});var $e,Ye=k(()=>{$e=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
939
|
+
@group(0) @binding(1) var<storage, read_write> output : array<f32>;
|
|
940
|
+
// Reduce over the last (innermost) axis: \`b\` rows of length \`d\` -> \`b\` outputs.
|
|
941
|
+
// \`inv\` scales the sum: 1.0 for ReduceSum, 1.0/d for ReduceMean.
|
|
942
|
+
struct Params { b : u32, d : u32, inv : f32 }
|
|
943
|
+
@group(0) @binding(2) var<uniform> p : Params;
|
|
944
|
+
@compute @workgroup_size(64)
|
|
945
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
946
|
+
let i = gid.x;
|
|
947
|
+
if (i >= p.b) { return; }
|
|
948
|
+
let offset = i * p.d;
|
|
949
|
+
var sum = 0.0;
|
|
950
|
+
for (var j = 0u; j < p.d; j = j + 1u) {
|
|
951
|
+
sum = sum + input[offset + j];
|
|
952
|
+
}
|
|
953
|
+
output[i] = sum * p.inv;
|
|
954
|
+
}
|
|
955
|
+
`});var He,Ve=k(()=>{He=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
956
|
+
@group(0) @binding(1) var<storage, read_write> output : array<f32>;
|
|
957
|
+
struct Params { b: u32, in_h: u32, in_w: u32, c: u32, out_h: u32, out_w: u32, kh: u32, kw: u32, sh: u32, sw: u32, ph: u32, pw: u32 }
|
|
958
|
+
@group(0) @binding(2) var<uniform> params : Params;
|
|
959
|
+
@compute @workgroup_size(8, 8, 1)
|
|
960
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
961
|
+
let x = global_id.x; let y = global_id.y; let z = global_id.z;
|
|
962
|
+
let b = z / params.c;
|
|
963
|
+
let c = z - b * params.c;
|
|
964
|
+
if (x >= params.out_w || y >= params.out_h || b >= params.b) { return; }
|
|
965
|
+
var sum = 0.0; var count = 0u;
|
|
966
|
+
for (var ky = 0u; ky < params.kh; ky = ky + 1u) {
|
|
967
|
+
for (var kx = 0u; kx < params.kw; kx = kx + 1u) {
|
|
968
|
+
let in_y = i32(y * params.sh) - i32(params.ph) + i32(ky);
|
|
969
|
+
let in_x = i32(x * params.sw) - i32(params.pw) + i32(kx);
|
|
970
|
+
if (in_y >= 0 && in_y < i32(params.in_h) && in_x >= 0 && in_x < i32(params.in_w)) {
|
|
971
|
+
sum = sum + input[((b * params.in_h + u32(in_y)) * params.in_w + u32(in_x)) * params.c + c];
|
|
972
|
+
count = count + 1u;
|
|
973
|
+
}
|
|
974
|
+
}
|
|
975
|
+
}
|
|
976
|
+
if (count == 0u) { count = 1u; }
|
|
977
|
+
output[((b * params.out_h + y) * params.out_w + x) * params.c + c] = sum / f32(count);
|
|
978
|
+
}
|
|
979
|
+
`});var Xe,Ke=k(()=>{Xe=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
980
|
+
@group(0) @binding(1) var<storage, read> indices : array<f32>;
|
|
981
|
+
@group(0) @binding(2) var<storage, read_write> output : array<f32>;
|
|
982
|
+
// Gather along axis 0: output[i, ...] = input[indices[i], ...]. \`row_size\` is the
|
|
983
|
+
// number of contiguous elements per gathered row (product of input dims after
|
|
984
|
+
// axis 0); \`num_idx\` is the number of indices. total = num_idx * row_size.
|
|
985
|
+
struct Params { row_size : u32, num_idx : u32, total : u32 }
|
|
986
|
+
@group(0) @binding(3) var<uniform> p : Params;
|
|
987
|
+
@compute @workgroup_size(64)
|
|
988
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
989
|
+
let idx = gid.x;
|
|
990
|
+
if (idx >= p.total) { return; }
|
|
991
|
+
let k = idx % p.row_size;
|
|
992
|
+
let i = idx / p.row_size;
|
|
993
|
+
let row = u32(indices[i]);
|
|
994
|
+
output[idx] = input[row * p.row_size + k];
|
|
995
|
+
}
|
|
996
|
+
`});var Je,Qe=k(()=>{Je=`@group(0) @binding(0) var<storage, read> cond : array<f32>;
|
|
997
|
+
@group(0) @binding(1) var<storage, read> a : array<f32>;
|
|
998
|
+
@group(0) @binding(2) var<storage, read> b : array<f32>;
|
|
999
|
+
@group(0) @binding(3) var<storage, read_write> output : array<f32>;
|
|
1000
|
+
struct Params { size : u32 }
|
|
1001
|
+
@group(0) @binding(4) var<uniform> params : Params;
|
|
1002
|
+
@compute @workgroup_size(64)
|
|
1003
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
1004
|
+
let idx = global_id.x;
|
|
1005
|
+
if (idx >= params.size) { return; }
|
|
1006
|
+
if (cond[idx] != 0.0) { output[idx] = a[idx]; } else { output[idx] = b[idx]; }
|
|
1007
|
+
}
|
|
1008
|
+
`});var ta,Ze=k(()=>{ta=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
1009
|
+
@group(0) @binding(1) var<storage, read> scale : array<f32>;
|
|
1010
|
+
@group(0) @binding(2) var<storage, read> zero_point : array<f32>;
|
|
1011
|
+
@group(0) @binding(3) var<storage, read_write> output : array<f32>;
|
|
1012
|
+
struct Params { size : u32, has_zp : u32 }
|
|
1013
|
+
@group(0) @binding(4) var<uniform> params : Params;
|
|
1014
|
+
@compute @workgroup_size(64)
|
|
1015
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
1016
|
+
let idx = global_id.x;
|
|
1017
|
+
if (idx >= params.size) { return; }
|
|
1018
|
+
var zp = 0.0;
|
|
1019
|
+
if (params.has_zp == 1u) { zp = zero_point[0]; }
|
|
1020
|
+
output[idx] = (input[idx] - zp) * scale[0];
|
|
1021
|
+
}
|
|
1022
|
+
`});var aa,ea=k(()=>{aa=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
1023
|
+
@group(0) @binding(1) var<storage, read_write> output : array<f32>;
|
|
1024
|
+
struct Params { in_b: u32, in_h: u32, in_w: u32, in_c: u32, out_b: u32, out_h: u32, out_w: u32, out_c: u32 }
|
|
1025
|
+
@group(0) @binding(2) var<uniform> params : Params;
|
|
1026
|
+
@compute @workgroup_size(64)
|
|
1027
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
1028
|
+
let idx = global_id.x;
|
|
1029
|
+
let total = params.out_b * params.out_h * params.out_w * params.out_c;
|
|
1030
|
+
if (idx >= total) { return; }
|
|
1031
|
+
let oc = idx % params.out_c;
|
|
1032
|
+
let ow = (idx / params.out_c) % params.out_w;
|
|
1033
|
+
let oh = (idx / (params.out_c * params.out_w)) % params.out_h;
|
|
1034
|
+
let ob = idx / (params.out_c * params.out_w * params.out_h);
|
|
1035
|
+
let ib = ob % params.in_b;
|
|
1036
|
+
let ih = oh % params.in_h; let iw = ow % params.in_w;
|
|
1037
|
+
let ic = oc % params.in_c;
|
|
1038
|
+
output[idx] = input[((ib * params.in_h + ih) * params.in_w + iw) * params.in_c + ic];
|
|
1039
|
+
}
|
|
1040
|
+
`});var ra,sa=k(()=>{ra=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
1041
|
+
@group(0) @binding(1) var<storage, read_write> output : array<f32>;
|
|
1042
|
+
struct Params { b: u32, in_h: u32, in_w: u32, c: u32, out_h: u32, out_w: u32, pt: u32, pl: u32, val: f32 }
|
|
1043
|
+
@group(0) @binding(2) var<uniform> params : Params;
|
|
1044
|
+
@compute @workgroup_size(64)
|
|
1045
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
1046
|
+
let idx = global_id.x;
|
|
1047
|
+
let total = params.b * params.out_h * params.out_w * params.c;
|
|
1048
|
+
if (idx >= total) { return; }
|
|
1049
|
+
let c = idx % params.c;
|
|
1050
|
+
let x = (idx / params.c) % params.out_w;
|
|
1051
|
+
let y = (idx / (params.c * params.out_w)) % params.out_h;
|
|
1052
|
+
let b = idx / (params.c * params.out_w * params.out_h);
|
|
1053
|
+
if (y >= params.pt && y < params.pt + params.in_h && x >= params.pl && x < params.pl + params.in_w) {
|
|
1054
|
+
output[idx] = input[((b * params.in_h + (y - params.pt)) * params.in_w + (x - params.pl)) * params.c + c];
|
|
1055
|
+
} else {
|
|
1056
|
+
output[idx] = params.val;
|
|
1057
|
+
}
|
|
1058
|
+
}
|
|
1059
|
+
`});var ua,ia=k(()=>{ua=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
1060
|
+
@group(0) @binding(1) var<storage, read> weight : array<f32>;
|
|
1061
|
+
@group(0) @binding(2) var<storage, read> bias : array<f32>;
|
|
1062
|
+
@group(0) @binding(3) var<storage, read_write> output : array<f32>;
|
|
1063
|
+
struct Params { b: u32, in_h: u32, in_w: u32, in_c: u32, out_h: u32, out_w: u32, out_c: u32, kh: u32, kw: u32, sh: u32, sw: u32, ph: u32, pw: u32, has_bias: u32 }
|
|
1064
|
+
@group(0) @binding(4) var<uniform> params : Params;
|
|
1065
|
+
@compute @workgroup_size(8, 8, 1)
|
|
1066
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
1067
|
+
let x = global_id.x; let y = global_id.y; let batch_c = global_id.z;
|
|
1068
|
+
if (x >= params.out_w || y >= params.out_h || batch_c >= (params.b * params.out_c)) { return; }
|
|
1069
|
+
let ob = batch_c / params.out_c;
|
|
1070
|
+
let oc = batch_c % params.out_c;
|
|
1071
|
+
var sum = 0.0;
|
|
1072
|
+
if (params.has_bias == 1u) { sum = bias[oc]; }
|
|
1073
|
+
for (var ic = 0u; ic < params.in_c; ic = ic + 1u) {
|
|
1074
|
+
for (var ky = 0u; ky < params.kh; ky = ky + 1u) {
|
|
1075
|
+
for (var kx = 0u; kx < params.kw; kx = kx + 1u) {
|
|
1076
|
+
let oy_shifted = i32(y) + i32(params.ph) - i32(ky);
|
|
1077
|
+
let ox_shifted = i32(x) + i32(params.pw) - i32(kx);
|
|
1078
|
+
if (oy_shifted % i32(params.sh) == 0 && ox_shifted % i32(params.sw) == 0) {
|
|
1079
|
+
let iy = oy_shifted / i32(params.sh);
|
|
1080
|
+
let ix = ox_shifted / i32(params.sw);
|
|
1081
|
+
if (iy >= 0 && iy < i32(params.in_h) && ix >= 0 && ix < i32(params.in_w)) {
|
|
1082
|
+
let in_val = input[((ob * params.in_h + u32(iy)) * params.in_w + u32(ix)) * params.in_c + ic];
|
|
1083
|
+
let w_val = weight[ic * (params.out_c * params.kh * params.kw) + oc * (params.kh * params.kw) + ky * params.kw + kx];
|
|
1084
|
+
sum = sum + in_val * w_val;
|
|
1085
|
+
}
|
|
1086
|
+
}
|
|
1087
|
+
}
|
|
1088
|
+
}
|
|
1089
|
+
}
|
|
1090
|
+
output[((ob * params.out_h + y) * params.out_w + x) * params.out_c + oc] = sum;
|
|
1091
|
+
}
|
|
1092
|
+
`});var na,oa=k(()=>{na=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
1093
|
+
@group(0) @binding(1) var<storage, read_write> output : array<f32>;
|
|
1094
|
+
struct Params { size : u32 }
|
|
1095
|
+
@group(0) @binding(2) var<uniform> params : Params;
|
|
1096
|
+
@compute @workgroup_size(64)
|
|
1097
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
1098
|
+
let idx = global_id.x;
|
|
1099
|
+
if (idx >= params.size) { return; }
|
|
1100
|
+
let x = input[idx];
|
|
1101
|
+
var out_val = x;
|
|
1102
|
+
if (x > 0.0) { out_val = x; } else { out_val = 0.0; }
|
|
1103
|
+
output[idx] = out_val;
|
|
1104
|
+
}
|
|
1105
|
+
`});var ca,pa=k(()=>{ca=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
1106
|
+
@group(0) @binding(1) var<storage, read_write> output : array<f32>;
|
|
1107
|
+
struct Params { size : u32 }
|
|
1108
|
+
@group(0) @binding(2) var<uniform> params : Params;
|
|
1109
|
+
@compute @workgroup_size(64)
|
|
1110
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
1111
|
+
let idx = global_id.x;
|
|
1112
|
+
if (idx >= params.size) { return; }
|
|
1113
|
+
let x = input[idx];
|
|
1114
|
+
var out_val = x;
|
|
1115
|
+
out_val = 1.0 / (1.0 + exp(-x));
|
|
1116
|
+
output[idx] = out_val;
|
|
1117
|
+
}
|
|
1118
|
+
`});var la,fa=k(()=>{la=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
1119
|
+
@group(0) @binding(1) var<storage, read_write> output : array<f32>;
|
|
1120
|
+
struct Params { size : u32 }
|
|
1121
|
+
@group(0) @binding(2) var<uniform> params : Params;
|
|
1122
|
+
@compute @workgroup_size(64)
|
|
1123
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
1124
|
+
let idx = global_id.x;
|
|
1125
|
+
if (idx >= params.size) { return; }
|
|
1126
|
+
let x = input[idx];
|
|
1127
|
+
var out_val = x;
|
|
1128
|
+
var v = x + 3.0; if (v < 0.0) { v = 0.0; } if (v > 6.0) { v = 6.0; } out_val = x * v / 6.0;
|
|
1129
|
+
output[idx] = out_val;
|
|
1130
|
+
}
|
|
1131
|
+
`});var _a,ma=k(()=>{_a=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
1132
|
+
@group(0) @binding(1) var<storage, read_write> output : array<f32>;
|
|
1133
|
+
struct Params { size : u32 }
|
|
1134
|
+
@group(0) @binding(2) var<uniform> params : Params;
|
|
1135
|
+
@compute @workgroup_size(64)
|
|
1136
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
1137
|
+
let idx = global_id.x;
|
|
1138
|
+
if (idx >= params.size) { return; }
|
|
1139
|
+
let x = input[idx];
|
|
1140
|
+
var out_val = x;
|
|
1141
|
+
var v = x + 3.0; if (v < 0.0) { v = 0.0; } if (v > 6.0) { v = 6.0; } out_val = v / 6.0;
|
|
1142
|
+
output[idx] = out_val;
|
|
1143
|
+
}
|
|
1144
|
+
`});var ga,da=k(()=>{ga=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
1145
|
+
@group(0) @binding(1) var<storage, read_write> output : array<f32>;
|
|
1146
|
+
struct Params { size : u32 }
|
|
1147
|
+
@group(0) @binding(2) var<uniform> params : Params;
|
|
1148
|
+
@compute @workgroup_size(64)
|
|
1149
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
1150
|
+
let idx = global_id.x;
|
|
1151
|
+
if (idx >= params.size) { return; }
|
|
1152
|
+
let x = input[idx];
|
|
1153
|
+
var out_val = x;
|
|
1154
|
+
out_val = x;
|
|
1155
|
+
output[idx] = out_val;
|
|
1156
|
+
}
|
|
1157
|
+
`});var ba,ha=k(()=>{ba=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
1158
|
+
@group(0) @binding(1) var<storage, read> weight : array<f32>;
|
|
1159
|
+
@group(0) @binding(2) var<storage, read> bias : array<f32>;
|
|
1160
|
+
@group(0) @binding(3) var<storage, read> running_mean : array<f32>;
|
|
1161
|
+
@group(0) @binding(4) var<storage, read> running_var : array<f32>;
|
|
1162
|
+
@group(0) @binding(5) var<storage, read_write> output : array<f32>;
|
|
1163
|
+
struct Params { b : u32, c : u32, h : u32, w : u32, eps : f32 }
|
|
1164
|
+
@group(0) @binding(6) var<uniform> params : Params;
|
|
1165
|
+
@compute @workgroup_size(64)
|
|
1166
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
1167
|
+
let idx = global_id.x;
|
|
1168
|
+
let total = params.b * params.c * params.h * params.w;
|
|
1169
|
+
if (idx >= total) { return; }
|
|
1170
|
+
let c = idx % params.c;
|
|
1171
|
+
let mean = running_mean[c];
|
|
1172
|
+
let var_val = running_var[c];
|
|
1173
|
+
let gamma = weight[c];
|
|
1174
|
+
let beta = bias[c];
|
|
1175
|
+
let inv_std = 1.0 / sqrt(var_val + params.eps);
|
|
1176
|
+
output[idx] = (input[idx] - mean) * inv_std * gamma + beta;
|
|
1177
|
+
}
|
|
1178
|
+
`});var xa,va=k(()=>{xa=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
1179
|
+
@group(0) @binding(1) var<storage, read_write> output : array<f32>;
|
|
1180
|
+
struct Params { size : u32 }
|
|
1181
|
+
@group(0) @binding(2) var<uniform> params : Params;
|
|
1182
|
+
|
|
1183
|
+
@compute @workgroup_size(64)
|
|
1184
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
1185
|
+
let idx = global_id.x;
|
|
1186
|
+
if (idx >= params.size) { return; }
|
|
1187
|
+
let x = input[idx];
|
|
1188
|
+
let cdf = 0.5 * (1.0 + tanh(0.7978845608 * (x + 0.044715 * x * x * x)));
|
|
1189
|
+
output[idx] = x * cdf;
|
|
1190
|
+
}
|
|
1191
|
+
`});var wa,ya=k(()=>{wa=`@group(0) @binding(0) var<storage, read> a : array<f32>;
|
|
1192
|
+
@group(0) @binding(1) var<storage, read> b : array<f32>;
|
|
1193
|
+
@group(0) @binding(2) var<storage, read_write> output : array<f32>;
|
|
1194
|
+
|
|
1195
|
+
struct Params { size : u32 }
|
|
1196
|
+
@group(0) @binding(3) var<uniform> params : Params;
|
|
1197
|
+
|
|
1198
|
+
@compute @workgroup_size(64)
|
|
1199
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
1200
|
+
let idx = global_id.x;
|
|
1201
|
+
if (idx >= params.size) { return; }
|
|
1202
|
+
output[idx] = a[idx] + b[idx];
|
|
1203
|
+
}
|
|
1204
|
+
`});var ka,Ba=k(()=>{ka=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
1205
|
+
@group(0) @binding(1) var<storage, read_write> output : array<f32>;
|
|
1206
|
+
|
|
1207
|
+
struct Params {
|
|
1208
|
+
n : u32,
|
|
1209
|
+
h : u32,
|
|
1210
|
+
w : u32,
|
|
1211
|
+
c : u32,
|
|
1212
|
+
}
|
|
1213
|
+
@group(0) @binding(2) var<uniform> params : Params;
|
|
1214
|
+
|
|
1215
|
+
@compute @workgroup_size(8, 8, 1)
|
|
1216
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
1217
|
+
let ox = gid.x;
|
|
1218
|
+
let oy = gid.y;
|
|
1219
|
+
let z = gid.z;
|
|
1220
|
+
let nb = z / params.c;
|
|
1221
|
+
let ch = z - nb * params.c;
|
|
1222
|
+
let out_h = params.h * 2u;
|
|
1223
|
+
let out_w = params.w * 2u;
|
|
1224
|
+
if (nb >= params.n || ox >= out_w || oy >= out_h) { return; }
|
|
1225
|
+
output[((nb * out_h + oy) * out_w + ox) * params.c + ch] =
|
|
1226
|
+
input[((nb * params.h + (oy / 2u)) * params.w + (ox / 2u)) * params.c + ch];
|
|
1227
|
+
}
|
|
1228
|
+
`});var Pa,Sa=k(()=>{Pa=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
1229
|
+
@group(0) @binding(1) var<storage, read_write> output : array<f32>;
|
|
1230
|
+
struct Params { size : u32, offset : u32 }
|
|
1231
|
+
@group(0) @binding(2) var<uniform> params : Params;
|
|
1232
|
+
@compute @workgroup_size(64)
|
|
1233
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
1234
|
+
let i = gid.x;
|
|
1235
|
+
if (i >= params.size) { return; }
|
|
1236
|
+
output[params.offset + i] = input[i];
|
|
1237
|
+
}
|
|
1238
|
+
`});var za,Ua=k(()=>{za=`@group(0) @binding(0) var<storage, read> a : array<f32>;
|
|
1239
|
+
@group(0) @binding(1) var<storage, read> b : array<f32>;
|
|
1240
|
+
@group(0) @binding(2) var<storage, read_write> output : array<f32>;
|
|
1241
|
+
|
|
1242
|
+
struct Params { a_size : u32, b_size : u32 }
|
|
1243
|
+
@group(0) @binding(3) var<uniform> params : Params;
|
|
1244
|
+
|
|
1245
|
+
@compute @workgroup_size(64)
|
|
1246
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
1247
|
+
let idx = global_id.x;
|
|
1248
|
+
if (idx < params.a_size) {
|
|
1249
|
+
output[idx] = a[idx];
|
|
1250
|
+
} else if (idx < params.a_size + params.b_size) {
|
|
1251
|
+
output[idx] = b[idx - params.a_size];
|
|
1252
|
+
}
|
|
1253
|
+
}
|
|
1254
|
+
`});var Ma,Ta=k(()=>{Ma=`@group(0) @binding(0) var<storage, read> a : array<f32>;
|
|
1255
|
+
@group(0) @binding(1) var<storage, read> b : array<f32>;
|
|
1256
|
+
@group(0) @binding(2) var<storage, read_write> output : array<f32>;
|
|
1257
|
+
@group(0) @binding(3) var<storage, read> md : array<u32>;
|
|
1258
|
+
@compute @workgroup_size(64)
|
|
1259
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
1260
|
+
let idx = gid.x;
|
|
1261
|
+
let total = md[0];
|
|
1262
|
+
if (idx >= total) { return; }
|
|
1263
|
+
let rank = md[1];
|
|
1264
|
+
var rem = idx;
|
|
1265
|
+
var a_idx = 0u;
|
|
1266
|
+
var b_idx = 0u;
|
|
1267
|
+
for (var d = 0u; d < rank; d = d + 1u) {
|
|
1268
|
+
let os = md[2u + d];
|
|
1269
|
+
let coord = rem / os;
|
|
1270
|
+
rem = rem - coord * os;
|
|
1271
|
+
a_idx = a_idx + coord * md[2u + rank + d];
|
|
1272
|
+
b_idx = b_idx + coord * md[2u + 2u * rank + d];
|
|
1273
|
+
}
|
|
1274
|
+
let av = a[a_idx];
|
|
1275
|
+
let bv = b[b_idx];
|
|
1276
|
+
var out_val = 0.0;
|
|
1277
|
+
//__BINOP__
|
|
1278
|
+
output[idx] = out_val;
|
|
1279
|
+
}
|
|
1280
|
+
`});var qa,Aa=k(()=>{qa=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
1281
|
+
@group(0) @binding(1) var<storage, read_write> output : array<f32>;
|
|
1282
|
+
@group(0) @binding(2) var<storage, read> md : array<u32>;
|
|
1283
|
+
@compute @workgroup_size(64)
|
|
1284
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
1285
|
+
let idx = gid.x;
|
|
1286
|
+
let total = md[0];
|
|
1287
|
+
if (idx >= total) { return; }
|
|
1288
|
+
let rank = md[1];
|
|
1289
|
+
var rem = idx;
|
|
1290
|
+
var in_idx = 0u;
|
|
1291
|
+
for (var d = 0u; d < rank; d = d + 1u) {
|
|
1292
|
+
let os = md[2u + d];
|
|
1293
|
+
let coord = rem / os;
|
|
1294
|
+
rem = rem - coord * os;
|
|
1295
|
+
in_idx = in_idx + coord * md[2u + rank + d];
|
|
1296
|
+
}
|
|
1297
|
+
output[idx] = input[in_idx];
|
|
1298
|
+
}
|
|
1299
|
+
`});var Da,Ca=k(()=>{Da=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
1300
|
+
@group(0) @binding(1) var<storage, read_write> output : array<f32>;
|
|
1301
|
+
struct Params { total : u32, inner : u32, split_size : u32, axis_in : u32, offset : u32 }
|
|
1302
|
+
@group(0) @binding(2) var<uniform> params : Params;
|
|
1303
|
+
@compute @workgroup_size(64)
|
|
1304
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
1305
|
+
let i = gid.x;
|
|
1306
|
+
if (i >= params.total) { return; }
|
|
1307
|
+
let inner_idx = i % params.inner;
|
|
1308
|
+
let s = (i / params.inner) % params.split_size;
|
|
1309
|
+
let outer_idx = i / (params.split_size * params.inner);
|
|
1310
|
+
let in_idx = outer_idx * (params.axis_in * params.inner)
|
|
1311
|
+
+ (params.offset + s) * params.inner + inner_idx;
|
|
1312
|
+
output[i] = input[in_idx];
|
|
1313
|
+
}
|
|
1314
|
+
`});var La,Ga=k(()=>{La=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
1315
|
+
@group(0) @binding(1) var<storage, read_write> output : array<f32>;
|
|
1316
|
+
|
|
1317
|
+
struct Params { in_h : u32, in_w : u32, in_c : u32 }
|
|
1318
|
+
@group(0) @binding(2) var<uniform> params : Params;
|
|
1319
|
+
|
|
1320
|
+
@compute @workgroup_size(64)
|
|
1321
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
1322
|
+
let y = global_id.x;
|
|
1323
|
+
let c = global_id.y;
|
|
1324
|
+
|
|
1325
|
+
if (y >= params.in_h || c >= params.in_c) { return; }
|
|
1326
|
+
|
|
1327
|
+
var max_val = -1e38;
|
|
1328
|
+
var sum_val = 0.0;
|
|
1329
|
+
|
|
1330
|
+
for (var x = 0u; x < params.in_w; x = x + 1u) {
|
|
1331
|
+
let val = input[(y * params.in_w + x) * params.in_c + c];
|
|
1332
|
+
if (val > max_val) { max_val = val; }
|
|
1333
|
+
sum_val = sum_val + val;
|
|
1334
|
+
}
|
|
1335
|
+
|
|
1336
|
+
let out_max_idx = c * params.in_h + y;
|
|
1337
|
+
let out_mean_idx = (c + params.in_c) * params.in_h + y;
|
|
1338
|
+
|
|
1339
|
+
output[out_max_idx] = max_val;
|
|
1340
|
+
output[out_mean_idx] = sum_val / f32(params.in_w);
|
|
1341
|
+
}
|
|
1342
|
+
`});var Na,Ia=k(()=>{Na=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
1343
|
+
@group(0) @binding(1) var<storage, read_write> output : array<f32>;
|
|
1344
|
+
|
|
1345
|
+
struct Params { in_h : u32, in_w : u32, in_c : u32 }
|
|
1346
|
+
@group(0) @binding(2) var<uniform> params : Params;
|
|
1347
|
+
|
|
1348
|
+
@compute @workgroup_size(64)
|
|
1349
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
1350
|
+
let x = global_id.x;
|
|
1351
|
+
let c = global_id.y;
|
|
1352
|
+
|
|
1353
|
+
if (x >= params.in_w || c >= params.in_c) { return; }
|
|
1354
|
+
|
|
1355
|
+
var max_val = -1e38;
|
|
1356
|
+
var sum_val = 0.0;
|
|
1357
|
+
|
|
1358
|
+
for (var y = 0u; y < params.in_h; y = y + 1u) {
|
|
1359
|
+
let val = input[(y * params.in_w + x) * params.in_c + c];
|
|
1360
|
+
if (val > max_val) { max_val = val; }
|
|
1361
|
+
sum_val = sum_val + val;
|
|
1362
|
+
}
|
|
1363
|
+
|
|
1364
|
+
let out_max_idx = c * params.in_w + x;
|
|
1365
|
+
let out_mean_idx = (c + params.in_c) * params.in_w + x;
|
|
1366
|
+
|
|
1367
|
+
output[out_max_idx] = max_val;
|
|
1368
|
+
output[out_mean_idx] = sum_val / f32(params.in_h);
|
|
1369
|
+
}
|
|
1370
|
+
`});var Ra,Oa=k(()=>{Ra=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
1371
|
+
@group(0) @binding(1) var<storage, read_write> output : array<f32>;
|
|
1372
|
+
|
|
1373
|
+
struct Params { n : u32, h : u32, w : u32, c : u32 }
|
|
1374
|
+
@group(0) @binding(2) var<uniform> params : Params;
|
|
1375
|
+
|
|
1376
|
+
@compute @workgroup_size(64)
|
|
1377
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
1378
|
+
let ch = gid.x;
|
|
1379
|
+
let nb = gid.y;
|
|
1380
|
+
if (nb >= params.n || ch >= params.c) { return; }
|
|
1381
|
+
var sum = 0.0;
|
|
1382
|
+
for (var y = 0u; y < params.h; y = y + 1u) {
|
|
1383
|
+
for (var x = 0u; x < params.w; x = x + 1u) {
|
|
1384
|
+
sum = sum + input[((nb * params.h + y) * params.w + x) * params.c + ch];
|
|
1385
|
+
}
|
|
1386
|
+
}
|
|
1387
|
+
output[nb * params.c + ch] = sum / f32(params.h * params.w);
|
|
1388
|
+
}
|
|
1389
|
+
`});var Ea,Fa=k(()=>{Ea=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
1390
|
+
@group(0) @binding(1) var<storage, read_write> output : array<f32>;
|
|
1391
|
+
|
|
1392
|
+
struct Params { in_h : u32, in_w : u32, in_c : u32 }
|
|
1393
|
+
@group(0) @binding(2) var<uniform> params : Params;
|
|
1394
|
+
|
|
1395
|
+
@compute @workgroup_size(64)
|
|
1396
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
1397
|
+
let x = global_id.x;
|
|
1398
|
+
let c = global_id.y;
|
|
1399
|
+
if (x >= params.in_w || c >= params.in_c) { return; }
|
|
1400
|
+
|
|
1401
|
+
var sum_val = 0.0;
|
|
1402
|
+
for (var y = 0u; y < params.in_h; y = y + 1u) {
|
|
1403
|
+
sum_val = sum_val + input[(y * params.in_w + x) * params.in_c + c];
|
|
1404
|
+
}
|
|
1405
|
+
output[c * params.in_w + x] = sum_val / f32(params.in_h);
|
|
1406
|
+
}
|
|
1407
|
+
`});var ja,Wa=k(()=>{ja=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
1408
|
+
@group(0) @binding(1) var<storage, read_write> output : array<f32>;
|
|
1409
|
+
|
|
1410
|
+
struct Params {
|
|
1411
|
+
h : u32,
|
|
1412
|
+
w : u32,
|
|
1413
|
+
c : u32,
|
|
1414
|
+
out_h : u32,
|
|
1415
|
+
out_w : u32,
|
|
1416
|
+
ky : u32,
|
|
1417
|
+
kx : u32,
|
|
1418
|
+
sy : u32,
|
|
1419
|
+
sx : u32,
|
|
1420
|
+
py : u32,
|
|
1421
|
+
px : u32,
|
|
1422
|
+
}
|
|
1423
|
+
@group(0) @binding(2) var<uniform> params : Params;
|
|
1424
|
+
|
|
1425
|
+
@compute @workgroup_size(8, 8, 1)
|
|
1426
|
+
fn main(@builtin(global_invocation_id) gid : vec3<u32>) {
|
|
1427
|
+
let ox = gid.x;
|
|
1428
|
+
let oy = gid.y;
|
|
1429
|
+
let ch = gid.z;
|
|
1430
|
+
if (ox >= params.out_w || oy >= params.out_h || ch >= params.c) { return; }
|
|
1431
|
+
|
|
1432
|
+
var best = -3.402823466e38;
|
|
1433
|
+
for (var yy = 0u; yy < params.ky; yy = yy + 1u) {
|
|
1434
|
+
let iy = i32(oy * params.sy + yy) - i32(params.py);
|
|
1435
|
+
if (iy < 0 || iy >= i32(params.h)) { continue; }
|
|
1436
|
+
for (var xx = 0u; xx < params.kx; xx = xx + 1u) {
|
|
1437
|
+
let ix = i32(ox * params.sx + xx) - i32(params.px);
|
|
1438
|
+
if (ix < 0 || ix >= i32(params.w)) { continue; }
|
|
1439
|
+
best = max(best, input[(u32(iy) * params.w + u32(ix)) * params.c + ch]);
|
|
1440
|
+
}
|
|
1441
|
+
}
|
|
1442
|
+
output[(oy * params.out_w + ox) * params.c + ch] = best;
|
|
1443
|
+
}
|
|
1444
|
+
`});var $a,Ya=k(()=>{$a=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
1445
|
+
@group(0) @binding(1) var<storage, read_write> output : array<f32>;
|
|
1446
|
+
|
|
1447
|
+
struct Params { in_c : u32, in_l : u32, out_l : u32 }
|
|
1448
|
+
@group(0) @binding(2) var<uniform> params : Params;
|
|
1449
|
+
|
|
1450
|
+
@compute @workgroup_size(64)
|
|
1451
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
1452
|
+
let i = global_id.x;
|
|
1453
|
+
let c = global_id.y;
|
|
1454
|
+
|
|
1455
|
+
if (i >= params.out_l || c >= params.in_c) { return; }
|
|
1456
|
+
|
|
1457
|
+
let scale = f32(params.in_l) / f32(params.out_l);
|
|
1458
|
+
var src = (f32(i) + 0.5) * scale - 0.5;
|
|
1459
|
+
if (src < 0.0) { src = 0.0; }
|
|
1460
|
+
if (src > f32(params.in_l - 1u)) { src = f32(params.in_l - 1u); }
|
|
1461
|
+
|
|
1462
|
+
let lo = u32(src);
|
|
1463
|
+
var hi = lo + 1u;
|
|
1464
|
+
if (hi >= params.in_l) { hi = params.in_l - 1u; }
|
|
1465
|
+
let t = src - f32(lo);
|
|
1466
|
+
|
|
1467
|
+
let in_base = c * params.in_l;
|
|
1468
|
+
let out_base = c * params.out_l;
|
|
1469
|
+
|
|
1470
|
+
output[out_base + i] = input[in_base + lo] * (1.0 - t) + input[in_base + hi] * t;
|
|
1471
|
+
}
|
|
1472
|
+
`});var Ha,Va=k(()=>{Ha=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
1473
|
+
@group(0) @binding(1) var<storage, read> weight : array<f32>;
|
|
1474
|
+
@group(0) @binding(2) var<storage, read> bias : array<f32>;
|
|
1475
|
+
@group(0) @binding(3) var<storage, read_write> output : array<f32>;
|
|
1476
|
+
|
|
1477
|
+
struct Params {
|
|
1478
|
+
in_c : u32, in_l : u32,
|
|
1479
|
+
out_c : u32, k : u32,
|
|
1480
|
+
stride : u32, pad : u32, relu : u32
|
|
1481
|
+
}
|
|
1482
|
+
@group(0) @binding(4) var<uniform> params : Params;
|
|
1483
|
+
|
|
1484
|
+
@compute @workgroup_size(64)
|
|
1485
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
1486
|
+
let x = global_id.x;
|
|
1487
|
+
let oc = global_id.y;
|
|
1488
|
+
let out_l = (params.in_l + 2u * params.pad - params.k) / params.stride + 1u;
|
|
1489
|
+
|
|
1490
|
+
if (x >= out_l || oc >= params.out_c) { return; }
|
|
1491
|
+
|
|
1492
|
+
var sum = bias[oc];
|
|
1493
|
+
let w_base = oc * params.in_c * params.k;
|
|
1494
|
+
|
|
1495
|
+
for (var ic = 0u; ic < params.in_c; ic = ic + 1u) {
|
|
1496
|
+
let in_base = ic * params.in_l;
|
|
1497
|
+
let w_ic_base = w_base + ic * params.k;
|
|
1498
|
+
for (var k = 0u; k < params.k; k = k + 1u) {
|
|
1499
|
+
let in_x = i32(x * params.stride + k) - i32(params.pad);
|
|
1500
|
+
if (in_x >= 0 && in_x < i32(params.in_l)) {
|
|
1501
|
+
sum = sum + input[in_base + u32(in_x)] * weight[w_ic_base + k];
|
|
1502
|
+
}
|
|
1503
|
+
}
|
|
1504
|
+
}
|
|
1505
|
+
|
|
1506
|
+
if (params.relu == 1u && sum < 0.0) { sum = 0.0; }
|
|
1507
|
+
output[oc * out_l + x] = sum;
|
|
1508
|
+
}
|
|
1509
|
+
`});var Xa,Ka=k(()=>{Xa=`@group(0) @binding(0) var<storage, read> input : array<f32>;
|
|
1510
|
+
@group(0) @binding(1) var<storage, read_write> output : array<f32>;
|
|
1511
|
+
|
|
1512
|
+
struct Params { in_h : u32, in_w : u32, in_c : u32 }
|
|
1513
|
+
@group(0) @binding(2) var<uniform> params : Params;
|
|
1514
|
+
|
|
1515
|
+
@compute @workgroup_size(64)
|
|
1516
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
1517
|
+
let x = global_id.x;
|
|
1518
|
+
let c = global_id.y;
|
|
1519
|
+
|
|
1520
|
+
if (x >= params.in_w || c >= params.in_c) { return; }
|
|
1521
|
+
|
|
1522
|
+
var max_val = -1e38;
|
|
1523
|
+
for (var y = 0u; y < params.in_h; y = y + 1u) {
|
|
1524
|
+
let val = input[(y * params.in_w + x) * params.in_c + c];
|
|
1525
|
+
if (val > max_val) { max_val = val; }
|
|
1526
|
+
}
|
|
1527
|
+
|
|
1528
|
+
var denom = 0.0;
|
|
1529
|
+
var weighted = 0.0;
|
|
1530
|
+
for (var y = 0u; y < params.in_h; y = y + 1u) {
|
|
1531
|
+
let val = input[(y * params.in_w + x) * params.in_c + c];
|
|
1532
|
+
let ev = exp(val - max_val);
|
|
1533
|
+
denom = denom + ev;
|
|
1534
|
+
weighted = weighted + ev * (f32(y) + 0.5) / f32(params.in_h);
|
|
1535
|
+
}
|
|
1536
|
+
|
|
1537
|
+
var out_val = 0.0;
|
|
1538
|
+
if (denom > 0.0) { out_val = weighted / denom; }
|
|
1539
|
+
output[c * params.in_w + x] = out_val;
|
|
1540
|
+
}
|
|
1541
|
+
`});var Ja,Qa=k(()=>{Ja=`@group(0) @binding(0) var<storage, read> tokens : array<f32>;
|
|
1542
|
+
@group(0) @binding(1) var<storage, read> weight : array<f32>;
|
|
1543
|
+
@group(0) @binding(2) var<storage, read_write> output : array<f32>;
|
|
1544
|
+
|
|
1545
|
+
struct Params { seq_len : u32, d_model : u32 }
|
|
1546
|
+
@group(0) @binding(3) var<uniform> params : Params;
|
|
1547
|
+
|
|
1548
|
+
@compute @workgroup_size(64)
|
|
1549
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
1550
|
+
let token_idx = global_id.x;
|
|
1551
|
+
if (token_idx >= params.seq_len) { return; }
|
|
1552
|
+
|
|
1553
|
+
let d_model = params.d_model;
|
|
1554
|
+
let token_id = u32(tokens[token_idx]); // ids arrive as f32 (see CPU/WASM tiers)
|
|
1555
|
+
|
|
1556
|
+
let in_offset = token_id * d_model;
|
|
1557
|
+
let out_offset = token_idx * d_model;
|
|
1558
|
+
|
|
1559
|
+
for (var i = 0u; i < d_model; i = i + 1u) {
|
|
1560
|
+
output[out_offset + i] = weight[in_offset + i];
|
|
1561
|
+
}
|
|
1562
|
+
}
|
|
1563
|
+
`});var ts,Za=k(()=>{ts=`@group(0) @binding(0) var<storage, read> qkv : array<f32>;
|
|
1564
|
+
@group(0) @binding(1) var<storage, read_write> output : array<f32>;
|
|
1565
|
+
|
|
1566
|
+
struct Params {
|
|
1567
|
+
seq_len : u32,
|
|
1568
|
+
d_model : u32,
|
|
1569
|
+
num_heads : u32,
|
|
1570
|
+
head_dim : u32,
|
|
1571
|
+
scale : f32,
|
|
1572
|
+
}
|
|
1573
|
+
@group(0) @binding(2) var<uniform> params : Params;
|
|
1574
|
+
|
|
1575
|
+
@compute @workgroup_size(64, 1, 1)
|
|
1576
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
1577
|
+
let q_idx = global_id.x;
|
|
1578
|
+
let h_idx = global_id.y;
|
|
1579
|
+
|
|
1580
|
+
if (q_idx >= params.seq_len || h_idx >= params.num_heads) { return; }
|
|
1581
|
+
|
|
1582
|
+
let head_dim = params.head_dim;
|
|
1583
|
+
let d_model = params.d_model;
|
|
1584
|
+
|
|
1585
|
+
var max_logit : f32 = -1e38;
|
|
1586
|
+
|
|
1587
|
+
// Cache Q for this head and this q_idx
|
|
1588
|
+
var q_cache : array<f32, 64>; // max head_dim 64
|
|
1589
|
+
for (var d = 0u; d < head_dim; d = d + 1u) {
|
|
1590
|
+
q_cache[d] = qkv[q_idx * (d_model * 3u) + (h_idx * head_dim) + d];
|
|
1591
|
+
}
|
|
1592
|
+
|
|
1593
|
+
// Pass 1: find max
|
|
1594
|
+
for (var k_idx = 0u; k_idx <= q_idx; k_idx = k_idx + 1u) {
|
|
1595
|
+
var score : f32 = 0.0;
|
|
1596
|
+
for (var d = 0u; d < head_dim; d = d + 1u) {
|
|
1597
|
+
let k_val = qkv[k_idx * (d_model * 3u) + d_model + (h_idx * head_dim) + d];
|
|
1598
|
+
score = score + (q_cache[d] * k_val);
|
|
1599
|
+
}
|
|
1600
|
+
score = score * params.scale;
|
|
1601
|
+
if (score > max_logit) { max_logit = score; }
|
|
1602
|
+
}
|
|
1603
|
+
|
|
1604
|
+
// Pass 2: sum exp
|
|
1605
|
+
var sum_exp : f32 = 0.0;
|
|
1606
|
+
for (var k_idx = 0u; k_idx <= q_idx; k_idx = k_idx + 1u) {
|
|
1607
|
+
var score : f32 = 0.0;
|
|
1608
|
+
for (var d = 0u; d < head_dim; d = d + 1u) {
|
|
1609
|
+
let k_val = qkv[k_idx * (d_model * 3u) + d_model + (h_idx * head_dim) + d];
|
|
1610
|
+
score = score + (q_cache[d] * k_val);
|
|
1611
|
+
}
|
|
1612
|
+
score = score * params.scale;
|
|
1613
|
+
sum_exp = sum_exp + exp(score - max_logit);
|
|
1614
|
+
}
|
|
1615
|
+
|
|
1616
|
+
// Pass 3: output
|
|
1617
|
+
for (var d = 0u; d < head_dim; d = d + 1u) {
|
|
1618
|
+
var out_val : f32 = 0.0;
|
|
1619
|
+
for (var k_idx = 0u; k_idx <= q_idx; k_idx = k_idx + 1u) {
|
|
1620
|
+
var score : f32 = 0.0;
|
|
1621
|
+
for (var kd = 0u; kd < head_dim; kd = kd + 1u) {
|
|
1622
|
+
let k_val = qkv[k_idx * (d_model * 3u) + d_model + (h_idx * head_dim) + kd];
|
|
1623
|
+
score = score + (q_cache[kd] * k_val);
|
|
1624
|
+
}
|
|
1625
|
+
score = score * params.scale;
|
|
1626
|
+
|
|
1627
|
+
let w = exp(score - max_logit) / sum_exp;
|
|
1628
|
+
let v_val = qkv[k_idx * (d_model * 3u) + d_model * 2u + (h_idx * head_dim) + d];
|
|
1629
|
+
out_val = out_val + (w * v_val);
|
|
1630
|
+
}
|
|
1631
|
+
output[q_idx * d_model + (h_idx * head_dim) + d] = out_val;
|
|
1632
|
+
}
|
|
1633
|
+
}
|
|
1634
|
+
`});var as,es=k(()=>{as=`@group(0) @binding(0) var<storage, read> q_in : array<f32>;
|
|
1635
|
+
@group(0) @binding(1) var<storage, read> k_in : array<f32>;
|
|
1636
|
+
@group(0) @binding(2) var<storage, read> v_in : array<f32>;
|
|
1637
|
+
@group(0) @binding(3) var<storage, read_write> output : array<f32>;
|
|
1638
|
+
|
|
1639
|
+
struct Params {
|
|
1640
|
+
seq_len_q : u32,
|
|
1641
|
+
seq_len_kv : u32,
|
|
1642
|
+
d_model : u32,
|
|
1643
|
+
num_heads : u32,
|
|
1644
|
+
head_dim : u32,
|
|
1645
|
+
scale : f32,
|
|
1646
|
+
}
|
|
1647
|
+
@group(0) @binding(4) var<uniform> params : Params;
|
|
1648
|
+
|
|
1649
|
+
@compute @workgroup_size(64, 1, 1)
|
|
1650
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
1651
|
+
let q_idx = global_id.x;
|
|
1652
|
+
let h_idx = global_id.y;
|
|
1653
|
+
|
|
1654
|
+
if (q_idx >= params.seq_len_q || h_idx >= params.num_heads) { return; }
|
|
1655
|
+
|
|
1656
|
+
let head_dim = params.head_dim;
|
|
1657
|
+
let d_model = params.d_model;
|
|
1658
|
+
|
|
1659
|
+
// Cache Q for this head and this q_idx
|
|
1660
|
+
var q_cache : array<f32, 64>; // max head_dim 64
|
|
1661
|
+
for (var d = 0u; d < head_dim; d = d + 1u) {
|
|
1662
|
+
q_cache[d] = q_in[q_idx * d_model + (h_idx * head_dim) + d];
|
|
1663
|
+
}
|
|
1664
|
+
|
|
1665
|
+
var max_logit : f32 = -1e38;
|
|
1666
|
+
|
|
1667
|
+
// Pass 1: find max
|
|
1668
|
+
for (var k_idx = 0u; k_idx < params.seq_len_kv; k_idx = k_idx + 1u) {
|
|
1669
|
+
var score : f32 = 0.0;
|
|
1670
|
+
for (var d = 0u; d < head_dim; d = d + 1u) {
|
|
1671
|
+
let k_val = k_in[k_idx * d_model + (h_idx * head_dim) + d];
|
|
1672
|
+
score = score + (q_cache[d] * k_val);
|
|
1673
|
+
}
|
|
1674
|
+
score = score * params.scale;
|
|
1675
|
+
if (score > max_logit) { max_logit = score; }
|
|
1676
|
+
}
|
|
1677
|
+
|
|
1678
|
+
// Pass 2: sum exp
|
|
1679
|
+
var sum_exp : f32 = 0.0;
|
|
1680
|
+
for (var k_idx = 0u; k_idx < params.seq_len_kv; k_idx = k_idx + 1u) {
|
|
1681
|
+
var score : f32 = 0.0;
|
|
1682
|
+
for (var d = 0u; d < head_dim; d = d + 1u) {
|
|
1683
|
+
let k_val = k_in[k_idx * d_model + (h_idx * head_dim) + d];
|
|
1684
|
+
score = score + (q_cache[d] * k_val);
|
|
1685
|
+
}
|
|
1686
|
+
score = score * params.scale;
|
|
1687
|
+
sum_exp = sum_exp + exp(score - max_logit);
|
|
1688
|
+
}
|
|
1689
|
+
|
|
1690
|
+
// Pass 3: output
|
|
1691
|
+
for (var d = 0u; d < head_dim; d = d + 1u) {
|
|
1692
|
+
var out_val : f32 = 0.0;
|
|
1693
|
+
for (var k_idx = 0u; k_idx < params.seq_len_kv; k_idx = k_idx + 1u) {
|
|
1694
|
+
var score : f32 = 0.0;
|
|
1695
|
+
for (var kd = 0u; kd < head_dim; kd = kd + 1u) {
|
|
1696
|
+
let k_val = k_in[k_idx * d_model + (h_idx * head_dim) + kd];
|
|
1697
|
+
score = score + (q_cache[kd] * k_val);
|
|
1698
|
+
}
|
|
1699
|
+
score = score * params.scale;
|
|
1700
|
+
|
|
1701
|
+
let w = exp(score - max_logit) / sum_exp;
|
|
1702
|
+
let v_val = v_in[k_idx * d_model + (h_idx * head_dim) + d];
|
|
1703
|
+
out_val = out_val + (w * v_val);
|
|
1704
|
+
}
|
|
1705
|
+
output[q_idx * d_model + (h_idx * head_dim) + d] = out_val;
|
|
1706
|
+
}
|
|
1707
|
+
}
|
|
1708
|
+
`});var rs,ss=k(()=>{rs=`@group(0) @binding(0) var<storage, read> q_in : array<f32>;
|
|
1709
|
+
@group(0) @binding(1) var<storage, read> kv_in : array<f32>;
|
|
1710
|
+
@group(0) @binding(2) var<storage, read> weight_int8_packed : array<u32>;
|
|
1711
|
+
@group(0) @binding(3) var<storage, read> w_scale : array<f32>;
|
|
1712
|
+
@group(0) @binding(4) var<storage, read> bias : array<f32>;
|
|
1713
|
+
@group(0) @binding(5) var<storage, read_write> output : array<f32>;
|
|
1714
|
+
|
|
1715
|
+
struct Params {
|
|
1716
|
+
seq_len_q : u32,
|
|
1717
|
+
seq_len_kv : u32,
|
|
1718
|
+
d_model : u32,
|
|
1719
|
+
num_heads : u32,
|
|
1720
|
+
head_dim : u32,
|
|
1721
|
+
scale_factor : f32,
|
|
1722
|
+
has_scale : u32,
|
|
1723
|
+
has_bias : u32,
|
|
1724
|
+
}
|
|
1725
|
+
@group(0) @binding(6) var<uniform> params : Params;
|
|
1726
|
+
|
|
1727
|
+
@compute @workgroup_size(64, 1, 1)
|
|
1728
|
+
fn main(@builtin(global_invocation_id) global_id : vec3<u32>) {
|
|
1729
|
+
let q_idx = global_id.x;
|
|
1730
|
+
let h_idx = global_id.y;
|
|
1731
|
+
|
|
1732
|
+
if (q_idx >= params.seq_len_q || h_idx >= params.num_heads) { return; }
|
|
1733
|
+
|
|
1734
|
+
let head_dim = params.head_dim;
|
|
1735
|
+
let d_model = params.d_model;
|
|
1736
|
+
let d_model_4 = d_model / 4u;
|
|
1737
|
+
|
|
1738
|
+
// Cache Q for this head and this q_idx
|
|
1739
|
+
var q_cache : array<f32, 64>; // max head_dim 64
|
|
1740
|
+
for (var d = 0u; d < head_dim; d = d + 1u) {
|
|
1741
|
+
var sum = 0.0;
|
|
1742
|
+
let out_col = h_idx * head_dim + d;
|
|
1743
|
+
for (var i = 0u; i < d_model_4; i = i + 1u) {
|
|
1744
|
+
let w_packed = weight_int8_packed[out_col * d_model_4 + i];
|
|
1745
|
+
let in_base = q_idx * d_model + i * 4u;
|
|
1746
|
+
sum = sum + q_in[in_base + 0u] * f32(extractBits(i32(w_packed), 0u, 8u));
|
|
1747
|
+
sum = sum + q_in[in_base + 1u] * f32(extractBits(i32(w_packed), 8u, 8u));
|
|
1748
|
+
sum = sum + q_in[in_base + 2u] * f32(extractBits(i32(w_packed), 16u, 8u));
|
|
1749
|
+
sum = sum + q_in[in_base + 3u] * f32(extractBits(i32(w_packed), 24u, 8u));
|
|
1750
|
+
}
|
|
1751
|
+
if (params.has_scale > 0u) { sum = sum * w_scale[out_col]; }
|
|
1752
|
+
if (params.has_bias > 0u) { sum = sum + bias[out_col]; }
|
|
1753
|
+
q_cache[d] = sum;
|
|
1754
|
+
}
|
|
1755
|
+
|
|
1756
|
+
var max_logit : f32 = -1e38;
|
|
1757
|
+
|
|
1758
|
+
// Pass 1: find max
|
|
1759
|
+
for (var k_idx = 0u; k_idx < params.seq_len_kv; k_idx = k_idx + 1u) {
|
|
1760
|
+
var score : f32 = 0.0;
|
|
1761
|
+
for (var d = 0u; d < head_dim; d = d + 1u) {
|
|
1762
|
+
var k_val = 0.0;
|
|
1763
|
+
let out_col = d_model + h_idx * head_dim + d;
|
|
1764
|
+
for (var i = 0u; i < d_model_4; i = i + 1u) {
|
|
1765
|
+
let w_packed = weight_int8_packed[out_col * d_model_4 + i];
|
|
1766
|
+
let in_base = k_idx * d_model + i * 4u;
|
|
1767
|
+
k_val = k_val + kv_in[in_base + 0u] * f32(extractBits(i32(w_packed), 0u, 8u));
|
|
1768
|
+
k_val = k_val + kv_in[in_base + 1u] * f32(extractBits(i32(w_packed), 8u, 8u));
|
|
1769
|
+
k_val = k_val + kv_in[in_base + 2u] * f32(extractBits(i32(w_packed), 16u, 8u));
|
|
1770
|
+
k_val = k_val + kv_in[in_base + 3u] * f32(extractBits(i32(w_packed), 24u, 8u));
|
|
1771
|
+
}
|
|
1772
|
+
if (params.has_scale > 0u) { k_val = k_val * w_scale[out_col]; }
|
|
1773
|
+
if (params.has_bias > 0u) { k_val = k_val + bias[out_col]; }
|
|
1774
|
+
|
|
1775
|
+
score = score + (q_cache[d] * k_val);
|
|
1776
|
+
}
|
|
1777
|
+
score = score * params.scale_factor;
|
|
1778
|
+
if (score > max_logit) { max_logit = score; }
|
|
1779
|
+
}
|
|
1780
|
+
|
|
1781
|
+
// Pass 2: sum exp
|
|
1782
|
+
var sum_exp : f32 = 0.0;
|
|
1783
|
+
for (var k_idx = 0u; k_idx < params.seq_len_kv; k_idx = k_idx + 1u) {
|
|
1784
|
+
var score : f32 = 0.0;
|
|
1785
|
+
for (var d = 0u; d < head_dim; d = d + 1u) {
|
|
1786
|
+
var k_val = 0.0;
|
|
1787
|
+
let out_col = d_model + h_idx * head_dim + d;
|
|
1788
|
+
for (var i = 0u; i < d_model_4; i = i + 1u) {
|
|
1789
|
+
let w_packed = weight_int8_packed[out_col * d_model_4 + i];
|
|
1790
|
+
let in_base = k_idx * d_model + i * 4u;
|
|
1791
|
+
k_val = k_val + kv_in[in_base + 0u] * f32(extractBits(i32(w_packed), 0u, 8u));
|
|
1792
|
+
k_val = k_val + kv_in[in_base + 1u] * f32(extractBits(i32(w_packed), 8u, 8u));
|
|
1793
|
+
k_val = k_val + kv_in[in_base + 2u] * f32(extractBits(i32(w_packed), 16u, 8u));
|
|
1794
|
+
k_val = k_val + kv_in[in_base + 3u] * f32(extractBits(i32(w_packed), 24u, 8u));
|
|
1795
|
+
}
|
|
1796
|
+
if (params.has_scale > 0u) { k_val = k_val * w_scale[out_col]; }
|
|
1797
|
+
if (params.has_bias > 0u) { k_val = k_val + bias[out_col]; }
|
|
1798
|
+
|
|
1799
|
+
score = score + (q_cache[d] * k_val);
|
|
1800
|
+
}
|
|
1801
|
+
score = score * params.scale_factor;
|
|
1802
|
+
sum_exp = sum_exp + exp(score - max_logit);
|
|
1803
|
+
}
|
|
1804
|
+
|
|
1805
|
+
// Pass 3: output
|
|
1806
|
+
for (var d = 0u; d < head_dim; d = d + 1u) {
|
|
1807
|
+
var out_val : f32 = 0.0;
|
|
1808
|
+
for (var k_idx = 0u; k_idx < params.seq_len_kv; k_idx = k_idx + 1u) {
|
|
1809
|
+
var score : f32 = 0.0;
|
|
1810
|
+
for (var kd = 0u; kd < head_dim; kd = kd + 1u) {
|
|
1811
|
+
var k_val = 0.0;
|
|
1812
|
+
let out_col = d_model + h_idx * head_dim + kd;
|
|
1813
|
+
for (var i = 0u; i < d_model_4; i = i + 1u) {
|
|
1814
|
+
let w_packed = weight_int8_packed[out_col * d_model_4 + i];
|
|
1815
|
+
let in_base = k_idx * d_model + i * 4u;
|
|
1816
|
+
k_val = k_val + kv_in[in_base + 0u] * f32(extractBits(i32(w_packed), 0u, 8u));
|
|
1817
|
+
k_val = k_val + kv_in[in_base + 1u] * f32(extractBits(i32(w_packed), 8u, 8u));
|
|
1818
|
+
k_val = k_val + kv_in[in_base + 2u] * f32(extractBits(i32(w_packed), 16u, 8u));
|
|
1819
|
+
k_val = k_val + kv_in[in_base + 3u] * f32(extractBits(i32(w_packed), 24u, 8u));
|
|
1820
|
+
}
|
|
1821
|
+
if (params.has_scale > 0u) { k_val = k_val * w_scale[out_col]; }
|
|
1822
|
+
if (params.has_bias > 0u) { k_val = k_val + bias[out_col]; }
|
|
1823
|
+
|
|
1824
|
+
score = score + (q_cache[kd] * k_val);
|
|
1825
|
+
}
|
|
1826
|
+
score = score * params.scale_factor;
|
|
1827
|
+
|
|
1828
|
+
let w = exp(score - max_logit) / sum_exp;
|
|
1829
|
+
|
|
1830
|
+
var v_val = 0.0;
|
|
1831
|
+
let v_col = d_model * 2u + h_idx * head_dim + d;
|
|
1832
|
+
for (var i = 0u; i < d_model_4; i = i + 1u) {
|
|
1833
|
+
let w_packed = weight_int8_packed[v_col * d_model_4 + i];
|
|
1834
|
+
let in_base = k_idx * d_model + i * 4u;
|
|
1835
|
+
v_val = v_val + kv_in[in_base + 0u] * f32(extractBits(i32(w_packed), 0u, 8u));
|
|
1836
|
+
v_val = v_val + kv_in[in_base + 1u] * f32(extractBits(i32(w_packed), 8u, 8u));
|
|
1837
|
+
v_val = v_val + kv_in[in_base + 2u] * f32(extractBits(i32(w_packed), 16u, 8u));
|
|
1838
|
+
v_val = v_val + kv_in[in_base + 3u] * f32(extractBits(i32(w_packed), 24u, 8u));
|
|
1839
|
+
}
|
|
1840
|
+
if (params.has_scale > 0u) { v_val = v_val * w_scale[v_col]; }
|
|
1841
|
+
if (params.has_bias > 0u) { v_val = v_val + bias[v_col]; }
|
|
1842
|
+
|
|
1843
|
+
out_val = out_val + (w * v_val);
|
|
1844
|
+
}
|
|
1845
|
+
output[q_idx * d_model + (h_idx * head_dim) + d] = out_val;
|
|
1846
|
+
}
|
|
1847
|
+
}
|
|
1848
|
+
`});var is={};fs(is,{ShaderLibrary:()=>Q});var Q,us=k(()=>{Qt();Zt();ee();se();ie();oe();pe();fe();me();de();he();ve();ye();Be();Se();Ue();Te();Ae();Ce();Ge();Ie();Oe();Fe();We();Ye();Ve();Ke();Qe();Ze();ea();sa();ia();oa();pa();fa();ma();da();ha();va();ya();Ba();Sa();Ua();Ta();Aa();Ca();Ga();Ia();Oa();Fa();Wa();Ya();Va();Ka();Qa();Za();es();ss();Q=class{static getLinearF32Shader(){return Jt}static getLinearInt8Shader(){return te}static getConv2DShader(){return ae}static getConv2DDepthwise8Shader(){return re}static getConv2DPointwise16Shader(){return ue}static getConv2DPointwise16TileShader(){return ne}static getConv2DPointwise8Vec2Shader(){return ce}static getConv2DPointwise8Vec4Shader(){return le}static getConv2DRegularC3Out16Shader(){return _e}static getLayerNormShader(){return ge}static getBinaryBroadcastShader(){return be}static getElementwiseShader(){return xe}static getResizeShader(){return we}static getSliceShader(){return ke}static getSubShader(){return Pe}static getDivShader(){return ze}static getSiLUShader(){return Me}static getLeakyReLUShader(){return qe}static getTanhShader(){return De}static getClipShader(){return Le}static getRMSNormShader(){return Ne}static getSoftmaxShader(){return Re}static getPReLUShader(){return Ee}static getLogSoftmaxShader(){return je}static getReduceShader(){return $e}static getAveragePool2DShader(){return He}static getGatherShader(){return Xe}static getWhereShader(){return Je}static getDequantizeLinearShader(){return ta}static getExpandShader(){return aa}static getPadShader(){return ra}static getConvTranspose2DShader(){return ua}static getReLUShader(){return na}static getSigmoidShader(){return ca}static getHardSwishShader(){return la}static getHardSigmoidShader(){return _a}static getCopyShader(){return ga}static getBatchNorm2DShader(){return ba}static getGELUShader(){return xa}static getAddShader(){return wa}static getUpsample2xShader(){return ka}static getConcatCopyShader(){return Pa}static getConcat2Shader(){return za}static getBroadcastBinaryShader(t="out_val = av + bv;"){return Ma.replace("//__BINOP__",t)}static getGeneralTransposeShader(){return qa}static getSplitShader(){return Da}static getProfileYShader(){return La}static getProfileXShader(){return Na}static getGlobalAveragePoolShader(){return Ra}static getMeanHeightShader(){return Ea}static getMaxPool2DShader(){return ja}static getInterp1DShader(){return $a}static getConv1DShader(){return Ha}static getSpatialSoftargmaxYShader(){return Xa}static getEmbeddingShader(){return Ja}static getSDPAShader(){return ts}static getCrossSDPAShader(){return as}static getCrossAttentionShader(){return rs}}});var W=class{constructor(t,r,e="float32",c=!1){this.name=t,this.shape=r,this.dtype=e,this.isWeight=c,this.gpuBuffer=null,this.sizeBytes=this._calculateByteSize()}_calculateByteSize(){let t=this.shape.reduce((r,e)=>r*e,1);return this.dtype==="float32"||this.dtype==="int32"?t*4:this.dtype==="int8"||this.dtype==="uint8"?t:t*4}};function C(p,t){if(Array.isArray(p))return[p[0],p[1]??p[0]];let r=p??t;return[r,r]}var j=class{constructor(){this.nodes=[],this.tensors=new Map}addInput(t,r,e="float32"){let c=new W(t,r,e,!1);return this.tensors.set(t,c),c}addWeight(t,r,e="float32"){let c=new W(t,r,e,!0);return this.tensors.set(t,c),c}addOp(t,r,e,c={}){let s={};for(let[m,a]of Object.entries(e)){let u=`${t}_${this.nodes.length}_out_${m}`,i=new W(u,a,"float32",!1);this.tensors.set(u,i),s[m]=i}let n={id:this.nodes.length,opType:t,inputs:r,outputs:s,params:c};return this.nodes.push(n),s}};function J(p){let t=(p.inputs.input||p.inputs.x).buffer,r=(p.inputs.slope||p.inputs.weight).buffer,e=p.outputs.out.buffer,c=(p.inputs.input||p.inputs.x).shape||[],s=c.length===4?c[3]:r.length;for(let n=0;n<e.length;n++){let m=r.length===s?r[n%s]:r[n%r.length];e[n]=t[n]<0?t[n]*m:t[n]}}function Z(p){let t=p.inputs.input.buffer,r=p.outputs.out.buffer;if(t.length===1)for(let e=0;e<r.length;e++)r[e]=t[0];else if(t.length===r.length)r.set(t);else{let e=f=>[1,1,1,1].slice(0,4-f.length).concat(f),[c,s,n,m]=e(p.inputs.input.shape),[a,u,i,o]=e(p.outputs.out.shape);for(let f=0;f<a;f++)for(let l=0;l<u;l++)for(let _=0;_<i;_++)for(let d=0;d<o;d++){let g=((f%c*s+l%s)*n+_%n)*m+d%m,b=((f*u+l)*i+_)*o+d;r[b]=t[g]}}}function tt(p){let t=p.inputs.input.buffer,r=p.inputs.scale.buffer[0],e=p.inputs.zero_point?p.inputs.zero_point.buffer[0]:0,c=p.outputs.out.buffer;for(let s=0;s<c.length;s++)c[s]=(t[s]-e)*r}function et(p){let t=p.inputs.input.buffer,r=p.outputs.out.buffer;for(let e=0;e<r.length;e++)r[e]=Math.tanh(t[e])}function at(p){let t=p.inputs.input||p.inputs.x,r=p.inputs.weight,e=p.outputs.out.buffer,c=t.shape.length===2?t.shape:[1,t.buffer.length],s=c[0],n=c[1],m=p.params.eps||1e-5;for(let a=0;a<s;a++){let u=0;for(let o=0;o<n;o++)u+=t.buffer[a*n+o]*t.buffer[a*n+o];let i=Math.sqrt(u/n+m);for(let o=0;o<n;o++)e[a*n+o]=t.buffer[a*n+o]/i*r.buffer[o]}}function st(p){let t=p.inputs.input.buffer,r=p.outputs.out.buffer;for(let e=0;e<r.length;e++){let c=t[e];r[e]=c/(1+Math.exp(-c))}}function rt(p){let t=p.inputs.a.buffer,r=p.inputs.b.buffer,e=p.outputs.out.buffer,c=e.length;if(r.length===1)for(let s=0;s<c;s++)e[s]=t[s]-r[0];else for(let s=0;s<c;s++)e[s]=t[s]-r[s]}function it(p){let t=p.inputs.input||p.inputs.x,r=p.outputs.out.buffer,e=t.shape.length===2?t.shape:[1,t.buffer.length],c=e[0],s=e[1];for(let n=0;n<c;n++){let m=-1/0;for(let i=0;i<s;i++)m=Math.max(m,t.buffer[n*s+i]);let a=0;for(let i=0;i<s;i++)a+=Math.exp(t.buffer[n*s+i]-m);let u=Math.log(a);for(let i=0;i<s;i++)r[n*s+i]=t.buffer[n*s+i]-m-u}}function ut(p){let t=p.inputs.input||p.inputs.x,r=p.outputs.out.buffer,e=t.shape.length===2?t.shape:[1,t.buffer.length],c=e[0],s=e[1];for(let n=0;n<c;n++){let m=-1/0;for(let u=0;u<s;u++)m=Math.max(m,t.buffer[n*s+u]);let a=0;for(let u=0;u<s;u++){let i=Math.exp(t.buffer[n*s+u]-m);r[n*s+u]=i,a+=i}for(let u=0;u<s;u++)r[n*s+u]/=a}}function ot(p){let t=p.inputs.cond||p.inputs.condition,r=p.inputs.x||p.inputs.a,e=p.inputs.y||p.inputs.b,c=p.outputs.out.buffer,s=t.buffer,n=r.buffer,m=e.buffer,a=c.length;for(let u=0;u<a;u++)c[u]=s[u]!==0?n[u]:m[u]}function nt(p){let t=p.inputs.input||p.inputs.data,r=p.outputs.out.buffer,e=p.params.pads||[],c=p.params.value||0,s=0,n=0,m=0,a=0;e.length===8?(s=e[1],m=e[2],n=e[5],a=e[6]):e.length===4&&(s=e[0],m=e[1],n=e[2],a=e[3]);let u=t.shape.length===4?t.shape:[1,t.shape[0]||1,t.shape[1]||1,1],[i,o,f,l]=u,_=o+s+n,d=f+m+a;for(let g=0;g<r.length;g++)r[g]=c;for(let g=0;g<i;g++)for(let b=0;b<o;b++)for(let h=0;h<f;h++)for(let v=0;v<l;v++){let x=((g*o+b)*f+h)*l+v,y=((g*_+(b+s))*d+(h+m))*l+v;r[y]=t.buffer[x]}}function pt(p){let t=p.inputs.input||p.inputs.x,r=t.buffer,e=p.outputs.out.buffer,[c,s,n,m]=t.shape,[a,u,i,o]=p.outputs.out.shape,f=p.params.kernel[0],l=p.params.kernel[1],_=p.params.stride?p.params.stride[0]:1,d=p.params.stride?p.params.stride[1]:1,g=p.params.padding?p.params.padding[0]:0,b=p.params.padding?p.params.padding[1]:0;for(let h=0;h<c;h++)for(let v=0;v<u;v++)for(let x=0;x<i;x++)for(let y=0;y<m;y++){let w=0,P=0;for(let z=0;z<f;z++)for(let M=0;M<l;M++){let q=v*_-g+z,T=x*d-b+M;if(q>=0&&q<s&&T>=0&&T<n){let A=((h*s+q)*n+T)*m+y;w+=r[A],P++}}let B=((h*u+v)*i+x)*o+y;e[B]=P>0?w/P:0}}function ct(p){let t=p.inputs.input||p.inputs.data,r=p.outputs.out.buffer,e=p.params.starts||[0,0,0,0],c=p.params.steps||[1,1,1,1],s=p.params.axes||[0,1,2,3],n=[1,1,1,1].slice(0,4-t.shape.length).concat(t.shape),m=[1,1,1,1].slice(0,4-p.outputs.out.shape.length).concat(p.outputs.out.shape),a=[0,0,0,0],u=[1,1,1,1];for(let o=0;o<s.length;o++){let f=s[o];f<0&&(f+=t.shape.length),f+=4-t.shape.length,a[f]=e[o]<0?e[o]+n[f]:e[o],u[f]=c[o]}let i=0;for(let o=0;o<m[0];o++)for(let f=0;f<m[1];f++)for(let l=0;l<m[2];l++)for(let _=0;_<m[3];_++){let d=a[0]+o*u[0],g=a[1]+f*u[1],b=a[2]+l*u[2],h=a[3]+_*u[3],v=d*(n[1]*n[2]*n[3])+g*(n[2]*n[3])+b*n[3]+h;r[i++]=t.buffer[v]}}function ft(p){let t=p.inputs.input||p.inputs.x,r=p.inputs.weight,e=p.inputs.bias,c=t.buffer,s=r.buffer,n=e?e.buffer:null,m=p.outputs.out.buffer,[a,u,i,o]=t.shape,[f,l,_,d]=p.outputs.out.shape,g=p.params.kernel[0],b=p.params.kernel[1],h=p.params.stride?p.params.stride[0]:1,v=p.params.stride?p.params.stride[1]:1,x=p.params.padding?p.params.padding[0]:0,y=p.params.padding?p.params.padding[1]:0;for(let w=0;w<m.length;w++)m[w]=n?n[w%d]:0;for(let w=0;w<a;w++)for(let P=0;P<o;P++)for(let B=0;B<u;B++)for(let z=0;z<i;z++){let M=c[((w*u+B)*i+z)*o+P];for(let q=0;q<d;q++)for(let T=0;T<g;T++)for(let A=0;A<b;A++){let D=B*h-x+T,G=z*v-y+A;if(D>=0&&D<l&&G>=0&&G<_){let L=s[P*(d*g*b)+q*(g*b)+T*b+A];m[((w*l+D)*_+G)*d+q]+=M*L}}}}function lt(p){let t=p.inputs.input||p.inputs.data,r=t.buffer,e=p.outputs.out.buffer,c=t.shape.length===2?t.shape:[1,t.buffer.length],s=c[0],n=c[1];for(let m=0;m<s;m++){let a=0;for(let u=0;u<n;u++)a+=r[m*n+u];e[m]=a}}function mt(p){let t=p.inputs.input||p.inputs.data,r=t.buffer,e=p.outputs.out.buffer,c=t.shape.length===2?t.shape:[1,t.buffer.length],s=c[0],n=c[1];for(let m=0;m<s;m++){let a=0;for(let u=0;u<n;u++)a+=r[m*n+u];e[m]=a/n}}function _t(p){let t=p.inputs.input||p.inputs.x,r=p.inputs.weight||p.inputs.scale,e=p.inputs.bias||p.inputs.b,c=p.inputs.running_mean||p.inputs.mean,s=p.inputs.running_var||p.inputs.var,n=p.outputs.out.buffer,[m,a,u,i]=t.shape,o=p.params.eps||1e-5;for(let f=0;f<m;f++)for(let l=0;l<i;l++){let _=r.buffer[l],d=e?e.buffer[l]:0,g=c.buffer[l],b=s.buffer[l];for(let h=0;h<a;h++)for(let v=0;v<u;v++){let x=((f*a+h)*u+v)*i+l,y=t.buffer[x];n[x]=(y-g)/Math.sqrt(b+o)*_+d}}}function dt(p){let t=p.inputs.a,r=p.inputs.b,e=p.outputs.out,c=t.buffer,s=r.buffer,n=e.buffer;if(s.length===1)for(let m=0;m<c.length;m++)n[m]=c[m]/s[0];else for(let m=0;m<c.length;m++)n[m]=c[m]/s[m%s.length]}function gt(p){let t=p.inputs.boxes,r=p.inputs.scores,e=p.outputs.out,c=0;p.inputs.max_output_boxes_per_class&&(c=p.inputs.max_output_boxes_per_class.buffer[0]);let s=.5;p.inputs.iou_threshold&&(s=p.inputs.iou_threshold.buffer[0]);let n=0;p.inputs.score_threshold&&(n=p.inputs.score_threshold.buffer[0]);let m=t.shape[0],a=t.shape[1],u=r.shape[1],i=0;for(let o=0;o<m;o++)for(let f=0;f<u;f++){let l=[];for(let d=0;d<a;d++){let g=r.buffer[o*(u*a)+f*a+d];if(g>=n){let b=t.buffer[o*(a*4)+d*4+0],h=t.buffer[o*(a*4)+d*4+1],v=t.buffer[o*(a*4)+d*4+2],x=t.buffer[o*(a*4)+d*4+3];l.push({s:d,score:g,y1:b,x1:h,y2:v,x2:x})}}l.sort((d,g)=>g.score-d.score);let _=[];for(let d=0;d<l.length&&_.length<c;d++){let g=l[d],b=!0;for(let h=0;h<_.length;h++){let v=_[h],x=Math.max(g.x1,v.x1),y=Math.max(g.y1,v.y1),w=Math.min(g.x2,v.x2),P=Math.min(g.y2,v.y2),B=Math.max(0,w-x),z=Math.max(0,P-y),M=B*z,q=(g.x2-g.x1)*(g.y2-g.y1),T=(v.x2-v.x1)*(v.y2-v.y1);if(M/(q+T-M)>s){b=!1;break}}b&&(_.push(g),i<e.buffer.length/3&&(e.buffer[i*3+0]=o,e.buffer[i*3+1]=f,e.buffer[i*3+2]=g.s,i++))}}for(;i<e.buffer.length/3;)e.buffer[i*3+0]=-1,e.buffer[i*3+1]=-1,e.buffer[i*3+2]=-1,i++}function ht(p){let t=p.inputs.input,r=p.inputs.indices,e=p.outputs.out,c=p.params.axis||0;c<0&&(c+=t.shape.length);let s=t.shape,n=e.shape,m=r.shape,a=new Array(s.length),u=1;for(let f=s.length-1;f>=0;f--)a[f]=u,u*=s[f];let i=new Array(n.length);u=1;for(let f=n.length-1;f>=0;f--)i[f]=u,u*=n[f];let o=new Array(m.length);u=1;for(let f=m.length-1;f>=0;f--)o[f]=u,u*=m[f];for(let f=0;f<e.buffer.length;f++){let l=f,_=new Array(n.length);for(let h=0;h<n.length;h++)_[h]=Math.floor(l/i[h]),l%=i[h];let d=0;for(let h=0;h<m.length;h++)d+=_[c+h]*o[h];let g=r.buffer[d];if(g<0){e.buffer[f]=-1;continue}let b=0;for(let h=0;h<c;h++)b+=_[h]*a[h];b+=g*a[c];for(let h=c+1;h<s.length;h++)b+=_[h-1+m.length]*a[h];e.buffer[f]=t.buffer[b]}}function bt(p){let t=p.inputs.input||p.inputs.data,r=p.inputs.indices,e=p.outputs.out,c=t.buffer,s=r.buffer,n=e.buffer,m=t.shape,a=r.shape,u=p.params.axis!==void 0?p.params.axis:0;u<0&&(u+=m.length);let i=new Array(m.length);{let _=1;for(let d=m.length-1;d>=0;d--)i[d]=_,_*=m[d]}let o=new Array(a.length);{let _=1;for(let d=a.length-1;d>=0;d--)o[d]=_,_*=a[d]}let f=a.length,l=new Array(f);for(let _=0;_<n.length;_++){let d=_;for(let h=0;h<f;h++)l[h]=Math.floor(d/o[h]),d%=o[h];let g=s[_]|0;g<0&&(g+=m[u]);let b=0;for(let h=0;h<f;h++)b+=(h===u?g:l[h])*i[h];n[_]=c[b]}}function vt(p){let t=p.inputs.q.buffer,r=p.inputs.kv.buffer,e=p.inputs.weight.buffer,c=p.inputs.scale?p.inputs.scale.buffer:null,s=p.inputs.bias?p.inputs.bias.buffer:null,n=p.outputs.out.buffer,m=p.inputs.q.shape[1],a=p.inputs.kv.shape[1],u=p.outputs.out.shape[2],i=p.params.heads||8,o=u/i,f=1/Math.sqrt(o);for(let l=0;l<i;l++)for(let _=0;_<m;_++){let d=new Float32Array(o);for(let v=0;v<o;v++){let x=0,y=l*o+v;for(let w=0;w<u;w++)x+=t[_*u+w]*e[y*u+w];c&&(x*=c[y]),s&&(x+=s[y]),d[v]=x}let g=new Float32Array(a),b=-1/0;for(let v=0;v<a;v++){let x=0;for(let y=0;y<o;y++){let w=0,P=u+l*o+y;for(let B=0;B<u;B++)w+=r[v*u+B]*e[P*u+B];c&&(w*=c[P]),s&&(w+=s[P]),x+=d[y]*w}x*=f,g[v]=x,x>b&&(b=x)}let h=0;for(let v=0;v<a;v++){let x=Math.exp(g[v]-b);g[v]=x,h+=x}for(let v=0;v<o;v++){let x=0;for(let y=0;y<a;y++){let w=g[y]/h,P=0,B=u*2+l*o+v;for(let z=0;z<u;z++)P+=r[y*u+z]*e[B*u+z];c&&(P*=c[B]),s&&(P+=s[B]),x+=w*P}n[_*u+l*o+v]=x}}}function xt(p){let t=p.inputs.input,r=p.outputs.out,e=t.buffer,c=r.buffer,s=t.shape[1],n=t.shape[2],m=t.shape[3];for(let a=0;a<m;a++){let u=a*n;for(let i=0;i<n;i++){let o=-1/0;for(let _=0;_<s;_++){let d=e[(_*n+i)*m+a];d>o&&(o=d)}let f=0,l=0;for(let _=0;_<s;_++){let d=Math.exp(e[(_*n+i)*m+a]-o);f+=d,l+=d*((_+.5)/s)}c[u+i]=f>0?l/f:0}}}function yt(p){let t=p.inputs.input,r=t.buffer,e=t.shape,c=p.outputs.out.buffer,s=p.params.perm||[...Array(e.length).keys()].reverse(),n=new Array(e.length),m=1;for(let o=e.length-1;o>=0;o--)n[o]=m,m*=e[o];let a=s.map(o=>e[o]),u=new Array(a.length);m=1;for(let o=a.length-1;o>=0;o--)u[o]=m,m*=a[o];let i=r.length;for(let o=0;o<i;o++){let f=0,l=o;for(let _=0;_<a.length;_++){let d=Math.floor(l/u[_]);l%=u[_],f+=d*n[s[_]]}c[o]=r[f]}}function wt(p){let t=p.inputs.q.buffer,r=p.inputs.k.buffer,e=p.inputs.v.buffer,c=p.outputs.out.buffer,s=p.inputs.q.shape[1],n=p.inputs.k.shape[1],m=p.outputs.out.shape[p.outputs.out.shape.length-1],a=p.params.heads||8,u=m/a,i=1/Math.sqrt(u);for(let o=0;o<a;o++)for(let f=0;f<s;f++){let l=new Float32Array(n),_=-1/0;for(let g=0;g<n;g++){let b=0;for(let h=0;h<u;h++)b+=t[f*m+o*u+h]*r[g*m+o*u+h];b*=i,l[g]=b,b>_&&(_=b)}let d=0;for(let g=0;g<n;g++){let b=Math.exp(l[g]-_);l[g]=b,d+=b}for(let g=0;g<u;g++){let b=0;for(let h=0;h<n;h++)b+=l[h]/d*e[h*m+o*u+g];c[f*m+o*u+g]=b}}}function Bt(p){let t=p.inputs.input,r=p.outputs.out,[,e,c,s]=t.shape,n=t.buffer,m=r.buffer;for(let a=0;a<s;a++)for(let u=0;u<c;u++){let i=0;for(let o=0;o<e;o++)i+=n[(o*c+u)*s+a];m[a*c+u]=i/e}}function kt(p){let t=p.inputs.input,r=p.outputs.out,[e,c,s,n]=t.shape,m=p.params.kernel[0],a=p.params.kernel[1],u=p.params.stride[0],i=p.params.stride[1],o=p.params.padding?p.params.padding[0]:0,f=p.params.padding?p.params.padding[1]:0,l=r.shape[1],_=r.shape[2],d=t.buffer,g=r.buffer;for(let b=0;b<e;b++)for(let h=0;h<l;h++)for(let v=0;v<_;v++)for(let x=0;x<n;x++){let y=-1/0;for(let w=0;w<m;w++)for(let P=0;P<a;P++){let B=h*u+w-o,z=v*i+P-f;if(B>=0&&B<c&&z>=0&&z<s){let M=d[((b*c+B)*s+z)*n+x];M>y&&(y=M)}}g[((b*l+h)*_+v)*n+x]=y}}function St(p){let t=p.inputs.input,r=p.outputs.out,[e,c]=t.shape.slice(1),s=p.params.size,n=t.buffer,m=r.buffer,a=c/s;for(let u=0;u<e;u++)for(let i=0;i<s;i++){let o=(i+.5)*a-.5;o<0&&(o=0),o>c-1&&(o=c-1);let f=Math.floor(o),l=f+1<c?f+1:f,_=o-f,d=n[u*c+f],g=n[u*c+l];m[u*s+i]=d+_*(g-d)}}function Pt(p){let t=p.inputs.input,r=p.outputs.out,[,e,c,s]=t.shape,n=t.buffer,m=r.buffer;for(let a=0;a<s;a++)for(let u=0;u<c;u++){let i=-1/0,o=0;for(let f=0;f<e;f++){let l=n[(f*c+u)*s+a];l>i&&(i=l),o+=l}m[a*c+u]=i,m[(s+a)*c+u]=o/e}}function Ut(p){let t=p.inputs.input,r=p.outputs.out,[,e,c,s]=t.shape,n=t.buffer,m=r.buffer;for(let a=0;a<s;a++)for(let u=0;u<e;u++){let i=-1/0,o=0;for(let f=0;f<c;f++){let l=n[(u*c+f)*s+a];l>i&&(i=l),o+=l}m[a*e+u]=i,m[(s+a)*e+u]=o/c}}function zt(p){let t=p.outputs.out.buffer,r=0,e=Object.entries(p.inputs).sort(([c],[s])=>{let n=/^input(\d+)$/.exec(c),m=/^input(\d+)$/.exec(s);return n&&m?Number(n[1])-Number(m[1]):c.localeCompare(s)});for(let[,c]of e)t.set(c.buffer,r),r+=c.buffer.length}function Tt(p){let t=p.inputs.input,r=p.outputs.out,[e,c,s,n]=t.shape,m=t.buffer,a=r.buffer;for(let u=0;u<e;u++)for(let i=0;i<c;i++)for(let o=0;o<s;o++)for(let f=0;f<n;f++){let l=m[((u*c+i)*s+o)*n+f],_=i*2,d=o*2;a[((u*c*2+_)*s*2+d)*n+f]=l,a[((u*c*2+_)*s*2+d+1)*n+f]=l,a[((u*c*2+_+1)*s*2+d)*n+f]=l,a[((u*c*2+_+1)*s*2+d+1)*n+f]=l}}function Mt(p){let t=p.inputs.qkv.buffer,r=p.outputs.out.buffer,e=p.inputs.qkv.shape[1],c=p.outputs.out.shape[2],s=p.params.heads||8,n=c/s,m=p.params.scale!==void 0?p.params.scale:1/Math.sqrt(n);for(let a=0;a<s;a++)for(let u=0;u<e;u++){let i=new Float32Array(e),o=-1/0;for(let l=0;l<=u;l++){let _=0;for(let d=0;d<n;d++){let g=t[u*(c*3)+a*n+d],b=t[l*(c*3)+c+a*n+d];_+=g*b}_*=m,i[l]=_,_>o&&(o=_)}let f=0;for(let l=0;l<=u;l++){let _=Math.exp(i[l]-o);i[l]=_,f+=_}for(let l=0;l<n;l++){let _=0;for(let d=0;d<=u;d++){let g=i[d]/f,b=t[d*(c*3)+c*2+a*n+l];_+=g*b}r[u*c+a*n+l]=_}}}function At(p){let t=p.inputs.input.buffer,r=p.inputs.weight.buffer,e=p.outputs.out.buffer,c=p.outputs.out.shape[p.outputs.out.shape.length-1],s=t.length;for(let n=0;n<s;n++){let m=t[n];for(let a=0;a<c;a++)e[n*c+a]=r[m*c+a]}}function qt(p){let t=p.inputs.a,r=p.inputs.b,e=p.outputs.out.buffer,c=t.buffer,s=r.buffer,n=t.shape,m=r.shape;if(c.length<s.length){let u=c;c=s,s=u;let i=n;n=m,m=i}let a=c.length;if(s.length===1)for(let u=0;u<a;u++)e[u]=c[u]*s[0];else if(s.length===a)for(let u=0;u<a;u++)e[u]=c[u]*s[u];else if(n.length===4&&s.length===n[3]){let u=n[3];for(let i=0;i<a;i++)e[i]=c[i]*s[i%u]}else if(n.length===4&&m.length===4&&m[0]===1&&m[1]===1&&m[2]===1&&m[3]===n[3]){let u=n[3];for(let i=0;i<a;i++)e[i]=c[i]*s[i%u]}else console.warn("[VolvoxAI CPU] Executing Mul is not fully implemented yet for shapes",t.shape,r.shape)}function Ct(p){let t=p.inputs.a,r=p.inputs.b,e=p.outputs.out.buffer,c=t.buffer,s=r.buffer,n=t.shape,m=r.shape;if(c.length<s.length){let u=c;c=s,s=u;let i=n;n=m,m=i}let a=c.length;if(s.length===1)for(let u=0;u<a;u++)e[u]=c[u]+s[0];else if(s.length===a)for(let u=0;u<a;u++)e[u]=c[u]+s[u];else if(n.length===4&&s.length===n[3]){let u=n[3];for(let i=0;i<a;i++)e[i]=c[i]+s[i%u]}else if(n.length===4&&m.length===4&&m[0]===1&&m[1]===1&&m[2]===1&&m[3]===n[3]){let u=n[3];for(let i=0;i<a;i++)e[i]=c[i]+s[i%u]}else console.warn("[VolvoxAI CPU] Executing Add is not fully implemented yet for shapes",t.shape,r.shape)}function Dt(p){let t=p.inputs.input,r=p.outputs.out,e=t.shape[0],c=t.shape[1],s=t.shape[2],n=t.shape[3],m=c*s;for(let a=0;a<e;a++)for(let u=0;u<n;u++){let i=0;for(let o=0;o<m;o++){let f=Math.floor(o/s),l=o-f*s;i+=t.buffer[((a*c+f)*s+l)*n+u]}r.buffer[a*n+u]=i/m}}function Gt(p){let t=p.inputs.input,r=p.outputs.out,e=p.params.min!==void 0?p.params.min:-1/0,c=p.params.max!==void 0?p.params.max:1/0;p.inputs.min&&(e=p.inputs.min.buffer[0]),p.inputs.max&&(c=p.inputs.max.buffer[0]);for(let s=0;s<t.buffer.length;s++){let n=t.buffer[s];n<e&&(n=e),n>c&&(n=c),r.buffer[s]=n}}function Lt(p){let t=p.inputs.input;p.outputs.out.buffer.set(t.buffer)}function It(p){let t=p.inputs.input,r=t.buffer,e=t.shape,c=p.params.axis||0;c<0&&(c+=e.length);let s=Object.keys(p.outputs).sort(),n=s.length,m=e[c]/n,a=1;for(let o=0;o<c;o++)a*=e[o];let u=1;for(let o=c+1;o<e.length;o++)u*=e[o];let i=m*u;for(let o=0;o<n;o++){let f=p.outputs[s[o]].buffer;for(let l=0;l<a;l++){let _=(l*e[c]+o*m)*u,d=l*i;f.set(r.subarray(_,_+i),d)}}}function Nt(p){let t=p.inputs.input,r=p.outputs.out,[e,c,s,n]=t.shape,[,m,a]=r.shape,u=t.buffer,i=r.buffer;if(p.opType==="ResizeNearest2D"||p.params.mode==="nearest"){for(let l=0;l<e;l++)for(let _=0;_<m;_++){let d=Math.floor(_*c/m);d>=c&&(d=c-1);for(let g=0;g<a;g++){let b=Math.floor(g*s/a);b>=s&&(b=s-1);for(let h=0;h<n;h++)i[((l*m+_)*a+g)*n+h]=u[((l*c+d)*s+b)*n+h]}}return}let o=c/m,f=s/a;for(let l=0;l<e;l++)for(let _=0;_<m;_++){let d=(_+.5)*o-.5;d<0&&(d=0);let g=Math.min(c-1,Math.floor(d)),b=Math.min(c-1,g+1),h=d-g;for(let v=0;v<a;v++){let x=(v+.5)*f-.5;x<0&&(x=0);let y=Math.min(s-1,Math.floor(x)),w=Math.min(s-1,y+1),P=x-y;for(let B=0;B<n;B++){let z=u[((l*c+g)*s+y)*n+B],M=u[((l*c+g)*s+w)*n+B],q=u[((l*c+b)*s+y)*n+B],T=u[((l*c+b)*s+w)*n+B];i[((l*m+_)*a+v)*n+B]=z*(1-h)*(1-P)+M*(1-h)*P+q*h*(1-P)+T*h*P}}}}function Ot(p){let t=p.inputs.input.buffer,r=p.outputs.out.buffer;for(let e=0;e<t.length;e++)r[e]=1/(1+Math.exp(-t[e]))}function Rt(p){let t=p.inputs.input.buffer,r=p.outputs.out.buffer;for(let e=0;e<t.length;e++){let s=t[e]+3;s<0?s=0:s>6&&(s=6),r[e]=s/6}}function Ft(p){let t=p.inputs.input.buffer,r=p.outputs.out.buffer;for(let e=0;e<t.length;e++){let c=t[e],s=c+3;s<0?s=0:s>6&&(s=6),r[e]=c*s/6}}function Et(p){let t=p.inputs.input.buffer,r=p.outputs.out.buffer;for(let e=0;e<t.length;e++)r[e]=t[e]>0?t[e]:0}function Wt(p){let t=p.inputs.input.buffer,r=p.outputs.out.buffer,e=p.params.alpha!==void 0?p.params.alpha:.01;for(let c=0;c<t.length;c++){let s=t[c];r[c]=s>0?s:e*s}}function jt(p){let t=p.inputs.input.buffer,r=p.outputs.out.buffer;for(let e=0;e<t.length;e++){let c=t[e];r[e]=.5*c*(1+Math.tanh(.7978845608*(c+.044715*c*c*c)))}}function Yt(p){let t=p.inputs.input.buffer,r=p.inputs.weight.buffer,e=p.inputs.bias.buffer,c=p.outputs.out.buffer,s=p.params.d_model,n=p.inputs.input.shape.slice(0,-1).reduce((m,a)=>m*a,1);for(let m=0;m<n;m++){let a=m*s,u=0,i=0;for(let _=0;_<s;_++){let d=t[a+_];u+=d,i+=d*d}let o=u/s,f=i/s-o*o,l=1/Math.sqrt(f+1e-5);for(let _=0;_<s;_++){let d=(t[a+_]-o)*l;c[a+_]=d*r[_]+e[_]}}}function $t(p){let t=p.inputs.input,r=p.inputs.weight,e=p.inputs.bias?p.inputs.bias.buffer:null,c=p.outputs.out,[s,n,m,a]=t.shape,[u,i]=r.shape,o=c.shape[3],f=c.shape[1],l=c.shape[2],[_,d]=C(p.params.stride,1),[g,b]=C(p.params.padding,0),h=p.params.pads||[g,b,g,b],[v,x]=C(p.params.dilation,1),y=t.buffer,w=r.buffer,P=c.buffer,B=p.params.groups||1,z=o/B,M=r.shape[2];for(let q=0;q<s;q++)for(let T=0;T<f;T++)for(let A=0;A<l;A++)for(let D=0;D<o;D++){let G=0;if(B===a){let L=o/a,O=Math.floor(D/L),I=D-O*L;for(let E=0;E<u;E++)for(let N=0;N<i;N++){let R=T*_+E*v-h[0],F=A*d+N*x-h[1];if(R>=0&&R<n&&F>=0&&F<m){let Y=((q*n+R)*m+F)*a+O,X=((E*i+N)*a+O)*L+I;G+=y[Y]*w[X]}}}else{let O=Math.floor(D/z)*M;for(let I=0;I<M;I++){let E=O+I;for(let N=0;N<u;N++)for(let R=0;R<i;R++){let F=T*_+N*v-h[0],Y=A*d+R*x-h[1];if(F>=0&&F<n&&Y>=0&&Y<m){let X=((q*n+F)*m+Y)*a+E,ps=((N*i+R)*M+I)*o+D;G+=y[X]*w[ps]}}}}e&&(G+=e[D]),p.params.relu===1&&G<0?G=0:p.params.relu>=2&&(G=Math.min(Math.max(G,0),6)),P[((q*f+T)*l+A)*o+D]=G}}function Vt(p){let t=p.inputs.input,r=p.inputs.weight,e=p.inputs.bias?p.inputs.bias.buffer:null,c=p.outputs.out,[s,n]=t.shape.slice(1),[m,a,u]=r.shape,i=c.shape[2],o=C(p.params.stride,1)[0],f=C(p.params.padding,0)[0],l=p.params.relu,_=t.buffer,d=r.buffer,g=c.buffer;for(let b=0;b<m;b++)for(let h=0;h<i;h++){let v=e?e[b]:0;for(let x=0;x<s;x++)for(let y=0;y<u;y++){let w=h*o+y-f;if(w>=0&&w<n){let P=x*n+w,B=(b*s+x)*u+y;v+=_[P]*d[B]}}l&&v<0&&(v=0),g[b*i+h]=v}}function Ht(p){let t=p.inputs.input,r=p.inputs.weight,e=p.outputs.out,c=t.shape.slice(0,-1).reduce((d,g)=>d*g,1),s=t.shape[t.shape.length-1],n=e.shape[e.shape.length-1],m=t.buffer,a=r.buffer,u=e.buffer,i=p.inputs.scale?p.inputs.scale.buffer:null,o=p.inputs.bias?p.inputs.bias.buffer:null,f=r.shape.length>=2?r.shape[0]:n,l=r.shape.length>=2?r.shape[1]:s,_=i?!0:p.wLayout?p.wLayout==="dout":f===n&&l===s;for(let d=0;d<c;d++)for(let g=0;g<n;g++){let b=0;if(_)for(let h=0;h<s;h++)b+=m[d*s+h]*a[g*s+h];else for(let h=0;h<s;h++)b+=m[d*s+h]*a[h*n+g];i&&(b*=i[g]),o&&(b+=o[g]),u[d*n+g]=b}}function Kt(p){let t=p.inputs.input||p.inputs.data,r=p.outputs.out,e=t.buffer,c=r.buffer,s=p.params.to,n=s==="int32"||s==="int64"||s==="int8"||s===3||s===5||s===6||s===7,m=Math.min(e.length,c.length);if(n)for(let a=0;a<m;a++)c[a]=Math.trunc(e[a]);else c.set(e.subarray(0,m))}function Xt(p){let t=p.inputs.input||p.inputs.data,r=p.outputs.out,e=t.buffer,c=r.buffer,s=t.shape,n=p.params.axis!==void 0?p.params.axis:0;n<0&&(n+=s.length);let m=s[n],a=1;for(let o=n+1;o<s.length;o++)a*=s[o];let u=1;for(let o=0;o<n;o++)u*=s[o];let i=0;for(let o=0;o<u;o++)for(let f=0;f<a;f++){let l=o*m*a+f,_=e[l],d=0;for(let g=1;g<m;g++){let b=e[l+g*a];b>_&&(_=b,d=g)}c[i++]=d}}var S=class{constructor(){this.tensors=new Map,console.log("[VolvoxAI] CPU Fallback Engine ready.")}allocateGraph(t){this.graph=t;for(let[r,e]of t.tensors.entries())e.buffer||(e.dtype==="int8"?e.buffer=new Int8Array(e.sizeBytes):e.buffer=new Float32Array(e.sizeBytes/4))}async execute(t,r){let e=r?t:this.graph,c=r||t;for(let[n,m]of Object.entries(c)){let a=e.tensors.get(n);a&&a.buffer&&a.buffer.set(m)}for(let n of e.nodes)this._runNode(n);let s={};if(e.outputNames&&e.outputNames.length>0)for(let n of e.outputNames)s[n]=e.tensors.get(n).buffer;else{let n=e.nodes[e.nodes.length-1];for(let[m,a]of Object.entries(n.outputs))s[a.name]=e.tensors.get(a.name).buffer}return s}_runNode(t){switch(t.opType){case"MatMul":return this._cpuMatMul(t);case"LayerNorm":return this._cpuLayerNorm(t);case"RMSNorm":return this._cpuRMSNorm(t);case"Embedding":return this._cpuEmbedding(t);case"SDPA":return this._cpuSDPA(t);case"CrossSDPA":return this._cpuCrossSDPA(t);case"CrossAttention":return this._cpuCrossAttention(t);case"Conv2D":return this._cpuConv2D(t);case"Conv1D":return this._cpuConv1D(t);case"ConvTranspose2D":return this._cpuConvTranspose2D(t);case"MaxPool2D":return this._cpuMaxPool2D(t);case"AveragePool":case"AveragePool2D":return this._cpuAveragePool2D(t);case"GlobalAveragePool":return this._cpuGlobalAveragePool(t);case"BatchNorm2D":return this._cpuBatchNorm2D(t);case"ResizeNearest2D":case"Resize":return this._cpuResize(t);case"Upsample2x":case"UpsampleNearest2D":return this._cpuUpsample2x(t);case"Interp1D":case"InterpLinear1D":return this._cpuInterp1D(t);case"ReLU":return this._cpuReLU(t);case"LeakyReLU":return this._cpuLeakyReLU(t);case"PReLU":return this._cpuPReLU(t);case"GELU":return this._cpuGELU(t);case"SiLU":case"Swish":return this._cpuSiLU(t);case"Sigmoid":return this._cpuSigmoid(t);case"HardSwish":return this._cpuHardSwish(t);case"HardSigmoid":return this._cpuHardSigmoid(t);case"Tanh":return this._cpuTanh(t);case"Clip":return this._cpuClip(t);case"Add":return this._cpuAdd(t);case"Mul":return this._cpuMul(t);case"Sub":return this._cpuSub(t);case"Div":return this._cpuDiv(t);case"Softmax":return this._cpuSoftmax(t);case"LogSoftmax":return this._cpuLogSoftmax(t);case"ReduceSum":return this._cpuReduceSum(t);case"ReduceMean":return this._cpuReduceMean(t);case"ArgMax":return this._cpuArgMax(t);case"Transpose":return this._cpuTranspose(t);case"Concat":case"Concat2":return this._cpuConcat2(t);case"Split":return this._cpuSplit(t);case"Slice":return this._cpuSlice(t);case"Pad":return this._cpuPad(t);case"Expand":case"Broadcast":return this._cpuExpand(t);case"Gather":return this._cpuGather(t);case"GatherElements":return this._cpuGatherElements(t);case"Where":case"Mask":return this._cpuWhere(t);case"Cast":return this._cpuCast(t);case"DequantizeLinear":return this._cpuDequantizeLinear(t);case"NonMaxSuppression":return this._cpuNonMaxSuppression(t);case"SpatialSoftargmaxY":return this._cpuSpatialSoftargmaxY(t);case"ProfileX":return this._cpuProfileX(t);case"ProfileY":return this._cpuProfileY(t);case"MeanHeight":return this._cpuMeanHeight(t);case"Reshape":case"Flatten":case"Squeeze":case"Unsqueeze":case"Dropout":case"Identity":return this._cpuReshape(t);default:console.warn(`[VolvoxAI CPU] Executing ${t.opType} is not implemented; node ${t.id} skipped.`)}}};S.prototype._cpuWhere=ot;S.prototype._cpuPad=nt;S.prototype._cpuAveragePool2D=pt;S.prototype._cpuSlice=ct;S.prototype._cpuConvTranspose2D=ft;S.prototype._cpuReduceSum=lt;S.prototype._cpuReduceMean=mt;S.prototype._cpuBatchNorm2D=_t;S.prototype._cpuSoftmax=ut;S.prototype._cpuLogSoftmax=it;S.prototype._cpuSub=rt;S.prototype._cpuSiLU=st;S.prototype._cpuRMSNorm=at;S.prototype._cpuTanh=et;S.prototype._cpuDequantizeLinear=tt;S.prototype._cpuExpand=Z;S.prototype._cpuPReLU=J;S.prototype._cpuDiv=dt;S.prototype._cpuNonMaxSuppression=gt;S.prototype._cpuGather=ht;S.prototype._cpuGatherElements=bt;S.prototype._cpuCrossAttention=vt;S.prototype._cpuSpatialSoftargmaxY=xt;S.prototype._cpuTranspose=yt;S.prototype._cpuCrossSDPA=wt;S.prototype._cpuMeanHeight=Bt;S.prototype._cpuMaxPool2D=kt;S.prototype._cpuInterp1D=St;S.prototype._cpuProfileX=Pt;S.prototype._cpuProfileY=Ut;S.prototype._cpuConcat2=zt;S.prototype._cpuUpsample2x=Tt;S.prototype._cpuSDPA=Mt;S.prototype._cpuEmbedding=At;S.prototype._cpuMul=qt;S.prototype._cpuAdd=Ct;S.prototype._cpuGlobalAveragePool=Dt;S.prototype._cpuClip=Gt;S.prototype._cpuReshape=Lt;S.prototype._cpuSplit=It;S.prototype._cpuResize=Nt;S.prototype._cpuSigmoid=Ot;S.prototype._cpuHardSigmoid=Rt;S.prototype._cpuHardSwish=Ft;S.prototype._cpuReLU=Et;S.prototype._cpuLeakyReLU=Wt;S.prototype._cpuGELU=jt;S.prototype._cpuLayerNorm=Yt;S.prototype._cpuConv2D=$t;S.prototype._cpuConv1D=Vt;S.prototype._cpuMatMul=Ht;S.prototype._cpuCast=Kt;S.prototype._cpuArgMax=Xt;var $=class p extends S{constructor(t){super(),this.wasmModule=t,this.api=t.instance.exports,this.mem=this.api.memory,this.pointers=new Map,console.log("[VolvoxAI] WASM Engine ready (Tier 2 Fallback).")}static async init(t){try{let r;if(typeof process<"u"&&process.versions&&process.versions.node){let s=await import("fs"),n=t;n.startsWith("/")||(n="./"+n),r=s.readFileSync(n)}else{let s=await fetch(t);if(!s.ok)throw new Error("WASM file not found.");r=await s.arrayBuffer()}let e={expf:Math.exp,logf:Math.log,powf:Math.pow},c=await WebAssembly.instantiate(r,{env:e,math:e});return new p(c)}catch(r){return console.warn(`[VolvoxAI] Failed to load WASM from ${t}:`,r),null}}createGraph(){return new j}_alloc(t){if(!this.pointers.has(t.name)){let r=this.api.alloc_bytes(t.sizeBytes),e=r+t.sizeBytes,c=this.mem.buffer.byteLength;if(e>c){let n=Math.ceil((e-c)/65536);this.mem.grow(n)}this.pointers.set(t.name,r);let s=new Float32Array(this.mem.buffer,r,t.sizeBytes/4);if(t.isWeight&&t.buffer){let n=t.buffer,m=this._doutWeights&&this._doutWeights.get(t.name);if(m){let{din:i,dout:o}=m,f=new Float32Array(i*o);for(let l=0;l<o;l++)for(let _=0;_<i;_++)f[_*o+l]=n[l*i+_];n=f}let a=new Uint8Array(n.buffer,n.byteOffset,n.byteLength),u=Math.min(n.byteLength,t.sizeBytes);new Uint8Array(this.mem.buffer,r,u).set(a.subarray(0,u))}t.buffer=s}return this.pointers.get(t.name)}allocateGraph(t){return this.compile(t)}compile(t){console.log("[VolvoxAI WASM] Allocating graph tensors on WASM heap..."),this.api.reset_heap&&this.api.reset_heap(),this.pointers.clear(),this._doutWeights=new Map;for(let r of t.nodes)if((r.opType==="MatMul"||r.opType==="Linear"||r.opType==="Gemm")&&r.wLayout==="dout"&&r.inputs.weight&&!r.inputs.scale){let e=r.inputs.input.shape[r.inputs.input.shape.length-1],c=r.outputs.out.shape[r.outputs.out.shape.length-1];this._doutWeights.set(r.inputs.weight.name,{din:e,dout:c})}for(let[r,e]of t.tensors.entries())this._alloc(e);for(let[r,e]of t.tensors.entries()){let c=this.pointers.get(r);e.buffer=new Float32Array(this.mem.buffer,c,e.sizeBytes/4)}return this.graph=t,this}async execute(t){for(let[e,c]of Object.entries(t)){if(!this.graph.tensors.get(e))continue;let n=this.pointers.get(e);new Float32Array(this.mem.buffer,n,c.length).set(c)}for(let e of this.graph.nodes)try{let c=this.pointers.get(e.inputs.input?.name),s=this.pointers.get(e.outputs.out?.name),n=this.pointers.get(e.inputs.weight?.name),m=this.pointers.get(e.inputs.bias?.name);if(e.opType==="Conv2D"){let a=this.pointers.get(e.inputs.weight.name),u=e.inputs.bias?this.pointers.get(e.inputs.bias.name):0,i=e.inputs.input.shape,o=e.outputs.out.shape,f=e.inputs.weight.shape,[l,_]=C(e.params.stride,1),[d,g]=C(e.params.dilation,1),b=C(e.params.padding,0),h=e.params.pads||[b[0],b[1],b[0],b[1]],v=e.params.groups||1,x=e.params.relu?1:0;this.api.conv2d_f32(c,s,a,u,i[0],i[1],i[2],i[3],f[0],f[1],f[2],f[3],o[1],o[2],l,_,h[0],h[1],v,x,d,g)}else if(e.opType==="ConvTranspose2D"){let a=this.pointers.get(e.inputs.weight.name),u=e.inputs.bias?this.pointers.get(e.inputs.bias.name):0,[i,o,f,l]=e.inputs.input.shape,[_,d,g,b]=e.outputs.out.shape,h=e.params.kernel[0],v=e.params.kernel[1],x=e.params.stride?e.params.stride[0]:1,y=e.params.stride?e.params.stride[1]:1,w=e.params.padding?e.params.padding[0]:0,P=e.params.padding?e.params.padding[1]:0;this.api.conv_transpose2d_f32(c,a,u,s,i,o,f,l,d,g,b,h,v,x,y,w,P)}else if(e.opType==="ReduceSum"){let a=e.inputs.input?e.inputs.input.shape:e.inputs.data.shape,u=a.length===2?a:[1,e.inputs.input?e.inputs.input.buffer.length:e.inputs.data.buffer.length];this.api.reduce_sum_f32(c,s,u[0],u[1])}else if(e.opType==="ReduceMean"){let a=e.inputs.input?e.inputs.input.shape:e.inputs.data.shape,u=a.length===2?a:[1,e.inputs.input?e.inputs.input.buffer.length:e.inputs.data.buffer.length];this.api.reduce_mean_f32(c,s,u[0],u[1])}else if(e.opType==="MatMul"){let a=this.pointers.get(e.inputs.weight.name),u=e.inputs.bias?this.pointers.get(e.inputs.bias.name):0,i=e.inputs.input.shape[e.inputs.input.shape.length-1],o=e.outputs.out.shape[e.outputs.out.shape.length-1],f=e.inputs.input.shape.slice(0,-1).reduce((l,_)=>l*_,1);if(e.inputs.scale){let l=this.pointers.get(e.inputs.scale.name);this.api.matmul_int8_f32(c,a,l,u,s,f,i,o)}else this.api.matmul_f32(c,a,u,s,f,i,o)}else if(e.opType==="LayerNorm"){let a=e.inputs.input.shape.slice(0,-1).reduce((i,o)=>i*o,1),u=e.params.d_model;this.api.layernorm_f32(c,n,m,s,a,u,1e-5)}else if(e.opType==="SDPA"){let a=this.pointers.get(e.inputs.qkv.name),u=e.inputs.qkv.shape[1],i=e.outputs.out.shape[e.outputs.out.shape.length-1],o=e.params.heads||e.params.num_heads||8,f=e.params.head_dim||i/o,l=e.params.scale!==void 0?e.params.scale:1/Math.sqrt(f);this.api.sdpa_f32(a,s,u,i,o,f,l)}else if(e.opType==="CrossSDPA"){let a=this.pointers.get(e.inputs.q.name),u=this.pointers.get(e.inputs.k.name),i=this.pointers.get(e.inputs.v.name),o=e.inputs.q.shape[1],f=e.inputs.k.shape[1],l=e.outputs.out.shape[e.outputs.out.shape.length-1],_=e.params.heads||e.params.num_heads||8,d=e.params.head_dim||l/_;this.api.cross_sdpa_f32(a,u,i,s,o,f,l,_,d,1/Math.sqrt(d))}else if(e.opType==="Embedding"){let a=e.inputs.input.shape.reduce((i,o)=>i*o,1),u=e.outputs.out.shape[e.outputs.out.shape.length-1];this.api.embedding_f32(c,n,s,a,u)}else if(e.opType==="ReLU"){let u=e.inputs.input.shape.reduce((i,o)=>i*o,1);this.api.relu_f32(c,s,u)}else if(e.opType==="GELU"){let a=e.inputs.input.sizeBytes/4;this.api.gelu_f32(c,s,a)}else if(e.opType==="Add")this._cpuAdd(e);else if(e.opType==="Mul")this._cpuMul(e);else if(e.opType==="Conv1D"){let a=e.inputs.input.shape,u=e.inputs.weight.shape,[i]=C(e.params.stride,1),[o]=C(e.params.padding,0),f=e.params.groups||1,l=e.params.relu?1:0;this.api.conv1d_f32(c,s,n,m,a[1],a[2],u[0],u[1],u[2],i,o,f,l)}else if(e.opType==="UpsampleNearest2D"){let a=e.inputs.input.shape;this.api.upsample_nearest2x_f32(c,s,a[3],a[1],a[2])}else if(e.opType==="Concat"||e.opType==="Concat2")this._cpuConcat2(e);else if(e.opType==="ProfileY"){let a=e.inputs.input.shape;this.api.profile_y_f32(c,s,a[3],a[1],a[2])}else if(e.opType==="ProfileX"){let a=e.inputs.input.shape;this.api.profile_x_f32(c,s,a[3],a[1],a[2])}else if(e.opType==="InterpLinear1D"){let a=e.inputs.input.shape,u=e.params.size;this.api.interp1d_f32(c,s,a[1],a[2],u)}else if(e.opType==="SpatialSoftargmaxY"){let a=e.inputs.input.shape;this.api.spatial_softargmax_y_f32(c,s,a[3],a[1],a[2])}else if(e.opType==="Sigmoid"){let u=e.inputs.input.shape.reduce((i,o)=>i*o,1);this.api.sigmoid_f32(c,s,u)}else if(e.opType==="Clip"){let a=e.params.min!==void 0?e.params.min:-1e9,u=e.params.max!==void 0?e.params.max:1e9;if(e.inputs.min){let f=this.pointers.get(e.inputs.min.name);a=new Float32Array(this.mem.buffer,f,1)[0]}if(e.inputs.max){let f=this.pointers.get(e.inputs.max.name);u=new Float32Array(this.mem.buffer,f,1)[0]}let o=e.inputs.input.shape.reduce((f,l)=>f*l,1);this.api.clip_f32(c,s,o,a,u)}else if(e.opType==="HardSwish"){let u=e.inputs.input.shape.reduce((i,o)=>i*o,1);this.api.hardswish_f32(c,s,u)}else if(e.opType==="LeakyReLU"){let u=e.inputs.input.shape.reduce((o,f)=>o*f,1),i=e.params.alpha||.01;this.api.leakyrelu_f32?this.api.leakyrelu_f32(c,s,u,i):this._cpuLeakyReLU(e)}else if(e.opType==="PReLU")if(this.api.prelu_f32){let a=e.inputs.input.shape,u=this.pointers.get(e.inputs.weight.name);this.api.prelu_f32(c,u,s,a[0],a[1],a[2],a[3])}else this._cpuPReLU(e);else if(e.opType==="HardSigmoid"){let u=e.inputs.input.shape.reduce((i,o)=>i*o,1);this.api.hardsigmoid_f32(c,s,u)}else if(e.opType==="Reshape"){let u=e.inputs.input.shape.reduce((i,o)=>i*o,1);this.api.copy_f32(c,s,u)}else if(e.opType==="Transpose")this._cpuTranspose(e);else if(e.opType==="GlobalAveragePool"){let a=e.inputs.input.shape;this.api.global_average_pool_f32(c,s,a[0],a[1],a[2],a[3])}else if(e.opType==="BatchNorm2D"){let a=this.pointers.get(e.inputs.weight.name),u=this.pointers.get(e.inputs.bias.name),i=this.pointers.get(e.inputs.running_mean.name),o=this.pointers.get(e.inputs.running_var.name),[f,l,_,d]=e.inputs.input.shape,g=e.params.eps||1e-5;this.api.batch_norm2d_f32(c,a,u,i,o,s,f,l,_,d,g)}else if(e.opType==="ResizeNearest2D")this._cpuResize(e);else if(e.opType==="Resize"){let[a,u,i,o]=e.inputs.input.shape,[f,l,_]=e.outputs.out.shape;this.api.resize_bilinear_f32(c,s,a,u,i,o,l,_)}else if(e.opType==="Cast")this._cpuCast(e);else if(e.opType==="Slice"){let a=[1,1,1,1].slice(0,4-e.inputs.input.shape.length).concat(e.inputs.input.shape),u=[1,1,1,1].slice(0,4-e.outputs.out.shape.length).concat(e.outputs.out.shape),i=e.params.starts||[0,0,0,0],o=e.params.steps||[1,1,1,1],f=e.params.axes||[0,1,2,3],l=[0,0,0,0],_=[1,1,1,1];for(let d=0;d<f.length;d++){let g=f[d];g<0&&(g+=e.inputs.input.shape.length),g+=4-e.inputs.input.shape.length,l[g]=i[d]<0?i[d]+a[g]:i[d],_[g]=o[d]}this.api.slice_4d_f32(c,s,a[0],a[1],a[2],a[3],u[0],u[1],u[2],u[3],l[0],l[1],l[2],l[3],_[0],_[1],_[2],_[3])}else if(e.opType==="Split")this._cpuSplit(e);else if(e.opType==="Gather"){let a=[1,1,1,1].slice(0,4-e.inputs.input.shape.length).concat(e.inputs.input.shape),u=e.params.axis||0;u<0&&(u+=e.inputs.input.shape.length),u+=4-e.inputs.input.shape.length;let i=this.pointers.get(e.inputs.indices.name);this.api.gather_4d_f32(c,i,s,a[0],a[1],a[2],a[3],e.inputs.indices.sizeBytes/4,u)}else if(e.opType==="GatherElements")this._cpuGatherElements(e);else if(e.opType==="NonMaxSuppression")this._cpuNonMaxSuppression(e);else if(e.opType==="Where"||e.opType==="Mask"){let a=this.pointers.get(e.inputs.cond?e.inputs.cond.name:e.inputs.condition.name),u=this.pointers.get(e.inputs.x?e.inputs.x.name:e.inputs.a.name),i=this.pointers.get(e.inputs.y?e.inputs.y.name:e.inputs.b.name);this.api.where_f32(a,u,i,s,e.outputs.out.sizeBytes/4)}else if(e.opType==="Pad"){let a=e.params.pads,u=a.length===8?a[1]:a[0],i=a.length===8?a[2]:a[1],o=a.length===8?a[5]:a[2],f=a.length===8?a[6]:a[3],l=e.params.value||0,_=e.inputs.input?e.inputs.input.shape:e.inputs.data.shape,d=_.length===4?_:[1,_[0]||1,_[1]||1,1];this.api.pad_2d_f32(c,s,l,d[0],d[1],d[2],d[3],u,o,i,f)}else if(e.opType==="AveragePool2D"||e.opType==="AveragePool"){let[a,u,i,o]=(e.inputs.input||e.inputs.x).shape,[f,l,_]=e.outputs.out.shape,d=e.params.kernel[0],g=e.params.kernel[1],b=e.params.stride?e.params.stride[0]:1,h=e.params.stride?e.params.stride[1]:1,v=e.params.padding?e.params.padding[0]:0,x=e.params.padding?e.params.padding[1]:0;this.api.averagepool2d_f32(c,s,a,u,i,o,d,g,b,h,v,x,l,_)}else if(e.opType==="Div")this._cpuDiv(e);else if(e.opType==="MaxPool2D"){let a=e.inputs.input.shape,u=e.outputs.out.shape,i=e.params.kernel[0],o=e.params.kernel[1],f=e.params.stride[0],l=e.params.stride[1],_=e.params.padding?e.params.padding[0]:0,d=e.params.padding?e.params.padding[1]:0;this.api.maxpool2d_f32(c,s,a[1],a[2],a[3],u[1],u[2],i,o,f,l,_,d)}else if(e.opType==="MeanHeight"){let a=e.inputs.input.shape;this.api.mean_height_f32(c,s,a[3],a[1],a[2])}else e.opType==="Flatten"||e.opType==="Squeeze"||e.opType==="Unsqueeze"||e.opType==="Dropout"||e.opType==="Reshape"||e.opType==="Identity"?this._cpuReshape(e):super._runNode(e)}catch(c){throw console.error("[WasmEngine] Execution failed at node:",e,c),c}let r={};for(let e of this.graph.outputNames){let c=this.graph.tensors.get(e),s=this.pointers.get(e);r[e]=new Float32Array(this.mem.buffer,s,c.sizeBytes/4).slice()}return r}};var U,V=class{constructor(t,r){this.device=t,this.graph=r,this.pipelines=[],this.gpuBuffers=new Map,console.log("[VolvoxAI WebGPU] Starting Graph Compilation...")}async compile(){({ShaderLibrary:U}=await Promise.resolve().then(()=>(us(),is))),this._dinWeights=new Map;for(let t of this.graph.nodes)if((t.opType==="MatMul"||t.opType==="Linear"||t.opType==="Gemm")&&t.wLayout==="din"&&t.inputs.weight&&!t.inputs.scale){let r=t.inputs.input.shape[t.inputs.input.shape.length-1],e=t.outputs.out.shape[t.outputs.out.shape.length-1];this._dinWeights.set(t.inputs.weight.name,{din:r,dout:e})}this._allocateBuffers();for(let t of this.graph.nodes)await this._buildNodePipeline(t);console.log(`[VolvoxAI WebGPU] Compilation complete. Allocated ${this.gpuBuffers.size} VRAM buffers.`)}_allocateBuffers(){for(let[t,r]of this.graph.tensors.entries()){let e=GPUBufferUsage.STORAGE;this.graph.nodes.some(s=>Object.values(s.inputs).some(n=>n.name===t))&&(e|=GPUBufferUsage.COPY_DST),this.graph.nodes.some(s=>Object.values(s.outputs).some(n=>n.name===t))&&(e|=GPUBufferUsage.COPY_SRC),!r.isWeight&&!this.graph.nodes.some(s=>Object.values(s.outputs).some(n=>n.name===t))&&(e|=GPUBufferUsage.COPY_DST),r.isWeight&&r.buffer&&(e|=GPUBufferUsage.COPY_DST);let c=this.device.createBuffer({label:`Tensor_${t}`,size:Math.ceil(r.sizeBytes/4)*4,usage:e});if(r.gpuBuffer=c,this.gpuBuffers.set(t,c),r.isWeight&&r.buffer){let s=r.buffer,n=this._dinWeights&&this._dinWeights.get(t);if(n){let{din:u,dout:i}=n,o=new Float32Array(u*i);for(let f=0;f<u;f++)for(let l=0;l<i;l++)o[l*u+f]=r.buffer[f*i+l];s=o}let m=new Uint8Array(s.buffer,s.byteOffset,s.byteLength),a=Math.ceil(m.byteLength/4)*4;if(a===m.byteLength)this.device.queue.writeBuffer(c,0,m);else{let u=new Uint8Array(a);u.set(m),this.device.queue.writeBuffer(c,0,u)}}}}async _buildNodePipeline(t){let r="",e="",c=null,s=[],n=[1,1,1];if(t.opType==="Conv2D"){r=U.getConv2DShader();let i=t.inputs.input.gpuBuffer,o=t.inputs.weight.gpuBuffer,f=t.outputs.out.gpuBuffer,[l,_,d,g]=t.inputs.input.shape,[b,h]=t.inputs.weight.shape,v=t.outputs.out.shape[3],x=t.outputs.out.shape[1],y=t.outputs.out.shape[2],[w,P]=C(t.params.stride,1),[B,z]=C(t.params.padding,0),[M,q]=C(t.params.dilation,1),T=t.params.groups||1,A=Array.isArray(t.params.pads)?t.params.pads:[B,z,B,z],D=A.length>=4&&A[0]===0&&A[1]===0&&A[2]===0&&A[3]===0,G=t.params.weight_layout||(T===g?"HWCM":"HWIO");e=r,c=[Math.ceil(y/8),Math.ceil(x/8),l*v],T===1&&G==="HWIO"&&g===3&&(v&15)===0?(r=U.getConv2DRegularC3Out16Shader(),n=[Math.ceil(y/8),Math.ceil(x/8),l*(v/16)]):T===g&&G==="HWCM"&&v===g&&(v&7)===0?(r=U.getConv2DDepthwise8Shader(),n=[Math.ceil(y/8),Math.ceil(x/8),l*Math.ceil(v/8)]):T===1&&G==="HWIO"&&b===1&&h===1&&w===1&&P===1&&D&&M===1&&q===1&&x===_&&y===d&&((v&15)===0?(r=U.getConv2DPointwise16TileShader(),n=[Math.ceil(y/8),Math.ceil(x/8),l*(v/16)]):(v&3)===0?(r=U.getConv2DPointwise8Vec4Shader(),n=[Math.ceil(y/8),Math.ceil(x/8),l*Math.ceil(v/8)]):(v&1)===0&&(r=U.getConv2DPointwise8Vec2Shader(),n=[Math.ceil(y/8),Math.ceil(x/8),l*Math.ceil(v/8)]));let L=this.device.createBuffer({size:Math.ceil(v*4/4)*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});t.inputs.bias&&this.device.queue.writeBuffer(L,0,t.inputs.bias.buffer);let O=new Uint32Array([l,_,d,g,v,x,y,b,h,w,P,B,z,T,t.params.relu||0,M,q]),I=this.device.createBuffer({size:Math.ceil(O.byteLength/16)*16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(I,0,O),s=[{binding:0,resource:{buffer:i}},{binding:1,resource:{buffer:o}},{binding:2,resource:{buffer:L}},{binding:3,resource:{buffer:f}},{binding:4,resource:{buffer:I}}],r===e&&(n=c)}else if(t.opType==="Conv1D"){r=U.getConv1DShader();let i=t.inputs.input.gpuBuffer,o=t.inputs.weight.gpuBuffer,f=t.outputs.out.gpuBuffer,l=this.device.createBuffer({size:Math.ceil(t.inputs.weight.shape[0]*4/4)*4||4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});t.inputs.bias&&this.device.queue.writeBuffer(l,0,t.inputs.bias.buffer);let _=new Uint32Array([t.inputs.input.shape[1],t.inputs.input.shape[2],t.outputs.out.shape[1],t.inputs.weight.shape[2],C(t.params.stride,1)[0],C(t.params.padding,0)[0],t.params.relu?1:0]),d=this.device.createBuffer({size:_.byteLength,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(d,0,_),s=[{binding:0,resource:{buffer:i}},{binding:1,resource:{buffer:o}},{binding:2,resource:{buffer:l}},{binding:3,resource:{buffer:f}},{binding:4,resource:{buffer:d}}],n=[Math.ceil(t.outputs.out.shape[2]/64),t.outputs.out.shape[1],1]}else if(t.opType==="SpatialSoftargmaxY"){r=U.getSpatialSoftargmaxYShader();let i=t.inputs.input.gpuBuffer,o=t.outputs.out.gpuBuffer,f=new Uint32Array([t.inputs.input.shape[1],t.inputs.input.shape[2],t.inputs.input.shape[3]]),l=this.device.createBuffer({size:f.byteLength,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(l,0,f),s=[{binding:0,resource:{buffer:i}},{binding:1,resource:{buffer:o}},{binding:2,resource:{buffer:l}}],n=[Math.ceil(t.inputs.input.shape[2]/64),t.inputs.input.shape[3],1]}else if(t.opType==="UpsampleNearest2D"){r=U.getUpsample2xShader();let i=t.inputs.input.gpuBuffer,o=t.outputs.out.gpuBuffer,f=new Uint32Array([t.inputs.input.shape[0],t.inputs.input.shape[1],t.inputs.input.shape[2],t.inputs.input.shape[3]]),l=this.device.createBuffer({size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(l,0,f),s=[{binding:0,resource:{buffer:i}},{binding:1,resource:{buffer:o}},{binding:2,resource:{buffer:l}}],n=[Math.ceil(t.outputs.out.shape[2]/8),Math.ceil(t.outputs.out.shape[1]/8),t.outputs.out.shape[0]*t.outputs.out.shape[3]]}else if(t.opType==="Concat"){let i=this.device.createShaderModule({code:U.getConcatCopyShader()}),o=await this.device.createComputePipelineAsync({layout:"auto",compute:{module:i,entryPoint:"main"}}),f=0;for(let l of["input","a","b","c","d","e","f","g","h"]){let _=t.inputs[l];if(!_)continue;let d=_.sizeBytes/4,g=new Uint32Array([d,f]),b=this.device.createBuffer({size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(b,0,g);let h=this.device.createBindGroup({layout:o.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:_.gpuBuffer}},{binding:1,resource:{buffer:t.outputs.out.gpuBuffer}},{binding:2,resource:{buffer:b}}]});this.pipelines.push({pipeline:o,bindGroup:h,workgroupCount:[Math.ceil(d/64),1,1],nodeName:`${t.id}_concat`}),f+=d}return}else if(t.opType==="ProfileY"){r=U.getProfileYShader();let i=t.inputs.input.gpuBuffer,o=t.outputs.out.gpuBuffer,f=new Uint32Array([t.inputs.input.shape[1],t.inputs.input.shape[2],t.inputs.input.shape[3]]),l=this.device.createBuffer({size:f.byteLength,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(l,0,f),s=[{binding:0,resource:{buffer:i}},{binding:1,resource:{buffer:o}},{binding:2,resource:{buffer:l}}],n=[Math.ceil(t.inputs.input.shape[1]/64),t.inputs.input.shape[3],1]}else if(t.opType==="ProfileX"){r=U.getProfileXShader();let i=t.inputs.input.gpuBuffer,o=t.outputs.out.gpuBuffer,f=new Uint32Array([t.inputs.input.shape[1],t.inputs.input.shape[2],t.inputs.input.shape[3]]),l=this.device.createBuffer({size:f.byteLength,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(l,0,f),s=[{binding:0,resource:{buffer:i}},{binding:1,resource:{buffer:o}},{binding:2,resource:{buffer:l}}],n=[Math.ceil(t.inputs.input.shape[2]/64),t.inputs.input.shape[3],1]}else if(t.opType==="InterpLinear1D"){r=U.getInterp1DShader();let i=t.inputs.input.gpuBuffer,o=t.outputs.out.gpuBuffer,f=new Uint32Array([t.inputs.input.shape[1],t.inputs.input.shape[2],t.params.size]),l=this.device.createBuffer({size:f.byteLength,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(l,0,f),s=[{binding:0,resource:{buffer:i}},{binding:1,resource:{buffer:o}},{binding:2,resource:{buffer:l}}],n=[Math.ceil(t.params.size/64),t.inputs.input.shape[1],1]}else if(t.opType==="MatMul"){t.inputs.scale?r=U.getLinearInt8Shader():r=U.getLinearF32Shader();let i=this.device.createBuffer({size:4096,usage:GPUBufferUsage.STORAGE}),o=t.inputs.input.shape.slice(0,-1).reduce((b,h)=>b*h,1),f=t.inputs.input.shape[t.inputs.input.shape.length-1],l=t.outputs.out.shape[t.outputs.out.shape.length-1],_=new Uint32Array([o,f,l]),d=this.device.createBuffer({size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(d,0,_);let g=t.inputs.bias?t.inputs.bias.gpuBuffer:i;s=[{binding:0,resource:{buffer:t.inputs.input.gpuBuffer}},{binding:1,resource:{buffer:t.inputs.weight.gpuBuffer}},...t.inputs.scale?[{binding:2,resource:{buffer:t.inputs.scale.gpuBuffer}}]:[],{binding:3,resource:{buffer:g}},{binding:4,resource:{buffer:t.outputs.out.gpuBuffer}},{binding:5,resource:{buffer:d}}],n=[Math.ceil(l/64),o,1]}else if(t.opType==="LayerNorm"){r=U.getLayerNormShader();let i=t.params.d_model,o=t.inputs.input.shape.slice(0,-1).reduce((_,d)=>_*d,1),f=new Uint32Array([o,i]),l=this.device.createBuffer({size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(l,0,f),s=[{binding:0,resource:{buffer:t.inputs.input.gpuBuffer}},{binding:1,resource:{buffer:t.inputs.weight.gpuBuffer}},{binding:2,resource:{buffer:t.inputs.bias.gpuBuffer}},{binding:3,resource:{buffer:t.outputs.out.gpuBuffer}},{binding:4,resource:{buffer:l}}],n=[Math.ceil(o/64),1,1]}else if(t.opType==="GELU"){r=U.getGELUShader();let i=t.outputs.out.shape.reduce((f,l)=>f*l,1),o=this.device.createBuffer({size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(o,0,new Uint32Array([i])),s=[{binding:0,resource:{buffer:t.inputs.input.gpuBuffer}},{binding:1,resource:{buffer:t.outputs.out.gpuBuffer}},{binding:2,resource:{buffer:o}}],n=[Math.ceil(i/64),1,1]}else if(t.opType==="Embedding"){r=U.getEmbeddingShader();let i=t.inputs.input.shape.reduce((_,d)=>_*d,1),o=t.outputs.out.shape[t.outputs.out.shape.length-1],f=new Uint32Array([i,o]),l=this.device.createBuffer({size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(l,0,f),s=[{binding:0,resource:{buffer:t.inputs.input.gpuBuffer}},{binding:1,resource:{buffer:t.inputs.weight.gpuBuffer}},{binding:2,resource:{buffer:t.outputs.out.gpuBuffer}},{binding:3,resource:{buffer:l}}],n=[Math.ceil(i/64),1,1]}else if(t.opType==="SDPA"){r=U.getSDPAShader();let i=t.inputs.qkv.shape[1],o=t.outputs.out.shape[2],f=t.params.heads||8,l=o/f,_=t.params.scale!==void 0?t.params.scale:1/Math.sqrt(l),d=new ArrayBuffer(20),g=new Uint32Array(d),b=new Float32Array(d);g[0]=i,g[1]=o,g[2]=f,g[3]=l,b[4]=_;let h=this.device.createBuffer({size:32,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(h,0,d),s=[{binding:0,resource:{buffer:t.inputs.qkv.gpuBuffer}},{binding:1,resource:{buffer:t.outputs.out.gpuBuffer}},{binding:2,resource:{buffer:h}}],n=[Math.ceil(i/64),f,1]}else if(t.opType==="CrossSDPA"){r=U.getCrossSDPAShader();let i=t.inputs.q.shape[1],o=t.inputs.k.shape[1],f=t.inputs.q.shape[2],l=t.params.heads||8,_=f/l,d=1/Math.sqrt(_),g=new ArrayBuffer(24),b=new Uint32Array(g),h=new Float32Array(g);b[0]=i,b[1]=o,b[2]=f,b[3]=l,b[4]=_,h[5]=d;let v=this.device.createBuffer({size:32,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(v,0,g),s=[{binding:0,resource:{buffer:t.inputs.q.gpuBuffer}},{binding:1,resource:{buffer:t.inputs.k.gpuBuffer}},{binding:2,resource:{buffer:t.inputs.v.gpuBuffer}},{binding:3,resource:{buffer:t.outputs.out.gpuBuffer}},{binding:4,resource:{buffer:v}}],n=[Math.ceil(i/64),l,1]}else if(t.opType==="CrossAttention"){r=U.getCrossAttentionShader();let i=t.inputs.q.shape[1],o=t.inputs.kv.shape[1],f=t.outputs.out.shape[2],l=t.params.heads||8,_=f/l,d=1/Math.sqrt(_),g=new ArrayBuffer(32),b=new Uint32Array(g),h=new Float32Array(g);b[0]=i,b[1]=o,b[2]=f,b[3]=l,b[4]=_,h[5]=d,b[6]=t.inputs.scale?1:0,b[7]=t.inputs.bias?1:0;let v=this.device.createBuffer({size:32,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(v,0,g);let x=this.device.createBuffer({size:4096,usage:GPUBufferUsage.STORAGE}),y=this.device.createBuffer({size:4096,usage:GPUBufferUsage.STORAGE});s=[{binding:0,resource:{buffer:t.inputs.q.gpuBuffer}},{binding:1,resource:{buffer:t.inputs.kv.gpuBuffer}},{binding:2,resource:{buffer:t.inputs.weight.gpuBuffer}},{binding:3,resource:{buffer:t.inputs.scale?t.inputs.scale.gpuBuffer:x}},{binding:4,resource:{buffer:t.inputs.bias?t.inputs.bias.gpuBuffer:y}},{binding:5,resource:{buffer:t.outputs.out.gpuBuffer}},{binding:6,resource:{buffer:v}}],n=[Math.ceil(i/64),l,1]}else if(t.opType==="MeanHeight"){r=U.getMeanHeightShader();let i=new Uint32Array([t.inputs.input.shape[1],t.inputs.input.shape[2],t.inputs.input.shape[3]]),o=this.device.createBuffer({size:Math.ceil(i.byteLength/16)*16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(o,0,i),s=[{binding:0,resource:{buffer:t.inputs.input.gpuBuffer}},{binding:1,resource:{buffer:t.outputs.out.gpuBuffer}},{binding:2,resource:{buffer:o}}],n=[Math.ceil(t.inputs.input.shape[2]/64),t.inputs.input.shape[3],1]}else if(t.opType==="ReLU"||t.opType==="Sigmoid"||t.opType==="HardSwish"||t.opType==="HardSigmoid"||t.opType==="SiLU"||t.opType==="Swish"||t.opType==="Tanh"||t.opType==="Reshape"||t.opType==="Squeeze"||t.opType==="Unsqueeze"||t.opType==="Flatten"||t.opType==="Dropout"||t.opType==="Identity"){t.opType==="ReLU"?r=U.getReLUShader():t.opType==="Sigmoid"?r=U.getSigmoidShader():t.opType==="HardSwish"?r=U.getHardSwishShader():t.opType==="HardSigmoid"?r=U.getHardSigmoidShader():t.opType==="SiLU"||t.opType==="Swish"?r=U.getSiLUShader():t.opType==="Tanh"?r=U.getTanhShader():r=U.getCopyShader();let i=t.outputs.out.shape.reduce((l,_)=>l*_,1),o=new Uint32Array([i]),f=this.device.createBuffer({size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(f,0,o),s=[{binding:0,resource:{buffer:t.inputs.input.gpuBuffer}},{binding:1,resource:{buffer:t.outputs.out.gpuBuffer}},{binding:2,resource:{buffer:f}}],n=[Math.ceil(i/64),1,1]}else if(t.opType==="Add"||t.opType==="Mul"||t.opType==="Sub"||t.opType==="Div"){let i={Add:"out_val = av + bv;",Mul:"out_val = av * bv;",Sub:"out_val = av - bv;",Div:"out_val = av / bv;"}[t.opType];r=U.getBroadcastBinaryShader(i);let o=t.outputs.out.shape,f=o.length,l=y=>{let w=new Array(y.length),P=1;for(let B=y.length-1;B>=0;B--)w[B]=P,P*=y[B];return w},_=l(o),d=y=>{let w=new Array(f).fill(1);for(let B=0;B<y.length;B++)w[f-y.length+B]=y[B];let P=l(w);for(let B=0;B<f;B++)w[B]===1&&o[B]!==1&&(P[B]=0);return P},g=d(t.inputs.a.shape),b=d(t.inputs.b.shape),h=o.reduce((y,w)=>y*w,1),v=new Uint32Array(2+f*3);v[0]=h,v[1]=f;for(let y=0;y<f;y++)v[2+y]=_[y],v[2+f+y]=g[y],v[2+2*f+y]=b[y];let x=this.device.createBuffer({size:Math.ceil(v.byteLength/4)*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(x,0,v),s=[{binding:0,resource:{buffer:t.inputs.a.gpuBuffer}},{binding:1,resource:{buffer:t.inputs.b.gpuBuffer}},{binding:2,resource:{buffer:t.outputs.out.gpuBuffer}},{binding:3,resource:{buffer:x}}],n=[Math.ceil(h/64),1,1]}else if(t.opType==="Transpose"){r=U.getGeneralTransposeShader();let i=t.inputs.input.shape,o=i.length,f=t.params.perm||[...Array(o).keys()].reverse(),l=new Array(o);{let v=1;for(let x=o-1;x>=0;x--)l[x]=v,v*=i[x]}let _=f.map(v=>i[v]),d=new Array(o);{let v=1;for(let x=o-1;x>=0;x--)d[x]=v,v*=_[x]}let g=i.reduce((v,x)=>v*x,1),b=new Uint32Array(2+o*2);b[0]=g,b[1]=o;for(let v=0;v<o;v++)b[2+v]=d[v],b[2+o+v]=l[f[v]];let h=this.device.createBuffer({size:Math.ceil(b.byteLength/4)*4,usage:GPUBufferUsage.STORAGE|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(h,0,b),s=[{binding:0,resource:{buffer:t.inputs.input.gpuBuffer}},{binding:1,resource:{buffer:t.outputs.out.gpuBuffer}},{binding:2,resource:{buffer:h}}],n=[Math.ceil(g/64),1,1]}else if(t.opType==="Softmax"||t.opType==="LogSoftmax"){r=t.opType==="Softmax"?U.getSoftmaxShader():U.getLogSoftmaxShader();let i=t.inputs.input.shape,o=i[i.length-1],f=i.reduce((d,g)=>d*g,1)/o;if(t.params.axis!==void 0){let d=t.params.axis;d<0&&(d+=i.length),d!==i.length-1&&console.warn(`[VolvoxAI WebGPU] ${t.opType} axis ${t.params.axis} != last; using last-axis.`)}let l=new Uint32Array([f,o]),_=this.device.createBuffer({size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(_,0,l),s=[{binding:0,resource:{buffer:t.inputs.input.gpuBuffer}},{binding:1,resource:{buffer:t.outputs.out.gpuBuffer}},{binding:2,resource:{buffer:_}}],n=[Math.ceil(f/64),1,1]}else if(t.opType==="LeakyReLU"){r=U.getLeakyReLUShader();let i=t.outputs.out.shape.reduce((_,d)=>_*d,1),o=t.params.alpha!==void 0?t.params.alpha:.01,f=new ArrayBuffer(16);new Uint32Array(f,0,1)[0]=i,new Float32Array(f,4,1)[0]=o;let l=this.device.createBuffer({size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(l,0,f),s=[{binding:0,resource:{buffer:t.inputs.input.gpuBuffer}},{binding:1,resource:{buffer:t.outputs.out.gpuBuffer}},{binding:2,resource:{buffer:l}}],n=[Math.ceil(i/64),1,1]}else if(t.opType==="PReLU"){r=U.getPReLUShader();let i=t.inputs.input.shape,o=i[i.length-1]||1,f=i.reduce((d,g)=>d*g,1),l=new Uint32Array([f,o]),_=this.device.createBuffer({size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(_,0,l),s=[{binding:0,resource:{buffer:t.inputs.input.gpuBuffer}},{binding:1,resource:{buffer:t.inputs.weight.gpuBuffer}},{binding:2,resource:{buffer:t.outputs.out.gpuBuffer}},{binding:3,resource:{buffer:_}}],n=[Math.ceil(f/64),1,1]}else if(t.opType==="RMSNorm"){r=U.getRMSNormShader();let i=t.inputs.input.shape,o=t.params.d_model||i[i.length-1],f=i.reduce((g,b)=>g*b,1)/o,l=t.params.eps!==void 0?t.params.eps:1e-6,_=new ArrayBuffer(16);new Uint32Array(_,0,2).set([f,o]),new Float32Array(_,8,1)[0]=l;let d=this.device.createBuffer({size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(d,0,_),s=[{binding:0,resource:{buffer:t.inputs.input.gpuBuffer}},{binding:1,resource:{buffer:t.inputs.weight.gpuBuffer}},{binding:2,resource:{buffer:t.outputs.out.gpuBuffer}},{binding:3,resource:{buffer:d}}],n=[Math.ceil(f/64),1,1]}else if(t.opType==="GlobalAveragePool"){r=U.getGlobalAveragePoolShader();let i=t.inputs.input.shape,o=i[0],f=i[1]||1,l=i[2]||1,_=i[3]||1,d=new Uint32Array([o,f,l,_]),g=this.device.createBuffer({size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(g,0,d),s=[{binding:0,resource:{buffer:t.inputs.input.gpuBuffer}},{binding:1,resource:{buffer:t.outputs.out.gpuBuffer}},{binding:2,resource:{buffer:g}}],n=[Math.ceil(_/64),o,1]}else if(t.opType==="BatchNorm2D"){r=U.getBatchNorm2DShader();let[i,o,f,l]=t.inputs.input.shape,_=t.params.eps!==void 0?t.params.eps:1e-5,d=new ArrayBuffer(32);new Uint32Array(d,0,4).set([i,l,o,f]),new Float32Array(d,16,1)[0]=_;let g=this.device.createBuffer({size:32,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(g,0,d),s=[{binding:0,resource:{buffer:t.inputs.input.gpuBuffer}},{binding:1,resource:{buffer:t.inputs.weight.gpuBuffer}},{binding:2,resource:{buffer:t.inputs.bias.gpuBuffer}},{binding:3,resource:{buffer:t.inputs.running_mean.gpuBuffer}},{binding:4,resource:{buffer:t.inputs.running_var.gpuBuffer}},{binding:5,resource:{buffer:t.outputs.out.gpuBuffer}},{binding:6,resource:{buffer:g}}],n=[Math.ceil(i*l*o*f/64),1,1]}else if(t.opType==="Resize"||t.opType==="ResizeNearest2D"){r=U.getResizeShader();let[i,o,f,l]=t.inputs.input.shape,[,_,d]=t.outputs.out.shape,g=t.opType==="ResizeNearest2D"||t.params.mode==="nearest"?0:1,b=new Uint32Array([i,o,f,l,_,d,g,0]),h=this.device.createBuffer({size:32,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(h,0,b),s=[{binding:0,resource:{buffer:t.inputs.input.gpuBuffer}},{binding:1,resource:{buffer:t.outputs.out.gpuBuffer}},{binding:2,resource:{buffer:h}}],n=[Math.ceil(d/8),Math.ceil(_/8),i*l]}else if(t.opType==="Split"){let i=t.inputs.input.shape,o=t.params.axis||0;o<0&&(o+=i.length);let f=Object.keys(t.outputs).sort(),l=f.length,_=i[o]/l,d=1;for(let h=o+1;h<i.length;h++)d*=i[h];let g=this.device.createShaderModule({code:U.getSplitShader()}),b=await this.device.createComputePipelineAsync({layout:"auto",compute:{module:g,entryPoint:"main"}});for(let h=0;h<l;h++){let v=t.outputs[f[h]],x=v.shape.reduce((B,z)=>B*z,1),y=new Uint32Array([x,d,_,i[o],h*_]),w=this.device.createBuffer({size:32,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(w,0,y);let P=this.device.createBindGroup({layout:b.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:t.inputs.input.gpuBuffer}},{binding:1,resource:{buffer:v.gpuBuffer}},{binding:2,resource:{buffer:w}}]});this.pipelines.push({pipeline:b,bindGroup:P,workgroupCount:[Math.ceil(x/64),1,1],nodeName:`${t.id}_split${h}`})}return}else if(t.opType==="Clip"){r=U.getClipShader();let i=t.inputs.input.sizeBytes/4,o=t.params.min!==void 0?t.params.min:-1e9,f=t.params.max!==void 0?t.params.max:1e9;t.inputs.min&&(o=new Float32Array(t.inputs.min.buffer)[0]),t.inputs.max&&(f=new Float32Array(t.inputs.max.buffer)[0]);let l=new Float32Array([0,o,f,0]);new Uint32Array(l.buffer)[0]=i;let _=this.device.createBuffer({size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(_,0,l),s=[{binding:0,resource:{buffer:t.inputs.input.gpuBuffer}},{binding:1,resource:{buffer:t.outputs.out.gpuBuffer}},{binding:2,resource:{buffer:_}}],n=[Math.ceil(i/64),1,1]}else if(t.opType==="MaxPool2D"){r=U.getMaxPool2DShader();let[i,o]=C(t.params.kernel,1),[f,l]=C(t.params.stride,1),_=t.params.padding?t.params.padding[0]:0,d=t.params.padding?t.params.padding[1]:0,g=new Uint32Array([t.inputs.input.shape[1],t.inputs.input.shape[2],t.inputs.input.shape[3],t.outputs.out.shape[1],t.outputs.out.shape[2],i,o,f,l,_,d]),b=this.device.createBuffer({size:Math.ceil(g.byteLength/16)*16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(b,0,g),s=[{binding:0,resource:{buffer:t.inputs.input.gpuBuffer}},{binding:1,resource:{buffer:t.outputs.out.gpuBuffer}},{binding:2,resource:{buffer:b}}],n=[Math.ceil(t.outputs.out.shape[2]/8),Math.ceil(t.outputs.out.shape[1]/8),t.outputs.out.shape[3]]}else if(t.opType==="Cast"){r=U.getCopyShader();let i=t.inputs.input||t.inputs.data,o=t.outputs.out.shape.reduce((l,_)=>l*_,1),f=this.device.createBuffer({size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(f,0,new Uint32Array([o])),s=[{binding:0,resource:{buffer:i.gpuBuffer}},{binding:1,resource:{buffer:t.outputs.out.gpuBuffer}},{binding:2,resource:{buffer:f}}],n=[Math.ceil(o/64),1,1]}else if(t.opType==="Where"||t.opType==="Mask"){r=U.getWhereShader();let i=t.inputs.cond||t.inputs.condition,o=t.inputs.x||t.inputs.a,f=t.inputs.y||t.inputs.b,l=t.outputs.out.shape.reduce((d,g)=>d*g,1),_=this.device.createBuffer({size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(_,0,new Uint32Array([l])),s=[{binding:0,resource:{buffer:i.gpuBuffer}},{binding:1,resource:{buffer:o.gpuBuffer}},{binding:2,resource:{buffer:f.gpuBuffer}},{binding:3,resource:{buffer:t.outputs.out.gpuBuffer}},{binding:4,resource:{buffer:_}}],n=[Math.ceil(l/64),1,1]}else if(t.opType==="DequantizeLinear"){r=U.getDequantizeLinearShader();let i=t.inputs.input||t.inputs.x,o=t.outputs.out.shape.reduce((d,g)=>d*g,1),f=t.inputs.zero_point?1:0,l=this.device.createBuffer({size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(l,0,new Uint32Array([o,f]));let _=this.device.createBuffer({size:16,usage:GPUBufferUsage.STORAGE});s=[{binding:0,resource:{buffer:i.gpuBuffer}},{binding:1,resource:{buffer:t.inputs.scale.gpuBuffer}},{binding:2,resource:{buffer:f?t.inputs.zero_point.gpuBuffer:_}},{binding:3,resource:{buffer:t.outputs.out.gpuBuffer}},{binding:4,resource:{buffer:l}}],n=[Math.ceil(o/64),1,1]}else if(t.opType==="Expand"||t.opType==="Broadcast"){r=U.getExpandShader();let i=t.inputs.input||t.inputs.data,o=w=>[1,1,1,1].slice(0,4-w.length).concat(w),[f,l,_,d]=o(i.shape),[g,b,h,v]=o(t.outputs.out.shape),x=new Uint32Array([f,l,_,d,g,b,h,v]),y=this.device.createBuffer({size:32,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(y,0,x),s=[{binding:0,resource:{buffer:i.gpuBuffer}},{binding:1,resource:{buffer:t.outputs.out.gpuBuffer}},{binding:2,resource:{buffer:y}}],n=[Math.ceil(g*b*h*v/64),1,1]}else if(t.opType==="Pad"){r=U.getPadShader();let i=t.inputs.input||t.inputs.data,o=t.params.pads||[],f=o.length===8?o[1]:o[0]||0,l=o.length===8?o[2]:o[1]||0,_=t.params.value||0,d=[1,1,1,1].slice(0,4-i.shape.length).concat(i.shape),g=[1,1,1,1].slice(0,4-t.outputs.out.shape.length).concat(t.outputs.out.shape),b=new ArrayBuffer(48),h=new Uint32Array(b),v=new Float32Array(b);h[0]=d[0],h[1]=d[1],h[2]=d[2],h[3]=d[3],h[4]=g[1],h[5]=g[2],h[6]=f,h[7]=l,v[8]=_;let x=this.device.createBuffer({size:48,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(x,0,b),s=[{binding:0,resource:{buffer:i.gpuBuffer}},{binding:1,resource:{buffer:t.outputs.out.gpuBuffer}},{binding:2,resource:{buffer:x}}],n=[Math.ceil(g[0]*g[1]*g[2]*g[3]/64),1,1]}else if(t.opType==="Slice"){r=U.getSliceShader();let i=t.inputs.input||t.inputs.data,o=t.params.starts||[0,0,0,0],f=t.params.steps||[1,1,1,1],l=t.params.axes||[0,1,2,3],_=[1,1,1,1].slice(0,4-i.shape.length).concat(i.shape),d=[1,1,1,1].slice(0,4-t.outputs.out.shape.length).concat(t.outputs.out.shape),g=[0,0,0,0],b=[1,1,1,1];for(let y=0;y<l.length;y++){let w=l[y];w<0&&(w+=i.shape.length),w+=4-i.shape.length,g[w]=o[y]<0?o[y]+_[w]:o[y],b[w]=f[y]}let h=d[0]*d[1]*d[2]*d[3],v=new Uint32Array([d[0],d[1],d[2],d[3],_[1],_[2],_[3],g[0],g[1],g[2],g[3],b[0],b[1],b[2],b[3],h]),x=this.device.createBuffer({size:64,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(x,0,v),s=[{binding:0,resource:{buffer:i.gpuBuffer}},{binding:1,resource:{buffer:t.outputs.out.gpuBuffer}},{binding:2,resource:{buffer:x}}],n=[Math.ceil(h/64),1,1]}else if(t.opType==="Gather"){let i=t.params.axis||0;if(i<0&&(i+=t.inputs.input.shape.length),i!==0){console.warn(`[VolvoxAI WebGPU] Gather axis ${i} not supported on GPU; node ${t.id} skipped (use WASM/CPU).`);return}r=U.getGatherShader();let o=t.inputs.input,f=o.shape.slice(1).reduce((d,g)=>d*g,1)||1,l=t.outputs.out.shape.reduce((d,g)=>d*g,1),_=this.device.createBuffer({size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(_,0,new Uint32Array([f,l/f,l])),s=[{binding:0,resource:{buffer:o.gpuBuffer}},{binding:1,resource:{buffer:t.inputs.indices.gpuBuffer}},{binding:2,resource:{buffer:t.outputs.out.gpuBuffer}},{binding:3,resource:{buffer:_}}],n=[Math.ceil(l/64),1,1]}else if(t.opType==="ReduceSum"||t.opType==="ReduceMean"){r=U.getReduceShader();let i=t.inputs.input||t.inputs.data,o=i.shape.length===2?i.shape:[1,i.shape.reduce((b,h)=>b*h,1)],f=o[0],l=o[1],_=t.opType==="ReduceMean"?1/l:1,d=new ArrayBuffer(16);new Uint32Array(d,0,2).set([f,l]),new Float32Array(d,8,1)[0]=_;let g=this.device.createBuffer({size:16,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(g,0,d),s=[{binding:0,resource:{buffer:i.gpuBuffer}},{binding:1,resource:{buffer:t.outputs.out.gpuBuffer}},{binding:2,resource:{buffer:g}}],n=[Math.ceil(f/64),1,1]}else if(t.opType==="AveragePool"||t.opType==="AveragePool2D"){r=U.getAveragePool2DShader();let i=t.inputs.input||t.inputs.x,[o,f,l,_]=i.shape,[,d,g]=t.outputs.out.shape,[b,h]=C(t.params.kernel,1),[v,x]=C(t.params.stride,1),y=t.params.padding?t.params.padding[0]:0,w=t.params.padding?t.params.padding[1]:0,P=new Uint32Array([o,f,l,_,d,g,b,h,v,x,y,w]),B=this.device.createBuffer({size:48,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(B,0,P),s=[{binding:0,resource:{buffer:i.gpuBuffer}},{binding:1,resource:{buffer:t.outputs.out.gpuBuffer}},{binding:2,resource:{buffer:B}}],n=[Math.ceil(g/8),Math.ceil(d/8),o*_]}else if(t.opType==="ConvTranspose2D"){r=U.getConvTranspose2DShader();let i=t.inputs.input||t.inputs.x,[o,f,l,_]=i.shape,[,d,g,b]=t.outputs.out.shape,h=t.params.kernel[0],v=t.params.kernel[1],x=t.params.stride?t.params.stride[0]:1,y=t.params.stride?t.params.stride[1]:1,w=t.params.padding?t.params.padding[0]:0,P=t.params.padding?t.params.padding[1]:0,B=t.inputs.bias?1:0,z=new Uint32Array([o,f,l,_,d,g,b,h,v,x,y,w,P,B]),M=this.device.createBuffer({size:64,usage:GPUBufferUsage.UNIFORM|GPUBufferUsage.COPY_DST});this.device.queue.writeBuffer(M,0,z);let q=this.device.createBuffer({size:16,usage:GPUBufferUsage.STORAGE});s=[{binding:0,resource:{buffer:i.gpuBuffer}},{binding:1,resource:{buffer:t.inputs.weight.gpuBuffer}},{binding:2,resource:{buffer:B?t.inputs.bias.gpuBuffer:q}},{binding:3,resource:{buffer:t.outputs.out.gpuBuffer}},{binding:4,resource:{buffer:M}}],n=[Math.ceil(g/8),Math.ceil(d/8),o*b]}else{console.warn(`[VolvoxAI WebGPU] Shader for ${t.opType} not implemented yet in Executor.`);return}if(!r){console.warn(`[VolvoxAI WebGPU] ${t.opType} has no native GPU shader; node ${t.id} skipped.`);return}(isNaN(n[0])||isNaN(n[1])||isNaN(n[2])||n[0]<=0||n[1]<=0||n[2]<=0)&&(console.error(`Invalid workgroupCount [${n}] for node ${t.id} (${t.opType})`),n=[1,1,1]);let m=this.device.createShaderModule({code:r}),a;try{a=await this.device.createComputePipelineAsync({layout:"auto",compute:{module:m,entryPoint:"main"}})}catch(i){if(!e||e===r||!c)throw i;console.warn(`[VolvoxAI WebGPU] Specialized shader for ${t.id} failed; falling back to generic Conv2D.`,i),r=e,n=c,m=this.device.createShaderModule({code:r}),a=await this.device.createComputePipelineAsync({layout:"auto",compute:{module:m,entryPoint:"main"}})}let u=this.device.createBindGroup({layout:a.getBindGroupLayout(0),entries:s});this.pipelines.push({pipeline:a,bindGroup:u,workgroupCount:n,nodeName:t.id})}async execute(t){for(let[n,m]of Object.entries(t)){let a=this.gpuBuffers.get(n);a&&this.device.queue.writeBuffer(a,0,m.buffer,m.byteOffset,m.byteLength)}let r=this.device.createCommandEncoder(),e=r.beginComputePass();for(let n=0;n<this.pipelines.length;n++){let m=this.pipelines[n];e.setPipeline(m.pipeline),e.setBindGroup(0,m.bindGroup),e.dispatchWorkgroups(m.workgroupCount[0],m.workgroupCount[1],m.workgroupCount[2]),(n+1)%20===0&&(e.end(),this.device.queue.submit([r.finish()]),r=this.device.createCommandEncoder(),e=r.beginComputePass())}e.end(),this.device.queue.submit([r.finish()]);let c=this.graph.nodes[this.graph.nodes.length-1],s=Object.keys(c.outputs)[0];return this.gpuBuffers.get(c.outputs[s].name)}async readBuffer(t,r){let e=this.device.createBuffer({size:r,usage:GPUBufferUsage.MAP_READ|GPUBufferUsage.COPY_DST}),c=this.device.createCommandEncoder();c.copyBufferToBuffer(t,0,e,0,r),this.device.queue.submit([c.finish()]),await e.mapAsync(GPUMapMode.READ);let s=new Float32Array(e.getMappedRange().slice(0));return e.unmap(),s}};var H=class p{static async load(t,r){let e;r.endsWith("_weights.safetensors")?e=r.replace("_weights.safetensors","_config.json"):e=r.replace(/\/[^\/]+$/,"/config.json"),console.log(`[VolvoxAI] Loading config from ${e}...`);let c=await fetch(e);if(!c.ok)throw new Error(`Failed to load config.json: ${c.statusText}`);let s=await c.json();console.log(`[VolvoxAI] Loading Safetensors model from ${r}...`);let n=await fetch(r);if(!n.ok)throw new Error(`Failed to load safetensors: ${n.statusText}`);let m=await n.arrayBuffer(),a=new DataView(m),u=Number(a.getBigUint64(0,!0)),i=new Uint8Array(m,8,u),o=new TextDecoder("utf-8").decode(i),f=JSON.parse(o),l=f.__metadata__||{},_=8+u,d=new Map;for(let[h,v]of Object.entries(f)){if(h==="__metadata__")continue;let x=v.dtype==="I8"?"int8":v.dtype==="U8"?"uint8":"float32",y=t.addWeight(h,v.shape,x),w=_+v.data_offsets[0],P=v.data_offsets[1]-v.data_offsets[0];x==="int8"?y.buffer=new Int8Array(m,w,P):x==="uint8"?y.buffer=new Uint8Array(m,w,P):v.dtype==="F16"?y.buffer=p._float16ToFloat32Array(m,w,P):y.buffer=new Float32Array(m,w,P/4),d.set(h,y)}if(s.inputs){let h=s.inputs;for(let[v,x]of Object.entries(h)){let y=t.addInput(v,x.shape,x.dtype||"float32");d.set(v,y)}}if(s.nodes)p._buildFromBlueprint(t,s,d);else if(s.model_type){if(typeof p.ModelBuilders>"u"||!p.ModelBuilders[s.model_type])throw new Error(`[VolvoxAI] Unsupported Hugging Face model_type: '${s.model_type}'. No builder registered.`);console.log(`[VolvoxAI] Building graph on the fly using model builder for '${s.model_type}'...`),p.ModelBuilders[s.model_type](t,s,d)}else throw new Error("[VolvoxAI] config.json must contain either 'nodes' (Volvox blueprint) or 'model_type' (Hugging Face).");p._dequantizeConvWeights(t),p._normalizeConvWeightsForImageLayout(t);let g=new Set;for(let h of t.nodes)for(let v of Object.values(h.inputs))v&&v.name&&g.add(v.name);let b=[];for(let h of t.nodes)for(let v of Object.values(h.outputs))v&&v.name&&!g.has(v.name)&&b.push(v.name);return t.outputNames=b,p._resolveMatMulLayouts(t),console.log("[VolvoxAI] Successfully assembled graph. Outputs:",b),t}static _resolveMatMulLayouts(t){let r=m=>m.opType==="MatMul"||m.opType==="Linear"||m.opType==="Gemm",e=m=>{let a=m.inputs.input?.shape?.[m.inputs.input.shape.length-1],u=Object.values(m.outputs)[0],i=u?.shape?.[u.shape.length-1];return[a,i]},c=0,s=0;for(let m of t.nodes){if(!r(m)||!m.inputs.weight||m.inputs.scale)continue;let a=m.inputs.weight.shape;if(!a||a.length<2)continue;let[u,i]=e(m);u!==i&&(a[0]===i&&a[1]===u?s++:a[0]===u&&a[1]===i&&c++)}let n=c>s?"din":"dout";for(let m of t.nodes){if(!r(m))continue;let a=m.inputs.weight?.shape,[u,i]=e(m);m.inputs.scale||a&&a.length>=2&&u!==i&&a[0]===i&&a[1]===u?m.wLayout="dout":a&&a.length>=2&&u!==i&&a[0]===u&&a[1]===i?m.wLayout="din":m.wLayout=n}}static _buildFromBlueprint(t,r,e){let c=r.nodes;for(let s of c){let n={};for(let[i,o]of Object.entries(s.inputs)){let f=e.get(o)||t.tensors.get(o);f||(console.warn(`[GraphLoader] Implicitly adding missing graph input '${o}' with shape [1, 3, 224, 224]`),f=t.addInput(o,[1,3,224,224],"float32"),e.set(o,f)),n[i]=f}let m=s.outputs_shape||{},a=s.opType||s.op,u=t.addOp(a,n,m,s.params||{});for(let[i,o]of Object.entries(s.outputs)){let f=u[i];f&&(f.name!==o&&(t.tensors.delete(f.name),f.name=o,t.tensors.set(o,f)),e.set(o,f))}}}static ModelBuilders={};static _float16ToFloat32Array(t,r,e){let c=e/2,s=new DataView(t,r,e),n=new Float32Array(c);for(let m=0;m<c;m++)n[m]=p._float16BitsToFloat32(s.getUint16(m*2,!0));return n}static _float16BitsToFloat32(t){let r=t&32768?-1:1,e=t>>10&31,c=t&1023;return e===0?c===0?r<0?-0:0:r*Math.pow(2,-14)*(c/1024):e===31?c?NaN:r*(1/0):r*Math.pow(2,e-15)*(1+c/1024)}static _dequantizeConvWeights(t){for(let r of t.nodes){if(r.opType!=="Conv2D"&&r.opType!=="Conv1D"&&r.opType!=="QConv2D")continue;let e=r.inputs.weight,c=r.inputs.scale||r.inputs.weight_scale;if(!c||!e||e.dtype!=="int8"||!e.buffer)continue;let s=r.inputs.weight_zero_point,n=e.shape[0],m=e.buffer.length/n,a=new Float32Array(e.buffer.length);for(let u=0;u<n;u++){let i=c.buffer[u],o=s&&s.buffer?s.buffer[s.buffer.length===1?0:u]:0,f=u*m;for(let l=0;l<m;l++)a[f+l]=(e.buffer[f+l]-o)*i}if(r.opType==="QConv2D"){let u=t.addWeight(`${e.name}__deq_${r.id}`,e.shape,"float32");u.buffer=a,u.sizeBytes=a.length*4,r.inputs.weight=u}else e.buffer=a,e.dtype="float32",e.sizeBytes=a.length*4;delete r.inputs.scale,delete r.inputs.weight_scale,delete r.inputs.weight_zero_point,r.opType==="QConv2D"&&(r.opType="Conv2D")}}static _normalizeConvWeightsForImageLayout(t){for(let r of t.nodes){if(r.opType!=="Conv2D")continue;let e=r.inputs.weight,c=r.inputs.input,s=r.outputs.out;if(!e||!e.buffer||!c||!s||e.shape.length!==4)continue;let n=r.params?.weight_layout||"HWIO";if(!(n==="HWIO"||n==="HWCM"))if(n==="OHWI"||n==="OIHW"){let[m,a,u,i]=e.shape,o=n==="OHWI"?a:u,f=n==="OHWI"?u:i,l=n==="OHWI"?i:a,_=e.buffer,d=new Float32Array(_.length);for(let g=0;g<m;g++)for(let b=0;b<o;b++)for(let h=0;h<f;h++)for(let v=0;v<l;v++)d[((b*f+h)*l+v)*m+g]=n==="OHWI"?_[((g*o+b)*f+h)*l+v]:_[((g*l+v)*o+b)*f+h];e.buffer=d,e.shape=[o,f,l,m],e.sizeBytes=d.length*4,r.params.weight_layout="HWIO"}else if(n==="1HWO"||n==="1HWM"){let[,m,a,u]=e.shape,i=c.shape[3],o=s.shape[3]/i;if(!Number.isInteger(o)||o<=0||i*o!==u)throw new Error(`[GraphLoader] Invalid depthwise Conv2D shape for node ${r.id}`);let f=e.buffer,l=new Float32Array(f.length);for(let _=0;_<m;_++)for(let d=0;d<a;d++)for(let g=0;g<i;g++)for(let b=0;b<o;b++)l[((_*a+d)*i+g)*o+b]=f[(_*a+d)*u+g*o+b];e.buffer=l,e.shape=[m,a,i,o],e.sizeBytes=l.length*4,r.params.weight_layout="HWCM"}else throw new Error(`[GraphLoader] Unsupported Conv2D weight_layout '${n}'. VolvoxAI uses NHWC/HWIO only.`)}}};var K=class{constructor(t){this.context=t,this.graph=null,this.compiledGraph=null,this.operands={},this.inputs=[],this.outputs=[]}async allocateGraph(t){this.graph=t,this.operands={},this.inputs=[],this.outputs=[];let r=new MLGraphBuilder(this.context),e=a=>{let u=a.length?a:[1];return{dataType:"float32",type:"float32",shape:u,dimensions:u}},c=new Set;for(let a of t.nodes)for(let u of Object.values(a.outputs))u&&u.name&&c.add(u.name);for(let a of t.tensors.values())a.isWeight&&a.buffer?(this.operands[a.name]=r.constant(e(a.shape),a.buffer),c.add(a.name)):c.has(a.name)||(this.inputs.push(a.name),this.operands[a.name]=r.input(a.name,e(a.shape)),c.add(a.name));let s=a=>((!a||!this.operands[a])&&(console.warn(`[WebNN] missing operand: ${a}`),this.operands[a]=r.constant(e([1]),new Float32Array([0]))),this.operands[a]),n=(a,u)=>a.inputs[u]?a.inputs[u].name:null;for(let a of t.nodes){let u=a.opType,i=Object.values(a.outputs)[0].name;try{if(u==="MatMul"||u==="Linear"||u==="Gemm"){let o=s(n(a,"input")||n(a,"a")),f=s(n(a,"weight")||n(a,"b")),l=a.wLayout==="dout"?r.gemm(o,f,{bTranspose:!0}):r.matmul(o,f);n(a,"bias")&&(l=r.add(l,s(n(a,"bias")))),this.operands[i]=l}else if(u==="Add")this.operands[i]=r.add(s(n(a,"a")||n(a,"input")),s(n(a,"b")));else if(u==="Mul")this.operands[i]=r.mul(s(n(a,"a")||n(a,"input")),s(n(a,"b")));else if(u==="ReLU")this.operands[i]=r.relu(s(n(a,"input")));else if(u==="GELU")this.operands[i]=r.gelu(s(n(a,"input")));else if(u==="SiLU"||u==="Swish"){let o=s(n(a,"input"));this.operands[i]=r.mul(o,r.sigmoid(o))}else if(u==="Sigmoid")this.operands[i]=r.sigmoid(s(n(a,"input")));else if(u==="Softmax")this.operands[i]=r.softmax(s(n(a,"input")));else if(u==="Reshape"||u==="Flatten"){let o=Object.values(a.outputs)[0].shape;this.operands[i]=r.reshape(s(n(a,"input")),o.length?o:[1])}else if(u==="LayerNorm"){let o=s(n(a,"input")),f=n(a,"weight")?s(n(a,"weight")):void 0,l=n(a,"bias")?s(n(a,"bias")):void 0,_=a.inputs.input.shape;this.operands[i]=r.layerNormalization(o,{axes:[_.length-1],scale:f,bias:l})}else if(u==="Conv2D")this.operands[i]=r.conv2d(s(n(a,"input")),s(n(a,"weight")),{bias:n(a,"bias")?s(n(a,"bias")):void 0,strides:a.params.stride,padding:a.params.padding,groups:a.params.groups||1});else if(u==="Embedding"){let o=r.cast(s(n(a,"input")),"int32");this.operands[i]=r.gather(s(n(a,"weight")),o,{axis:0})}else if(u==="SDPA"){let o=a.inputs.qkv,f=o.shape[1],l=Math.floor(o.shape[2]/3),_=a.params.heads||8,d=Math.floor(l/_),g=a.params.scale!==void 0?a.params.scale:1/Math.sqrt(d),b=r.reshape(s(n(a,"qkv")),[f,3*l]),h=r.slice(b,[0,0],[f,l]),v=r.slice(b,[0,l],[f,l]),x=r.slice(b,[0,2*l],[f,l]),y=A=>r.transpose(r.reshape(A,[f,_,d]),{permutation:[1,0,2]}),w=y(h),P=y(x),B=r.transpose(r.reshape(v,[f,_,d]),{permutation:[1,2,0]}),z=r.matmul(w,B);z=r.mul(z,r.constant(e([1]),new Float32Array([g])));let M=new Float32Array(f*f);for(let A=0;A<f;A++)for(let D=0;D<f;D++)M[A*f+D]=D<=A?0:-1e9;z=r.add(z,r.constant(e([f,f]),M));let q=r.softmax(z,2),T=r.matmul(q,P);T=r.transpose(T,{permutation:[1,0,2]}),this.operands[i]=r.reshape(T,[1,f,l])}else throw new Error(`Unsupported op in WebNNEngine: ${u}`)}catch(o){throw console.warn(`[WebNN] cannot map op ${u}: ${o.message}`),o}}let m={};for(let a of t.outputNames)this.operands[a]&&(m[a]=this.operands[a],this.outputs.push(a));return console.log("[WebNN] building graph, outputs:",this.outputs),this.compiledGraph=await r.build(m),console.log("[WebNN] graph compiled."),this}async execute(t){if(!this.compiledGraph)throw new Error("WebNN graph not compiled.");let r=this.context,e=a=>{let u=this.graph.tensors.get(a);return u?u.shape.reduce((i,o)=>i*o,1):1},c=a=>{let u=this.graph.tensors.get(a);return u&&u.shape.length?u.shape:[1]};if(typeof r.compute=="function"){let a={},u={};for(let i of this.inputs)a[i]=t[i]||new Float32Array(e(i));for(let i of this.outputs)u[i]=new Float32Array(e(i));return(await r.compute(this.compiledGraph,a,u)).outputs}let s={},n={};for(let a of this.inputs){let u=await r.createTensor({dataType:"float32",shape:c(a),dimensions:c(a),writable:!0});r.writeTensor(u,t[a]||new Float32Array(e(a))),s[a]=u}for(let a of this.outputs)n[a]=await r.createTensor({dataType:"float32",shape:c(a),dimensions:c(a),readable:!0});r.dispatch(this.compiledGraph,s,n);let m={};for(let a of this.outputs){let u=await r.readTensor(n[a]);m[a]=new Float32Array(u),n[a].destroy?.()}for(let a of this.inputs)s[a].destroy?.();return m}};var os=class p{constructor(){this.engines=[],this.weightsBaseUrl=null}static async init(t="auto",r="./volvoxai.wasm"){let e=new p,c={auto:["webnn","webgpu","wasm","cpu"],webnn:["webnn","wasm","cpu"],webgpu:["webgpu","wasm","cpu"],wasm:["wasm","cpu"],cpu:["cpu"]},s=new Set(["webnn","webgpu","wasm","cpu"]),n=Array.isArray(t),m=n?[...t]:c[t];if(!m||m.length===0)throw new Error(`[VolvoxAI] Invalid backend selection: ${JSON.stringify(t)}`);for(let u of m)if(!s.has(u))throw new Error(`[VolvoxAI] Unknown backend '${u}'. Use 'auto', 'webnn', 'webgpu', 'wasm', 'cpu', or an array of those backend names.`);let a=new Set;for(let u of m)if(!a.has(u))if(u==="webnn")if(typeof navigator<"u"&&navigator.ml)try{let i=await navigator.ml.createContext({deviceType:"npu"});console.log("[VolvoxAI] WebNN Engine (NPU) Initialized successfully."),e.engines.push({type:"webnn",engine:new K(i)}),a.add(u)}catch(i){console.warn("[VolvoxAI] WebNN initialization failed.",i.message)}else(n||t==="webnn")&&console.warn("[VolvoxAI] WebNN is not supported.");else if(u==="webgpu")if(typeof navigator<"u"&&navigator.gpu)try{let i=await navigator.gpu.requestAdapter();if(i){let o=await i.requestDevice();console.log("[VolvoxAI] WebGPU Engine Initialized successfully."),e.engines.push({type:"webgpu",device:o}),a.add(u)}else console.warn("[VolvoxAI] WebGPU adapter is not available.")}catch(i){console.warn("[VolvoxAI] WebGPU initialization failed.",i.message)}else(n||t==="webgpu")&&console.warn("[VolvoxAI] WebGPU is not supported.");else if(u==="wasm"){let i=await $.init(r);i?(console.log("[VolvoxAI] WASM Engine Initialized successfully."),e.engines.push({type:"wasm",engine:i}),a.add(u)):console.warn("[VolvoxAI] WASM initialization failed.")}else u==="cpu"&&(console.log("[VolvoxAI] Pure JS CPU Engine Initialized."),e.engines.push({type:"cpu",engine:new S}),a.add(u));if(e.engines.length===0)throw new Error(`[VolvoxAI] None of the requested backends initialized: ${m.join(", ")}`);return e}createGraph(){return new j}async loadGraph(t){let r=this.createGraph();return await H.load(r,t)}async compile(t,r){this.weightsBaseUrl=r,console.log(`[VolvoxAI] Compiling graph with ${t.nodes.length} nodes...`);for(let e of this.engines)try{if(e.type==="webgpu"){console.log("[VolvoxAI] Trying to allocate graph on WebGPU (Tier 2)...");let c=new V(e.device,t);return await c.compile(),console.log("[VolvoxAI] WebGPU Engine compiled successfully."),c}else return console.log(`[VolvoxAI] Trying to allocate graph on ${e.engine.constructor.name}...`),await e.engine.allocateGraph(t),console.log(`[VolvoxAI] ${e.engine.constructor.name} compiled successfully.`),e.engine}catch(c){console.warn(`[VolvoxAI] Compilation failed on ${e.type}. Falling back to next tier. Error: ${c.message}`)}throw new Error("[VolvoxAI] All engine tiers failed to compile the graph.")}};var ns=class{constructor(){this.vocabByText=new Map,this.vocabByLatin1=new Map,this.idToText=[],this.idToBytes=[],this.merges=new Map,this.mergeEnabled=!1,this.decoder=new TextDecoder("utf-8"),this.encoder=new TextEncoder,this.bpePattern=/'s|'t|'re|'ve|'m|'ll|'d| ?\p{L}+| ?\p{N}+| ?[^\s\p{L}\p{N}]+|\s+(?!\S)|\s+/gu}async load(t,r=null){try{/\.bin$/i.test(t)?await this.loadFromBinary(t):await this.loadFromJson(t),r&&await this.loadMerges(r)}catch(e){throw console.error("Tokenizer load error:",e),e}}resetVocab(){this.vocabByText.clear(),this.vocabByLatin1.clear(),this.idToText=[],this.idToBytes=[],this.merges.clear(),this.mergeEnabled=!1}async loadFromJson(t){let r=await fetch(t);if(!r.ok)throw new Error(`Failed to fetch vocab: ${r.statusText}`);let e=await r.json();this.resetVocab();for(let[c,s]of Object.entries(e)){let n=this.encoder.encode(c);this.vocabByText.set(c,s),this.vocabByLatin1.set(this.bytesToLatin1(n),s),this.idToText[s]=c,this.idToBytes[s]=n}console.log(`Loaded ${Object.keys(e).length} tokens from ${t}`)}async loadFromBinary(t){let r=await fetch(t);if(!r.ok)throw new Error(`Failed to fetch vocab.bin: ${r.statusText}`);let e=new Uint8Array(await r.arrayBuffer());if(e.length<4)throw new Error("Invalid vocab.bin");let c=new DataView(e.buffer,e.byteOffset,e.byteLength),s=c.getInt32(0,!0);this.resetVocab();let n=4;for(let m=0;m<s;m++){if(n+4>e.length)throw new Error(`vocab.bin truncated at token ${m}`);let a=c.getInt32(n,!0);if(n+=4,a<0||n+a>e.length)throw new Error(`vocab.bin malformed at token ${m}`);let u=e.slice(n,n+a);n+=a;let i=this.decoder.decode(u);this.vocabByText.set(i,m),this.vocabByLatin1.set(this.bytesToLatin1(u),m),this.idToText[m]=i,this.idToBytes[m]=u}console.log(`Loaded ${s} tokens from ${t}`)}async loadMerges(t){let r=await fetch(t);if(!r.ok)throw new Error(`Failed to fetch merges: ${r.statusText}`);let e=await r.text(),c=0;this.merges.clear();for(let s of e.split(/\r?\n/)){let n=s.trim();if(!n||n.startsWith("#"))continue;let m=n.split(/\s+/);if(m.length<2)continue;let a=this.normalizeMergeToken(m[0]),u=this.normalizeMergeToken(m[1]),i=this.findTokenByText(a),o=this.findTokenByText(u);if(i<0||o<0)continue;let f=`${this.idToText[i]}${this.idToText[o]}`,l=this.vocabByText.get(f);if(l===void 0)continue;let _=this.pairKey(i,o);this.merges.has(_)||this.merges.set(_,{rank:c++,mergedId:l})}this.mergeEnabled=this.merges.size>0,console.log(`Loaded ${this.merges.size} merge rules from ${t}`)}bytesToLatin1(t){let r="";for(let e=0;e<t.length;e++)r+=String.fromCharCode(t[e]);return r}utf8Len(t){return t<128?1:(t&224)===192?2:(t&240)===224?3:(t&248)===240?4:1}pairKey(t,r){return`${t},${r}`}normalizeMergeToken(t){return t.startsWith("\u0120")?` ${t.slice(1)}`:t}findTokenByText(t){let r=this.vocabByText.get(t);return r!==void 0?r:(r=this.vocabByLatin1.get(t),r===void 0?-1:r)}findTokenByBytes(t){let r=this.decoder.decode(t),e=this.vocabByText.get(r);return e!==void 0?e:(e=this.vocabByLatin1.get(this.bytesToLatin1(t)),e===void 0?-1:e)}decodeToken(t){let r=this.idToBytes[t];return r?this.decoder.decode(r).replace(/Ġ/g," "):""}decode(t){return t.map(r=>this.decodeToken(r)).join("")}encodeBpeWord(t,r){let e=this.encoder.encode(t);if(e.length===0||r<=0)return[];let c=[];for(let s=0;s<e.length;){let n=this.utf8Len(e[s]);s+n>e.length&&(n=e.length-s);let m=e.slice(s,s+n),a=this.findTokenByBytes(m);if(a>=0)c.push(a);else for(let u=0;u<n;u++){let i=this.findTokenByBytes(Uint8Array.of(e[s+u]));i>=0&&c.push(i)}s+=n}for(;c.length>1;){let s=-1,n=Number.MAX_SAFE_INTEGER,m=-1;for(let a=0;a<c.length-1;a++){let u=this.merges.get(this.pairKey(c[a],c[a+1]));u&&(u.rank>=n||u.mergedId<0||(s=a,n=u.rank,m=u.mergedId))}if(s<0)break;c[s]=m,c.splice(s+1,1)}return c.slice(0,r)}encodeGreedy(t,r){let e=this.encoder.encode(t),c=[],s=0;for(;s<e.length&&c.length<r;){let n=-1,m=0;for(let a=0;a<this.idToBytes.length;a++){let u=this.idToBytes[a];if(!u||u.length<=m||s+u.length>e.length)continue;let i=!0;for(let o=0;o<u.length;o++)if(e[s+o]!==u[o]){i=!1;break}i&&(n=a,m=u.length)}if(n<0){s++;continue}c.push(n),s+=m}return c}encode(t,r=256){if(r<=0)return[];if(this.vocabByText.size===0&&this.vocabByLatin1.size===0)return[];if(!this.mergeEnabled)return this.encodeGreedy(t,r);let e=[];for(let c of t.matchAll(this.bpePattern)){let s=c[0];if(!s||e.length>=r)continue;let n=r-e.length;if(n<=0)break;let m=this.encodeBpeWord(s,n);for(let a of m)e.push(a)}return e}};export{S as CPUEngine,j as Graph,V as GraphExecutor,H as GraphLoader,W as Tensor,ns as Tokenizer,os as VolvoxAI,$ as WasmEngine,C as _pair};
|