9bow commited on
Commit
181bba7
·
verified ·
1 Parent(s): 412c7f6

Add exaone4-fp32-int8-g32-release-token-major-v2-v4 (tiled prefill GEMM over the v3 bundle)

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. exaone4-fp32-int8-g32-release-token-major-v2-v4/entrypoints/prefill-16.json +0 -0
  2. exaone4-fp32-int8-g32-release-token-major-v2-v4/entrypoints/prefill-4.json +0 -0
  3. exaone4-fp32-int8-g32-release-token-major-v2-v4/entrypoints/prefill-64.json +0 -0
  4. exaone4-fp32-int8-g32-release-token-major-v2-v4/graph.json +0 -0
  5. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/004e921ad38af5420a00fa5fbba1919f15780198ddfe6df05a31ce667bcd84e2.wgsl +12 -0
  6. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/0112d93bb1aa347d8887ce1b95610a1a21fc8450ff8f59bcd37747fa6bf6fa52.wgsl +10 -0
  7. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/0337d8a473b6e485bd383533df7d373dbbfe7a5f3a982424004560b7213fbaa3.wgsl +11 -0
  8. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/036902bfb564d824fa22d0ba0d8ed16a5d58e362fa585035f488ba7b806cefea.wgsl +71 -0
  9. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/07cfabe2e2c2feff22a06c8296600e5ca21efb7444419f0a05e5ff6f48e0292d.wgsl +10 -0
  10. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/0b8815b1efe176d55ab08530c0a9e1913cf6c9ef3e773c574843573d237cf196.wgsl +10 -0
  11. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/0d3892883d1532d173a7dbe85d9ab1daa87f0d9b4923a535b8d2003f24f9500c.wgsl +11 -0
  12. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/0e2ba0d1849cd945e9b533bfc599a5664fa7909515c955681084ab8ad82f8755.wgsl +9 -0
  13. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/1024c1444e2cb17a211ebed96e18db764f1809d6e986d09e75f482ab4e61a07b.wgsl +71 -0
  14. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/133b3d1c9ddb9953a9d3cffa5e3bd5e837cf2474ec6641a311a54d911d958f6b.wgsl +9 -0
  15. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/1533ec909b782828ba90ded15ebe230c6f9dbfbeb74335606f979f2b56c58dbf.wgsl +9 -0
  16. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/18a66ec0875c456c9defd45d15e6ef0c148e64a1618e2825c7f96eadbbe8303a.wgsl +9 -0
  17. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/1a73b6fceda28f40bba4ae27a986ffa39842db94fa5903ea5bf689a7e854d4f3.wgsl +11 -0
  18. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/1ae471d3a9fd6a17efdb02ac9de0d56089b0df79cd834ba8d34f2417c400a51c.wgsl +83 -0
  19. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/1aec53ecf59335904944de2db37f0d3df64e3445556b40324ce611d4c9fcfc2c.wgsl +9 -0
  20. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/1c5b119286250e322ec8f75a46494057ed2485c4ce8ea081b4858aa5fbeadd0d.wgsl +9 -0
  21. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/1d3137ed94b2dd9113466681ea64a1e9a3086acbadc3c2e2a35f30dc42c67ad5.wgsl +9 -0
  22. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/1f75ad93914b4f5fa3bc44e3995f201125f28abea03eae845b3b829a6ee39b11.wgsl +13 -0
  23. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/224943172cdf191aa761ddce6dc4bc70265cda77a27b2a5fb69e9824a3dc494a.wgsl +71 -0
  24. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/2602f4b29f873a095f9c0b226b2bcc6f2379956c7469b7d2ee81722d97d06b36.wgsl +20 -0
  25. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/2790fbaffce918ef00d053c0f83f62375a0a4ac95aa9ec58cb066b2aee41d18a.wgsl +71 -0
  26. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/27a921d3b5edfdca227a99e1c3328959881c09acb02b12cd09d07d598745b2d3.wgsl +9 -0
  27. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/28119aa01122c42bd26ceb37129fe0c95b2a9192163f6dabd90fe058b1e14c54.wgsl +10 -0
  28. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/284513e54dd254e923b7a86bc5703879e3bfb119b6c71aa234ba744c2dc63615.wgsl +9 -0
  29. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/28c076a43a25e4705518eefb1c3a2699493c6d0a5734baa14532dfa4826ed566.wgsl +12 -0
  30. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/2b9e4b05ef5623d721dbe56b5812e551efcc6fd833d81064320e86fe94d8c670.wgsl +9 -0
  31. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/2c66dcac8fdd3caa9ff1e2441524070c21c24df9526bee44c49e765a8d4c8222.wgsl +9 -0
  32. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/2e1ce6ef01198780289fd4a35d8f86b5172595ed189cf931e8444091d49e8d3a.wgsl +9 -0
  33. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/30cb10d38275eecebb04ab10dc3246b7a30ff80578096f6efa538f30c602afb8.wgsl +41 -0
  34. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/3203e08f2c99fa4848f553739b7115a7c677840344f17b1d4391d6130517f5a7.wgsl +9 -0
  35. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/3241a118927e109c0dacbb278370abe70d099ee593a07cd023d4530b5fb8f833.wgsl +24 -0
  36. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/33e8ec04c66adb4988f562f0f9d3e92d29dfda91a56d0ed62be598c7c737f5ba.wgsl +9 -0
  37. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/37ce78f0b50bc59dc7b6dd62724d6ad3acfbfb73deae12446a4575f5688d8f34.wgsl +9 -0
  38. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/383d0ce2bbe657b6412b8e55e6b0cf06e385cb4efbe45019afff9357f2a77751.wgsl +11 -0
  39. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/39646bdfafd1ab0cb874474e3f1e9d79b57f10582a1804bc1d3762a492fec851.wgsl +10 -0
  40. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/3c2cd3f4326cc231268e80b83abfa0520c88c9763ba44fb16df8357610c0a301.wgsl +41 -0
  41. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/3e34409407100d4858c4c109cf62f3eaf2f4c6081166b0ec8679105e6dfbe7fe.wgsl +10 -0
  42. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/402b4fbc568183c6fd53e1541bbe6f09d8bb4d70293eb96576db5f0d013d035d.wgsl +83 -0
  43. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/40f115c8647a238bfb3ccb0bb8446bccdc94a0dfadc89111c4920efb2259f41d.wgsl +10 -0
  44. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/431a95359c9c41766af53351f3074089c052c44df79b9d1d08205d8e58e90d25.wgsl +13 -0
  45. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/44745cf68171fb657debd4b4fdd15edcd4d5798e18aedc4314d0cb1249948808.wgsl +20 -0
  46. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/453668cbe741eb27e2cc10194eca66f514a3763d97b46c1733c376986defc322.wgsl +24 -0
  47. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/45b47a1eff94975353fa58c943de182aa0da352efeb23f477ba2c69b8fc52b70.wgsl +12 -0
  48. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/45c3c3f9ae14f5837bb0cfc8cf8ce189010dba8f3b03d640b18883fc1367207b.wgsl +71 -0
  49. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/483857d2d9929bc07cd14940dc3bca97abcf9485ce1c805a234d2db4110a7010.wgsl +10 -0
  50. exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/4ec7950cea0e4257dc30630582df36a6127ce61794f46012db6ad0c0b1ea8380.wgsl +24 -0
exaone4-fp32-int8-g32-release-token-major-v2-v4/entrypoints/prefill-16.json ADDED
The diff for this file is too large to render. See raw diff
 
exaone4-fp32-int8-g32-release-token-major-v2-v4/entrypoints/prefill-4.json ADDED
The diff for this file is too large to render. See raw diff
 
exaone4-fp32-int8-g32-release-token-major-v2-v4/entrypoints/prefill-64.json ADDED
The diff for this file is too large to render. See raw diff
 
exaone4-fp32-int8-g32-release-token-major-v2-v4/graph.json ADDED
The diff for this file is too large to render. See raw diff
 
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/004e921ad38af5420a00fa5fbba1919f15780198ddfe6df05a31ce667bcd84e2.wgsl ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read> b1: array<f32>;
3
+ @group(0) @binding(2) var<storage, read_write> out: array<f32>;
4
+
5
+ @compute @workgroup_size(64)
6
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
7
+ let i = gid.x + gid.y * 4194240u;
8
+ if (i >= 6553600u) { return; }
9
+ let coord = (i / 1u) % 102400u;
10
+ if (coord >= 0u && coord < 65536u) { out[i] = f32(b0[(i / 102400u) * 65536u + (coord - 0u) * 1u + i % 1u]); }
11
+ if (coord >= 65536u && coord < 102400u) { out[i] = f32(b1[(i / 102400u) * 36864u + (coord - 65536u) * 1u + i % 1u]); }
12
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/0112d93bb1aa347d8887ce1b95610a1a21fc8450ff8f59bcd37747fa6bf6fa52.wgsl ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read> b1: array<f32>;
3
+ @group(0) @binding(2) var<storage, read_write> out: array<f32>;
4
+
5
+ @compute @workgroup_size(64)
6
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
7
+ let i = gid.x + gid.y * 2048u;
8
+ if (i >= 2048u) { return; }
9
+ out[i] = f32(f32(b0[i]) + (f32(b1[i]) * 1.0));
10
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/0337d8a473b6e485bd383533df7d373dbbfe7a5f3a982424004560b7213fbaa3.wgsl ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read_write> out: array<f32>;
3
+
4
+ @compute @workgroup_size(64)
5
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
6
+ let i = gid.x + gid.y * 4096u;
7
+ if (i >= 4096u) { return; }
8
+ let coord = (i / 1u) % 64u;
9
+ if (coord >= 0u && coord < 32u) { out[i] = f32(b0[(i / 64u) * 32u + (coord - 0u) * 1u + i % 1u]); }
10
+ if (coord >= 32u && coord < 64u) { out[i] = f32(b0[(i / 64u) * 32u + (coord - 32u) * 1u + i % 1u]); }
11
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/036902bfb564d824fa22d0ba0d8ed16a5d58e362fa585035f488ba7b806cefea.wgsl ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read> b1: array<u32>;
3
+ @group(0) @binding(2) var<storage, read> b2: array<f32>;
4
+ @group(0) @binding(3) var<storage, read_write> out: array<f32>;
5
+ fn dequant_1(index: u32) -> f32 {
6
+ let row = index / 2048u;
7
+ let col = index % 2048u;
8
+ let word = b1[row * 512u + col / 4u];
9
+ let code = i32((word >> ((col % 4u) * 8u)) & 255u) - 128;
10
+ return f32(code) * b2[row * 64u + col / 32u];
11
+ }
12
+
13
+ var<workgroup> tile_a: array<array<f32, 16>, 16>;
14
+ var<workgroup> tile_b: array<array<f32, 64>, 16>;
15
+ @compute @workgroup_size(16, 16)
16
+ fn main(@builtin(workgroup_id) group: vec3<u32>, @builtin(local_invocation_id) local: vec3<u32>) {
17
+ let lane = local.y * 16u + local.x;
18
+ let batch = group.z;
19
+ let tile_n = group.x * 64u;
20
+ let tile_row = group.y * 16u;
21
+ var acc: array<array<f32, 4>, 1>;
22
+ for (var k0 = 0u; k0 < 2048u; k0 += 16u) {
23
+ for (var e = 0u; e < 1u; e++) {
24
+ let flat = lane + e * 256u;
25
+ let m_local = flat / 16u;
26
+ let row = tile_row + m_local;
27
+ let col = k0 + flat % 16u;
28
+ var value = 0.0;
29
+ if (row < 4u && col < 2048u) { value = f32(f32(b0[(batch * 4u + row) * 2048u + col])); }
30
+ tile_a[m_local][flat % 16u] = value;
31
+ }
32
+ if (lane < 256u) {
33
+ let n_local = lane / 4u;
34
+ let word_local = lane % 4u;
35
+ let n_index = tile_n + n_local;
36
+ let first = k0 + word_local * 4u;
37
+ var word = 0u;
38
+ var scale = 0.0;
39
+ if (n_index < 512u && first < 2048u) {
40
+ word = b1[n_index * 512u + first / 4u];
41
+ scale = f32(b2[n_index * 64u + first / 32u]);
42
+ }
43
+ for (var e = 0u; e < 4u; e++) {
44
+ let code = i32((word >> (e * 8u)) & 255u) - 128;
45
+ var value = 0.0;
46
+ if (first + e < 2048u) { value = f32(code) * scale; }
47
+ tile_b[word_local * 4u + e][n_local] = value;
48
+ }
49
+ }
50
+ workgroupBarrier();
51
+ for (var kk = 0u; kk < 16u; kk++) {
52
+ var b_values: array<f32, 4>;
53
+ for (var c = 0u; c < 4u; c++) { b_values[c] = tile_b[kk][local.x * 4u + c]; }
54
+ for (var r = 0u; r < 1u; r++) {
55
+ let a_value = tile_a[local.y * 1u + r][kk];
56
+ for (var c = 0u; c < 4u; c++) { acc[r][c] += a_value * b_values[c]; }
57
+ }
58
+ }
59
+ workgroupBarrier();
60
+ }
61
+ for (var r = 0u; r < 1u; r++) {
62
+ let out_row = tile_row + local.y * 1u + r;
63
+ for (var c = 0u; c < 4u; c++) {
64
+ let out_col = tile_n + local.x * 4u + c;
65
+ if (out_row < 4u && out_col < 512u) {
66
+ let i = (batch * 4u + out_row) * 512u + out_col;
67
+ out[i] = f32(acc[r][c] + 0.0);
68
+ }
69
+ }
70
+ }
71
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/07cfabe2e2c2feff22a06c8296600e5ca21efb7444419f0a05e5ff6f48e0292d.wgsl ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read_write> out: array<f32>;
3
+
4
+ @compute @workgroup_size(64)
5
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
6
+ let i = gid.x + gid.y * 1024u;
7
+ if (i >= 1024u) { return; }
8
+ let x = f32(b0[i]);
9
+ out[i] = f32(-x);
10
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/0b8815b1efe176d55ab08530c0a9e1913cf6c9ef3e773c574843573d237cf196.wgsl ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read_write> out: array<f32>;
3
+
4
+ @compute @workgroup_size(64)
5
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
6
+ let i = gid.x + gid.y * 256u;
7
+ if (i >= 256u) { return; }
8
+ let x = f32(b0[i]);
9
+ out[i] = f32(sin(x));
10
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/0d3892883d1532d173a7dbe85d9ab1daa87f0d9b4923a535b8d2003f24f9500c.wgsl ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read_write> out: array<f32>;
3
+
4
+ @compute @workgroup_size(64)
5
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
6
+ let i = gid.x + gid.y * 256u;
7
+ if (i >= 256u) { return; }
8
+ let coord = (i / 1u) % 64u;
9
+ if (coord >= 0u && coord < 32u) { out[i] = f32(b0[(i / 64u) * 32u + (coord - 0u) * 1u + i % 1u]); }
10
+ if (coord >= 32u && coord < 64u) { out[i] = f32(b0[(i / 64u) * 32u + (coord - 32u) * 1u + i % 1u]); }
11
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/0e2ba0d1849cd945e9b533bfc599a5664fa7909515c955681084ab8ad82f8755.wgsl ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read_write> out: array<f32>;
3
+
4
+ @compute @workgroup_size(64)
5
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
6
+ let i = gid.x + gid.y * 512u;
7
+ if (i >= 512u) { return; }
8
+ out[i] = f32(b0[((i / 512u) % 1u) * 512u + ((i / 64u) % 8u) * 64u + ((i / 64u) % 1u) * 512u + ((i / 1u) % 64u) * 1u]);
9
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/1024c1444e2cb17a211ebed96e18db764f1809d6e986d09e75f482ab4e61a07b.wgsl ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read> b1: array<u32>;
3
+ @group(0) @binding(2) var<storage, read> b2: array<f32>;
4
+ @group(0) @binding(3) var<storage, read_write> out: array<f32>;
5
+ fn dequant_1(index: u32) -> f32 {
6
+ let row = index / 2048u;
7
+ let col = index % 2048u;
8
+ let word = b1[row * 512u + col / 4u];
9
+ let code = i32((word >> ((col % 4u) * 8u)) & 255u) - 128;
10
+ return f32(code) * b2[row * 64u + col / 32u];
11
+ }
12
+
13
+ var<workgroup> tile_a: array<array<f32, 16>, 16>;
14
+ var<workgroup> tile_b: array<array<f32, 64>, 16>;
15
+ @compute @workgroup_size(16, 16)
16
+ fn main(@builtin(workgroup_id) group: vec3<u32>, @builtin(local_invocation_id) local: vec3<u32>) {
17
+ let lane = local.y * 16u + local.x;
18
+ let batch = group.z;
19
+ let tile_n = group.x * 64u;
20
+ let tile_row = group.y * 16u;
21
+ var acc: array<array<f32, 4>, 1>;
22
+ for (var k0 = 0u; k0 < 2048u; k0 += 16u) {
23
+ for (var e = 0u; e < 1u; e++) {
24
+ let flat = lane + e * 256u;
25
+ let m_local = flat / 16u;
26
+ let row = tile_row + m_local;
27
+ let col = k0 + flat % 16u;
28
+ var value = 0.0;
29
+ if (row < 16u && col < 2048u) { value = f32(f32(b0[(batch * 16u + row) * 2048u + col])); }
30
+ tile_a[m_local][flat % 16u] = value;
31
+ }
32
+ if (lane < 256u) {
33
+ let n_local = lane / 4u;
34
+ let word_local = lane % 4u;
35
+ let n_index = tile_n + n_local;
36
+ let first = k0 + word_local * 4u;
37
+ var word = 0u;
38
+ var scale = 0.0;
39
+ if (n_index < 2048u && first < 2048u) {
40
+ word = b1[n_index * 512u + first / 4u];
41
+ scale = f32(b2[n_index * 64u + first / 32u]);
42
+ }
43
+ for (var e = 0u; e < 4u; e++) {
44
+ let code = i32((word >> (e * 8u)) & 255u) - 128;
45
+ var value = 0.0;
46
+ if (first + e < 2048u) { value = f32(code) * scale; }
47
+ tile_b[word_local * 4u + e][n_local] = value;
48
+ }
49
+ }
50
+ workgroupBarrier();
51
+ for (var kk = 0u; kk < 16u; kk++) {
52
+ var b_values: array<f32, 4>;
53
+ for (var c = 0u; c < 4u; c++) { b_values[c] = tile_b[kk][local.x * 4u + c]; }
54
+ for (var r = 0u; r < 1u; r++) {
55
+ let a_value = tile_a[local.y * 1u + r][kk];
56
+ for (var c = 0u; c < 4u; c++) { acc[r][c] += a_value * b_values[c]; }
57
+ }
58
+ }
59
+ workgroupBarrier();
60
+ }
61
+ for (var r = 0u; r < 1u; r++) {
62
+ let out_row = tile_row + local.y * 1u + r;
63
+ for (var c = 0u; c < 4u; c++) {
64
+ let out_col = tile_n + local.x * 4u + c;
65
+ if (out_row < 16u && out_col < 2048u) {
66
+ let i = (batch * 16u + out_row) * 2048u + out_col;
67
+ out[i] = f32(acc[r][c] + 0.0);
68
+ }
69
+ }
70
+ }
71
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/133b3d1c9ddb9953a9d3cffa5e3bd5e837cf2474ec6641a311a54d911d958f6b.wgsl ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read_write> out: array<f32>;
3
+
4
+ @compute @workgroup_size(64)
5
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
6
+ let i = gid.x + gid.y * 65536u;
7
+ if (i >= 65536u) { return; }
8
+ out[i] = f32(b0[((i / 65536u) % 1u) * 131072u + ((i / 2048u) % 32u) * 4096u + ((i / 32u) % 64u) * 64u + (((i / 1u) % 32u) * 1u + 32u) * 1u]);
9
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/1533ec909b782828ba90ded15ebe230c6f9dbfbeb74335606f979f2b56c58dbf.wgsl ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read_write> out: array<f32>;
3
+
4
+ @compute @workgroup_size(64)
5
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
6
+ let i = gid.x + gid.y * 1024u;
7
+ if (i >= 1024u) { return; }
8
+ out[i] = f32(b0[((i / 1024u) % 1u) * 2048u + ((i / 32u) % 32u) * 64u + ((i / 32u) % 1u) * 64u + (((i / 1u) % 32u) * 1u + 0u) * 1u]);
9
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/18a66ec0875c456c9defd45d15e6ef0c148e64a1618e2825c7f96eadbbe8303a.wgsl ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<i32>;
2
+ @group(0) @binding(1) var<storage, read_write> out: array<i32>;
3
+
4
+ @compute @workgroup_size(64)
5
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
6
+ let i = gid.x + gid.y * 64u;
7
+ if (i >= 16u) { return; }
8
+ out[i] = i32(b0[i]);
9
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/1a73b6fceda28f40bba4ae27a986ffa39842db94fa5903ea5bf689a7e854d4f3.wgsl ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read_write> out: array<f32>;
3
+
4
+ @compute @workgroup_size(64)
5
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
6
+ let i = gid.x + gid.y * 1024u;
7
+ if (i >= 1024u) { return; }
8
+ let coord = (i / 1u) % 64u;
9
+ if (coord >= 0u && coord < 32u) { out[i] = f32(b0[(i / 64u) * 32u + (coord - 0u) * 1u + i % 1u]); }
10
+ if (coord >= 32u && coord < 64u) { out[i] = f32(b0[(i / 64u) * 32u + (coord - 32u) * 1u + i % 1u]); }
11
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/1ae471d3a9fd6a17efdb02ac9de0d56089b0df79cd834ba8d34f2417c400a51c.wgsl ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read> b1: array<f32>;
3
+ @group(0) @binding(2) var<storage, read> b2: array<f32>;
4
+ @group(0) @binding(3) var<storage, read> b3: array<f32>;
5
+ @group(0) @binding(4) var<storage, read_write> out: array<f32>;
6
+
7
+ var<workgroup> q_row: array<f32, 64>;
8
+ var<workgroup> scores: array<f32, 1024>;
9
+ var<workgroup> partial: array<f32, 64>;
10
+ @compute @workgroup_size(64)
11
+ fn main(@builtin(workgroup_id) group: vec3<u32>, @builtin(local_invocation_id) local: vec3<u32>) {
12
+ let lane = local.x;
13
+ let head = group.x / 4u;
14
+ let row = group.x % 4u;
15
+ let kv_head = head / 4u;
16
+ for (var d = lane; d < 64u; d += 64u) { q_row[d] = f32(b0[(head * 4u + row) * 64u + d]); }
17
+ workgroupBarrier();
18
+ var running_max = -3.4028234663852886e38;
19
+ var running_sum = 0.0;
20
+ var acc: array<f32, 1>;
21
+ for (var start = 0u; start < 4096u; start += 1024u) {
22
+ let count = min(1024u, 4096u - start);
23
+ var tile_max = -3.4028234663852886e38;
24
+ for (var t = lane; t < count; t += 64u) {
25
+ let j = start + t;
26
+ var score = -3.4028234663852886e38;
27
+ if (f32(b3[row * 4096u + j]) > -1000.0) {
28
+ var dot = 0.0;
29
+ for (var d = 0u; d < 64u; d++) { dot += q_row[d] * f32(b1[(((kv_head * 4096u + j) * 64u + d) / 64u) % 4096u * 512u + (((kv_head * 4096u + j) * 64u + d) / 262144u) % 8u * 64u + (((kv_head * 4096u + j) * 64u + d) / 1u) % 64u * 1u]); }
30
+ score = dot * 0.125 + f32(b3[row * 4096u + j]);
31
+ }
32
+ scores[t] = score;
33
+ tile_max = max(tile_max, score);
34
+ }
35
+ partial[lane] = tile_max;
36
+ workgroupBarrier();
37
+ for (var stride = 32u; stride > 0u; stride /= 2u) {
38
+ if (lane < stride) { partial[lane] = max(partial[lane], partial[lane + stride]); }
39
+ workgroupBarrier();
40
+ }
41
+ let next_max = max(running_max, partial[0]);
42
+ workgroupBarrier();
43
+ var tile_sum = 0.0;
44
+ for (var t = lane; t < count; t += 64u) {
45
+ var p = 0.0;
46
+ if (scores[t] > -3.0e38) { p = exp(scores[t] - next_max); }
47
+ scores[t] = p;
48
+ tile_sum += p;
49
+ }
50
+ partial[lane] = tile_sum;
51
+ workgroupBarrier();
52
+ for (var stride = 32u; stride > 0u; stride /= 2u) {
53
+ if (lane < stride) { partial[lane] += partial[lane + stride]; }
54
+ workgroupBarrier();
55
+ }
56
+ var correction = 0.0;
57
+ if (running_max > -3.0e38) { correction = exp(running_max - next_max); }
58
+ running_sum = running_sum * correction + partial[0];
59
+ running_max = next_max;
60
+ for (var c = 0u; c < 1u; c++) {
61
+ let d = lane + c * 64u;
62
+ var total = acc[c] * correction;
63
+ if (d < 64u) {
64
+ for (var t = 0u; t < count; t++) {
65
+ let p = scores[t];
66
+ if (p != 0.0) {
67
+ let j = start + t;
68
+ total += p * f32(b2[(((kv_head * 4096u + j) * 64u + d) / 64u) % 4096u * 512u + (((kv_head * 4096u + j) * 64u + d) / 262144u) % 8u * 64u + (((kv_head * 4096u + j) * 64u + d) / 1u) % 64u * 1u]);
69
+ }
70
+ }
71
+ }
72
+ acc[c] = total;
73
+ }
74
+ workgroupBarrier();
75
+ }
76
+ for (var c = 0u; c < 1u; c++) {
77
+ let d = lane + c * 64u;
78
+ if (d < 64u) {
79
+ let i = (head * 4u + row) * 64u + d;
80
+ out[i] = f32(acc[c] / running_sum);
81
+ }
82
+ }
83
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/1aec53ecf59335904944de2db37f0d3df64e3445556b40324ce611d4c9fcfc2c.wgsl ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read_write> out: array<f32>;
3
+
4
+ @compute @workgroup_size(64)
5
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
6
+ let i = gid.x + gid.y * 1024u;
7
+ if (i >= 1024u) { return; }
8
+ out[i] = f32(b0[((i / 1024u) % 1u) * 2048u + ((i / 32u) % 32u) * 64u + ((i / 32u) % 1u) * 64u + (((i / 1u) % 32u) * 1u + 32u) * 1u]);
9
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/1c5b119286250e322ec8f75a46494057ed2485c4ce8ea081b4858aa5fbeadd0d.wgsl ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read_write> out: array<f32>;
3
+
4
+ @compute @workgroup_size(64)
5
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
6
+ let i = gid.x + gid.y * 4096u;
7
+ if (i >= 4096u) { return; }
8
+ out[i] = f32(b0[((i / 4096u) % 1u) * 8192u + ((i / 128u) % 32u) * 256u + ((i / 32u) % 4u) * 64u + (((i / 1u) % 32u) * 1u + 32u) * 1u]);
9
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/1d3137ed94b2dd9113466681ea64a1e9a3086acbadc3c2e2a35f30dc42c67ad5.wgsl ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read_write> out: array<f32>;
3
+
4
+ @compute @workgroup_size(64)
5
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
6
+ let i = gid.x + gid.y * 4096u;
7
+ if (i >= 4096u) { return; }
8
+ out[i] = f32(b0[((i / 4096u) % 1u) * 8192u + ((i / 128u) % 32u) * 256u + ((i / 32u) % 4u) * 64u + (((i / 1u) % 32u) * 1u + 0u) * 1u]);
9
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/1f75ad93914b4f5fa3bc44e3995f201125f28abea03eae845b3b829a6ee39b11.wgsl ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read> b1: array<i32>;
3
+ @group(0) @binding(2) var<storage, read_write> out: array<f32>;
4
+
5
+ @compute @workgroup_size(64)
6
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
7
+ let i = gid.x + gid.y * 8192u;
8
+ if (i >= 8192u) { return; }
9
+ let token = (i / 64u) % 16u;
10
+ let outer = i / 1024u;
11
+ let destination = outer * 262144u + u32(b1[token]) * 64u + i % 64u;
12
+ out[((destination) / 64u) % 4096u * 512u + ((destination) / 262144u) % 8u * 64u + ((destination) / 1u) % 64u * 1u] = f32(b0[i]);
13
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/224943172cdf191aa761ddce6dc4bc70265cda77a27b2a5fb69e9824a3dc494a.wgsl ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read> b1: array<u32>;
3
+ @group(0) @binding(2) var<storage, read> b2: array<f32>;
4
+ @group(0) @binding(3) var<storage, read_write> out: array<f32>;
5
+ fn dequant_1(index: u32) -> f32 {
6
+ let row = index / 4096u;
7
+ let col = index % 4096u;
8
+ let word = b1[row * 1024u + col / 4u];
9
+ let code = i32((word >> ((col % 4u) * 8u)) & 255u) - 128;
10
+ return f32(code) * b2[row * 128u + col / 32u];
11
+ }
12
+
13
+ var<workgroup> tile_a: array<array<f32, 16>, 16>;
14
+ var<workgroup> tile_b: array<array<f32, 64>, 16>;
15
+ @compute @workgroup_size(16, 16)
16
+ fn main(@builtin(workgroup_id) group: vec3<u32>, @builtin(local_invocation_id) local: vec3<u32>) {
17
+ let lane = local.y * 16u + local.x;
18
+ let batch = group.z;
19
+ let tile_n = group.x * 64u;
20
+ let tile_row = group.y * 16u;
21
+ var acc: array<array<f32, 4>, 1>;
22
+ for (var k0 = 0u; k0 < 4096u; k0 += 16u) {
23
+ for (var e = 0u; e < 1u; e++) {
24
+ let flat = lane + e * 256u;
25
+ let m_local = flat / 16u;
26
+ let row = tile_row + m_local;
27
+ let col = k0 + flat % 16u;
28
+ var value = 0.0;
29
+ if (row < 16u && col < 4096u) { value = f32(f32(b0[(batch * 16u + row) * 4096u + col])); }
30
+ tile_a[m_local][flat % 16u] = value;
31
+ }
32
+ if (lane < 256u) {
33
+ let n_local = lane / 4u;
34
+ let word_local = lane % 4u;
35
+ let n_index = tile_n + n_local;
36
+ let first = k0 + word_local * 4u;
37
+ var word = 0u;
38
+ var scale = 0.0;
39
+ if (n_index < 2048u && first < 4096u) {
40
+ word = b1[n_index * 1024u + first / 4u];
41
+ scale = f32(b2[n_index * 128u + first / 32u]);
42
+ }
43
+ for (var e = 0u; e < 4u; e++) {
44
+ let code = i32((word >> (e * 8u)) & 255u) - 128;
45
+ var value = 0.0;
46
+ if (first + e < 4096u) { value = f32(code) * scale; }
47
+ tile_b[word_local * 4u + e][n_local] = value;
48
+ }
49
+ }
50
+ workgroupBarrier();
51
+ for (var kk = 0u; kk < 16u; kk++) {
52
+ var b_values: array<f32, 4>;
53
+ for (var c = 0u; c < 4u; c++) { b_values[c] = tile_b[kk][local.x * 4u + c]; }
54
+ for (var r = 0u; r < 1u; r++) {
55
+ let a_value = tile_a[local.y * 1u + r][kk];
56
+ for (var c = 0u; c < 4u; c++) { acc[r][c] += a_value * b_values[c]; }
57
+ }
58
+ }
59
+ workgroupBarrier();
60
+ }
61
+ for (var r = 0u; r < 1u; r++) {
62
+ let out_row = tile_row + local.y * 1u + r;
63
+ for (var c = 0u; c < 4u; c++) {
64
+ let out_col = tile_n + local.x * 4u + c;
65
+ if (out_row < 16u && out_col < 2048u) {
66
+ let i = (batch * 16u + out_row) * 2048u + out_col;
67
+ out[i] = f32(acc[r][c] + 0.0);
68
+ }
69
+ }
70
+ }
71
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/2602f4b29f873a095f9c0b226b2bcc6f2379956c7469b7d2ee81722d97d06b36.wgsl ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<i32>;
2
+ @group(0) @binding(1) var<storage, read> b1: array<u32>;
3
+ @group(0) @binding(2) var<storage, read> b2: array<f32>;
4
+ @group(0) @binding(3) var<storage, read_write> out: array<f32>;
5
+ fn dequant_1(index: u32) -> f32 {
6
+ let row = index / 2048u;
7
+ let col = index % 2048u;
8
+ let word = b1[row * 512u + col / 4u];
9
+ let code = i32((word >> ((col % 4u) * 8u)) & 255u) - 128;
10
+ return f32(code) * b2[row * 64u + col / 32u];
11
+ }
12
+
13
+ @compute @workgroup_size(64)
14
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
15
+ let i = gid.x + gid.y * 131072u;
16
+ if (i >= 131072u) { return; }
17
+ let token = i32(b0[i / 2048u]);
18
+ if (token < 65536 || token >= 102400) { out[i] = f32(0.0); return; }
19
+ out[i] = f32(dequant_1(u32(token - 65536) * 2048u + i % 2048u));
20
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/2790fbaffce918ef00d053c0f83f62375a0a4ac95aa9ec58cb066b2aee41d18a.wgsl ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read> b1: array<u32>;
3
+ @group(0) @binding(2) var<storage, read> b2: array<f32>;
4
+ @group(0) @binding(3) var<storage, read_write> out: array<f32>;
5
+ fn dequant_1(index: u32) -> f32 {
6
+ let row = index / 2048u;
7
+ let col = index % 2048u;
8
+ let word = b1[row * 512u + col / 4u];
9
+ let code = i32((word >> ((col % 4u) * 8u)) & 255u) - 128;
10
+ return f32(code) * b2[row * 64u + col / 32u];
11
+ }
12
+
13
+ var<workgroup> tile_a: array<array<f32, 16>, 16>;
14
+ var<workgroup> tile_b: array<array<f32, 64>, 16>;
15
+ @compute @workgroup_size(16, 16)
16
+ fn main(@builtin(workgroup_id) group: vec3<u32>, @builtin(local_invocation_id) local: vec3<u32>) {
17
+ let lane = local.y * 16u + local.x;
18
+ let batch = group.z;
19
+ let tile_n = group.x * 64u;
20
+ let tile_row = group.y * 16u;
21
+ var acc: array<array<f32, 4>, 1>;
22
+ for (var k0 = 0u; k0 < 2048u; k0 += 16u) {
23
+ for (var e = 0u; e < 1u; e++) {
24
+ let flat = lane + e * 256u;
25
+ let m_local = flat / 16u;
26
+ let row = tile_row + m_local;
27
+ let col = k0 + flat % 16u;
28
+ var value = 0.0;
29
+ if (row < 16u && col < 2048u) { value = f32(f32(b0[(batch * 16u + row) * 2048u + col])); }
30
+ tile_a[m_local][flat % 16u] = value;
31
+ }
32
+ if (lane < 256u) {
33
+ let n_local = lane / 4u;
34
+ let word_local = lane % 4u;
35
+ let n_index = tile_n + n_local;
36
+ let first = k0 + word_local * 4u;
37
+ var word = 0u;
38
+ var scale = 0.0;
39
+ if (n_index < 512u && first < 2048u) {
40
+ word = b1[n_index * 512u + first / 4u];
41
+ scale = f32(b2[n_index * 64u + first / 32u]);
42
+ }
43
+ for (var e = 0u; e < 4u; e++) {
44
+ let code = i32((word >> (e * 8u)) & 255u) - 128;
45
+ var value = 0.0;
46
+ if (first + e < 2048u) { value = f32(code) * scale; }
47
+ tile_b[word_local * 4u + e][n_local] = value;
48
+ }
49
+ }
50
+ workgroupBarrier();
51
+ for (var kk = 0u; kk < 16u; kk++) {
52
+ var b_values: array<f32, 4>;
53
+ for (var c = 0u; c < 4u; c++) { b_values[c] = tile_b[kk][local.x * 4u + c]; }
54
+ for (var r = 0u; r < 1u; r++) {
55
+ let a_value = tile_a[local.y * 1u + r][kk];
56
+ for (var c = 0u; c < 4u; c++) { acc[r][c] += a_value * b_values[c]; }
57
+ }
58
+ }
59
+ workgroupBarrier();
60
+ }
61
+ for (var r = 0u; r < 1u; r++) {
62
+ let out_row = tile_row + local.y * 1u + r;
63
+ for (var c = 0u; c < 4u; c++) {
64
+ let out_col = tile_n + local.x * 4u + c;
65
+ if (out_row < 16u && out_col < 512u) {
66
+ let i = (batch * 16u + out_row) * 512u + out_col;
67
+ out[i] = f32(acc[r][c] + 0.0);
68
+ }
69
+ }
70
+ }
71
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/27a921d3b5edfdca227a99e1c3328959881c09acb02b12cd09d07d598745b2d3.wgsl ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<i32>;
2
+ @group(0) @binding(1) var<storage, read_write> out: array<f32>;
3
+
4
+ @compute @workgroup_size(64)
5
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
6
+ let i = gid.x + gid.y * 64u;
7
+ if (i >= 1u) { return; }
8
+ out[i] = f32(b0[i]);
9
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/28119aa01122c42bd26ceb37129fe0c95b2a9192163f6dabd90fe058b1e14c54.wgsl ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read_write> out: array<f32>;
3
+
4
+ @compute @workgroup_size(64)
5
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
6
+ let i = gid.x + gid.y * 4096u;
7
+ if (i >= 4096u) { return; }
8
+ let x = f32(b0[i]);
9
+ out[i] = f32(sin(x));
10
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/284513e54dd254e923b7a86bc5703879e3bfb119b6c71aa234ba744c2dc63615.wgsl ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read_write> out: array<f32>;
3
+
4
+ @compute @workgroup_size(64)
5
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
6
+ let i = gid.x + gid.y * 2048u;
7
+ if (i >= 2048u) { return; }
8
+ out[i] = f32(b0[((i / 2048u) % 1u) * 2048u + ((i / 32u) % 64u) * 1u + ((i / 1u) % 32u) * 64u]);
9
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/28c076a43a25e4705518eefb1c3a2699493c6d0a5734baa14532dfa4826ed566.wgsl ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read> b1: array<f32>;
3
+ @group(0) @binding(2) var<storage, read_write> out: array<f32>;
4
+
5
+ @compute @workgroup_size(64)
6
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
7
+ let i = gid.x + gid.y * 102400u;
8
+ if (i >= 102400u) { return; }
9
+ let coord = (i / 1u) % 102400u;
10
+ if (coord >= 0u && coord < 65536u) { out[i] = f32(b0[(i / 102400u) * 65536u + (coord - 0u) * 1u + i % 1u]); }
11
+ if (coord >= 65536u && coord < 102400u) { out[i] = f32(b1[(i / 102400u) * 36864u + (coord - 65536u) * 1u + i % 1u]); }
12
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/2b9e4b05ef5623d721dbe56b5812e551efcc6fd833d81064320e86fe94d8c670.wgsl ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read_write> out: array<f32>;
3
+
4
+ @compute @workgroup_size(64)
5
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
6
+ let i = gid.x + gid.y * 4096u;
7
+ if (i >= 4096u) { return; }
8
+ out[i] = f32(f32(b0[i]) * 1.0);
9
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/2c66dcac8fdd3caa9ff1e2441524070c21c24df9526bee44c49e765a8d4c8222.wgsl ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read_write> out: array<f32>;
3
+
4
+ @compute @workgroup_size(64)
5
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
6
+ let i = gid.x + gid.y * 16384u;
7
+ if (i >= 16384u) { return; }
8
+ out[i] = f32(b0[((i / 16384u) % 1u) * 32768u + ((i / 2048u) % 8u) * 4096u + ((i / 32u) % 64u) * 64u + (((i / 1u) % 32u) * 1u + 0u) * 1u]);
9
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/2e1ce6ef01198780289fd4a35d8f86b5172595ed189cf931e8444091d49e8d3a.wgsl ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read_write> out: array<f32>;
3
+
4
+ @compute @workgroup_size(64)
5
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
6
+ let i = gid.x + gid.y * 64u;
7
+ if (i >= 64u) { return; }
8
+ out[i] = f32(f32(b0[i]) * 1.0);
9
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/30cb10d38275eecebb04ab10dc3246b7a30ff80578096f6efa538f30c602afb8.wgsl ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<u32>;
2
+ @group(0) @binding(1) var<storage, read> b1: array<f32>;
3
+ @group(0) @binding(2) var<storage, read> b2: array<f32>;
4
+ @group(0) @binding(3) var<storage, read_write> out: array<f32>;
5
+ fn dequant_0(index: u32) -> f32 {
6
+ let row = index / 2048u;
7
+ let col = index % 2048u;
8
+ let word = b0[row * 512u + col / 4u];
9
+ let code = i32((word >> ((col % 4u) * 8u)) & 255u) - 128;
10
+ return f32(code) * b1[row * 64u + col / 32u];
11
+ }
12
+
13
+ var<workgroup> partial: array<f32, 64>;
14
+ @compute @workgroup_size(64)
15
+ fn main(@builtin(workgroup_id) group: vec3<u32>, @builtin(local_invocation_id) local: vec3<u32>) {
16
+ let i = group.x + group.y * 2048u;
17
+ if (i >= 2048u) { return; }
18
+ let lane = local.x;
19
+ let row = i % 2048u;
20
+ var acc = 0.0;
21
+ for (var w = lane; w < 512u; w += 64u) {
22
+ let word = b0[row * 512u + w];
23
+ let first = w * 4u;
24
+ var part = 0.0;
25
+ for (var e = 0u; e < 4u; e++) {
26
+ let col = first + e;
27
+ if (col < 2048u) {
28
+ let code = i32((word >> (e * 8u)) & 255u) - 128;
29
+ part += f32(code) * f32(b2[(i / 2048u) * 2048u + col]);
30
+ }
31
+ }
32
+ acc += part * f32(b1[row * 64u + first / 32u]);
33
+ }
34
+ partial[lane] = acc;
35
+ workgroupBarrier();
36
+ for (var stride = 32u; stride > 0u; stride /= 2u) {
37
+ if (lane < stride) { partial[lane] += partial[lane + stride]; }
38
+ workgroupBarrier();
39
+ }
40
+ if (lane == 0u) { out[i] = f32(partial[0] + 0.0); }
41
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/3203e08f2c99fa4848f553739b7115a7c677840344f17b1d4391d6130517f5a7.wgsl ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<i32>;
2
+ @group(0) @binding(1) var<storage, read_write> out: array<i32>;
3
+
4
+ @compute @workgroup_size(64)
5
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
6
+ let i = gid.x + gid.y * 64u;
7
+ if (i >= 4u) { return; }
8
+ out[i] = i32(b0[i]);
9
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/3241a118927e109c0dacbb278370abe70d099ee593a07cd023d4530b5fb8f833.wgsl ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read> b1: array<f32>;
3
+ @group(0) @binding(2) var<storage, read_write> out: array<f32>;
4
+
5
+ var<workgroup> factor: f32;
6
+ @compute @workgroup_size(64)
7
+ fn main(@builtin(workgroup_id) group: vec3<u32>, @builtin(local_invocation_id) local: vec3<u32>) {
8
+ let row = group.x + group.y * 8u;
9
+ if (row >= 8u) { return; }
10
+ let lane = local.x;
11
+ if (lane == 0u) {
12
+ var total = 0.0;
13
+ for (var j = 0u; j < 64u; j++) {
14
+ let v = f32(b0[row * 64u + j]);
15
+ total += v * v;
16
+ }
17
+ factor = inverseSqrt(total / 64.0 + 1e-05);
18
+ }
19
+ workgroupBarrier();
20
+ for (var p = lane; p < 64u; p += 64u) {
21
+ let i = row * 64u + p;
22
+ out[i] = f32(f32(b0[row * 64u + p]) * factor * (f32(b1[p]) + 0.0));
23
+ }
24
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/33e8ec04c66adb4988f562f0f9d3e92d29dfda91a56d0ed62be598c7c737f5ba.wgsl ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read_write> out: array<f32>;
3
+
4
+ @compute @workgroup_size(64)
5
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
6
+ let i = gid.x + gid.y * 16384u;
7
+ if (i >= 16384u) { return; }
8
+ out[i] = f32(b0[((i / 16384u) % 1u) * 32768u + ((i / 2048u) % 8u) * 4096u + ((i / 32u) % 64u) * 64u + (((i / 1u) % 32u) * 1u + 32u) * 1u]);
9
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/37ce78f0b50bc59dc7b6dd62724d6ad3acfbfb73deae12446a4575f5688d8f34.wgsl ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read_write> out: array<f32>;
3
+
4
+ @compute @workgroup_size(64)
5
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
6
+ let i = gid.x + gid.y * 128u;
7
+ if (i >= 128u) { return; }
8
+ out[i] = f32(b0[((i / 128u) % 1u) * 128u + ((i / 32u) % 4u) * 1u + ((i / 1u) % 32u) * 4u]);
9
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/383d0ce2bbe657b6412b8e55e6b0cf06e385cb4efbe45019afff9357f2a77751.wgsl ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read> b1: array<f32>;
3
+ @group(0) @binding(2) var<storage, read_write> out: array<f32>;
4
+
5
+ @compute @workgroup_size(64)
6
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
7
+ let i = gid.x + gid.y * 16384u;
8
+ if (i >= 16384u) { return; }
9
+ let x = f32(b0[i]); let s = f32(f32(x / (1.0 + exp(-x))));
10
+ out[i] = f32(s * f32(b1[i]));
11
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/39646bdfafd1ab0cb874474e3f1e9d79b57f10582a1804bc1d3762a492fec851.wgsl ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read> b1: array<f32>;
3
+ @group(0) @binding(2) var<storage, read_write> out: array<f32>;
4
+
5
+ @compute @workgroup_size(64)
6
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
7
+ let i = gid.x + gid.y * 32768u;
8
+ if (i >= 32768u) { return; }
9
+ out[i] = f32(f32(b0[i]) * f32(b1[((i / 64u) % 64u) * 64u + ((i / 1u) % 64u) * 1u]));
10
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/3c2cd3f4326cc231268e80b83abfa0520c88c9763ba44fb16df8357610c0a301.wgsl ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<u32>;
2
+ @group(0) @binding(1) var<storage, read> b1: array<f32>;
3
+ @group(0) @binding(2) var<storage, read> b2: array<f32>;
4
+ @group(0) @binding(3) var<storage, read_write> out: array<f32>;
5
+ fn dequant_0(index: u32) -> f32 {
6
+ let row = index / 2048u;
7
+ let col = index % 2048u;
8
+ let word = b0[row * 512u + col / 4u];
9
+ let code = i32((word >> ((col % 4u) * 8u)) & 255u) - 128;
10
+ return f32(code) * b1[row * 64u + col / 32u];
11
+ }
12
+
13
+ var<workgroup> partial: array<f32, 64>;
14
+ @compute @workgroup_size(64)
15
+ fn main(@builtin(workgroup_id) group: vec3<u32>, @builtin(local_invocation_id) local: vec3<u32>) {
16
+ let i = group.x + group.y * 4096u;
17
+ if (i >= 4096u) { return; }
18
+ let lane = local.x;
19
+ let row = i % 4096u;
20
+ var acc = 0.0;
21
+ for (var w = lane; w < 512u; w += 64u) {
22
+ let word = b0[row * 512u + w];
23
+ let first = w * 4u;
24
+ var part = 0.0;
25
+ for (var e = 0u; e < 4u; e++) {
26
+ let col = first + e;
27
+ if (col < 2048u) {
28
+ let code = i32((word >> (e * 8u)) & 255u) - 128;
29
+ part += f32(code) * f32(b2[(i / 4096u) * 2048u + col]);
30
+ }
31
+ }
32
+ acc += part * f32(b1[row * 64u + first / 32u]);
33
+ }
34
+ partial[lane] = acc;
35
+ workgroupBarrier();
36
+ for (var stride = 32u; stride > 0u; stride /= 2u) {
37
+ if (lane < stride) { partial[lane] += partial[lane + stride]; }
38
+ workgroupBarrier();
39
+ }
40
+ if (lane == 0u) { out[i] = f32(partial[0] + 0.0); }
41
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/3e34409407100d4858c4c109cf62f3eaf2f4c6081166b0ec8679105e6dfbe7fe.wgsl ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read_write> out: array<f32>;
3
+
4
+ @compute @workgroup_size(64)
5
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
6
+ let i = gid.x + gid.y * 16384u;
7
+ if (i >= 16384u) { return; }
8
+ let x = f32(b0[i]);
9
+ out[i] = f32(-x);
10
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/402b4fbc568183c6fd53e1541bbe6f09d8bb4d70293eb96576db5f0d013d035d.wgsl ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read> b1: array<f32>;
3
+ @group(0) @binding(2) var<storage, read> b2: array<f32>;
4
+ @group(0) @binding(3) var<storage, read> b3: array<f32>;
5
+ @group(0) @binding(4) var<storage, read_write> out: array<f32>;
6
+
7
+ var<workgroup> q_row: array<f32, 64>;
8
+ var<workgroup> scores: array<f32, 1024>;
9
+ var<workgroup> partial: array<f32, 64>;
10
+ @compute @workgroup_size(64)
11
+ fn main(@builtin(workgroup_id) group: vec3<u32>, @builtin(local_invocation_id) local: vec3<u32>) {
12
+ let lane = local.x;
13
+ let head = group.x / 64u;
14
+ let row = group.x % 64u;
15
+ let kv_head = head / 4u;
16
+ for (var d = lane; d < 64u; d += 64u) { q_row[d] = f32(b0[(head * 64u + row) * 64u + d]); }
17
+ workgroupBarrier();
18
+ var running_max = -3.4028234663852886e38;
19
+ var running_sum = 0.0;
20
+ var acc: array<f32, 1>;
21
+ for (var start = 0u; start < 4096u; start += 1024u) {
22
+ let count = min(1024u, 4096u - start);
23
+ var tile_max = -3.4028234663852886e38;
24
+ for (var t = lane; t < count; t += 64u) {
25
+ let j = start + t;
26
+ var score = -3.4028234663852886e38;
27
+ if (f32(b3[row * 4096u + j]) > -1000.0) {
28
+ var dot = 0.0;
29
+ for (var d = 0u; d < 64u; d++) { dot += q_row[d] * f32(b1[(((kv_head * 4096u + j) * 64u + d) / 64u) % 4096u * 512u + (((kv_head * 4096u + j) * 64u + d) / 262144u) % 8u * 64u + (((kv_head * 4096u + j) * 64u + d) / 1u) % 64u * 1u]); }
30
+ score = dot * 0.125 + f32(b3[row * 4096u + j]);
31
+ }
32
+ scores[t] = score;
33
+ tile_max = max(tile_max, score);
34
+ }
35
+ partial[lane] = tile_max;
36
+ workgroupBarrier();
37
+ for (var stride = 32u; stride > 0u; stride /= 2u) {
38
+ if (lane < stride) { partial[lane] = max(partial[lane], partial[lane + stride]); }
39
+ workgroupBarrier();
40
+ }
41
+ let next_max = max(running_max, partial[0]);
42
+ workgroupBarrier();
43
+ var tile_sum = 0.0;
44
+ for (var t = lane; t < count; t += 64u) {
45
+ var p = 0.0;
46
+ if (scores[t] > -3.0e38) { p = exp(scores[t] - next_max); }
47
+ scores[t] = p;
48
+ tile_sum += p;
49
+ }
50
+ partial[lane] = tile_sum;
51
+ workgroupBarrier();
52
+ for (var stride = 32u; stride > 0u; stride /= 2u) {
53
+ if (lane < stride) { partial[lane] += partial[lane + stride]; }
54
+ workgroupBarrier();
55
+ }
56
+ var correction = 0.0;
57
+ if (running_max > -3.0e38) { correction = exp(running_max - next_max); }
58
+ running_sum = running_sum * correction + partial[0];
59
+ running_max = next_max;
60
+ for (var c = 0u; c < 1u; c++) {
61
+ let d = lane + c * 64u;
62
+ var total = acc[c] * correction;
63
+ if (d < 64u) {
64
+ for (var t = 0u; t < count; t++) {
65
+ let p = scores[t];
66
+ if (p != 0.0) {
67
+ let j = start + t;
68
+ total += p * f32(b2[(((kv_head * 4096u + j) * 64u + d) / 64u) % 4096u * 512u + (((kv_head * 4096u + j) * 64u + d) / 262144u) % 8u * 64u + (((kv_head * 4096u + j) * 64u + d) / 1u) % 64u * 1u]);
69
+ }
70
+ }
71
+ }
72
+ acc[c] = total;
73
+ }
74
+ workgroupBarrier();
75
+ }
76
+ for (var c = 0u; c < 1u; c++) {
77
+ let d = lane + c * 64u;
78
+ if (d < 64u) {
79
+ let i = (head * 64u + row) * 64u + d;
80
+ out[i] = f32(acc[c] / running_sum);
81
+ }
82
+ }
83
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/40f115c8647a238bfb3ccb0bb8446bccdc94a0dfadc89111c4920efb2259f41d.wgsl ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read> b1: array<f32>;
3
+ @group(0) @binding(2) var<storage, read_write> out: array<f32>;
4
+
5
+ @compute @workgroup_size(64)
6
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
7
+ let i = gid.x + gid.y * 2048u;
8
+ if (i >= 2048u) { return; }
9
+ out[i] = f32(f32(b0[i]) * f32(b1[((i / 64u) % 4u) * 64u + ((i / 1u) % 64u) * 1u]));
10
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/431a95359c9c41766af53351f3074089c052c44df79b9d1d08205d8e58e90d25.wgsl ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read> b1: array<i32>;
3
+ @group(0) @binding(2) var<storage, read_write> out: array<f32>;
4
+
5
+ @compute @workgroup_size(64)
6
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
7
+ let i = gid.x + gid.y * 32768u;
8
+ if (i >= 32768u) { return; }
9
+ let token = (i / 64u) % 64u;
10
+ let outer = i / 4096u;
11
+ let destination = outer * 262144u + u32(b1[token]) * 64u + i % 64u;
12
+ out[((destination) / 64u) % 4096u * 512u + ((destination) / 262144u) % 8u * 64u + ((destination) / 1u) % 64u * 1u] = f32(b0[i]);
13
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/44745cf68171fb657debd4b4fdd15edcd4d5798e18aedc4314d0cb1249948808.wgsl ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<i32>;
2
+ @group(0) @binding(1) var<storage, read> b1: array<u32>;
3
+ @group(0) @binding(2) var<storage, read> b2: array<f32>;
4
+ @group(0) @binding(3) var<storage, read_write> out: array<f32>;
5
+ fn dequant_1(index: u32) -> f32 {
6
+ let row = index / 2048u;
7
+ let col = index % 2048u;
8
+ let word = b1[row * 512u + col / 4u];
9
+ let code = i32((word >> ((col % 4u) * 8u)) & 255u) - 128;
10
+ return f32(code) * b2[row * 64u + col / 32u];
11
+ }
12
+
13
+ @compute @workgroup_size(64)
14
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
15
+ let i = gid.x + gid.y * 8192u;
16
+ if (i >= 8192u) { return; }
17
+ let token = i32(b0[i / 2048u]);
18
+ if (token < 0 || token >= 65536) { out[i] = f32(0.0); return; }
19
+ out[i] = f32(dequant_1(u32(token - 0) * 2048u + i % 2048u));
20
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/453668cbe741eb27e2cc10194eca66f514a3763d97b46c1733c376986defc322.wgsl ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read> b1: array<f32>;
3
+ @group(0) @binding(2) var<storage, read_write> out: array<f32>;
4
+
5
+ var<workgroup> factor: f32;
6
+ @compute @workgroup_size(64)
7
+ fn main(@builtin(workgroup_id) group: vec3<u32>, @builtin(local_invocation_id) local: vec3<u32>) {
8
+ let row = group.x + group.y * 4u;
9
+ if (row >= 4u) { return; }
10
+ let lane = local.x;
11
+ if (lane == 0u) {
12
+ var total = 0.0;
13
+ for (var j = 0u; j < 2048u; j++) {
14
+ let v = f32(b0[row * 2048u + j]);
15
+ total += v * v;
16
+ }
17
+ factor = inverseSqrt(total / 2048.0 + 1e-05);
18
+ }
19
+ workgroupBarrier();
20
+ for (var p = lane; p < 2048u; p += 64u) {
21
+ let i = row * 2048u + p;
22
+ out[i] = f32(f32(b0[row * 2048u + p]) * factor * (f32(b1[p]) + 0.0));
23
+ }
24
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/45b47a1eff94975353fa58c943de182aa0da352efeb23f477ba2c69b8fc52b70.wgsl ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read> b1: array<f32>;
3
+ @group(0) @binding(2) var<storage, read_write> out: array<f32>;
4
+
5
+ @compute @workgroup_size(64)
6
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
7
+ let i = gid.x + gid.y * 1638400u;
8
+ if (i >= 1638400u) { return; }
9
+ let coord = (i / 1u) % 102400u;
10
+ if (coord >= 0u && coord < 65536u) { out[i] = f32(b0[(i / 102400u) * 65536u + (coord - 0u) * 1u + i % 1u]); }
11
+ if (coord >= 65536u && coord < 102400u) { out[i] = f32(b1[(i / 102400u) * 36864u + (coord - 65536u) * 1u + i % 1u]); }
12
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/45c3c3f9ae14f5837bb0cfc8cf8ce189010dba8f3b03d640b18883fc1367207b.wgsl ADDED
@@ -0,0 +1,71 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read> b1: array<u32>;
3
+ @group(0) @binding(2) var<storage, read> b2: array<f32>;
4
+ @group(0) @binding(3) var<storage, read_write> out: array<f32>;
5
+ fn dequant_1(index: u32) -> f32 {
6
+ let row = index / 4096u;
7
+ let col = index % 4096u;
8
+ let word = b1[row * 1024u + col / 4u];
9
+ let code = i32((word >> ((col % 4u) * 8u)) & 255u) - 128;
10
+ return f32(code) * b2[row * 128u + col / 32u];
11
+ }
12
+
13
+ var<workgroup> tile_a: array<array<f32, 16>, 64>;
14
+ var<workgroup> tile_b: array<array<f32, 64>, 16>;
15
+ @compute @workgroup_size(16, 16)
16
+ fn main(@builtin(workgroup_id) group: vec3<u32>, @builtin(local_invocation_id) local: vec3<u32>) {
17
+ let lane = local.y * 16u + local.x;
18
+ let batch = group.z;
19
+ let tile_n = group.x * 64u;
20
+ let tile_row = group.y * 64u;
21
+ var acc: array<array<f32, 4>, 4>;
22
+ for (var k0 = 0u; k0 < 4096u; k0 += 16u) {
23
+ for (var e = 0u; e < 4u; e++) {
24
+ let flat = lane + e * 256u;
25
+ let m_local = flat / 16u;
26
+ let row = tile_row + m_local;
27
+ let col = k0 + flat % 16u;
28
+ var value = 0.0;
29
+ if (row < 64u && col < 4096u) { value = f32(f32(b0[(batch * 64u + row) * 4096u + col])); }
30
+ tile_a[m_local][flat % 16u] = value;
31
+ }
32
+ if (lane < 256u) {
33
+ let n_local = lane / 4u;
34
+ let word_local = lane % 4u;
35
+ let n_index = tile_n + n_local;
36
+ let first = k0 + word_local * 4u;
37
+ var word = 0u;
38
+ var scale = 0.0;
39
+ if (n_index < 2048u && first < 4096u) {
40
+ word = b1[n_index * 1024u + first / 4u];
41
+ scale = f32(b2[n_index * 128u + first / 32u]);
42
+ }
43
+ for (var e = 0u; e < 4u; e++) {
44
+ let code = i32((word >> (e * 8u)) & 255u) - 128;
45
+ var value = 0.0;
46
+ if (first + e < 4096u) { value = f32(code) * scale; }
47
+ tile_b[word_local * 4u + e][n_local] = value;
48
+ }
49
+ }
50
+ workgroupBarrier();
51
+ for (var kk = 0u; kk < 16u; kk++) {
52
+ var b_values: array<f32, 4>;
53
+ for (var c = 0u; c < 4u; c++) { b_values[c] = tile_b[kk][local.x * 4u + c]; }
54
+ for (var r = 0u; r < 4u; r++) {
55
+ let a_value = tile_a[local.y * 4u + r][kk];
56
+ for (var c = 0u; c < 4u; c++) { acc[r][c] += a_value * b_values[c]; }
57
+ }
58
+ }
59
+ workgroupBarrier();
60
+ }
61
+ for (var r = 0u; r < 4u; r++) {
62
+ let out_row = tile_row + local.y * 4u + r;
63
+ for (var c = 0u; c < 4u; c++) {
64
+ let out_col = tile_n + local.x * 4u + c;
65
+ if (out_row < 64u && out_col < 2048u) {
66
+ let i = (batch * 64u + out_row) * 2048u + out_col;
67
+ out[i] = f32(acc[r][c] + 0.0);
68
+ }
69
+ }
70
+ }
71
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/483857d2d9929bc07cd14940dc3bca97abcf9485ce1c805a234d2db4110a7010.wgsl ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read> b1: array<f32>;
3
+ @group(0) @binding(2) var<storage, read_write> out: array<f32>;
4
+
5
+ @compute @workgroup_size(64)
6
+ fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
7
+ let i = gid.x + gid.y * 32768u;
8
+ if (i >= 32768u) { return; }
9
+ out[i] = f32(f32(b0[i]) * f32(b1[((i / 64u) % 16u) * 64u + ((i / 1u) % 64u) * 1u]));
10
+ }
exaone4-fp32-int8-g32-release-token-major-v2-v4/kernels/4ec7950cea0e4257dc30630582df36a6127ce61794f46012db6ad0c0b1ea8380.wgsl ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @group(0) @binding(0) var<storage, read> b0: array<f32>;
2
+ @group(0) @binding(1) var<storage, read> b1: array<f32>;
3
+ @group(0) @binding(2) var<storage, read_write> out: array<f32>;
4
+
5
+ var<workgroup> factor: f32;
6
+ @compute @workgroup_size(64)
7
+ fn main(@builtin(workgroup_id) group: vec3<u32>, @builtin(local_invocation_id) local: vec3<u32>) {
8
+ let row = group.x + group.y * 64u;
9
+ if (row >= 64u) { return; }
10
+ let lane = local.x;
11
+ if (lane == 0u) {
12
+ var total = 0.0;
13
+ for (var j = 0u; j < 2048u; j++) {
14
+ let v = f32(b0[row * 2048u + j]);
15
+ total += v * v;
16
+ }
17
+ factor = inverseSqrt(total / 2048.0 + 1e-05);
18
+ }
19
+ workgroupBarrier();
20
+ for (var p = lane; p < 2048u; p += 64u) {
21
+ let i = row * 2048u + p;
22
+ out[i] = f32(f32(b0[row * 2048u + p]) * factor * (f32(b1[p]) + 0.0));
23
+ }
24
+ }