yum-mirror/glslang

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

Wooyoung KimAdd support for GLSL_QCOM_cooperative_matrix_conversionf3a7f2c2

main
6.8 KiB196 linesraw
1#version 450 core
2#pragma use_vulkan_memory_model
3#extension GL_KHR_shader_subgroup_basic : enable
4#extension GL_EXT_scalar_block_layout : enable
5#extension GL_KHR_memory_scope_semantics : enable
6#extension GL_KHR_cooperative_matrix : enable
7#extension GL_EXT_buffer_reference : enable
8#extension GL_EXT_control_flow_attributes : enable
9#extension GL_KHR_shader_subgroup_basic : enable
10
11#extension GL_EXT_shader_explicit_arithmetic_types_float32 : enable
12#extension GL_EXT_shader_explicit_arithmetic_types_float16 : enable
13#extension GL_EXT_shader_explicit_arithmetic_types_int32   : enable
14#extension GL_EXT_shader_explicit_arithmetic_types_int8    : enable
15#extension GL_QCOM_cooperative_matrix_conversion : enable
16
17layout(set=0, binding=0) readonly buffer InputA { float x[]; } inputA;
18layout(set=0, binding=1) readonly buffer InputB { float x[]; } inputB;
19layout(set=0, binding=2) readonly buffer InputC { float x[]; } inputC;
20layout(set=0, binding=3) buffer Output { float x[]; } outputO;
21
22layout(local_size_x = 64, local_size_y = 2, local_size_z = 2) in;
23
24void main()
25{
26    float16_t hvec8A[16];
27    float32_t  vec8A[8];
28      int32_t ivec8A[8];
29     uint32_t uvec8A[8];
30    float16_t hvec32B[64];
31    float32_t  vec32B[32];
32      int32_t ivec32B[32];
33     uint32_t uvec32B[32];
34        float  vec64Acc[64];
35          int ivec64Acc[64];
36         uint uvec64Acc[64];
37    float16_t hvec8A_4[4];
38
39    // bitcastQCOM
40    {
41      bitcastQCOM(hvec8A, uvec8A);
42      bitcastQCOM(uvec8A, hvec8A);
43      bitcastQCOM(ivec8A,  vec8A);
44      bitcastQCOM( vec8A, ivec8A);
45
46      bitcastQCOM(hvec32B, ivec32B);
47      bitcastQCOM(ivec32B, hvec32B);
48      bitcastQCOM(uvec32B,  vec32B);
49      bitcastQCOM( vec32B, uvec32B);
50
51      bitcastQCOM(uvec64Acc, ivec64Acc);
52      bitcastQCOM(ivec64Acc, uvec64Acc);
53      bitcastQCOM(uvec64Acc,  vec64Acc);
54      bitcastQCOM( vec64Acc, uvec64Acc);
55    }
56
57    // extractSubArrayQCOM
58    {
59      extractSubArrayQCOM(ivec64Acc, 0, ivec8A);
60      extractSubArrayQCOM(ivec64Acc, 8, ivec32B);
61      extractSubArrayQCOM(uvec64Acc, 0, uvec8A);
62      extractSubArrayQCOM(uvec64Acc, 8, uvec32B);
63      extractSubArrayQCOM( vec64Acc, 0,  vec8A);
64      extractSubArrayQCOM( vec64Acc, 4,  vec32B);
65      extractSubArrayQCOM(hvec32B,   0, hvec8A);
66      extractSubArrayQCOM(hvec32B,   4, hvec8A_4);
67    }
68
69    coopmat<  uint8_t, gl_ScopeSubgroup, 64,  32, gl_MatrixUseA> matA_u8_64_32;
70    coopmat<   int8_t, gl_ScopeSubgroup, 64,  32, gl_MatrixUseA> matA_i8_64_32;
71    coopmat<float16_t, gl_ScopeSubgroup, 64,  16, gl_MatrixUseA> matA_f16_64_16;
72    coopmat<float32_t, gl_ScopeSubgroup, 64,   8, gl_MatrixUseA> matA_f32_64_8;
73
74    // vectorToCoopmatQCOM gl_MatrixUseA
75    {
76      vectorToCoopmatQCOM( vec8A, matA_f32_64_8);
77      vectorToCoopmatQCOM(uvec8A, matA_f32_64_8);
78
79      vectorToCoopmatQCOM(hvec8A, matA_f16_64_16);
80      vectorToCoopmatQCOM(uvec8A, matA_f16_64_16);
81
82      int8_t i8vec8A[32];
83      vectorToCoopmatQCOM(i8vec8A, matA_i8_64_32);
84      vectorToCoopmatQCOM( uvec8A, matA_i8_64_32);
85
86      uint8_t u8vec8A[32];
87      vectorToCoopmatQCOM(u8vec8A, matA_u8_64_32);
88      vectorToCoopmatQCOM( uvec8A, matA_u8_64_32);
89    }
90
91    coopmat<  uint8_t, gl_ScopeSubgroup, 32, 64, gl_MatrixUseB> matB_u8_32_64;
92    coopmat<   int8_t, gl_ScopeSubgroup, 32, 64, gl_MatrixUseB> matB_i8_32_64;
93    coopmat<float16_t, gl_ScopeSubgroup, 16, 64, gl_MatrixUseB> matB_f16_16_64;
94    coopmat<float32_t, gl_ScopeSubgroup,  8, 64, gl_MatrixUseB> matB_f32_8_64;
95
96    coopmat<float16_t, gl_ScopeSubgroup, 16, 32, gl_MatrixUseB> matB_f16_16_32;
97    coopmat<   int8_t, gl_ScopeSubgroup, 32, 16, gl_MatrixUseB> matB_i8_32_16;
98
99    // vectorToCoopmatQCOM gl_MatrixUseB
100    {
101      vectorToCoopmatQCOM( vec8A, matB_f32_8_64);
102      vectorToCoopmatQCOM(uvec8A, matB_f32_8_64);
103
104      vectorToCoopmatQCOM(hvec8A, matB_f16_16_64);
105      vectorToCoopmatQCOM(uvec8A, matB_f16_16_64);
106
107      int8_t i8vec8B[32];
108      vectorToCoopmatQCOM(i8vec8B, matB_i8_32_64);
109      vectorToCoopmatQCOM( uvec8A, matB_i8_32_64);
110
111      uint8_t u8vec8B[32];
112      vectorToCoopmatQCOM(u8vec8B, matB_u8_32_64);
113      vectorToCoopmatQCOM( uvec8A, matB_u8_32_64);
114
115      vectorToCoopmatQCOM(hvec8A, matB_f16_16_32);
116      vectorToCoopmatQCOM(uvec8A, matB_f16_16_32);
117
118      vectorToCoopmatQCOM(i8vec8B, matB_i8_32_16);
119      vectorToCoopmatQCOM(uvec8A, matB_i8_32_16);
120    }
121
122    coopmat< uint32_t, gl_ScopeSubgroup, 64, 64, gl_MatrixUseAccumulator> matAcc_u32_64_64;
123    coopmat<  int32_t, gl_ScopeSubgroup, 64, 64, gl_MatrixUseAccumulator> matAcc_i32_64_64;
124    coopmat<float16_t, gl_ScopeSubgroup, 64, 64, gl_MatrixUseAccumulator> matAcc_f16_64_64;
125    coopmat<float32_t, gl_ScopeSubgroup, 64, 64, gl_MatrixUseAccumulator> matAcc_f32_64_64;
126
127    // vectorToCoopmatQCOM gl_MatrixUseAccumulator
128    {
129      vectorToCoopmatQCOM( vec64Acc, matAcc_f32_64_64);
130      vectorToCoopmatQCOM(uvec64Acc, matAcc_f32_64_64);
131
132      float16_t hvec64Acc[64];
133      vectorToCoopmatQCOM(hvec64Acc, matAcc_f16_64_64);
134      vectorToCoopmatQCOM(uvec32B, matAcc_f16_64_64);
135
136      vectorToCoopmatQCOM(ivec64Acc, matAcc_i32_64_64);
137      vectorToCoopmatQCOM(uvec64Acc, matAcc_i32_64_64);
138
139      vectorToCoopmatQCOM(uvec64Acc, matAcc_u32_64_64);
140    }
141
142    // coopmatToVectorQCOM gl_MatrixUseA
143    {
144      coopmatToVectorQCOM(matA_f32_64_8,  vec8A);
145      coopmatToVectorQCOM(matA_f32_64_8, uvec8A);
146
147      coopmatToVectorQCOM(matA_f16_64_16, hvec8A);
148      coopmatToVectorQCOM(matA_f16_64_16, uvec8A);
149
150      int8_t i8vec8A[32];
151      coopmatToVectorQCOM(matA_i8_64_32, i8vec8A);
152      coopmatToVectorQCOM(matA_i8_64_32,  uvec8A);
153
154      uint8_t u8vec8A[32];
155      coopmatToVectorQCOM(matA_u8_64_32, u8vec8A);
156      coopmatToVectorQCOM(matA_u8_64_32,  uvec8A);
157    }
158
159    // coopmatToVectorQCOM gl_MatrixUseB
160    {
161      coopmatToVectorQCOM(matB_f32_8_64, vec8A);
162      coopmatToVectorQCOM(matB_f32_8_64, uvec8A);
163
164      coopmatToVectorQCOM(matB_f16_16_64, hvec8A);
165      coopmatToVectorQCOM(matB_f16_16_64, uvec8A);
166
167      int8_t i8vec8B[32];
168      coopmatToVectorQCOM(matB_i8_32_64, i8vec8B);
169      coopmatToVectorQCOM(matB_i8_32_64,  uvec8A);
170
171      uint8_t u8vec8B[32];
172      coopmatToVectorQCOM(matB_u8_32_64, u8vec8B);
173      coopmatToVectorQCOM(matB_u8_32_64,  uvec8A);
174
175      coopmatToVectorQCOM(matB_f16_16_32, hvec8A);
176      coopmatToVectorQCOM(matB_f16_16_32, uvec8A);
177
178      coopmatToVectorQCOM(matB_i8_32_16, i8vec8B);
179      coopmatToVectorQCOM(matB_i8_32_16, uvec8A);
180    }
181
182    // coopmatToVectorQCOM gl_MatrixUseAccumulator
183    {
184      coopmatToVectorQCOM(matAcc_f32_64_64,  vec64Acc);
185      coopmatToVectorQCOM(matAcc_f32_64_64, uvec64Acc);
186
187      float16_t hvec64Acc[64];
188      coopmatToVectorQCOM(matAcc_f16_64_64, hvec64Acc);
189      coopmatToVectorQCOM(matAcc_f16_64_64,  uvec32B);
190
191      coopmatToVectorQCOM(matAcc_i32_64_64, ivec64Acc);
192      coopmatToVectorQCOM(matAcc_i32_64_64, uvec64Acc);
193
194      coopmatToVectorQCOM(matAcc_u32_64_64, uvec64Acc);
195    }
196}