| #version 450 core |
| #extension GL_KHR_memory_scope_semantics : enable |
| #extension GL_KHR_cooperative_matrix : enable |
| #extension GL_EXT_shader_explicit_arithmetic_types : enable |
| #extension GL_EXT_cooperative_matrix_maintenance1 : enable
|
| #extension GL_EXT_float_e5m2 : enable
|
| |
| layout (local_size_x = 64, local_size_y = 1, local_size_z = 1) in; |
| |
| float16_t combine(const in float16_t a, const in float16_t b) { return a + b; } |
| f16vec2 vectorCombine(const in f16vec2 a, const in f16vec2 b) { return a + b; } |
| float16_t elem(const in uint32_t row, const in uint32_t col, const in float16_t x) { return x; } |
| float16_t badCoordElem(const in uvec2 row, const in uint32_t col, const in float16_t x) { return x; } |
| f16vec2 vectorElem(const in uint32_t row, const in uint32_t col, const in f16vec2 x) { return x; } |
| float16_t optionalElem(const in uint32_t row, const in uint32_t col, const in float16_t x, |
| const in float16_t y) { return x + y; } |
| float16_t badMatrixOptionalElem(const in uint32_t row, const in uint32_t col, const in float16_t x, |
| const in f16vec2 y) { return x + y.x; } |
| |
| layout(constant_id = 0) const int SpecRows = 16; |
| layout(constant_id = 1) const int SpecCols = 8; |
| layout(constant_id = 2) const int SpecScope = gl_ScopeWorkgroup; |
| const int SpecScopeAlias = SpecScope * 1; |
| const int SpecRowResultRows = SpecRows * 1; |
| const int SpecRowResultCols = SpecCols * 3; |
| const int SpecColumnResultRows = SpecRows * 3; |
| const int SpecColumnResultCols = SpecCols * 1; |
| const int SpecTransposeRows = SpecCols * 1; |
| const int SpecTransposeCols = SpecRows * 1; |
| |
| void main() |
| { |
| coopmat<float16_t, gl_ScopeWorkgroup, 16, 16, gl_MatrixUseA> A;
|
| coopmat<float16_t, gl_ScopeWorkgroup, 16, 16, gl_MatrixUseB> B;
|
| coopmat<float16_t, gl_ScopeWorkgroup, 16, 16, gl_MatrixUseAccumulator> Acc;
|
|
|
| coopMatTransposeEXT(A, Acc); // ok
|
| coopMatTransposeEXT(B, Acc); // ok |
| coopMatTransposeEXT(Acc, A); // error |
| coopMatTransposeEXT(Acc, B); // error |
| |
| coopmat<float16_t, gl_ScopeSubgroup, 16, 16, gl_MatrixUseAccumulator> AccSubgroup; |
| coopmat<float32_t, gl_ScopeWorkgroup, 16, 16, gl_MatrixUseAccumulator> AccFloat; |
| coopmat<float16_t, gl_ScopeWorkgroup, 8, 8, gl_MatrixUseAccumulator> Acc8x8; |
| coopmat<float16_t, gl_ScopeWorkgroup, 8, 16, gl_MatrixUseAccumulator> Acc8x16; |
| coopmat<float16_t, gl_ScopeWorkgroup, 16, 8, gl_MatrixUseAccumulator> Acc16x8; |
| |
| int dynamicMask = gl_CooperativeMatrixReduceRowEXT; |
| coopMatReduceEXT(Acc, Acc, dynamicMask, combine); // error: mask is not constant |
| coopMatReduceEXT(Acc, Acc, 5, combine); // error: invalid mask |
| coopMatReduceEXT(AccFloat, Acc, gl_CooperativeMatrixReduceRowEXT, combine); // error: component type |
| coopMatReduceEXT(AccSubgroup, Acc, gl_CooperativeMatrixReduceRowEXT, combine); // error: scope |
| coopMatReduceEXT(A, Acc, gl_CooperativeMatrixReduceRowEXT, combine); // error: result Use |
| coopMatReduceEXT(Acc, A, gl_CooperativeMatrixReduceRowEXT, combine); // error: input Use |
| coopMatReduceEXT(Acc, Acc, gl_CooperativeMatrixReduce2x2EXT, combine); // error: 2x2 dimensions |
| coopMatReduceEXT(Acc8x16, Acc, gl_CooperativeMatrixReduceRowEXT, combine); // error: row count |
| coopMatReduceEXT(Acc16x8, Acc, gl_CooperativeMatrixReduceColumnEXT, combine); // error: column count |
| coopMatReduceEXT(Acc, Acc, gl_CooperativeMatrixReduceRowEXT, vectorCombine); // error: callback types |
| |
| const int constantMask = gl_CooperativeMatrixReduceRowEXT; |
| coopMatReduceEXT(Acc, Acc, constantMask, combine); // ok |
| coopMatReduceEXT(Acc16x8, Acc, gl_CooperativeMatrixReduceRowEXT, combine); // ok |
| coopMatReduceEXT(Acc8x16, Acc, gl_CooperativeMatrixReduceColumnEXT, combine); // ok |
| coopMatReduceEXT(Acc8x8, Acc, gl_CooperativeMatrixReduceRowAndColumnEXT, combine); // ok |
| |
| coopmat<float16_t, SpecScope, SpecRows, SpecCols, gl_MatrixUseAccumulator> SpecAcc; |
| coopmat<float16_t, SpecScopeAlias, SpecRowResultRows, SpecRowResultCols, |
| gl_MatrixUseAccumulator> SpecRowResult; |
| coopmat<float16_t, SpecScopeAlias, SpecColumnResultRows, SpecColumnResultCols, |
| gl_MatrixUseAccumulator> SpecColumnResult; |
| coopmat<float16_t, SpecScopeAlias, SpecTransposeRows, SpecTransposeCols, |
| gl_MatrixUseB> SpecTransposeResult; |
| coopMatReduceEXT(SpecRowResult, SpecAcc, gl_CooperativeMatrixReduceRowEXT, combine); // ok |
| coopMatReduceEXT(SpecColumnResult, SpecAcc, gl_CooperativeMatrixReduceColumnEXT, combine); // ok |
| coopMatTransposeEXT(SpecTransposeResult, SpecAcc); // ok |
| |
| coopMatPerElementEXT(Acc8x8, Acc, elem); // error: result type |
| coopMatPerElementEXT(Acc, Acc, badCoordElem); // error: coordinate type |
| coopMatPerElementEXT(Acc, Acc, vectorElem); // error: component and return types |
| coopMatPerElementEXT(Acc, Acc, optionalElem, Acc8x8); // error: optional matrix type |
| coopMatPerElementEXT(Acc, Acc, optionalElem, f16vec2(1.0)); // error: optional value type |
| coopMatPerElementEXT(Acc, Acc, badMatrixOptionalElem, Acc); // error: optional callback parameter type |
| coopMatPerElementEXT(Acc, Acc, optionalElem, Acc); // ok |
| |
| coopmat<float16_t, gl_ScopeWorkgroup, 16, 8, gl_MatrixUseAccumulator> AccRect; |
| coopmat<float16_t, gl_ScopeWorkgroup, 16, 8, gl_MatrixUseB> BadTransposeShape; |
| coopmat<float16_t, gl_ScopeSubgroup, 8, 16, gl_MatrixUseB> BadTransposeScope; |
| coopMatTransposeEXT(BadTransposeShape, AccRect); // error: dimensions |
| coopMatTransposeEXT(BadTransposeScope, AccRect); // error: scope |
| } |