blob: a5d86b4f7b934457ebb2edf12b0b9d8fbd357324 [file]
#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
}