yum-mirror/glslang

git clone https://git.yummers.dev/yum-mirror/glslang

Jeff BolzImplement GL_EXT_cooperative_matrix_maintenance124ae85ba

main
5.4 KiB90 linesraw
1#version 450 core
2#extension GL_KHR_memory_scope_semantics : enable
3#extension GL_KHR_cooperative_matrix : enable
4#extension GL_EXT_shader_explicit_arithmetic_types : enable
5#extension GL_EXT_cooperative_matrix_maintenance1 : enable
6#extension GL_EXT_float_e5m2 : enable
7
8layout (local_size_x = 64, local_size_y = 1, local_size_z = 1) in;
9
10float16_t combine(const in float16_t a, const in float16_t b) { return a + b; }
11f16vec2 vectorCombine(const in f16vec2 a, const in f16vec2 b) { return a + b; }
12float16_t elem(const in uint32_t row, const in uint32_t col, const in float16_t x) { return x; }
13float16_t badCoordElem(const in uvec2 row, const in uint32_t col, const in float16_t x) { return x; }
14f16vec2 vectorElem(const in uint32_t row, const in uint32_t col, const in f16vec2 x) { return x; }
15float16_t optionalElem(const in uint32_t row, const in uint32_t col, const in float16_t x,
16                       const in float16_t y) { return x + y; }
17float16_t badMatrixOptionalElem(const in uint32_t row, const in uint32_t col, const in float16_t x,
18                                const in f16vec2 y) { return x + y.x; }
19
20layout(constant_id = 0) const int SpecRows = 16;
21layout(constant_id = 1) const int SpecCols = 8;
22layout(constant_id = 2) const int SpecScope = gl_ScopeWorkgroup;
23const int SpecScopeAlias = SpecScope * 1;
24const int SpecRowResultRows = SpecRows * 1;
25const int SpecRowResultCols = SpecCols * 3;
26const int SpecColumnResultRows = SpecRows * 3;
27const int SpecColumnResultCols = SpecCols * 1;
28const int SpecTransposeRows = SpecCols * 1;
29const int SpecTransposeCols = SpecRows * 1;
30
31void main()
32{
33    coopmat<float16_t, gl_ScopeWorkgroup, 16, 16, gl_MatrixUseA> A;
34    coopmat<float16_t, gl_ScopeWorkgroup, 16, 16, gl_MatrixUseB> B;
35    coopmat<float16_t, gl_ScopeWorkgroup, 16, 16, gl_MatrixUseAccumulator> Acc;
36
37    coopMatTransposeEXT(A, Acc); // ok
38    coopMatTransposeEXT(B, Acc); // ok
39    coopMatTransposeEXT(Acc, A); // error
40    coopMatTransposeEXT(Acc, B); // error
41
42    coopmat<float16_t, gl_ScopeSubgroup, 16, 16, gl_MatrixUseAccumulator> AccSubgroup;
43    coopmat<float32_t, gl_ScopeWorkgroup, 16, 16, gl_MatrixUseAccumulator> AccFloat;
44    coopmat<float16_t, gl_ScopeWorkgroup, 8, 8, gl_MatrixUseAccumulator> Acc8x8;
45    coopmat<float16_t, gl_ScopeWorkgroup, 8, 16, gl_MatrixUseAccumulator> Acc8x16;
46    coopmat<float16_t, gl_ScopeWorkgroup, 16, 8, gl_MatrixUseAccumulator> Acc16x8;
47
48    int dynamicMask = gl_CooperativeMatrixReduceRowEXT;
49    coopMatReduceEXT(Acc, Acc, dynamicMask, combine); // error: mask is not constant
50    coopMatReduceEXT(Acc, Acc, 5, combine); // error: invalid mask
51    coopMatReduceEXT(AccFloat, Acc, gl_CooperativeMatrixReduceRowEXT, combine); // error: component type
52    coopMatReduceEXT(AccSubgroup, Acc, gl_CooperativeMatrixReduceRowEXT, combine); // error: scope
53    coopMatReduceEXT(A, Acc, gl_CooperativeMatrixReduceRowEXT, combine); // error: result Use
54    coopMatReduceEXT(Acc, A, gl_CooperativeMatrixReduceRowEXT, combine); // error: input Use
55    coopMatReduceEXT(Acc, Acc, gl_CooperativeMatrixReduce2x2EXT, combine); // error: 2x2 dimensions
56    coopMatReduceEXT(Acc8x16, Acc, gl_CooperativeMatrixReduceRowEXT, combine); // error: row count
57    coopMatReduceEXT(Acc16x8, Acc, gl_CooperativeMatrixReduceColumnEXT, combine); // error: column count
58    coopMatReduceEXT(Acc, Acc, gl_CooperativeMatrixReduceRowEXT, vectorCombine); // error: callback types
59
60    const int constantMask = gl_CooperativeMatrixReduceRowEXT;
61    coopMatReduceEXT(Acc, Acc, constantMask, combine); // ok
62    coopMatReduceEXT(Acc16x8, Acc, gl_CooperativeMatrixReduceRowEXT, combine); // ok
63    coopMatReduceEXT(Acc8x16, Acc, gl_CooperativeMatrixReduceColumnEXT, combine); // ok
64    coopMatReduceEXT(Acc8x8, Acc, gl_CooperativeMatrixReduceRowAndColumnEXT, combine); // ok
65
66    coopmat<float16_t, SpecScope, SpecRows, SpecCols, gl_MatrixUseAccumulator> SpecAcc;
67    coopmat<float16_t, SpecScopeAlias, SpecRowResultRows, SpecRowResultCols,
68            gl_MatrixUseAccumulator> SpecRowResult;
69    coopmat<float16_t, SpecScopeAlias, SpecColumnResultRows, SpecColumnResultCols,
70            gl_MatrixUseAccumulator> SpecColumnResult;
71    coopmat<float16_t, SpecScopeAlias, SpecTransposeRows, SpecTransposeCols,
72            gl_MatrixUseB> SpecTransposeResult;
73    coopMatReduceEXT(SpecRowResult, SpecAcc, gl_CooperativeMatrixReduceRowEXT, combine); // ok
74    coopMatReduceEXT(SpecColumnResult, SpecAcc, gl_CooperativeMatrixReduceColumnEXT, combine); // ok
75    coopMatTransposeEXT(SpecTransposeResult, SpecAcc); // ok
76
77    coopMatPerElementEXT(Acc8x8, Acc, elem); // error: result type
78    coopMatPerElementEXT(Acc, Acc, badCoordElem); // error: coordinate type
79    coopMatPerElementEXT(Acc, Acc, vectorElem); // error: component and return types
80    coopMatPerElementEXT(Acc, Acc, optionalElem, Acc8x8); // error: optional matrix type
81    coopMatPerElementEXT(Acc, Acc, optionalElem, f16vec2(1.0)); // error: optional value type
82    coopMatPerElementEXT(Acc, Acc, badMatrixOptionalElem, Acc); // error: optional callback parameter type
83    coopMatPerElementEXT(Acc, Acc, optionalElem, Acc); // ok
84
85    coopmat<float16_t, gl_ScopeWorkgroup, 16, 8, gl_MatrixUseAccumulator> AccRect;
86    coopmat<float16_t, gl_ScopeWorkgroup, 16, 8, gl_MatrixUseB> BadTransposeShape;
87    coopmat<float16_t, gl_ScopeSubgroup, 8, 16, gl_MatrixUseB> BadTransposeScope;
88    coopMatTransposeEXT(BadTransposeShape, AccRect); // error: dimensions
89    coopMatTransposeEXT(BadTransposeScope, AccRect); // error: scope
90}