yum-mirror/glslang

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

alelenvFix bug in handling slice of array being passed cooperative matrix load/store functions and strengthen error checks. (#4007)8e12361e

main
3.4 KiB119 linesraw
1#version 450 core
2#extension GL_KHR_memory_scope_semantics : enable
3#extension GL_NV_cooperative_matrix : enable
4#extension GL_EXT_shader_explicit_arithmetic_types_float16 : enable
5#extension GL_EXT_buffer_reference : enable
6
7layout (local_size_x = 64, local_size_y = 1, local_size_z = 1) in;
8
9const int X = 8;
10layout(constant_id = 0) const int Y = 2;
11const int Z = X*Y;
12
13fcoopmatNV<16, gl_ScopeSubgroup, Z, 8> mC;
14fcoopmatNV<16, gl_ScopeSubgroup, Z, 8> mC2[3];
15
16int arr[mC.length()];
17int arr2[mC2[1].length()];
18
19layout(constant_id = 1) const float F = 3.0;
20
21const fcoopmatNV<32, gl_ScopeSubgroup, Z, 8> mD = fcoopmatNV<32, gl_ScopeSubgroup, Z, 8>(0.0);
22const fcoopmatNV<16, gl_ScopeSubgroup, 8, 8> mD2 = fcoopmatNV<16, gl_ScopeSubgroup, 8, 8>(1);
23
24struct S { int a; int b; int c; };
25
26const S s = S(12, 23, 34);
27
28layout(set = 0, binding = 0, buffer_reference) coherent buffer Block {
29    float y[1024*1024];
30    float x[];
31} block;
32
33layout(set = 0, binding = 0) coherent buffer Block16 {
34    float16_t arr[256][256];
35    float16_t y[1024*1024];
36    float16_t x[];
37
38    Block b;
39} block16;
40
41fcoopmatNV<16, gl_ScopeSubgroup, 8, 8> f16(fcoopmatNV<16, gl_ScopeSubgroup, 8, 8> m) { return -m; }
42fcoopmatNV<32, gl_ScopeSubgroup, 8, 8> f32(fcoopmatNV<32, gl_ScopeSubgroup, 8, 8> m) { return -m; }
43
44layout(constant_id = 2) const int SC = 1;
45fcoopmatNV<16, gl_ScopeSubgroup, SC, SC> scm[SC][SC];
46
47// sized for fcoopmatNV<16, gl_ScopeSubgroup, 16, 16>
48shared uvec4 shmatrix[16*16*2/16];
49
50void main()
51{
52    fcoopmatNV<32, gl_ScopeSubgroup, 16, (2>1?8:4)> m = fcoopmatNV<32, gl_ScopeSubgroup, 16, (2>1?8:4)>(0.0);
53
54    m = m + m;
55    m = m - m;
56    m = -m;
57    m = 2.0*m;
58    m = m*2.0;
59
60    fcoopmatNV<16, gl_ScopeSubgroup, 16, 8> m2 = fcoopmatNV<16, gl_ScopeSubgroup, 16, 8>(m);
61
62    float x = m[1];
63    m[0] = x;
64
65    coopMatLoadNV(m, block.x, 16, 128, false);
66    coopMatStoreNV(m, block.x, 16, 128, false);
67    coopMatLoadNV(m2, block16.x, 16, 128, false);
68    coopMatStoreNV(m2, block16.x, 16, 128, false);
69    coopMatLoadNV(m, block16.b.x, 16, 128, false);
70    coopMatStoreNV(m, block16.b.x, 16, 128, false);
71
72    fcoopmatNV<16, gl_ScopeSubgroup, 16, 8> A;
73    fcoopmatNV<16, gl_ScopeSubgroup, 8, 8> B;
74    fcoopmatNV<32, gl_ScopeSubgroup, 16, 8> C;
75    fcoopmatNV<32, gl_ScopeSubgroup, 16, 8> D;
76    D = coopMatMulAddNV(A, B, C);
77
78    int l = D.length();
79
80    fcoopmatNV<16, gl_ScopeSubgroup, 8, 8> E;
81
82    fcoopmatNV<16, gl_ScopeSubgroup, Z, Z> F = fcoopmatNV<16, gl_ScopeSubgroup, Z, Z>(0.0);
83
84    fcoopmatNV<32, gl_ScopeSubgroup, 16, (2>1?8:4)> a[5];
85    a[3][0] = 1.0;
86
87    float md1 = mD[1];
88
89    md1 += (m += m)[1234];
90
91    mC2[1] = mC2[2];
92
93    coopMatLoadNV(m, block.y, 16, 128, false);
94    coopMatStoreNV(m, block.y, 16, 128, false);
95    coopMatLoadNV(m2, block16.y, 16, 128, false);
96    coopMatStoreNV(m2, block16.y, 16, 128, false);
97
98    fcoopmatNV<16, gl_ScopeSubgroup, 8, 8> p1;
99    fcoopmatNV<32, gl_ScopeSubgroup, 8, 8> p2;
100
101    p1 = f16(p1);
102    p2 = f32(p2);
103
104    p1 = fcoopmatNV<16, gl_ScopeSubgroup, 8, 8>(0.0);
105    p2 = fcoopmatNV<32, gl_ScopeSubgroup, 8, 8>(0.0);
106
107    p1 /= p1;
108
109    p1 *= float16_t(2.0);
110    p2 *= 4.0;
111
112    fcoopmatNV<16, gl_ScopeSubgroup, 16, 8> ms;
113    coopMatLoadNV(ms, shmatrix, 1, 2, false);
114    coopMatStoreNV(ms, shmatrix, 1, 2, false);
115
116    coopMatLoadNV(ms, block16.arr[8], 1, 2, false);
117    coopMatStoreNV(ms, block16.arr[16], 1, 2, false);
118
119}