sync c928d21e6cc1
Browse files
build/webgpu/manifest.json
CHANGED
|
@@ -104,6 +104,10 @@
|
|
| 104 |
},
|
| 105 |
"derive": {
|
| 106 |
"deviceWorkgroupCap": "min(device.limits.maxComputeInvocationsPerWorkgroup, device.limits.maxComputeWorkgroupSizeX)",
|
|
|
|
|
|
|
|
|
|
|
|
|
| 107 |
"hiddenSize": "dim(shapes.input, ranks.input - 1)",
|
| 108 |
"numTokens": "numel(shapes.input) / max(1, hiddenSize)",
|
| 109 |
"topK": "attrs.k",
|
|
@@ -574,7 +578,7 @@
|
|
| 574 |
{
|
| 575 |
"id": "quant_grouped_sgmat_routed",
|
| 576 |
"priority": 32,
|
| 577 |
-
"when": ["groupedSgmatOk"],
|
| 578 |
"constants": {
|
| 579 |
"groupTileM": "groupTileM",
|
| 580 |
"groupRouteWorkgroup": "tunables.groupRouteWorkgroup",
|
|
@@ -642,7 +646,6 @@
|
|
| 642 |
"requires": {
|
| 643 |
"features": ["subgroups", "chromium-experimental-subgroup-matrix"],
|
| 644 |
"limits": { "maxComputeWorkgroupStorageSize": 16512 },
|
| 645 |
-
"subgroupMinSize": 32,
|
| 646 |
"subgroupMatrixConfigs": [{ "componentType": "f32", "resultComponentType": "f32", "M": 8, "N": 8, "K": 8 }]
|
| 647 |
}
|
| 648 |
},
|
|
|
|
| 104 |
},
|
| 105 |
"derive": {
|
| 106 |
"deviceWorkgroupCap": "min(device.limits.maxComputeInvocationsPerWorkgroup, device.limits.maxComputeWorkgroupSizeX)",
|
| 107 |
+
"wave32Adapter": "has(device.adapterInfo, \"subgroupMinSize\") and has(device.adapterInfo, \"subgroupMaxSize\") and device.adapterInfo.subgroupMinSize == 32 and device.adapterInfo.subgroupMaxSize == 32",
|
| 108 |
+
"canPinSubgroupSize32": "device.features.has(\"subgroups\") and device.features.has(\"subgroup-size-control\") and has(device.adapterInfo, \"subgroupMinSize\") and has(device.adapterInfo, \"subgroupMaxSize\") and device.adapterInfo.subgroupMinSize <= 32 and device.adapterInfo.subgroupMaxSize >= 32",
|
| 109 |
+
"pinSubgroupSize32": "canPinSubgroupSize32 and not wave32Adapter",
|
| 110 |
+
"wave32Effective": "wave32Adapter or pinSubgroupSize32",
|
| 111 |
"hiddenSize": "dim(shapes.input, ranks.input - 1)",
|
| 112 |
"numTokens": "numel(shapes.input) / max(1, hiddenSize)",
|
| 113 |
"topK": "attrs.k",
|
|
|
|
| 578 |
{
|
| 579 |
"id": "quant_grouped_sgmat_routed",
|
| 580 |
"priority": 32,
|
| 581 |
+
"when": ["groupedSgmatOk", "wave32Effective"],
|
| 582 |
"constants": {
|
| 583 |
"groupTileM": "groupTileM",
|
| 584 |
"groupRouteWorkgroup": "tunables.groupRouteWorkgroup",
|
|
|
|
| 646 |
"requires": {
|
| 647 |
"features": ["subgroups", "chromium-experimental-subgroup-matrix"],
|
| 648 |
"limits": { "maxComputeWorkgroupStorageSize": 16512 },
|
|
|
|
| 649 |
"subgroupMatrixConfigs": [{ "componentType": "f32", "resultComponentType": "f32", "M": 8, "N": 8, "K": 8 }]
|
| 650 |
}
|
| 651 |
},
|
build/webgpu/metadata.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
| 1 |
{
|
| 2 |
"name": "com.microsoft.QMoE",
|
| 3 |
-
"id": "
|
| 4 |
"version": 1,
|
| 5 |
"license": "Apache-2.0",
|
| 6 |
"backend": { "type": "webgpu" },
|
|
@@ -9,14 +9,14 @@
|
|
| 9 |
"files": {
|
| 10 |
"bench.json": "zBVupnayA0Ggc4y737P9tzqyM/q/N8F4j+FEJXz6Wks=",
|
| 11 |
"expert-group-slots.wgsl.jinja": "Ta+3H2FA1qRRzksdkwgKLZiO+AokmuM+B9JVN8cv1EQ=",
|
| 12 |
-
"manifest.json": "
|
| 13 |
"qmoe-fc1-activation-gemv.wgsl.jinja": "UvP8Vyx1E9+/+I09w/z9iB6h6MHrSrOmjKfIelyIS0M=",
|
| 14 |
-
"qmoe-fc1-activation-grouped-sgmat.wgsl.jinja": "
|
| 15 |
"qmoe-fc1-activation-grouped.wgsl.jinja": "y2vGeNeXE5YmNrM2WrXogyF/fTvQ/nqYR4uWBTDvpPY=",
|
| 16 |
"qmoe-fc1-activation-stage.wgsl.jinja": "Hx7fYjr8CwB2jXeTnh6G6IyavWrLwyOdtUsJwVEpgGk=",
|
| 17 |
"qmoe-mix-stage.wgsl.jinja": "+deuFyuBn04UeIX8Hk2/ntCHNfM1vgkNDTcsh3uXVdI=",
|
| 18 |
"qmoe-output-gemv.wgsl.jinja": "OJLoDDWMYE5yaTeDGY7qUeuf6AepJL7ZZLx8ko6OTEQ=",
|
| 19 |
-
"qmoe-output-grouped-sgmat.wgsl.jinja": "
|
| 20 |
"qmoe-output-grouped.wgsl.jinja": "mHkrsubKwd0YWYo4TMpl4HWdbWheoeiAsUU2WsUON8E=",
|
| 21 |
"qmoe-output-stage.wgsl.jinja": "f9CWE9XR/5RTULNXdTHwA4gFsOL1QRg0H/rT3dD32Gs=",
|
| 22 |
"qmoe-output-zero-inter.wgsl.jinja": "6iBjk5YqxSSoXufDo/aJJRS4v8ZOp7wF2aRRXU4m1SA=",
|
|
@@ -24,6 +24,6 @@
|
|
| 24 |
"test.json": "3i3FSregL3rNfwD/Wi7X2Ix296NNB1zIV+Ap9TrpMeU="
|
| 25 |
}
|
| 26 |
},
|
| 27 |
-
"provenance": { "kernel": { "sha": "
|
| 28 |
"webgpu": { "manifestSpec": "1.0", "specialized": true, "opPath": "ops/com.microsoft.QMoE" }
|
| 29 |
}
|
|
|
|
| 1 |
{
|
| 2 |
"name": "com.microsoft.QMoE",
|
| 3 |
+
"id": "_com_microsoft_qmoe_webgpu_6caed83",
|
| 4 |
"version": 1,
|
| 5 |
"license": "Apache-2.0",
|
| 6 |
"backend": { "type": "webgpu" },
|
|
|
|
| 9 |
"files": {
|
| 10 |
"bench.json": "zBVupnayA0Ggc4y737P9tzqyM/q/N8F4j+FEJXz6Wks=",
|
| 11 |
"expert-group-slots.wgsl.jinja": "Ta+3H2FA1qRRzksdkwgKLZiO+AokmuM+B9JVN8cv1EQ=",
|
| 12 |
+
"manifest.json": "F9s2iIz0nNI2vJ+2zAFr55u8jaKjAEe5qvfmGxSc6mE=",
|
| 13 |
"qmoe-fc1-activation-gemv.wgsl.jinja": "UvP8Vyx1E9+/+I09w/z9iB6h6MHrSrOmjKfIelyIS0M=",
|
| 14 |
+
"qmoe-fc1-activation-grouped-sgmat.wgsl.jinja": "r/vlFM8WL1WfjkX7P2/DjKxrMDRKBmI+PtV/qQVLgCc=",
|
| 15 |
"qmoe-fc1-activation-grouped.wgsl.jinja": "y2vGeNeXE5YmNrM2WrXogyF/fTvQ/nqYR4uWBTDvpPY=",
|
| 16 |
"qmoe-fc1-activation-stage.wgsl.jinja": "Hx7fYjr8CwB2jXeTnh6G6IyavWrLwyOdtUsJwVEpgGk=",
|
| 17 |
"qmoe-mix-stage.wgsl.jinja": "+deuFyuBn04UeIX8Hk2/ntCHNfM1vgkNDTcsh3uXVdI=",
|
| 18 |
"qmoe-output-gemv.wgsl.jinja": "OJLoDDWMYE5yaTeDGY7qUeuf6AepJL7ZZLx8ko6OTEQ=",
|
| 19 |
+
"qmoe-output-grouped-sgmat.wgsl.jinja": "aoBOyGPOM2MXOpjvVCppacvWra4bVBewQEbjL2MPe2k=",
|
| 20 |
"qmoe-output-grouped.wgsl.jinja": "mHkrsubKwd0YWYo4TMpl4HWdbWheoeiAsUU2WsUON8E=",
|
| 21 |
"qmoe-output-stage.wgsl.jinja": "f9CWE9XR/5RTULNXdTHwA4gFsOL1QRg0H/rT3dD32Gs=",
|
| 22 |
"qmoe-output-zero-inter.wgsl.jinja": "6iBjk5YqxSSoXufDo/aJJRS4v8ZOp7wF2aRRXU4m1SA=",
|
|
|
|
| 24 |
"test.json": "3i3FSregL3rNfwD/Wi7X2Ix296NNB1zIV+Ap9TrpMeU="
|
| 25 |
}
|
| 26 |
},
|
| 27 |
+
"provenance": { "kernel": { "sha": "c928d21e6cc1310861cba3bafb75f5f679ecf5f3", "dirty": false } },
|
| 28 |
"webgpu": { "manifestSpec": "1.0", "specialized": true, "opPath": "ops/com.microsoft.QMoE" }
|
| 29 |
}
|
build/webgpu/qmoe-fc1-activation-grouped-sgmat.wgsl.jinja
CHANGED
|
@@ -1,4 +1,7 @@
|
|
| 1 |
enable subgroups;
|
|
|
|
|
|
|
|
|
|
| 2 |
enable chromium_experimental_subgroup_matrix;
|
| 3 |
diagnostic(off, chromium.subgroup_matrix_uniformity);
|
| 4 |
|
|
@@ -124,7 +127,7 @@ fn loadSHMB(expert: u32, weight_base: u32, k_idx: u32, row: u32, c_idx: u32) {
|
|
| 124 |
}
|
| 125 |
}
|
| 126 |
|
| 127 |
-
@compute @workgroup_size({{ sgmatWorkgroup }}, 1, 1)
|
| 128 |
fn main(
|
| 129 |
@builtin(workgroup_id) wid: vec3<u32>,
|
| 130 |
@builtin(local_invocation_index) local_idx: u32,
|
|
@@ -162,14 +165,14 @@ fn main(
|
|
| 162 |
|
| 163 |
for (var step = 0u; step < TILE_K; step = step + 8u) {
|
| 164 |
{% set operandScalar = "f32" %} let matrix_a_offset = subtile_idy * SUB_ROWS * TILE_K + step;
|
| 165 |
-
var matA0: subgroup_matrix_left<{{ operandScalar }}, 8, 8> = subgroupMatrixLoad<subgroup_matrix_left<{{ operandScalar }}, 8, 8>>(&tile_A, matrix_a_offset,
|
| 166 |
-
var matA1: subgroup_matrix_left<{{ operandScalar }}, 8, 8> = subgroupMatrixLoad<subgroup_matrix_left<{{ operandScalar }}, 8, 8>>(&tile_A, matrix_a_offset + 8u * TILE_K,
|
| 167 |
|
| 168 |
let matrix_b_offset = subtile_idx * SUB_COLS * TILE_K + step;
|
| 169 |
-
var matB0: subgroup_matrix_right<{{ operandScalar }}, 8, 8> = subgroupMatrixLoad<subgroup_matrix_right<{{ operandScalar }}, 8, 8>>(&tile_B, matrix_b_offset,
|
| 170 |
-
var matB1: subgroup_matrix_right<{{ operandScalar }}, 8, 8> = subgroupMatrixLoad<subgroup_matrix_right<{{ operandScalar }}, 8, 8>>(&tile_B, matrix_b_offset + 8u * TILE_K,
|
| 171 |
-
var matB2: subgroup_matrix_right<{{ operandScalar }}, 8, 8> = subgroupMatrixLoad<subgroup_matrix_right<{{ operandScalar }}, 8, 8>>(&tile_B, matrix_b_offset + 16u * TILE_K,
|
| 172 |
-
var matB3: subgroup_matrix_right<{{ operandScalar }}, 8, 8> = subgroupMatrixLoad<subgroup_matrix_right<{{ operandScalar }}, 8, 8>>(&tile_B, matrix_b_offset + 24u * TILE_K,
|
| 173 |
|
| 174 |
matC00 = subgroupMatrixMultiplyAccumulate(matA0, matB0, matC00);
|
| 175 |
matC01 = subgroupMatrixMultiplyAccumulate(matA0, matB1, matC01);
|
|
@@ -194,7 +197,7 @@ fn main(
|
|
| 194 |
// The scratch banks are shared by both row groups, so the readback is fenced on both
|
| 195 |
// sides of each collective store.
|
| 196 |
{% for c in [0, 1, 2, 3] %}
|
| 197 |
-
subgroupMatrixStore(&scratch[subtile_id][{{ c }}], 0u, matC{{ group }}{{ c }},
|
| 198 |
{% endfor %}
|
| 199 |
workgroupBarrier();
|
| 200 |
{
|
|
|
|
| 1 |
enable subgroups;
|
| 2 |
+
{% if pinSubgroupSize32 %}
|
| 3 |
+
enable subgroup_size_control;
|
| 4 |
+
{% endif %}
|
| 5 |
enable chromium_experimental_subgroup_matrix;
|
| 6 |
diagnostic(off, chromium.subgroup_matrix_uniformity);
|
| 7 |
|
|
|
|
| 127 |
}
|
| 128 |
}
|
| 129 |
|
| 130 |
+
@compute @workgroup_size({{ sgmatWorkgroup }}, 1, 1){{ " @subgroup_size(32)" if pinSubgroupSize32 else "" }}
|
| 131 |
fn main(
|
| 132 |
@builtin(workgroup_id) wid: vec3<u32>,
|
| 133 |
@builtin(local_invocation_index) local_idx: u32,
|
|
|
|
| 165 |
|
| 166 |
for (var step = 0u; step < TILE_K; step = step + 8u) {
|
| 167 |
{% set operandScalar = "f32" %} let matrix_a_offset = subtile_idy * SUB_ROWS * TILE_K + step;
|
| 168 |
+
var matA0: subgroup_matrix_left<{{ operandScalar }}, 8, 8> = subgroupMatrixLoad<subgroup_matrix_left<{{ operandScalar }}, 8, 8>, row_major>(&tile_A, matrix_a_offset, TILE_K);
|
| 169 |
+
var matA1: subgroup_matrix_left<{{ operandScalar }}, 8, 8> = subgroupMatrixLoad<subgroup_matrix_left<{{ operandScalar }}, 8, 8>, row_major>(&tile_A, matrix_a_offset + 8u * TILE_K, TILE_K);
|
| 170 |
|
| 171 |
let matrix_b_offset = subtile_idx * SUB_COLS * TILE_K + step;
|
| 172 |
+
var matB0: subgroup_matrix_right<{{ operandScalar }}, 8, 8> = subgroupMatrixLoad<subgroup_matrix_right<{{ operandScalar }}, 8, 8>, col_major>(&tile_B, matrix_b_offset, TILE_K);
|
| 173 |
+
var matB1: subgroup_matrix_right<{{ operandScalar }}, 8, 8> = subgroupMatrixLoad<subgroup_matrix_right<{{ operandScalar }}, 8, 8>, col_major>(&tile_B, matrix_b_offset + 8u * TILE_K, TILE_K);
|
| 174 |
+
var matB2: subgroup_matrix_right<{{ operandScalar }}, 8, 8> = subgroupMatrixLoad<subgroup_matrix_right<{{ operandScalar }}, 8, 8>, col_major>(&tile_B, matrix_b_offset + 16u * TILE_K, TILE_K);
|
| 175 |
+
var matB3: subgroup_matrix_right<{{ operandScalar }}, 8, 8> = subgroupMatrixLoad<subgroup_matrix_right<{{ operandScalar }}, 8, 8>, col_major>(&tile_B, matrix_b_offset + 24u * TILE_K, TILE_K);
|
| 176 |
|
| 177 |
matC00 = subgroupMatrixMultiplyAccumulate(matA0, matB0, matC00);
|
| 178 |
matC01 = subgroupMatrixMultiplyAccumulate(matA0, matB1, matC01);
|
|
|
|
| 197 |
// The scratch banks are shared by both row groups, so the readback is fenced on both
|
| 198 |
// sides of each collective store.
|
| 199 |
{% for c in [0, 1, 2, 3] %}
|
| 200 |
+
subgroupMatrixStore<row_major>(&scratch[subtile_id][{{ c }}], 0u, matC{{ group }}{{ c }}, 8u);
|
| 201 |
{% endfor %}
|
| 202 |
workgroupBarrier();
|
| 203 |
{
|
build/webgpu/qmoe-output-grouped-sgmat.wgsl.jinja
CHANGED
|
@@ -1,4 +1,7 @@
|
|
| 1 |
enable subgroups;
|
|
|
|
|
|
|
|
|
|
| 2 |
enable chromium_experimental_subgroup_matrix;
|
| 3 |
diagnostic(off, chromium.subgroup_matrix_uniformity);
|
| 4 |
|
|
@@ -118,7 +121,7 @@ fn storeOutput(col_base: u32, row: u32, col: u32, src_slot: u32, row_base: u32,
|
|
| 118 |
}
|
| 119 |
}
|
| 120 |
|
| 121 |
-
@compute @workgroup_size({{ sgmatWorkgroup }}, 1, 1)
|
| 122 |
fn main(
|
| 123 |
@builtin(workgroup_id) wid: vec3<u32>,
|
| 124 |
@builtin(local_invocation_index) local_idx: u32,
|
|
@@ -156,14 +159,14 @@ fn main(
|
|
| 156 |
|
| 157 |
for (var step = 0u; step < TILE_K; step = step + 8u) {
|
| 158 |
{% set operandScalar = "f32" %} let matrix_a_offset = subtile_idy * SUB_ROWS * TILE_K + step;
|
| 159 |
-
var matA0: subgroup_matrix_left<{{ operandScalar }}, 8, 8> = subgroupMatrixLoad<subgroup_matrix_left<{{ operandScalar }}, 8, 8>>(&tile_A, matrix_a_offset,
|
| 160 |
-
var matA1: subgroup_matrix_left<{{ operandScalar }}, 8, 8> = subgroupMatrixLoad<subgroup_matrix_left<{{ operandScalar }}, 8, 8>>(&tile_A, matrix_a_offset + 8u * TILE_K,
|
| 161 |
|
| 162 |
let matrix_b_offset = subtile_idx * SUB_COLS * TILE_K + step;
|
| 163 |
-
var matB0: subgroup_matrix_right<{{ operandScalar }}, 8, 8> = subgroupMatrixLoad<subgroup_matrix_right<{{ operandScalar }}, 8, 8>>(&tile_B, matrix_b_offset,
|
| 164 |
-
var matB1: subgroup_matrix_right<{{ operandScalar }}, 8, 8> = subgroupMatrixLoad<subgroup_matrix_right<{{ operandScalar }}, 8, 8>>(&tile_B, matrix_b_offset + 8u * TILE_K,
|
| 165 |
-
var matB2: subgroup_matrix_right<{{ operandScalar }}, 8, 8> = subgroupMatrixLoad<subgroup_matrix_right<{{ operandScalar }}, 8, 8>>(&tile_B, matrix_b_offset + 16u * TILE_K,
|
| 166 |
-
var matB3: subgroup_matrix_right<{{ operandScalar }}, 8, 8> = subgroupMatrixLoad<subgroup_matrix_right<{{ operandScalar }}, 8, 8>>(&tile_B, matrix_b_offset + 24u * TILE_K,
|
| 167 |
|
| 168 |
matC00 = subgroupMatrixMultiplyAccumulate(matA0, matB0, matC00);
|
| 169 |
matC01 = subgroupMatrixMultiplyAccumulate(matA0, matB1, matC01);
|
|
@@ -180,7 +183,7 @@ fn main(
|
|
| 180 |
// Each scratch bank is written by a collective store and then read across lanes, and
|
| 181 |
// the two row groups reuse the same banks, so both barriers are load-bearing.
|
| 182 |
{% for col in [0, 1, 2, 3] %}
|
| 183 |
-
subgroupMatrixStore(&scratch[subtile_id][{{ col }}], 0u, matC0{{ col }},
|
| 184 |
{% endfor %}
|
| 185 |
workgroupBarrier();
|
| 186 |
let row = sg_id / 4u;
|
|
@@ -189,7 +192,7 @@ fn main(
|
|
| 189 |
workgroupBarrier();
|
| 190 |
|
| 191 |
{% for col in [0, 1, 2, 3] %}
|
| 192 |
-
subgroupMatrixStore(&scratch[subtile_id][{{ col }}], 0u, matC1{{ col }},
|
| 193 |
{% endfor %}
|
| 194 |
workgroupBarrier();
|
| 195 |
storeOutput(col_base + base_B, row, col, subtile_id, base_A + 8u, rows);
|
|
|
|
| 1 |
enable subgroups;
|
| 2 |
+
{% if pinSubgroupSize32 %}
|
| 3 |
+
enable subgroup_size_control;
|
| 4 |
+
{% endif %}
|
| 5 |
enable chromium_experimental_subgroup_matrix;
|
| 6 |
diagnostic(off, chromium.subgroup_matrix_uniformity);
|
| 7 |
|
|
|
|
| 121 |
}
|
| 122 |
}
|
| 123 |
|
| 124 |
+
@compute @workgroup_size({{ sgmatWorkgroup }}, 1, 1){{ " @subgroup_size(32)" if pinSubgroupSize32 else "" }}
|
| 125 |
fn main(
|
| 126 |
@builtin(workgroup_id) wid: vec3<u32>,
|
| 127 |
@builtin(local_invocation_index) local_idx: u32,
|
|
|
|
| 159 |
|
| 160 |
for (var step = 0u; step < TILE_K; step = step + 8u) {
|
| 161 |
{% set operandScalar = "f32" %} let matrix_a_offset = subtile_idy * SUB_ROWS * TILE_K + step;
|
| 162 |
+
var matA0: subgroup_matrix_left<{{ operandScalar }}, 8, 8> = subgroupMatrixLoad<subgroup_matrix_left<{{ operandScalar }}, 8, 8>, row_major>(&tile_A, matrix_a_offset, TILE_K);
|
| 163 |
+
var matA1: subgroup_matrix_left<{{ operandScalar }}, 8, 8> = subgroupMatrixLoad<subgroup_matrix_left<{{ operandScalar }}, 8, 8>, row_major>(&tile_A, matrix_a_offset + 8u * TILE_K, TILE_K);
|
| 164 |
|
| 165 |
let matrix_b_offset = subtile_idx * SUB_COLS * TILE_K + step;
|
| 166 |
+
var matB0: subgroup_matrix_right<{{ operandScalar }}, 8, 8> = subgroupMatrixLoad<subgroup_matrix_right<{{ operandScalar }}, 8, 8>, col_major>(&tile_B, matrix_b_offset, TILE_K);
|
| 167 |
+
var matB1: subgroup_matrix_right<{{ operandScalar }}, 8, 8> = subgroupMatrixLoad<subgroup_matrix_right<{{ operandScalar }}, 8, 8>, col_major>(&tile_B, matrix_b_offset + 8u * TILE_K, TILE_K);
|
| 168 |
+
var matB2: subgroup_matrix_right<{{ operandScalar }}, 8, 8> = subgroupMatrixLoad<subgroup_matrix_right<{{ operandScalar }}, 8, 8>, col_major>(&tile_B, matrix_b_offset + 16u * TILE_K, TILE_K);
|
| 169 |
+
var matB3: subgroup_matrix_right<{{ operandScalar }}, 8, 8> = subgroupMatrixLoad<subgroup_matrix_right<{{ operandScalar }}, 8, 8>, col_major>(&tile_B, matrix_b_offset + 24u * TILE_K, TILE_K);
|
| 170 |
|
| 171 |
matC00 = subgroupMatrixMultiplyAccumulate(matA0, matB0, matC00);
|
| 172 |
matC01 = subgroupMatrixMultiplyAccumulate(matA0, matB1, matC01);
|
|
|
|
| 183 |
// Each scratch bank is written by a collective store and then read across lanes, and
|
| 184 |
// the two row groups reuse the same banks, so both barriers are load-bearing.
|
| 185 |
{% for col in [0, 1, 2, 3] %}
|
| 186 |
+
subgroupMatrixStore<row_major>(&scratch[subtile_id][{{ col }}], 0u, matC0{{ col }}, 8u);
|
| 187 |
{% endfor %}
|
| 188 |
workgroupBarrier();
|
| 189 |
let row = sg_id / 4u;
|
|
|
|
| 192 |
workgroupBarrier();
|
| 193 |
|
| 194 |
{% for col in [0, 1, 2, 3] %}
|
| 195 |
+
subgroupMatrixStore<row_major>(&scratch[subtile_id][{{ col }}], 0u, matC1{{ col }}, 8u);
|
| 196 |
{% endfor %}
|
| 197 |
workgroupBarrier();
|
| 198 |
storeOutput(col_base + base_B, row, col, subtile_id, base_A + 8u, rows);
|