Fix NVIDIA/Windows output corruption: add the missing sgExact32 guard to 8 bare subgroupAdd sites
#13
by Ar5en1c - opened
- 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();
|