char-fork/llama.cpp

git clone https://git.t4t.associates/char-fork/llama.cpp

Ruben Ortlamvulkan: use spec constant for matrix matrix multiplication A-type (#25773)91f6a6cf3

char/aliceai-t5-moe
32.0 KiB717 linesraw
1// k_pair is the K coordinate measured in FLOAT_TYPEV2 elements.
2uint a_shmem_index(uint m, uint k_pair) {
3    if (APPLY_SLM_A_RESHAPE) {
4        const uint tile_width = TK / 2;
5        return (k_pair / tile_width) * BM * tile_width
6             + m * tile_width
7             + k_pair % tile_width;
8    }
9    return m * SHMEM_STRIDE + k_pair;
10}
11
12uint a_shmem_stride() {
13    return APPLY_SLM_A_RESHAPE ? TK / 2 : SHMEM_STRIDE;
14}
15
16void store_a(uint m, uint k_pair, FLOAT_TYPEV2 value) {
17    buf_a[a_shmem_index(m, k_pair)] = value;
18}
19
20void load_a_to_shmem(const uint pos_a, const uint row, const uint col, const uint idx_m, const uint block, const uint end_k) {
21#if defined(DATA_A_F32) || defined(DATA_A_F16)
22#if LOAD_VEC_A == 8
23    if (ALIGNED != 0) {
24        const uint idx = pos_a + col * p.stride_a / LOAD_VEC_A + row;
25        const uint k_pair = row * LOAD_VEC_A / 2;
26        FLOAT_TYPEV8 aa = FLOAT_TYPEV8(data_a[idx]);
27        store_a(col, k_pair,     aa[0].xy);
28        store_a(col, k_pair + 1, aa[0].zw);
29        store_a(col, k_pair + 2, aa[1].xy);
30        store_a(col, k_pair + 3, aa[1].zw);
31        return;
32    }
33#elif LOAD_VEC_A == 4
34    if (ALIGNED != 0) {
35        const uint idx = pos_a + col * p.stride_a / LOAD_VEC_A + row;
36        const uint k_pair = row * LOAD_VEC_A / 2;
37        FLOAT_TYPEV4 aa = FLOAT_TYPEV4(data_a[idx]);
38        store_a(col, k_pair,     aa.xy);
39        store_a(col, k_pair + 1, aa.zw);
40        return;
41    }
42#endif
43    const uint idx = pos_a + col * p.stride_a + row * 2;
44    if (idx_m < p.M && block + row * 2 + 1 < end_k) {
45        store_a(col, row, FLOAT_TYPEV2(data_a_scalar[idx],
46                                       data_a_scalar[idx + 1]));
47    } else if (idx_m < p.M && block + row * 2 < end_k) {
48        store_a(col, row, FLOAT_TYPEV2(data_a_scalar[idx], 0.0f));
49    } else {
50        store_a(col, row, FLOAT_TYPEV2(0.0f));
51    }
52#elif defined(DATA_A_BF16)
53#if LOAD_VEC_A == 4
54    if (ALIGNED != 0) {
55        const uint idx = pos_a + col * p.stride_a / LOAD_VEC_A + row;
56        const uint k_pair = row * LOAD_VEC_A / 2;
57        FLOAT_TYPEV4 aa = FLOAT_TYPEV4(TO_FLOAT_TYPE(data_a[idx]));
58        store_a(col, k_pair,     aa.xy);
59        store_a(col, k_pair + 1, aa.zw);
60        return;
61    }
62#endif
63    const uint idx = pos_a + col * p.stride_a + row * 2;
64    if (idx_m < p.M && block + row * 2 + 1 < end_k) {
65        store_a(col, row, FLOAT_TYPEV2(TO_FLOAT_TYPE(data_a_scalar[idx]),
66                                       TO_FLOAT_TYPE(data_a_scalar[idx + 1])));
67    } else if (idx_m < p.M && block + row * 2 < end_k) {
68        store_a(col, row, FLOAT_TYPEV2(TO_FLOAT_TYPE(data_a_scalar[idx]), 0.0f));
69    } else {
70        store_a(col, row, FLOAT_TYPEV2(0.0f));
71    }
72#elif defined(DATA_A_IQ1_S)
73    const uint idx = pos_a + col * p.stride_a / LOAD_VEC_A + row;
74    const uint k_pair = row * LOAD_VEC_A / 2;
75
76    const uint ib = idx / 32;
77    const uint ib32 = (idx % 32) / 4;
78    const uint ib8 = idx % 32;
79
80    const float d = float(data_a[ib].d);
81    const uint qh = data_a[ib].qh[ib32];
82    const uint qs = data_a[ib].qs[ib8];
83    const float dl = d * (2 * bitfieldExtract(qh, 12, 3) + 1);
84    const float delta = ((qh & 0x8000) != 0) ? -IQ1S_DELTA : IQ1S_DELTA;
85    const int16_t grid = int16_t(iq1s_grid[qs | (bitfieldExtract(qh, 3 * int(ib8 & 3), 3) << 8)]);
86
87    [[unroll]] for (int k = 0; k < 4; ++k) {
88        store_a(col, k_pair + k, FLOAT_TYPEV2(dl * (bitfieldExtract(grid, 4 * k    , 2) + delta),
89                                            dl * (bitfieldExtract(grid, 4 * k + 2, 2) + delta)));
90
91    }
92#elif defined(DATA_A_IQ1_M)
93    const uint idx = pos_a + col * p.stride_a / LOAD_VEC_A + row;
94    const uint k_pair = row * LOAD_VEC_A / 2;
95
96    const uint ib = idx / 32;
97    const uint ib8 = idx % 32;
98    const uint ib16 = ib8 / 2;
99
100    const uint16_t[4] scales = data_a[ib].scales;
101    const u16vec4 s = u16vec4(scales[0], scales[1], scales[2], scales[3]) >> 12;
102    const float d = float(unpackHalf2x16(s.x | (s.y << 4) | (s.z << 8) | (s.w << 12)).x);
103    const uint sc = scales[ib8 / 8];
104    const uint qs = data_a[ib].qs[ib8];
105    const uint qh = data_a[ib].qh[ib16] >> (4 * (ib8 & 1));
106    const float dl = d * (2 * bitfieldExtract(sc, 3 * int(ib16 & 3), 3) + 1);
107    const float delta = ((qh & 8) != 0) ? -IQ1M_DELTA : IQ1M_DELTA;
108    const int16_t grid = int16_t(iq1s_grid[qs | ((qh & 7) << 8)]);
109
110    [[unroll]] for (int k = 0; k < 4; ++k) {
111        store_a(col, k_pair + k, FLOAT_TYPEV2(dl * (bitfieldExtract(grid, 4 * k    , 2) + delta),
112                                            dl * (bitfieldExtract(grid, 4 * k + 2, 2) + delta)));
113
114    }
115#elif defined(DATA_A_IQ2_XXS)
116    const uint idx = pos_a + col * p.stride_a / LOAD_VEC_A + row;
117    const uint k_pair = row * LOAD_VEC_A / 2;
118
119    const uint ib = idx / 32;
120    const uint ib32 = (idx % 32) / 4;
121    const uint ib8 = idx % 4;
122
123    const float d = float(data_a[ib].d);
124    const uint qs = data_a[ib].qs[8 * ib32 + ib8];
125    const uint signs = pack32(u8vec4(
126        data_a[ib].qs[8*ib32 + 4],
127        data_a[ib].qs[8*ib32 + 5],
128        data_a[ib].qs[8*ib32 + 6],
129        data_a[ib].qs[8*ib32 + 7]
130    ));
131    const FLOAT_TYPE db = FLOAT_TYPE(d * 0.25 * (0.5 + (signs >> 28)));
132    const uint32_t sign7 = bitfieldExtract(signs, 7 * int(ib8), 7);
133    const uint sign = sign7 | (bitCount(sign7) << 7);
134    const uvec2 grid = iq2xxs_grid[qs];
135    const vec4 grid0 = vec4(unpack8(grid.x));
136    const vec4 grid1 = vec4(unpack8(grid.y));
137
138    store_a(col, k_pair, db * FLOAT_TYPEV2((sign &   1) != 0 ? -grid0.x : grid0.x,
139                                            (sign &   2) != 0 ? -grid0.y : grid0.y));
140
141    store_a(col, k_pair + 1, db * FLOAT_TYPEV2((sign &   4) != 0 ? -grid0.z : grid0.z,
142                                            (sign &   8) != 0 ? -grid0.w : grid0.w));
143
144    store_a(col, k_pair + 2, db * FLOAT_TYPEV2((sign &  16) != 0 ? -grid1.x : grid1.x,
145                                            (sign &  32) != 0 ? -grid1.y : grid1.y));
146
147    store_a(col, k_pair + 3, db * FLOAT_TYPEV2((sign &  64) != 0 ? -grid1.z : grid1.z,
148                                            (sign & 128) != 0 ? -grid1.w : grid1.w));
149
150#elif defined(DATA_A_IQ2_XS)
151    const uint idx = pos_a + col * p.stride_a / LOAD_VEC_A + row;
152    const uint k_pair = row * LOAD_VEC_A / 2;
153
154    const uint ib = idx / 32;
155    const uint ib32 = (idx % 32) / 4;
156    const uint ib8 = idx % 4;
157
158    const float d = float(data_a[ib].d);
159    const uint scale = (data_a[ib].scales[ib32] >> (2 * (ib8 & 2))) & 0xf;
160    const FLOAT_TYPE db = FLOAT_TYPE(d * 0.25 * (0.5 + scale));
161    const uint qs = data_a[ib].qs[4 * ib32 + ib8];
162    const uint sign7 = qs >> 9;
163    const uint sign = sign7 | (bitCount(sign7) << 7);
164    const uvec2 grid = iq2xs_grid[qs & 511];
165    const vec4 grid0 = vec4(unpack8(grid.x));
166    const vec4 grid1 = vec4(unpack8(grid.y));
167
168    store_a(col, k_pair, db * FLOAT_TYPEV2((sign &   1) != 0 ? -grid0.x : grid0.x,
169                                            (sign &   2) != 0 ? -grid0.y : grid0.y));
170
171    store_a(col, k_pair + 1, db * FLOAT_TYPEV2((sign &   4) != 0 ? -grid0.z : grid0.z,
172                                            (sign &   8) != 0 ? -grid0.w : grid0.w));
173
174    store_a(col, k_pair + 2, db * FLOAT_TYPEV2((sign &  16) != 0 ? -grid1.x : grid1.x,
175                                            (sign &  32) != 0 ? -grid1.y : grid1.y));
176
177    store_a(col, k_pair + 3, db * FLOAT_TYPEV2((sign &  64) != 0 ? -grid1.z : grid1.z,
178                                            (sign & 128) != 0 ? -grid1.w : grid1.w));
179
180#elif defined(DATA_A_IQ2_S)
181    const uint idx = pos_a + col * p.stride_a / LOAD_VEC_A + row;
182    const uint k_pair = row * LOAD_VEC_A / 2;
183
184    const uint ib = idx / 32;
185    const uint ib8 = idx % 32;
186    const uint ib32 = ib8 / 4;
187
188    const uint scale = (data_a[ib].scales[ib32] >> (2 * (ib8 & 2))) & 0xf;
189    const uint qs = data_a[ib].qs[ib8];
190    const uint qh = data_a[ib].qh[ib32];
191    const uint qhshift = 2 * (ib8 % 4);
192    const uint sign = data_a[ib].qs[QUANT_K_IQ2_S / 8 + ib8];
193
194    const float d = float(data_a[ib].d);
195    const FLOAT_TYPE db = FLOAT_TYPE(d * 0.25 * (0.5 + scale));
196    const uvec2 grid = iq2s_grid[qs | ((qh << (8 - qhshift)) & 0x300)];
197    const vec4 grid0 = vec4(unpack8(grid.x));
198    const vec4 grid1 = vec4(unpack8(grid.y));
199
200    store_a(col, k_pair, db * FLOAT_TYPEV2((sign &   1) != 0 ? -grid0.x : grid0.x,
201                                            (sign &   2) != 0 ? -grid0.y : grid0.y));
202
203    store_a(col, k_pair + 1, db * FLOAT_TYPEV2((sign &   4) != 0 ? -grid0.z : grid0.z,
204                                            (sign &   8) != 0 ? -grid0.w : grid0.w));
205
206    store_a(col, k_pair + 2, db * FLOAT_TYPEV2((sign &  16) != 0 ? -grid1.x : grid1.x,
207                                            (sign &  32) != 0 ? -grid1.y : grid1.y));
208
209    store_a(col, k_pair + 3, db * FLOAT_TYPEV2((sign &  64) != 0 ? -grid1.z : grid1.z,
210                                            (sign & 128) != 0 ? -grid1.w : grid1.w));
211
212#elif defined(DATA_A_IQ3_XXS)
213    const uint idx = pos_a + col * p.stride_a / LOAD_VEC_A + row;
214    const uint k_pair = row * LOAD_VEC_A / 2;
215
216    const uint ib = idx / 64;
217    const uint iqs = idx % 64;
218    const uint is = QUANT_K_IQ3_XXS / 4 + 4 * (iqs / 8);
219
220    const float d = float(data_a[ib].d);
221    const uint qs = data_a[ib].qs[iqs];
222    const uint signs = pack32(u16vec2(
223        data_a_packed16[ib].qs[is/2],
224        data_a_packed16[ib].qs[is/2+1]
225    ));
226    const float db = d * 0.5 * (0.5 + (signs >> 28));
227    const uint32_t sign7 = bitfieldExtract(signs, 7 * (int(iqs / 2) % 4), 7);
228    const uint sign = (sign7 | (bitCount(sign7) << 7)) >> (4 * (idx % 2));
229    const uint grid = iq3xxs_grid[qs];
230    const vec4 v = db * vec4(unpack8(grid));
231
232    store_a(col, k_pair, FLOAT_TYPEV2((sign &   1) != 0 ? -v.x : v.x,
233                                        (sign &   2) != 0 ? -v.y : v.y));
234
235    store_a(col, k_pair + 1, FLOAT_TYPEV2((sign &   4) != 0 ? -v.z : v.z,
236                                        (sign &   8) != 0 ? -v.w : v.w));
237
238#elif defined(DATA_A_IQ3_S)
239    const uint idx = pos_a + col * p.stride_a / LOAD_VEC_A + row;
240    const uint k_pair = row * LOAD_VEC_A / 2;
241
242    const uint ib = idx / 64;
243    const uint iqs = idx % 64;
244    const uint iqh = iqs / 8;
245
246    const float d = float(data_a[ib].d);
247    const uint qs = data_a[ib].qs[iqs];
248    const uint qh = data_a[ib].qh[iqh];
249    const int8_t sign = int8_t(data_a[ib].signs[iqs / 2] >> (4 * (idx % 2)));
250    const uint scale = data_a[ib].scales[iqs / 16];
251    const i8vec2 sign01 = i8vec2(1 - (2 & i8vec2(sign << 1, sign)));
252    const float db = d * (1 + 2 * ((scale >> (4 * (iqh & 1))) & 0xf));
253    const uint32_t grid = iq3s_grid[qs | ((qh << (8 - (iqs % 8))) & 256)];
254    const vec4 v = db * vec4(unpack8(grid));
255
256    store_a(col, k_pair, FLOAT_TYPEV2((sign &   1) != 0 ? -v.x : v.x,
257                                        (sign &   2) != 0 ? -v.y : v.y));
258
259    store_a(col, k_pair + 1, FLOAT_TYPEV2((sign &   4) != 0 ? -v.z : v.z,
260                                        (sign &   8) != 0 ? -v.w : v.w));
261
262#elif defined(DATA_A_IQ4_XS)
263    const uint idx = pos_a + col * p.stride_a / LOAD_VEC_A + row;
264    const uint k_pair = row * LOAD_VEC_A / 2;
265
266    const uint ib = idx / 64;
267    const uint ib32 = (idx % 64) / 8;
268    const uint iq = 4 * ib32 + (idx % 4);
269
270    const uint sl = (data_a[ib].scales_l[ib32/2] >> (4 * (ib32 & 1))) & 0xF;
271    const uint sh = ((data_a[ib].scales_h) >> (2 * ib32)) & 3;
272    const uint qshift = idx & 4;
273    u8vec4 qs = unpack8((uint(data_a_packed32[ib].qs[iq]) >> qshift) & 0x0F0F0F0F);
274
275    const float d = float(data_a[ib].d);
276    const vec4 v = d * float(int(sl | (sh << 4)) - 32) * vec4(kvalues_iq4nl[qs.x], kvalues_iq4nl[qs.y], kvalues_iq4nl[qs.z], kvalues_iq4nl[qs.w]);
277
278    store_a(col, k_pair, FLOAT_TYPEV2(v.xy));
279    store_a(col, k_pair + 1, FLOAT_TYPEV2(v.zw));
280#elif defined(DATA_A_IQ4_NL)
281    const uint idx = pos_a + col * p.stride_a / LOAD_VEC_A + row;
282    const uint k_pair = row * LOAD_VEC_A / 4;
283
284    const uint ib = idx / 8;
285    const uint iqs = idx & 0x07;
286
287    const FLOAT_TYPE d = FLOAT_TYPE(data_a_packed16[ib].d);
288    const uint vui = uint(data_a_packed16[ib].qs[iqs]);
289
290    store_a(col, k_pair, d * FLOAT_TYPEV2(kvalues_iq4nl[vui & 0xF],
291                                            kvalues_iq4nl[bitfieldExtract(vui, 8, 4)]));
292
293    store_a(col, k_pair + 8, d * FLOAT_TYPEV2(kvalues_iq4nl[bitfieldExtract(vui, 4, 4)],
294                                            kvalues_iq4nl[vui >> 12]));
295
296#elif defined(DATA_A_MXFP4)
297    const uint idx = pos_a + col * p.stride_a / LOAD_VEC_A + row;
298    const uint k_pair = row * LOAD_VEC_A / 4;
299
300    const uint ib = idx / 8;
301    const uint iqs = (idx & 0x07) * 2;
302
303    const uint vui = uint(data_a[ib].qs[iqs]);
304    const uint vui2 = uint(data_a[ib].qs[iqs+1]);
305
306#ifdef USE_OCP_FP4
307    const float d = e8m0_to_fp32(data_a[ib].e);
308    const u8vec2 packed = u8vec2(vui, vui2);
309    store_a(col, k_pair, FLOAT_TYPEV2(bitcastExtractfe2m1EXT(packed, 0u)) * FLOAT_TYPE(d));
310    store_a(col, k_pair + 8, FLOAT_TYPEV2(bitcastExtractfe2m1EXT(packed, 4u)) * FLOAT_TYPE(d));
311#else
312    const float d = e8m0_to_fp32(data_a[ib].e) * 0.5;
313    store_a(col, k_pair, FLOAT_TYPEV2(kvalues_mxfp4[vui  & 0xF] * d,
314                                        kvalues_mxfp4[vui2 & 0xF] * d));
315
316    store_a(col, k_pair + 8, FLOAT_TYPEV2(kvalues_mxfp4[vui  >>  4] * d,
317                                        kvalues_mxfp4[vui2 >>  4] * d));
318
319#endif
320#elif defined(DATA_A_NVFP4)
321    const uint idx = pos_a + col * p.stride_a / LOAD_VEC_A + row;
322    const uint eff_row = (row & 3) + (row & ~3) * 2;
323
324    const uint ib = idx / 16u;
325    const uint sub = (idx & 0xC) >> 2;
326    const uint iqs = (idx & 0xF) * 2;
327    const uint vui = uint(data_a[ib].qs[iqs]);
328    const uint vui2 = uint(data_a[ib].qs[iqs+1]);
329
330#ifdef USE_OCP_FP4
331    const FLOAT_TYPE d = FLOAT_TYPE(ue4m3_from_bits(data_a[ib].d[sub]));
332    const u8vec2 packed = u8vec2(vui, vui2);
333    store_a(col, eff_row,     FLOAT_TYPEV2(bitcastExtractfe2m1EXT(packed, 0u)) * d);
334    store_a(col, eff_row + 4, FLOAT_TYPEV2(bitcastExtractfe2m1EXT(packed, 4u)) * d);
335#else
336    const float d = ue4m3_to_fp32(data_a[ib].d[sub]) * 0.5;
337    store_a(col, eff_row,     FLOAT_TYPEV2(kvalues_mxfp4[vui  & 0xF] * d,
338                                            kvalues_mxfp4[vui2 & 0xF] * d));
339    store_a(col, eff_row + 4, FLOAT_TYPEV2(kvalues_mxfp4[vui  >>  4] * d,
340                                            kvalues_mxfp4[vui2 >>  4] * d));
341#endif
342#else
343    if (MmTypeA == GGML_TYPE_Q4_0) {
344        const uint idx = pos_a + col * p.stride_a / mm_load_vec_a() + row;
345        const uint k_pair = row * mm_load_vec_a() / 4;
346
347        const uint ib = idx / 4;
348        const uint iqs = idx & 0x03;
349
350        const float d = float(a_q4_0_p16.data[ib].d);
351        const uint vui = uint(a_q4_0_p16.data[ib].qs[2*iqs]) | (uint(a_q4_0_p16.data[ib].qs[2*iqs + 1]) << 16);
352        const vec4 v0 = (vec4(unpack8(vui & 0x0F0F0F0F)) - 8.0f) * d;
353        const vec4 v1 = (vec4(unpack8((vui >> 4) & 0x0F0F0F0F)) - 8.0f) * d;
354
355        store_a(col, k_pair, FLOAT_TYPEV2(v0.xy));
356        store_a(col, k_pair + 1, FLOAT_TYPEV2(v0.zw));
357        store_a(col, k_pair + 8, FLOAT_TYPEV2(v1.xy));
358        store_a(col, k_pair + 9, FLOAT_TYPEV2(v1.zw));
359    } else if (MmTypeA == GGML_TYPE_Q4_1) {
360        const uint idx = pos_a + col * p.stride_a / mm_load_vec_a() + row;
361        const uint k_pair = row * mm_load_vec_a() / 4;
362
363        const uint ib = idx / 4;
364        const uint iqs = idx & 0x03;
365
366        const vec2 dm = vec2(a_q4_1_p32.data[ib].dm);
367        const uint vui = a_q4_1_p32.data[ib].qs[iqs];
368        const vec4 v0 = vec4(unpack8(vui & 0x0F0F0F0F)) * dm.x + dm.y;
369        const vec4 v1 = vec4(unpack8((vui >> 4) & 0x0F0F0F0F)) * dm.x + dm.y;
370
371        store_a(col, k_pair, FLOAT_TYPEV2(v0.xy));
372        store_a(col, k_pair + 1, FLOAT_TYPEV2(v0.zw));
373        store_a(col, k_pair + 8, FLOAT_TYPEV2(v1.xy));
374        store_a(col, k_pair + 9, FLOAT_TYPEV2(v1.zw));
375    } else if (MmTypeA == GGML_TYPE_Q5_0) {
376        const uint idx = pos_a + col * p.stride_a / mm_load_vec_a() + row;
377        const uint k_pair = row * mm_load_vec_a() / 4;
378
379        const uint ib = idx / 8;
380        const uint iqs = idx & 0x07;
381
382        const float d = float(a_q5_0_p16.data[ib].d);
383        const uint uint_qh = uint(a_q5_0_p16.data[ib].qh[1]) << 16 | uint(a_q5_0_p16.data[ib].qh[0]);
384        const ivec2 qh0 = ivec2(((uint_qh >> 2*iqs) << 4) & 0x10, (uint_qh >> (2*iqs + 12)) & 0x10);
385        const ivec2 qh1 = ivec2(((uint_qh >> (2*iqs + 1)) << 4) & 0x10, (uint_qh >> (2*iqs + 13)) & 0x10);
386
387        const uint vui = uint(a_q5_0_p16.data[ib].qs[iqs]);
388        const vec4 v = (vec4((vui & 0xF) | qh0.x, ((vui >> 4) & 0xF) | qh0.y, ((vui >> 8) & 0xF) | qh1.x, (vui >> 12) | qh1.y) - 16.0f) * d;
389
390        store_a(col, k_pair, FLOAT_TYPEV2(v.xz));
391        store_a(col, k_pair + 8, FLOAT_TYPEV2(v.yw));
392    } else if (MmTypeA == GGML_TYPE_Q5_1) {
393        const uint idx = pos_a + col * p.stride_a / mm_load_vec_a() + row;
394        const uint k_pair = row * mm_load_vec_a() / 4;
395
396        const uint ib = idx / 4;
397        const uint iqs = idx & 0x03;
398
399        const vec2 dm = vec2(a_q5_1_p32.data[ib].dm);
400        const uint uint_qh = a_q5_1_p32.data[ib].qh;
401        const uvec2 qh0 = uvec2(((uint_qh >> 4*iqs) << 4) & 0x10, (uint_qh >> (4*iqs + 12)) & 0x10);
402        const uvec2 qh1 = uvec2(((uint_qh >> (4*iqs + 1)) << 4) & 0x10, (uint_qh >> (4*iqs + 13)) & 0x10);
403        const uvec2 qh2 = uvec2(((uint_qh >> (4*iqs + 2)) << 4) & 0x10, (uint_qh >> (4*iqs + 14)) & 0x10);
404        const uvec2 qh3 = uvec2(((uint_qh >> (4*iqs + 3)) << 4) & 0x10, (uint_qh >> (4*iqs + 15)) & 0x10);
405
406        const uint vui = a_q5_1_p32.data[ib].qs[iqs];
407        const vec4 v0 = vec4((vui & 0xF) | qh0.x, ((vui >> 4) & 0xF) | qh0.y, ((vui >> 8) & 0xF) | qh1.x, ((vui >> 12) & 0xF) | qh1.y) * dm.x + dm.y;
408        const vec4 v1 = vec4(((vui >> 16) & 0xF) | qh2.x, ((vui >> 20) & 0xF) | qh2.y, ((vui >> 24) & 0xF) | qh3.x, ((vui >> 28) & 0xF) | qh3.y) * dm.x + dm.y;
409
410        store_a(col, k_pair, FLOAT_TYPEV2(v0.xz));
411        store_a(col, k_pair + 1, FLOAT_TYPEV2(v1.xz));
412        store_a(col, k_pair + 8, FLOAT_TYPEV2(v0.yw));
413        store_a(col, k_pair + 9, FLOAT_TYPEV2(v1.yw));
414    } else if (MmTypeA == GGML_TYPE_Q8_0) {
415        const uint idx = pos_a + col * p.stride_a / mm_load_vec_a() + row;
416        const uint k_pair = row * mm_load_vec_a() / 2;
417
418        const uint ib = idx / 8;
419        const uint iqs = idx & 0x07;
420
421        const float d = float(a_q8_0_p16.data[ib].d);
422        const i8vec2 v0 = unpack8(int32_t(a_q8_0_p16.data[ib].qs[2*iqs])).xy; // vec4 used due to #12147
423        const i8vec2 v1 = unpack8(int32_t(a_q8_0_p16.data[ib].qs[2*iqs + 1])).xy;
424        const vec4 v = vec4(v0.x, v0.y, v1.x, v1.y) * d;
425
426        store_a(col, k_pair, FLOAT_TYPEV2(v.xy));
427        store_a(col, k_pair + 1, FLOAT_TYPEV2(v.zw));
428    } else if (MmTypeA == GGML_TYPE_Q1_0) {
429        const uint idx = pos_a + col * p.stride_a / mm_load_vec_a() + row;
430        const uint k_pair = row * mm_load_vec_a() / 2;
431
432        const uint ib = idx / 16;
433        const uint iqs = idx & 0xfu;
434
435        const float d = float(a_q1_0.data[ib].d);
436        const uint bits = uint(a_q1_0.data[ib].qs[iqs]);
437
438        store_a(col, k_pair, FLOAT_TYPEV2((bits & 0x01u) != 0u ? d : -d, (bits & 0x02u) != 0u ? d : -d));
439        store_a(col, k_pair + 1, FLOAT_TYPEV2((bits & 0x04u) != 0u ? d : -d, (bits & 0x08u) != 0u ? d : -d));
440        store_a(col, k_pair + 2, FLOAT_TYPEV2((bits & 0x10u) != 0u ? d : -d, (bits & 0x20u) != 0u ? d : -d));
441        store_a(col, k_pair + 3, FLOAT_TYPEV2((bits & 0x40u) != 0u ? d : -d, (bits & 0x80u) != 0u ? d : -d));
442    } else if (MmTypeA == GGML_TYPE_Q2_0) {
443        const uint idx = pos_a + col * p.stride_a / mm_load_vec_a() + row;
444        const uint k_pair = row * mm_load_vec_a() / 2;
445
446        const uint ib = idx / 16;
447        const uint iqs = idx & 0xfu;
448
449        const FLOAT_TYPE d = FLOAT_TYPE(a_q2_0.data[ib].d);
450        const uint bits = uint(a_q2_0.data[ib].qs[iqs]);
451
452        store_a(col, k_pair, d * (FLOAT_TYPEV2(bits & 3u, (bits >> 2u) & 3u) - FLOAT_TYPEV2(1.0f)));
453        store_a(col, k_pair + 1, d * (FLOAT_TYPEV2((bits >> 4u) & 3u, bits >> 6u) - FLOAT_TYPEV2(1.0f)));
454    } else if (MmTypeA == GGML_TYPE_Q2_K) {
455        const uint idx = pos_a + col * p.stride_a / mm_load_vec_a() + row;
456        const uint k_pair = row * mm_load_vec_a() / 2;
457
458        const uint ib = idx / 64;                          // 4 values per idx
459        const uint iqs = (idx % 64) * 2;                   // 0,2,4..126
460
461        const uint qsi = (iqs / 64) * 16 + (iqs % 16);     // 0..15
462        const uint scalesi = iqs / 8;                      // 0..15
463        const uint qsshift = ((iqs % 64) / 16) * 2;        // 0,2,4,6
464
465        const vec4 qs = vec4(unpack8((a_q2_k_p32.data[ib].qs[qsi / 2] >> qsshift) & 0x03030303));
466        const uint scales = a_q2_k.data[ib].scales[scalesi];
467        const vec2 dm = vec2(a_q2_k.data[ib].dm);
468
469        const vec4 v = dm.x * float(scales & 0xF) * qs - dm.y * float(scales >> 4);
470
471        store_a(col, k_pair, FLOAT_TYPEV2(v.xy));
472        store_a(col, k_pair + 1, FLOAT_TYPEV2(v.zw));
473    } else if (MmTypeA == GGML_TYPE_Q3_K) {
474        const uint idx = pos_a + col * p.stride_a / mm_load_vec_a() + row;
475        const uint k_pair = row * mm_load_vec_a() / 2;
476
477        const uint ib = idx / 128;                   // 2 values per idx
478        const uint iqs = idx % 128;                  // 0..127
479
480        const uint n = iqs / 64;                     // 0,1
481        const uint qsi = n * 32 + (iqs % 16) * 2;    // 0,2,4..62
482        const uint hmi =          (iqs % 16) * 2;    // 0,2,4..30
483        const uint j = (iqs % 64) / 4;               // 0..3
484        const uint is = iqs / 8;                     // 0..15
485        const uint halfsplit = ((iqs % 64) / 16);    // 0,1,2,3
486        const uint qsshift = halfsplit * 2;          // 0,2,4,6
487
488        const int8_t us = int8_t(((a_q3_k.data[ib].scales[is % 8] >> (4 * int(is / 8))) & 0xF)
489                                | (((a_q3_k.data[ib].scales[8 + (is % 4)] >> (2 * int(is / 4))) & 3) << 4));
490        const float dl = float(a_q3_k.data[ib].d) * float(us - 32);
491
492        const vec2 qs = vec2(unpack8((uint(a_q3_k_p16.data[ib].qs[qsi / 2]) >> qsshift) & 0x0303).xy);
493        const vec2 hm = vec2(unpack8(((uint(a_q3_k_p16.data[ib].hmask[hmi / 2]) >> (4 * n + halfsplit)) & 0x0101 ^ 0x0101) << 2).xy);
494
495        store_a(col, k_pair, FLOAT_TYPEV2(dl * (qs.x - hm.x),
496                                        dl * (qs.y - hm.y)));
497
498    } else if (MmTypeA == GGML_TYPE_Q4_K) {
499        const uint idx = pos_a + col * p.stride_a / mm_load_vec_a() + row;
500        const uint k_pair = row * mm_load_vec_a() / 2;
501
502        const uint ib = idx / 64;                  // 4 values per idx
503        const uint iqs = (idx % 64) * 2;           // 0,2,4..126
504
505        const uint n = iqs / 32;                   // 0,1,2,3
506        const uint b = (iqs % 32) / 16;            // 0,1
507        const uint is = 2 * n + b;                 // 0..7
508        const uint qsi = n * 32 + (iqs % 16) * 2;  // 0,2,4..126
509
510        const vec2 loadd = vec2(a_q4_k.data[ib].dm);
511
512        const uvec3 scales = uvec3(a_q4_k_p32.data[ib].scales[0],
513                                    a_q4_k_p32.data[ib].scales[1],
514                                    a_q4_k_p32.data[ib].scales[2]);
515        const uint scalesoffs = (is & 3) * 8;
516
517        const uint scidx0 = (is < 4) ? 0 : 2;
518        const uint scidxshift0 = scalesoffs;
519        const uint scidxshift1 = (is < 4) ? scalesoffs : scalesoffs + 2;
520        const uint mbidx0 = (is < 4) ? 1 : 2;
521        const uint mbidxshift0 = (is < 4) ? scalesoffs : scalesoffs + 4;
522        const uint mbidxshift1 = (is < 4) ? scalesoffs : scalesoffs + 2;
523
524        const uint8_t sc    = uint8_t(((scales[scidx0] >> scidxshift0) & 0xF) | ((scales[0] >> scidxshift1) & 0x30));
525        const uint8_t mbyte = uint8_t(((scales[mbidx0] >> mbidxshift0) & 0xF) | ((scales[1] >> mbidxshift1) & 0x30));
526
527        const float d = loadd.x * sc;
528        const float m = -loadd.y * mbyte;
529
530        const vec4 q = vec4(unpack8((a_q4_k_p32.data[ib].qs[qsi / 4] >> (b * 4)) & 0x0F0F0F0F));
531
532        store_a(col, k_pair, FLOAT_TYPEV2(fma(d, q.x, m), fma(d, q.y, m)));
533        store_a(col, k_pair + 1, FLOAT_TYPEV2(fma(d, q.z, m), fma(d, q.w, m)));
534    } else if (MmTypeA == GGML_TYPE_Q5_K) {
535        const uint idx = pos_a + col * p.stride_a / mm_load_vec_a() + row;
536        const uint k_pair = row * mm_load_vec_a() / 2;
537
538        const uint ib = idx / 64;                  // 4 values per idx
539        const uint iqs = (idx % 64) * 2;           // 0,2,4..126
540
541        const uint n = iqs / 32;                   // 0,1,2,3
542        const uint b = (iqs % 32) / 16;            // 0,1
543        const uint is = 2 * n + b;                 // 0..7
544        const uint qsi = n * 32 + (iqs % 16) * 2;  // 0,2,4..126
545        const uint qhi = (iqs % 16) * 2;           // 0,2,4..30
546
547        const vec2 loadd = vec2(a_q5_k.data[ib].dm);
548
549        const uvec3 scales = uvec3(a_q5_k_p32.data[ib].scales[0],
550                                    a_q5_k_p32.data[ib].scales[1],
551                                    a_q5_k_p32.data[ib].scales[2]);
552        const uint scalesoffs = (is & 3) * 8;
553
554        const uint scidx0 = (is < 4) ? 0 : 2;
555        const uint scidxshift0 = scalesoffs;
556        const uint scidxshift1 = (is < 4) ? scalesoffs : scalesoffs + 2;
557        const uint mbidx0 = (is < 4) ? 1 : 2;
558        const uint mbidxshift0 = (is < 4) ? scalesoffs : scalesoffs + 4;
559        const uint mbidxshift1 = (is < 4) ? scalesoffs : scalesoffs + 2;
560
561        const uint8_t sc    = uint8_t(((scales[scidx0] >> scidxshift0) & 0xF) | ((scales[0] >> scidxshift1) & 0x30));
562        const uint8_t mbyte = uint8_t(((scales[mbidx0] >> mbidxshift0) & 0xF) | ((scales[1] >> mbidxshift1) & 0x30));
563
564        const float d = loadd.x * sc;
565        const float m = -loadd.y * mbyte;
566
567        const uint qs = (a_q5_k_p32.data[ib].qs[qsi / 4] >> (b * 4)) & 0x0F0F0F0F;
568        const uint qh = ((a_q5_k_p32.data[ib].qh[qhi / 4] >> (iqs / 16)) & 0x01010101) << 4;
569        const vec4 q = vec4(unpack8(qs | qh));
570
571        store_a(col, k_pair, FLOAT_TYPEV2(fma(d, q.x, m), fma(d, q.y, m)));
572        store_a(col, k_pair + 1, FLOAT_TYPEV2(fma(d, q.z, m), fma(d, q.w, m)));
573    } else if (MmTypeA == GGML_TYPE_Q6_K) {
574        const uint idx = pos_a + col * p.stride_a / mm_load_vec_a() + row;
575        const uint k_pair = row * mm_load_vec_a() / 2;
576
577        const uint ib = idx / 128;                  // 2 values per idx
578        const uint iqs = idx % 128;                 // 0..127
579
580        const uint n = iqs / 64;                    // 0,1
581        const uint b = ((iqs % 64) / 32) * 4;       // 0,4
582        const uint is_b = (iqs % 16) / 8;           // 0,1
583        const uint qhshift = ((iqs % 64) / 16) * 2; // 0,2,4,6
584        const uint is = 8 * n + qhshift + is_b;     // 0..15
585        const uint qsi = n * 32 + (iqs % 32);       // 0..63
586        const uint qhi = n * 16 + (iqs % 16);       // 0..31
587
588        const float dscale = float(a_q6_k.data[ib].d) * float(a_q6_k.data[ib].scales[is]);
589
590        const uint ql = (uint(a_q6_k_p16.data[ib].ql[qsi]) >> b) & 0x0F0F;
591        const uint qh = (uint(a_q6_k_p16.data[ib].qh[qhi]) >> qhshift) & 0x0303;
592        const vec2 q = (vec2(unpack8(ql | (qh << 4)).xy) - 32) * dscale;
593
594        store_a(col, k_pair, FLOAT_TYPEV2(q.x, q.y));
595    } else if (MmTypeA == GGML_TYPE_TQ1_0) {
596        const uint idx = pos_a + col * p.stride_a / mm_load_vec_a() + row;
597
598        const uint ib  = idx / 128;                        // 2 values per idx
599        const uint iqs = (idx % 128) * 2;                  // elem 0,2,4..254
600
601        const float d = float(a_tq1_0.data[ib].d);
602        vec2 v;
603        for (uint kk = 0u; kk < 2u; ++kk) {
604            const uint e = iqs + kk;
605            const uint bidx = tq1_0_byte_of(e);
606            const uint qbyte = uint(bidx < 48u ? a_tq1_0.data[ib].qs[bidx]
607                                               : a_tq1_0.data[ib].qh[bidx - 48u]);
608            v[kk] = d * (float(tq1_0_trit(qbyte, tq1_0_digit_of(e))) - 1.0);
609        }
610
611        const uint k_pair = row * mm_load_vec_a() / 2;
612        store_a(col, k_pair, FLOAT_TYPEV2(v.xy));
613    } else if (MmTypeA == GGML_TYPE_TQ2_0) {
614        const uint idx = pos_a + col * p.stride_a / mm_load_vec_a() + row;
615
616        const uint ib = idx / 128;                         // 2 values per idx
617        const uint iqs = (idx % 128) * 2;                  // elem 0,2,4..254
618
619        const uint qsi   = (iqs / 128) * 32 + (iqs % 32);  // byte pair start
620        const uint shift = 2 * ((iqs % 128) / 32);         // 0,2,4,6
621
622        const uvec2 qs = uvec2(a_tq2_0.data[ib].qs[qsi], a_tq2_0.data[ib].qs[qsi + 1]);
623        const float d = float(a_tq2_0.data[ib].d);
624
625        const vec2 v = d * (vec2((qs >> shift) & 3) - 1.0);
626
627        const uint k_pair = row * mm_load_vec_a() / 2;
628        store_a(col, k_pair, FLOAT_TYPEV2(v.xy));
629    }
630#endif
631}
632
633#if !defined(MUL_MAT_ID)
634void load_b_to_shmem(const uint pos_b, const uint row, const uint col, const uint idx_n, const uint block, const uint end_k) {
635#if LOAD_VEC_B == 8
636    if (ALIGNED != 0) {
637        // Not supported for b_type bf16 because bf16mat2x4 does not exist
638        const uint idx = pos_b + col * p.stride_b / LOAD_VEC_B + row;
639        const uint buf_idx = col * SHMEM_STRIDE + row * LOAD_VEC_B / 2;
640        FLOAT_TYPEV8 bb = FLOAT_TYPEV8(data_b[idx]);
641        buf_b[buf_idx + 0] = bb[0].xy;
642        buf_b[buf_idx + 1] = bb[0].zw;
643        buf_b[buf_idx + 2] = bb[1].xy;
644        buf_b[buf_idx + 3] = bb[1].zw;
645        return;
646    }
647#elif LOAD_VEC_B == 4
648    if (ALIGNED != 0) {
649        const uint idx = pos_b + col * p.stride_b / LOAD_VEC_B + row;
650        const uint buf_idx = col * SHMEM_STRIDE + row * LOAD_VEC_B / 2;
651#if defined(DATA_B_BF16)
652        FLOAT_TYPEV4 bb = FLOAT_TYPEV4(TO_FLOAT_TYPE(data_b[idx]));
653#else
654        FLOAT_TYPEV4 bb = FLOAT_TYPEV4(data_b[idx]);
655#endif
656        buf_b[buf_idx + 0] = bb.xy;
657        buf_b[buf_idx + 1] = bb.zw;
658        return;
659    }
660#endif
661    const uint idx = pos_b + col * p.stride_b + row * 2;
662    const uint buf_idx = col * SHMEM_STRIDE + row;
663    if (idx_n < p.N && block + row * 2 + 1 < end_k) {
664        buf_b[buf_idx] = FLOAT_TYPEV2(TO_FLOAT_TYPE(data_b_scalar[idx]),
665                                        TO_FLOAT_TYPE(data_b_scalar[idx + 1]));
666    } else if (idx_n < p.N && block + row * 2 < end_k) {
667        buf_b[buf_idx] = FLOAT_TYPEV2(TO_FLOAT_TYPE(data_b_scalar[idx]), 0.0f);
668    } else {
669        buf_b[buf_idx] = FLOAT_TYPEV2(0.0f);
670    }
671}
672#else
673void load_b_to_shmem(const uint pos_b, const uint row, const uint col, const uint ic, const uint _ne1, const uint block, const uint end_k) {
674#if LOAD_VEC_B == 8
675    if (ALIGNED != 0) {
676        // Not supported for b_type bf16 because bf16mat2x4 does not exist
677        const u16vec2 row_idx = row_ids[col];
678        const uint idx = pos_b + row_idx.y * p.batch_stride_b / LOAD_VEC_B + (row_idx.x % p.ne11) * p.stride_b / LOAD_VEC_B + row;
679        const uint buf_idx = col * SHMEM_STRIDE + row * LOAD_VEC_B / 2;
680        FLOAT_TYPEV8 bb = FLOAT_TYPEV8(data_b[idx]);
681        buf_b[buf_idx + 0] = bb[0].xy;
682        buf_b[buf_idx + 1] = bb[0].zw;
683        buf_b[buf_idx + 2] = bb[1].xy;
684        buf_b[buf_idx + 3] = bb[1].zw;
685        return;
686    }
687#elif LOAD_VEC_B == 4
688    if (ALIGNED != 0) {
689        const u16vec2 row_idx = row_ids[col];
690        const uint idx = pos_b + row_idx.y * p.batch_stride_b / LOAD_VEC_B + (row_idx.x % p.ne11) * p.stride_b / LOAD_VEC_B + row;
691        const uint buf_idx = col * SHMEM_STRIDE + row * LOAD_VEC_B / 2;
692#if defined(DATA_B_BF16)
693        FLOAT_TYPEV4 bb = FLOAT_TYPEV4(TO_FLOAT_TYPE(data_b[idx]));
694#else
695        FLOAT_TYPEV4 bb = FLOAT_TYPEV4(data_b[idx]);
696#endif
697        buf_b[buf_idx + 0] = bb.xy;
698        buf_b[buf_idx + 1] = bb.zw;
699        return;
700    }
701#endif
702    const uint row_i = ic * BN + col;
703    const uint buf_idx = col * SHMEM_STRIDE + row;
704    if (row_i < _ne1 && block + row * 2 + 1 < end_k) {
705        const u16vec2 row_idx = row_ids[col];
706        const uint idx = pos_b + row_idx.y * p.batch_stride_b + (row_idx.x % p.ne11) * p.stride_b + row * 2;
707        buf_b[buf_idx] = FLOAT_TYPEV2(TO_FLOAT_TYPE(data_b_scalar[idx]),
708                                        TO_FLOAT_TYPE(data_b_scalar[idx + 1]));
709    } else if (row_i < _ne1 && block + row * 2 < end_k) {
710        const u16vec2 row_idx = row_ids[col];
711        const uint idx = pos_b + row_idx.y * p.batch_stride_b + (row_idx.x % p.ne11) * p.stride_b + row * 2;
712        buf_b[buf_idx] = FLOAT_TYPEV2(TO_FLOAT_TYPE(data_b_scalar[idx]), 0.0f);
713    } else {
714        buf_b[buf_idx] = FLOAT_TYPEV2(0.0f);
715    }
716}
717#endif