@imaduddin/fastbrain 1.1.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/dist/Embedding/index.d.ts +24 -0
  2. package/dist/Embedding/index.js +93 -0
  3. package/dist/FFN/index.d.ts +20 -0
  4. package/dist/FFN/index.js +51 -0
  5. package/dist/Gelu/index.d.ts +15 -0
  6. package/dist/Gelu/index.js +58 -0
  7. package/dist/Linear/index.d.ts +31 -0
  8. package/dist/Linear/index.js +136 -0
  9. package/dist/RMSNorm/index.d.ts +16 -0
  10. package/dist/RMSNorm/index.js +63 -0
  11. package/dist/Relu/index.d.ts +15 -0
  12. package/dist/Relu/index.js +58 -0
  13. package/dist/SelfAttention/index.d.ts +47 -0
  14. package/dist/SelfAttention/index.js +186 -0
  15. package/dist/Softmax/index.d.ts +18 -0
  16. package/dist/Softmax/index.js +96 -0
  17. package/dist/Tokenizer/index.d.ts +15 -0
  18. package/dist/Tokenizer/index.js +58 -0
  19. package/dist/TransformerBlock/index.d.ts +21 -0
  20. package/dist/TransformerBlock/index.js +43 -0
  21. package/dist/fileManager.d.ts +6 -0
  22. package/dist/fileManager.js +34 -0
  23. package/dist/index.d.ts +10 -0
  24. package/dist/index.js +10 -0
  25. package/dist/residualConnection/index.d.ts +9 -0
  26. package/dist/residualConnection/index.js +25 -0
  27. package/package.json +14 -3
  28. package/shaders/add.wgsl +22 -0
  29. package/shaders/embedding/backward.wgsl +36 -0
  30. package/shaders/embedding/forward.wgsl +35 -0
  31. package/shaders/linear/ComputeDinput.wgsl +72 -0
  32. package/shaders/linear/forward.wgsl +63 -0
  33. package/shaders/linear/updateBias.wgsl +33 -0
  34. package/shaders/linear/updateWeights.wgsl +38 -0
  35. package/shaders/relu/backward.wgsl +43 -0
  36. package/shaders/relu/forward.wgsl +28 -0
  37. package/shaders/rmsnorm/backward.wgsl +54 -0
  38. package/shaders/rmsnorm/forward.wgsl +51 -0
  39. package/shaders/selfAttention/SB.wgsl +30 -0
  40. package/shaders/selfAttention/add3.wgsl +27 -0
  41. package/shaders/selfAttention/matMul.wgsl +63 -0
  42. package/shaders/selfAttention/qK.wgsl +66 -0
  43. package/shaders/selfAttention/transpose.wgsl +24 -0
  44. package/shaders/softmax/backward.wgsl +36 -0
  45. package/shaders/softmax/crossEntropy.wgsl +36 -0
  46. package/shaders/softmax/forward.wgsl +68 -0
  47. package/src/Embedding/index.ts +81 -0
  48. package/src/FFN/index.ts +47 -0
  49. package/src/Gelu/index.ts +53 -0
  50. package/src/Linear/index.ts +122 -0
  51. package/src/RMSNorm/index.ts +56 -0
  52. package/src/SelfAttention/index.ts +177 -0
  53. package/src/Softmax/index.ts +82 -0
  54. package/src/Tokenizer/index.ts +60 -0
  55. package/src/TransformerBlock/index.ts +41 -0
  56. package/src/fileManager.ts +46 -0
  57. package/src/index.ts +10 -0
  58. package/src/residualConnection/index.ts +24 -0
  59. package/tsconfig.json +27 -0
  60. package/index.js +0 -22
  61. package/src/Embedding/index.d.ts +0 -21
  62. package/src/Embedding/index.js +0 -140
  63. package/src/FFN/index.d.ts +0 -23
  64. package/src/FFN/index.js +0 -45
  65. package/src/Linear/index.d.ts +0 -31
  66. package/src/Linear/index.js +0 -196
  67. package/src/OperationManager.js +0 -169
  68. package/src/PositionEmbedding/index.d.ts +0 -30
  69. package/src/PositionEmbedding/index.js +0 -70
  70. package/src/RMSNorm/index.d.ts +0 -30
  71. package/src/RMSNorm/index.js +0 -91
  72. package/src/Relu/index.d.ts +0 -25
  73. package/src/Relu/index.js +0 -108
  74. package/src/SelfAttention/index.d.ts +0 -28
  75. package/src/SelfAttention/index.js +0 -138
  76. package/src/Softmax/index.d.ts +0 -26
  77. package/src/Softmax/index.js +0 -195
  78. package/src/Tokenizer/index.d.ts +0 -12
  79. package/src/Tokenizer/index.js +0 -164
  80. package/src/Tokenizer/vocabs.json +0 -19618
  81. package/src/TransformerBlock/index.d.ts +0 -28
  82. package/src/TransformerBlock/index.js +0 -78
  83. package/src/getVec.js +0 -30
  84. package/src/gpu.js +0 -0
  85. package/src/model/index.d.ts +0 -43
  86. package/src/model/index.js +0 -83
  87. package/src/residualConnection/index.js +0 -31
  88. package/src/shaders/CalculateAcc.wgsl +0 -50
  89. package/src/shaders/CalculateLoss.wgsl +0 -33
  90. package/src/shaders/ComputeDInput.wgsl +0 -46
  91. package/src/shaders/EB.wgsl +0 -33
  92. package/src/shaders/EF.wgsl +0 -25
  93. package/src/shaders/LB.wgsl +0 -71
  94. package/src/shaders/LF.wgsl +0 -60
  95. package/src/shaders/Norm/rmsBackward.wgsl +0 -65
  96. package/src/shaders/Norm/rmsForward.wgsl +0 -30
  97. package/src/shaders/Norm/sumSquare.wgsl +0 -38
  98. package/src/shaders/Norm/updateGamma.wgsl +0 -54
  99. package/src/shaders/PB.wgsl +0 -25
  100. package/src/shaders/PF.wgsl +0 -24
  101. package/src/shaders/RB.wgsl +0 -37
  102. package/src/shaders/RF.wgsl +0 -33
  103. package/src/shaders/ReductionFunction.wgsl +0 -28
  104. package/src/shaders/SB.wgsl +0 -41
  105. package/src/shaders/SF.wgsl +0 -75
  106. package/src/shaders/SoftmaxBackward.wgsl +0 -31
  107. package/src/shaders/add.wgsl +0 -30
  108. package/src/shaders/attentionShader/CompueFinalForwardOutput.wgsl +0 -29
  109. package/src/shaders/attentionShader/ComputeDA.wgsl +0 -30
  110. package/src/shaders/attentionShader/ComputeDV.wgsl +0 -37
  111. package/src/shaders/attentionShader/ComputeK.wgsl +0 -30
  112. package/src/shaders/attentionShader/ComputedQ.wgsl +0 -31
  113. package/src/shaders/attentionShader/attentionSocres.wgsl +0 -40
  114. package/src/shaders/attentionShader/sumGradient.wgsl +0 -24
  115. package/src/shaders/calculateTotal.wgsl +0 -26
@@ -0,0 +1,72 @@
1
+ struct Params {
2
+ inputSize: f32,
3
+ outputSize: f32,
4
+ tokenCount: f32,
5
+ lr : f32
6
+ }
7
+
8
+ @group(0) @binding(0)
9
+
10
+ var <storage, read> weights: array<f32>;
11
+
12
+
13
+ @group(0) @binding(1)
14
+
15
+ var <storage, read> outputGradient : array<f32>;
16
+
17
+ @group(0) @binding(2)
18
+
19
+ var <storage, read_write> dinput : array<f32>;
20
+
21
+ @group(0) @binding(3)
22
+
23
+ var <uniform> params : Params;
24
+
25
+ var <workgroup> sdata : array<f32, 64>;
26
+
27
+ @compute @workgroup_size(64)
28
+
29
+ fn main(@builtin(workgroup_id) wid: vec3<u32>, @builtin(local_invocation_id) lid: vec3<u32>){
30
+ var x = wid.x;
31
+ var y = wid.y;
32
+ var tid = lid.x;
33
+ var isCorrect = x >= u32(params.tokenCount) || y >= u32(params.inputSize);
34
+ if(!isCorrect){
35
+ var local_sum = 0.0;
36
+ for(var out = tid; out < u32(params.outputSize); out += 64){
37
+ let dOut = outputGradient[x * u32(params.outputSize) + out];
38
+ let w = weights[out * u32(params.inputSize) + y];
39
+ local_sum += dOut * w;
40
+ }
41
+ sdata[tid] = local_sum;
42
+ workgroupBarrier();
43
+
44
+ if(tid < 32u){
45
+ sdata[tid] += sdata[tid + 32u];
46
+ }
47
+ workgroupBarrier();
48
+ if(tid < 16u){
49
+ sdata[tid] += sdata[tid + 16u];
50
+ }
51
+ workgroupBarrier();
52
+ if(tid < 8u){
53
+ sdata[tid] += sdata[tid + 8u];
54
+ }
55
+ workgroupBarrier();
56
+ if(tid < 4u){
57
+ sdata[tid] += sdata[tid + 4u];
58
+ }
59
+ workgroupBarrier();
60
+ if(tid < 2u){
61
+ sdata[tid] += sdata[tid + 2u];
62
+ }
63
+ workgroupBarrier();
64
+ if(tid < 1u){
65
+ sdata[tid] += sdata[tid + 1u];
66
+ }
67
+ workgroupBarrier();
68
+ if(tid == 0u){
69
+ dinput[x * u32(params.inputSize) + y] = sdata[0u];
70
+ }
71
+ }
72
+ }
@@ -0,0 +1,63 @@
1
+
2
+ struct Params {
3
+ inputSize: u32,
4
+ outputSize: u32,
5
+ tokenCount: u32,
6
+ };
7
+ @group(0) @binding(0)
8
+ var<storage, read> input: array<f32>;
9
+ @group(0) @binding(1)
10
+ var<storage, read> weights: array<f32>;
11
+ @group(0) @binding(2)
12
+ var<storage, read> bias: array<f32>;
13
+ @group(0) @binding(3)
14
+ var<storage, read_write> output: array<f32>;
15
+ @group(0) @binding(4)
16
+ var<uniform> params: Params;
17
+
18
+ var <workgroup> sdata: array<f32, 64>;
19
+ @compute @workgroup_size(64)
20
+ fn main(@builtin(workgroup_id) wid: vec3<u32>, @builtin(local_invocation_id) lid: vec3<u32>) {
21
+ var vocabIndex = wid.x;
22
+ var tokenIndex = wid.y;
23
+ var lane = lid.x;
24
+ let isCorrect = vocabIndex >= params.outputSize || tokenIndex >= params.tokenCount;
25
+ if (!isCorrect) {
26
+ var sum = 0.0;
27
+ for (var i = lane; i < params.inputSize; i+= 64u) {
28
+ let inputIndex = tokenIndex * params.inputSize + i;
29
+ let weightIndex = vocabIndex * params.inputSize + i;
30
+ sum += input[inputIndex] * weights[weightIndex];
31
+ }
32
+ sdata[lane] = sum;
33
+ workgroupBarrier();
34
+ if(lane < 32u){
35
+ sdata[lane] += sdata[lane + 32u];
36
+ }
37
+ workgroupBarrier();
38
+ if(lane < 16u){
39
+ sdata[lane] += sdata[lane + 16u];
40
+ }
41
+ workgroupBarrier();
42
+ if(lane < 8u){
43
+ sdata[lane] += sdata[lane + 8u];
44
+ }
45
+ workgroupBarrier();
46
+ if(lane < 4u){
47
+ sdata[lane] += sdata[lane + 4u];
48
+ }
49
+ workgroupBarrier();
50
+ if(lane < 2u){
51
+ sdata[lane] += sdata[lane + 2u];
52
+ }
53
+ workgroupBarrier();
54
+ if(lane < 1u){
55
+ sdata[lane] += sdata[lane + 1u];
56
+ }
57
+ workgroupBarrier();
58
+ if(lane == 0u){
59
+ output[tokenIndex * params.outputSize + vocabIndex] = sdata[0u] + bias[vocabIndex];
60
+ };
61
+ }
62
+
63
+ }
@@ -0,0 +1,33 @@
1
+ struct Params {
2
+ inputSize: f32,
3
+ outputSize: f32,
4
+ tokenCount: f32,
5
+ lr : f32
6
+ }
7
+ @group(0) @binding(0)
8
+
9
+ var <storage, read_write> bias : array<f32>;
10
+
11
+ @group(0) @binding(1)
12
+
13
+ var <storage, read> outputGradient: array<f32>;
14
+
15
+ @group(0) @binding(2)
16
+
17
+ var <uniform> params: Params;
18
+
19
+
20
+ @compute @workgroup_size(32)
21
+
22
+ fn main(@builtin(global_invocation_id) gid : vec3<u32>){
23
+ let vocab = gid.x;
24
+ if(vocab >= u32(params.outputSize)){
25
+ return;
26
+ }
27
+ var grad = 0.0;
28
+ for(var a = 0u; a < u32(params.tokenCount); a++){
29
+ let gradIndex = a * u32(params.outputSize) + vocab;
30
+ grad += outputGradient[gradIndex];
31
+ }
32
+ bias[vocab] -= params.lr * grad;
33
+ }
@@ -0,0 +1,38 @@
1
+ struct Params {
2
+ inputSize: f32,
3
+ outputSize: f32,
4
+ tokenCount: f32,
5
+ lr : f32
6
+ }
7
+ @group(0) @binding(0)
8
+
9
+ var <storage, read_write> weights : array<f32>;
10
+
11
+ @group(0) @binding(1)
12
+
13
+ var <storage, read> outputGradient: array<f32>;
14
+
15
+ @group(0) @binding(2)
16
+
17
+ var <uniform> params: Params;
18
+
19
+ @group(0) @binding(3)
20
+
21
+ var <storage, read> input: array<f32>;
22
+
23
+ @compute @workgroup_size(16, 32)
24
+
25
+ fn main(@builtin(global_invocation_id) gid : vec3<u32>){
26
+ let dim = gid.x;
27
+ let vocab = gid.y;
28
+ if(dim >= u32(params.inputSize) || vocab >= u32(params.outputSize)){
29
+ return;
30
+ }
31
+ let index = u32(vocab) * u32(params.inputSize) + u32(dim);
32
+ var grad = 0.0;
33
+ for(var a = 0u; a < u32(params.tokenCount); a++){
34
+ let gradIndex = a * u32( params.outputSize) + vocab;
35
+ grad += outputGradient[gradIndex] * input[a * u32( params.inputSize) + dim];
36
+ }
37
+ weights[index] -= params.lr * grad;
38
+ }
@@ -0,0 +1,43 @@
1
+ struct Params{
2
+ dimSize: u32,
3
+ tokenCount : u32
4
+ }
5
+
6
+ @group(0) @binding(0)
7
+
8
+ var <storage, read> input : array<f32>;
9
+
10
+ @group(0) @binding(1)
11
+
12
+ var <storage, read_write> output : array<f32>;
13
+
14
+
15
+ @group(0) @binding(2)
16
+
17
+ var <storage, read_write> grad : array<f32>;
18
+
19
+ @group(0) @binding(3)
20
+ var <uniform> params : Params;
21
+
22
+
23
+ @compute @workgroup_size(16,16)
24
+ fn main(@builtin(global_invocation_id) id : vec3<u32>){
25
+ var dim = id.x;
26
+ var token = id.y;
27
+ if(dim >= params.dimSize || token >= params.tokenCount){
28
+ return;
29
+ }
30
+ var index = token * params.dimSize + dim;
31
+ let x = input[index];
32
+ let go = grad[index];
33
+ let c0 = sqrt(2 / 3.141592653589793);
34
+ let c1 = 0.044715;
35
+ let x3 = x * x * x;
36
+ let inner = c0 * (x + c1 * x3);
37
+ let tanh_inner = tanh(inner);
38
+ let left = 0.5 * (1.0 + tanh_inner);
39
+ let sech2 = 1.0 - tanh_inner * tanh_inner;
40
+ let right = 0.5 * x * sech2 * c0 * (1.0 + 3.0 * c1 * x * x);
41
+ let dgelu = left + right;
42
+ output[index] = go * dgelu;
43
+ }
@@ -0,0 +1,28 @@
1
+ struct Params{
2
+ dimSize: u32,
3
+ tokenCount : u32
4
+ }
5
+
6
+ @group(0) @binding(0)
7
+
8
+ var <storage, read> input : array<f32>;
9
+
10
+ @group(0) @binding(1)
11
+
12
+ var <storage, read_write> output : array<f32>;
13
+
14
+ @group(0) @binding(2)
15
+
16
+ var <uniform> params : Params;
17
+
18
+ @compute @workgroup_size(16,16)
19
+ fn main(@builtin(global_invocation_id) id : vec3<u32>){
20
+ var dim = id.x;
21
+ var token = id.y;
22
+ if(dim >= params.dimSize || token >= params.tokenCount){
23
+ return;
24
+ }
25
+ var index = token * params.dimSize + dim;
26
+ let x = input[index];
27
+ output[index] = 0.5 * x * (1 + tanh(sqrt(2 / 3.141592653589793) * (x + 0.044715 * x * x * x)));
28
+ }
@@ -0,0 +1,54 @@
1
+ struct Params {
2
+ dim: u32,
3
+ tokenCount: u32,
4
+ }
5
+
6
+ @group(0) @binding(0)
7
+ var<storage, read> input: array<f32>;
8
+
9
+ @group(0) @binding(1)
10
+ var<storage, read> rstd: array<f32>;
11
+
12
+ @group(0) @binding(2)
13
+ var<storage, read> dout: array<f32>;
14
+
15
+ @group(0) @binding(3)
16
+ var<storage, read_write> din: array<f32>;
17
+
18
+ @group(0) @binding(4)
19
+ var<uniform> params: Params;
20
+
21
+ var<workgroup> shared1: array<f32, 256>;
22
+
23
+ @compute @workgroup_size(256)
24
+ fn main(@builtin(local_invocation_id) lid: vec3<u32>, @builtin(workgroup_id) wid: vec3<u32>) {
25
+ let token = wid.x;
26
+ let lane = lid.x;
27
+
28
+ if (token >= params.tokenCount) {
29
+ return;
30
+ }
31
+
32
+ let base = token * params.dim;
33
+ let inv_rms = rstd[token];
34
+ var local_sum = 0.0;
35
+ for (var i = lane; i < params.dim; i += 256u) {
36
+ local_sum += dout[base + i] * input[base + i];
37
+ }
38
+
39
+ shared1[lane] = local_sum;
40
+ workgroupBarrier();
41
+ for (var stride = 128u; stride > 0u; stride >>= 1u) {
42
+ if (lane < stride) {
43
+ shared1[lane] += shared1[lane + stride];
44
+ }
45
+ workgroupBarrier();
46
+ }
47
+ let mean_term = (shared1[0] * inv_rms * inv_rms) / f32(params.dim);
48
+ for (var i = lane; i < params.dim; i += 256u) {
49
+ let x = input[base + i];
50
+ let dy = dout[base + i];
51
+
52
+ din[base + i] = inv_rms * (dy - x * mean_term);
53
+ }
54
+ }
@@ -0,0 +1,51 @@
1
+ struct Params {
2
+ dim: u32,
3
+ tokenCount: u32,
4
+ }
5
+
6
+ @group(0) @binding(0)
7
+ var<storage, read> input: array<f32>;
8
+
9
+ @group(0) @binding(1)
10
+ var<storage, read_write> output: array<f32>;
11
+
12
+ @group(0) @binding(2)
13
+ var<storage, read_write> rstd: array<f32>;
14
+
15
+ @group(0) @binding(3)
16
+ var<uniform> params: Params;
17
+
18
+
19
+
20
+ var<workgroup> shared1: array<f32, 256>;
21
+
22
+ @compute @workgroup_size(256)
23
+ fn main(@builtin(local_invocation_id) lid: vec3<u32>, @builtin(workgroup_id) wid: vec3<u32>) {
24
+ let token = wid.x;
25
+ let lane = lid.x;
26
+ if (token >= params.tokenCount) {
27
+ return;
28
+ }
29
+ let base = token * params.dim;
30
+ var local_sum = 0.0;
31
+ for (var i = lane; i < params.dim; i += 256u) {
32
+ let x = input[base + i];
33
+ local_sum += x * x;
34
+ }
35
+ shared1[lane] = local_sum;
36
+ workgroupBarrier();
37
+ for (var stride = 128u; stride > 0u; stride >>= 1u) {
38
+ if (lane < stride) {
39
+ shared1[lane] += shared1[lane + stride];
40
+ }
41
+ workgroupBarrier();
42
+ }
43
+ let inv_rms = 1.0 / sqrt(shared1[0] / f32(params.dim) + 1e-8);
44
+ if (lane == 0u) {
45
+ rstd[token] = inv_rms;
46
+ }
47
+ workgroupBarrier();
48
+ for (var i = lane; i < params.dim; i += 256u) {
49
+ output[base + i] = input[base + i] * inv_rms;
50
+ }
51
+ }
@@ -0,0 +1,30 @@
1
+
2
+ struct Params {
3
+ size: u32,
4
+ D: u32
5
+ }
6
+
7
+ @group(0) @binding(0)
8
+ var<storage, read> probs: array<f32>;
9
+ @group(0) @binding(1)
10
+ var<storage, read> dProbs: array<f32>;
11
+ @group(0) @binding(2)
12
+ var<storage, read_write> dScores: array<f32>;
13
+ @group(0) @binding(3)
14
+ var<uniform> params: Params;
15
+
16
+ @compute @workgroup_size(16, 16)
17
+ fn main(@builtin(global_invocation_id) id: vec3<u32>) {
18
+ let row = id.y;
19
+ let col = id.x;
20
+ if (row >= params.size || col >= params.size) { return; }
21
+ let idx = row * params.size + col;
22
+ let p = probs[idx];
23
+ var sum = 0.0;
24
+ for (var j = 0u; j < params.size; j++) {
25
+ sum += probs[row * params.size + j] * dProbs[row * params.size + j];
26
+ }
27
+
28
+ dScores[idx] = p * (dProbs[idx] - sum);
29
+ dScores[idx] /= sqrt(f32(params.D));
30
+ }
@@ -0,0 +1,27 @@
1
+ struct Params {
2
+ size: u32,
3
+ }
4
+
5
+ @group(0) @binding(0)
6
+ var<storage, read> a: array<f32>;
7
+
8
+ @group(0) @binding(1)
9
+ var<storage, read> b: array<f32>;
10
+
11
+ @group(0) @binding(2)
12
+ var<storage, read> c: array<f32>;
13
+
14
+ @group(0) @binding(3)
15
+ var<storage, read_write> d: array<f32>;
16
+
17
+ @group(0) @binding(4)
18
+ var<uniform> params: Params;
19
+
20
+ @compute @workgroup_size(256)
21
+ fn main(@builtin(global_invocation_id) id: vec3<u32>) {
22
+ let i = id.x;
23
+ if (i >= params.size) {
24
+ return;
25
+ }
26
+ d[i] = a[i] + b[i] + c[i];
27
+ }
@@ -0,0 +1,63 @@
1
+ struct Params{
2
+ M: u32,
3
+ N: u32,
4
+ K: u32
5
+ }
6
+ @group(0) @binding(0)
7
+ var <storage, read> a : array<f32>;
8
+
9
+ @group(0) @binding(1)
10
+ var <storage, read> b : array<f32>;
11
+
12
+ @group(0) @binding(2)
13
+ var <storage, read_write> c : array<f32>;
14
+
15
+ @group(0) @binding(3)
16
+ var <uniform> params : Params;
17
+
18
+ var <workgroup> sdata: array<f32, 64>;
19
+
20
+
21
+ @compute @workgroup_size(64)
22
+
23
+ fn main(@builtin(workgroup_id) id : vec3<u32>, @builtin(local_invocation_id) lid : vec3<u32>){
24
+ let row = id.y;
25
+ let col = id.x;
26
+ let tane = lid.x;
27
+ let isCorrect = row >= params.M || col >= params.N;
28
+ if(!isCorrect){
29
+ var sum = 0.0;
30
+ for(var k = tane; k < params.K; k+= 64u){
31
+ sum += a[row * params.K + k] * b[k * params.N + col];
32
+ }
33
+ sdata[tane] = sum;
34
+ workgroupBarrier();
35
+ if(tane < 32u){
36
+ sdata[tane] += sdata[tane + 32u];
37
+ }
38
+ workgroupBarrier() ;
39
+ if(tane < 16u){
40
+ sdata[tane] += sdata[tane + 16u];
41
+ }
42
+ workgroupBarrier();
43
+ if(tane < 8u){
44
+ sdata[tane] += sdata[tane + 8u];
45
+ }
46
+ workgroupBarrier();
47
+ if(tane < 4u){
48
+ sdata[tane] += sdata[tane + 4u];
49
+ }
50
+ workgroupBarrier() ;
51
+ if(tane < 2u){
52
+ sdata[tane] += sdata[tane + 2u];
53
+ }
54
+ workgroupBarrier() ;
55
+ if(tane < 1u){
56
+ sdata[tane] += sdata[tane + 1u];
57
+ }
58
+ workgroupBarrier() ;
59
+ if(tane == 0u){
60
+ c[row * params.N + col] = sdata[0u];
61
+ }
62
+ }
63
+ }
@@ -0,0 +1,66 @@
1
+ struct Params{
2
+ M: u32,
3
+ N: u32,
4
+ K: u32
5
+ }
6
+ @group(0) @binding(0)
7
+ var <storage, read> a : array<f32>;
8
+
9
+ @group(0) @binding(1)
10
+ var <storage, read> b : array<f32>;
11
+
12
+ @group(0) @binding(2)
13
+ var <storage, read_write> c : array<f32>;
14
+
15
+ @group(0) @binding(3)
16
+ var <uniform> params : Params;
17
+
18
+
19
+ var <workgroup> sdata : array<f32, 64>;
20
+ @compute @workgroup_size(64)
21
+
22
+ fn main(@builtin(workgroup_id) id : vec3<u32>, @builtin(local_invocation_id) lid: vec3<u32>){
23
+ let row = id.y;
24
+ let col = id.x;
25
+ let tane = lid.x;
26
+ let isCorrect = row >= params.M || col >= params.N;
27
+ if(!isCorrect){
28
+ var sum = 0.0;
29
+ for(var k = tane; k < params.K; k+= 64u){
30
+ sum += a[row * params.K + k] * b[k * params.N + col];
31
+ }
32
+ sdata[tane] = sum;
33
+ workgroupBarrier();
34
+ if(tane < 32u){
35
+ sdata[tane] += sdata[tane + 32u];
36
+ }
37
+ workgroupBarrier() ;
38
+ if(tane < 16u){
39
+ sdata[tane] += sdata[tane + 16u];
40
+ }
41
+ workgroupBarrier();
42
+ if(tane < 8u){
43
+ sdata[tane] += sdata[tane + 8u];
44
+ }
45
+ workgroupBarrier();
46
+ if(tane < 4u){
47
+ sdata[tane] += sdata[tane + 4u];
48
+ }
49
+ workgroupBarrier() ;
50
+ if(tane < 2u){
51
+ sdata[tane] += sdata[tane + 2u];
52
+ }
53
+ workgroupBarrier() ;
54
+ if(tane < 1u){
55
+ sdata[tane] += sdata[tane + 1u];
56
+ }
57
+ workgroupBarrier() ;
58
+ if(tane == 0u){
59
+ sum = sdata[0u] / sqrt(f32(params.K));
60
+ if(col > row){
61
+ sum = -1e9;
62
+ }
63
+ c[row * params.N + col] = sum ;
64
+ }
65
+ }
66
+ }
@@ -0,0 +1,24 @@
1
+ struct Params{
2
+ M: u32,
3
+ N: u32,
4
+ K: u32
5
+ }
6
+ @group(0) @binding(0)
7
+ var <storage, read> a : array<f32>;
8
+
9
+ @group(0) @binding(1)
10
+ var <storage, read_write> b : array<f32>;
11
+
12
+ @group(0) @binding(2)
13
+ var <uniform> params : Params;
14
+
15
+ @compute @workgroup_size(16, 16)
16
+
17
+ fn main(@builtin(global_invocation_id) id : vec3<u32>){
18
+ let x = id.x;
19
+ let y = id.y;
20
+ if(y >= params.M || x >= params.N){
21
+ return ;
22
+ }
23
+ b[x * params.M + y] = a[y * params.N + x];
24
+ }
@@ -0,0 +1,36 @@
1
+ struct Params{
2
+ vocabSize: u32,
3
+ tokenCount: u32
4
+ }
5
+
6
+ @group(0) @binding(0)
7
+
8
+ var <storage, read> probs: array<f32>;
9
+
10
+ @group(0) @binding(1)
11
+
12
+ var <storage, read_write> dLogits: array<f32>;
13
+
14
+ @group(0) @binding(2)
15
+
16
+ var <storage, read> targetBuffer: array<u32>;
17
+
18
+ @group(0) @binding(3)
19
+
20
+ var <uniform> params: Params;
21
+
22
+ @compute @workgroup_size(64, 1)
23
+
24
+
25
+ fn main(@builtin(global_invocation_id) id : vec3<u32>){
26
+ let x = id.x;
27
+ let y = id.y;
28
+ if(x >= params.vocabSize || y >= params.tokenCount){
29
+ return;
30
+ }
31
+ let index = y * params.vocabSize + x;
32
+ dLogits[index] = probs[index];
33
+ if(x == targetBuffer[y]){
34
+ dLogits[index] -= 1;
35
+ }
36
+ }
@@ -0,0 +1,36 @@
1
+ struct Params{
2
+ vocabSize: u32,
3
+ tokenCount: u32
4
+ }
5
+
6
+
7
+ @group(0) @binding(0)
8
+
9
+ var <storage, read> probs: array<f32>;
10
+
11
+ @group(0) @binding(1)
12
+
13
+ var <storage, read> targetBuffer: array<u32>;
14
+
15
+
16
+ @group(0) @binding(2)
17
+
18
+ var <storage, read_write> loss: array<f32>;
19
+
20
+ @group(0) @binding(3)
21
+
22
+ var <uniform> params: Params;
23
+
24
+
25
+ @compute @workgroup_size(16)
26
+
27
+
28
+ fn main(@builtin(global_invocation_id) id : vec3<u32>){
29
+ let token = id.x;
30
+ if(token >= params.tokenCount){
31
+ return;
32
+ }
33
+ let targetToken = targetBuffer[token];
34
+ let index = token * params.vocabSize + targetToken;
35
+ loss[token] = - log(probs[index] + 1e-9);
36
+ }