| #version 450 core | |
| #extension GL_KHR_memory_scope_semantics : enable | |
| #extension GL_NV_cooperative_matrix : enable | |
| #extension GL_EXT_shader_explicit_arithmetic_types_float16 : enable | |
| #extension GL_EXT_buffer_reference : enable | |
| layout (local_size_x = 64, local_size_y = 1, local_size_z = 1) in; | |
| const int X = 8; | |
| layout(constant_id = 0) const int Y = 2; | |
| const int Z = X*Y; | |
| fcoopmatNV<16, gl_ScopeSubgroup, Z, 8> mC; | |
| fcoopmatNV<16, gl_ScopeSubgroup, Z, 8> mC2[3]; | |
| int arr[mC.length()]; | |
| int arr2[mC2[1].length()]; | |
| layout(constant_id = 1) const float F = 3.0; | |
| const fcoopmatNV<32, gl_ScopeSubgroup, Z, 8> mD = fcoopmatNV<32, gl_ScopeSubgroup, Z, 8>(0.0); | |
| const fcoopmatNV<16, gl_ScopeSubgroup, 8, 8> mD2 = fcoopmatNV<16, gl_ScopeSubgroup, 8, 8>(1); | |
| struct S { int a; int b; int c; }; | |
| const S s = S(12, 23, 34); | |
| layout(set = 0, binding = 0, buffer_reference) coherent buffer Block { | |
| float y[1024*1024]; | |
| float x[]; | |
| } block; | |
| layout(set = 0, binding = 0) coherent buffer Block16 { | |
| float16_t arr[256][256]; | |
| float16_t y[1024*1024]; | |
| float16_t x[]; | |
| Block b; | |
| } block16; | |
| fcoopmatNV<16, gl_ScopeSubgroup, 8, 8> f16(fcoopmatNV<16, gl_ScopeSubgroup, 8, 8> m) { return -m; } | |
| fcoopmatNV<32, gl_ScopeSubgroup, 8, 8> f32(fcoopmatNV<32, gl_ScopeSubgroup, 8, 8> m) { return -m; } | |
| layout(constant_id = 2) const int SC = 1; | |
| fcoopmatNV<16, gl_ScopeSubgroup, SC, SC> scm[SC][SC]; | |
| // sized for fcoopmatNV<16, gl_ScopeSubgroup, 16, 16> | |
| shared uvec4 shmatrix[16*16*2/16]; | |
| void main() | |
| { | |
| fcoopmatNV<32, gl_ScopeSubgroup, 16, (2>1?8:4)> m = fcoopmatNV<32, gl_ScopeSubgroup, 16, (2>1?8:4)>(0.0); | |
| m = m + m; | |
| m = m - m; | |
| m = -m; | |
| m = 2.0*m; | |
| m = m*2.0; | |
| fcoopmatNV<16, gl_ScopeSubgroup, 16, 8> m2 = fcoopmatNV<16, gl_ScopeSubgroup, 16, 8>(m); | |
| float x = m[1]; | |
| m[0] = x; | |
| coopMatLoadNV(m, block.x, 16, 128, false); | |
| coopMatStoreNV(m, block.x, 16, 128, false); | |
| coopMatLoadNV(m2, block16.x, 16, 128, false); | |
| coopMatStoreNV(m2, block16.x, 16, 128, false); | |
| coopMatLoadNV(m, block16.b.x, 16, 128, false); | |
| coopMatStoreNV(m, block16.b.x, 16, 128, false); | |
| fcoopmatNV<16, gl_ScopeSubgroup, 16, 8> A; | |
| fcoopmatNV<16, gl_ScopeSubgroup, 8, 8> B; | |
| fcoopmatNV<32, gl_ScopeSubgroup, 16, 8> C; | |
| fcoopmatNV<32, gl_ScopeSubgroup, 16, 8> D; | |
| D = coopMatMulAddNV(A, B, C); | |
| int l = D.length(); | |
| fcoopmatNV<16, gl_ScopeSubgroup, 8, 8> E; | |
| fcoopmatNV<16, gl_ScopeSubgroup, Z, Z> F = fcoopmatNV<16, gl_ScopeSubgroup, Z, Z>(0.0); | |
| fcoopmatNV<32, gl_ScopeSubgroup, 16, (2>1?8:4)> a[5]; | |
| a[3][0] = 1.0; | |
| float md1 = mD[1]; | |
| md1 += (m += m)[1234]; | |
| mC2[1] = mC2[2]; | |
| coopMatLoadNV(m, block.y, 16, 128, false); | |
| coopMatStoreNV(m, block.y, 16, 128, false); | |
| coopMatLoadNV(m2, block16.y, 16, 128, false); | |
| coopMatStoreNV(m2, block16.y, 16, 128, false); | |
| fcoopmatNV<16, gl_ScopeSubgroup, 8, 8> p1; | |
| fcoopmatNV<32, gl_ScopeSubgroup, 8, 8> p2; | |
| p1 = f16(p1); | |
| p2 = f32(p2); | |
| p1 = fcoopmatNV<16, gl_ScopeSubgroup, 8, 8>(0.0); | |
| p2 = fcoopmatNV<32, gl_ScopeSubgroup, 8, 8>(0.0); | |
| p1 /= p1; | |
| p1 *= float16_t(2.0); | |
| p2 *= 4.0; | |
| fcoopmatNV<16, gl_ScopeSubgroup, 16, 8> ms; | |
| coopMatLoadNV(ms, shmatrix, 1, 2, false); | |
| coopMatStoreNV(ms, shmatrix, 1, 2, false); | |
| coopMatLoadNV(ms, block16.arr[8], 1, 2, false); | |
| coopMatStoreNV(ms, block16.arr[16], 1, 2, false); | |
| } |