Fix NVIDIA/Windows output corruption: add the missing sgExact32 guard to 8 bare subgroupAdd sites

#13
by Ar5en1c - opened
Files changed (1) hide show
  1. gemma-4-e2b.js +80 -0
gemma-4-e2b.js CHANGED
@@ -1469,7 +1469,17 @@ fn srq(x: f32, s: f32) -> f32 {
1469
 
1470
  fn reduce(value: f32, tid: u32) -> f32 {
1471
  {% if useSubgroups %}
 
1472
  return subgroupAdd(value);
 
 
 
 
 
 
 
 
 
1473
  {% else %}
1474
  red[tid] = value;
1475
  workgroupBarrier();
@@ -2150,7 +2160,17 @@ var<workgroup> partial: array<f32, WG>;
2150
 
2151
  fn reduce_sum(value: f32, tid: u32) -> f32 {
2152
  {% if useSubgroups %}
 
2153
  return subgroupAdd(value);
 
 
 
 
 
 
 
 
 
2154
  {% else %}
2155
  partial[tid] = value;
2156
  workgroupBarrier();
@@ -2904,7 +2924,17 @@ var<workgroup> red: array<f32, WG>;
2904
 
2905
  fn reduce(value: f32, tid: u32) -> f32 {
2906
  {% if useSubgroups %}
 
2907
  return subgroupAdd(value);
 
 
 
 
 
 
 
 
 
2908
  {% else %}
2909
  red[tid] = value;
2910
  workgroupBarrier();
@@ -3014,7 +3044,17 @@ var<workgroup> red: array<f32, WG>;
3014
 
3015
  fn reduce(value: f32, tid: u32) -> f32 {
3016
  {% if useSubgroups %}
 
3017
  return subgroupAdd(value);
 
 
 
 
 
 
 
 
 
3018
  {% else %}
3019
  red[tid] = value;
3020
  workgroupBarrier();
@@ -3636,7 +3676,17 @@ fn srq(x: f32, s: f32) -> f32 {
3636
 
3637
  fn reduce(value: f32, tid: u32) -> f32 {
3638
  {% if useSubgroups %}
 
3639
  return subgroupAdd(value);
 
 
 
 
 
 
 
 
 
3640
  {% else %}
3641
  pQA[tid] = value;
3642
  workgroupBarrier();
@@ -4092,7 +4142,17 @@ var<workgroup> red: array<f32, WG>;
4092
 
4093
  fn reduce(value: f32, tid: u32) -> f32 {
4094
  {% if useSubgroups %}
 
4095
  return subgroupAdd(value);
 
 
 
 
 
 
 
 
 
4096
  {% else %}
4097
  red[tid] = value;
4098
  workgroupBarrier();
@@ -4963,7 +5023,17 @@ fn srq(x: f32, s: f32) -> f32 {
4963
 
4964
  fn reduce(value: f32, tid: u32) -> f32 {
4965
  {% if useSubgroups %}
 
4966
  return subgroupAdd(value);
 
 
 
 
 
 
 
 
 
4967
  {% else %}
4968
  red[tid] = value;
4969
  workgroupBarrier();
@@ -5094,7 +5164,17 @@ fn srq4(x: vec4<f32>, s: f32) -> vec4<f32> {
5094
 
5095
  fn reduce(value: f32, tid: u32) -> f32 {
5096
  {% if useSubgroups %}
 
5097
  return subgroupAdd(value);
 
 
 
 
 
 
 
 
 
5098
  {% else %}
5099
  pQA[tid] = value;
5100
  workgroupBarrier();
 
1469
 
1470
  fn reduce(value: f32, tid: u32) -> f32 {
1471
  {% if useSubgroups %}
1472
+ {% if sgExact32 %}
1473
  return subgroupAdd(value);
1474
+ {% else %}
1475
+ var x = value;
1476
+ x = x + subgroupShuffleXor(x, 1u);
1477
+ x = x + subgroupShuffleXor(x, 2u);
1478
+ x = x + subgroupShuffleXor(x, 4u);
1479
+ x = x + subgroupShuffleXor(x, 8u);
1480
+ x = x + subgroupShuffleXor(x, 16u);
1481
+ return x;
1482
+ {% endif %}
1483
  {% else %}
1484
  red[tid] = value;
1485
  workgroupBarrier();
 
2160
 
2161
  fn reduce_sum(value: f32, tid: u32) -> f32 {
2162
  {% if useSubgroups %}
2163
+ {% if sgExact32 %}
2164
  return subgroupAdd(value);
2165
+ {% else %}
2166
+ var x = value;
2167
+ x = x + subgroupShuffleXor(x, 1u);
2168
+ x = x + subgroupShuffleXor(x, 2u);
2169
+ x = x + subgroupShuffleXor(x, 4u);
2170
+ x = x + subgroupShuffleXor(x, 8u);
2171
+ x = x + subgroupShuffleXor(x, 16u);
2172
+ return x;
2173
+ {% endif %}
2174
  {% else %}
2175
  partial[tid] = value;
2176
  workgroupBarrier();
 
2924
 
2925
  fn reduce(value: f32, tid: u32) -> f32 {
2926
  {% if useSubgroups %}
2927
+ {% if sgExact32 %}
2928
  return subgroupAdd(value);
2929
+ {% else %}
2930
+ var x = value;
2931
+ x = x + subgroupShuffleXor(x, 1u);
2932
+ x = x + subgroupShuffleXor(x, 2u);
2933
+ x = x + subgroupShuffleXor(x, 4u);
2934
+ x = x + subgroupShuffleXor(x, 8u);
2935
+ x = x + subgroupShuffleXor(x, 16u);
2936
+ return x;
2937
+ {% endif %}
2938
  {% else %}
2939
  red[tid] = value;
2940
  workgroupBarrier();
 
3044
 
3045
  fn reduce(value: f32, tid: u32) -> f32 {
3046
  {% if useSubgroups %}
3047
+ {% if sgExact32 %}
3048
  return subgroupAdd(value);
3049
+ {% else %}
3050
+ var x = value;
3051
+ x = x + subgroupShuffleXor(x, 1u);
3052
+ x = x + subgroupShuffleXor(x, 2u);
3053
+ x = x + subgroupShuffleXor(x, 4u);
3054
+ x = x + subgroupShuffleXor(x, 8u);
3055
+ x = x + subgroupShuffleXor(x, 16u);
3056
+ return x;
3057
+ {% endif %}
3058
  {% else %}
3059
  red[tid] = value;
3060
  workgroupBarrier();
 
3676
 
3677
  fn reduce(value: f32, tid: u32) -> f32 {
3678
  {% if useSubgroups %}
3679
+ {% if sgExact32 %}
3680
  return subgroupAdd(value);
3681
+ {% else %}
3682
+ var x = value;
3683
+ x = x + subgroupShuffleXor(x, 1u);
3684
+ x = x + subgroupShuffleXor(x, 2u);
3685
+ x = x + subgroupShuffleXor(x, 4u);
3686
+ x = x + subgroupShuffleXor(x, 8u);
3687
+ x = x + subgroupShuffleXor(x, 16u);
3688
+ return x;
3689
+ {% endif %}
3690
  {% else %}
3691
  pQA[tid] = value;
3692
  workgroupBarrier();
 
4142
 
4143
  fn reduce(value: f32, tid: u32) -> f32 {
4144
  {% if useSubgroups %}
4145
+ {% if sgExact32 %}
4146
  return subgroupAdd(value);
4147
+ {% else %}
4148
+ var x = value;
4149
+ x = x + subgroupShuffleXor(x, 1u);
4150
+ x = x + subgroupShuffleXor(x, 2u);
4151
+ x = x + subgroupShuffleXor(x, 4u);
4152
+ x = x + subgroupShuffleXor(x, 8u);
4153
+ x = x + subgroupShuffleXor(x, 16u);
4154
+ return x;
4155
+ {% endif %}
4156
  {% else %}
4157
  red[tid] = value;
4158
  workgroupBarrier();
 
5023
 
5024
  fn reduce(value: f32, tid: u32) -> f32 {
5025
  {% if useSubgroups %}
5026
+ {% if sgExact32 %}
5027
  return subgroupAdd(value);
5028
+ {% else %}
5029
+ var x = value;
5030
+ x = x + subgroupShuffleXor(x, 1u);
5031
+ x = x + subgroupShuffleXor(x, 2u);
5032
+ x = x + subgroupShuffleXor(x, 4u);
5033
+ x = x + subgroupShuffleXor(x, 8u);
5034
+ x = x + subgroupShuffleXor(x, 16u);
5035
+ return x;
5036
+ {% endif %}
5037
  {% else %}
5038
  red[tid] = value;
5039
  workgroupBarrier();
 
5164
 
5165
  fn reduce(value: f32, tid: u32) -> f32 {
5166
  {% if useSubgroups %}
5167
+ {% if sgExact32 %}
5168
  return subgroupAdd(value);
5169
+ {% else %}
5170
+ var x = value;
5171
+ x = x + subgroupShuffleXor(x, 1u);
5172
+ x = x + subgroupShuffleXor(x, 2u);
5173
+ x = x + subgroupShuffleXor(x, 4u);
5174
+ x = x + subgroupShuffleXor(x, 8u);
5175
+ x = x + subgroupShuffleXor(x, 16u);
5176
+ return x;
5177
+ {% endif %}
5178
  {% else %}
5179
  pQA[tid] = value;
5180
  workgroupBarrier();