@@ -88,6 +88,222 @@ vec4 dequantize4(uint ib, uint iqs, uint a_offset) {
88
88
}
89
89
#endif
90
90
91
+ #if defined(DATA_A_IQ2_XXS)
92
+ vec2 dequantize(uint ib, uint iqs, uint a_offset) {
93
+ const uint ib32 = iqs / 32;
94
+ const uint ib8 = (iqs / 8) % 4;
95
+ const uint qs = data_a[a_offset + ib].qs[8 * ib32 + ib8];
96
+ // Scales are stored as packed 7+7+7+7+4 bits (4 sign tuples and 1 int4 scale)
97
+ const uint signs = pack32(u16vec2(data_a_packed16[a_offset + ib].qs[4 * ib32 + 2],
98
+ data_a_packed16[a_offset + ib].qs[4 * ib32 + 3]));
99
+ const float db = 0.25 * (0.5 + (signs >> 28));
100
+ const uint sign7 = bitfieldExtract(signs, 7 * int(ib8), 7);
101
+ // Add parity bit
102
+ const uint sign8 = sign7 | (bitCount(sign7) << 7);
103
+ const uint sign = sign8 >> (iqs % 8);
104
+ const u8vec4 grid = unpack8(iq2xxs_grid[qs][(iqs % 8) / 4] >> (8 * (iqs % 4)));
105
+ bool sign0 = (sign & 1) != 0;
106
+ bool sign1 = (sign & 2) != 0;
107
+ return db * vec2(
108
+ grid.x * (sign0 ? -1.0 : 1.0),
109
+ grid.y * (sign1 ? -1.0 : 1.0)
110
+ );
111
+ }
112
+ vec4 dequantize4(uint ib, uint iqs, uint a_offset) {
113
+ const uint ib32 = iqs / 32;
114
+ const uint ib8 = (iqs / 8) % 4;
115
+ const uint qs = data_a[a_offset + ib].qs[8 * ib32 + ib8];
116
+ // Scales are stored as packed 7+7+7+7+4 bits (4 sign tuples and 1 int4 scale)
117
+ const uint signs = pack32(u16vec2(data_a_packed16[a_offset + ib].qs[4 * ib32 + 2],
118
+ data_a_packed16[a_offset + ib].qs[4 * ib32 + 3]));
119
+ const float db = 0.25 * (0.5 + (signs >> 28));
120
+ const uint sign7 = bitfieldExtract(signs, 7 * int(ib8), 7);
121
+ // Add parity bit
122
+ const uint sign8 = sign7 | (bitCount(sign7) << 7);
123
+ const uint sign = sign8 >> (iqs % 8);
124
+ const u8vec4 grid = unpack8(iq2xxs_grid[qs][(iqs % 8) / 4] >> (8 * (iqs % 4)));
125
+ bool sign0 = (sign & 1) != 0;
126
+ bool sign1 = (sign & 2) != 0;
127
+ bool sign2 = (sign & 4) != 0;
128
+ bool sign3 = (sign & 8) != 0;
129
+ return db * vec4(
130
+ grid.x * (sign0 ? -1.0 : 1.0),
131
+ grid.y * (sign1 ? -1.0 : 1.0),
132
+ grid.z * (sign2 ? -1.0 : 1.0),
133
+ grid.w * (sign3 ? -1.0 : 1.0)
134
+ );
135
+ }
136
+ #endif
137
+
138
+ #if defined(DATA_A_IQ2_XS)
139
+ vec2 dequantize(uint ib, uint iqs, uint a_offset) {
140
+ const uint scale = (data_a[a_offset + ib].scales[iqs / 32] >> (4 * ((iqs / 16) & 1))) & 0xf;
141
+ const uint qs = data_a[a_offset + ib].qs[iqs / 8];
142
+ const float db = 0.25 * (0.5 + scale);
143
+ const uint sign7 = qs >> 9;
144
+ // Add parity bit
145
+ const uint sign8 = sign7 | (bitCount(sign7) << 7);
146
+ const uint sign = sign8 >> (iqs % 8);
147
+ const u8vec4 grid = unpack8(iq2xs_grid[qs & 511][(iqs % 8) / 4] >> (8 * (iqs % 4)));
148
+ bool sign0 = (sign & 1) != 0;
149
+ bool sign1 = (sign & 2) != 0;
150
+ return db * vec2(
151
+ grid.x * (sign0 ? -1.0 : 1.0),
152
+ grid.y * (sign1 ? -1.0 : 1.0)
153
+ );
154
+ }
155
+ vec4 dequantize4(uint ib, uint iqs, uint a_offset) {
156
+ const uint scale = (data_a[a_offset + ib].scales[iqs / 32] >> (4 * ((iqs / 16) & 1))) & 0xf;
157
+ const uint qs = data_a[a_offset + ib].qs[iqs / 8];
158
+ const float db = 0.25 * (0.5 + scale);
159
+ const uint sign7 = qs >> 9;
160
+ // Add parity bit
161
+ const uint sign8 = sign7 | (bitCount(sign7) << 7);
162
+ const uint sign = sign8 >> (iqs % 8);
163
+ const u8vec4 grid = unpack8(iq2xs_grid[qs & 511][(iqs % 8) / 4] >> (8 * (iqs % 4)));
164
+ bool sign0 = (sign & 1) != 0;
165
+ bool sign1 = (sign & 2) != 0;
166
+ bool sign2 = (sign & 4) != 0;
167
+ bool sign3 = (sign & 8) != 0;
168
+ return db * vec4(
169
+ grid.x * (sign0 ? -1.0 : 1.0),
170
+ grid.y * (sign1 ? -1.0 : 1.0),
171
+ grid.z * (sign2 ? -1.0 : 1.0),
172
+ grid.w * (sign3 ? -1.0 : 1.0)
173
+ );
174
+ }
175
+ #endif
176
+
177
+ #if defined(DATA_A_IQ2_S)
178
+ vec2 dequantize(uint ib, uint iqs, uint a_offset) {
179
+ const uint ib32 = iqs / 32;
180
+ const uint ib8 = iqs / 8;
181
+
182
+ const uint scale = (data_a[a_offset + ib].scales[ib32] >> (4 * ((iqs / 16) & 1))) & 0xf;
183
+ const uint qs = data_a[a_offset + ib].qs[ib8];
184
+ const uint qh = data_a[a_offset + ib].qh[ib32];
185
+ const uint qhshift = 2 * (ib8 % 4);
186
+ const uint sign = data_a[a_offset + ib].qs[QUANT_K / 8 + ib8] >> (iqs % 8);
187
+
188
+ const float db = 0.25 * (0.5 + scale);
189
+ const u8vec4 grid = unpack8(iq2s_grid[qs | ((qh << (8 - qhshift)) & 0x300)][(iqs % 8) / 4]);
190
+ bool sign0 = (sign & 1) != 0;
191
+ bool sign1 = (sign & 2) != 0;
192
+ return db * vec2(
193
+ grid[iqs % 4] * (sign0 ? -1.0 : 1.0),
194
+ grid[(iqs % 4) + 1] * (sign1 ? -1.0 : 1.0)
195
+ );
196
+ }
197
+ vec4 dequantize4(uint ib, uint iqs, uint a_offset) {
198
+ const uint ib32 = iqs / 32;
199
+ const uint ib8 = iqs / 8;
200
+
201
+ const uint scale = (data_a[a_offset + ib].scales[ib32] >> (4 * ((iqs / 16) & 1))) & 0xf;
202
+ const uint qs = data_a[a_offset + ib].qs[ib8];
203
+ const uint qh = data_a[a_offset + ib].qh[ib32];
204
+ const uint qhshift = 2 * (ib8 % 4);
205
+ const uint sign = data_a[a_offset + ib].qs[QUANT_K / 8 + ib8] >> (iqs % 8);
206
+
207
+ const float db = 0.25 * (0.5 + scale);
208
+ const u8vec4 grid = unpack8(iq2s_grid[qs | ((qh << (8 - qhshift)) & 0x300)][(iqs % 8) / 4]);
209
+ bool sign0 = (sign & 1) != 0;
210
+ bool sign1 = (sign & 2) != 0;
211
+ bool sign2 = (sign & 4) != 0;
212
+ bool sign3 = (sign & 8) != 0;
213
+ return db * vec4(
214
+ grid.x * (sign0 ? -1.0 : 1.0),
215
+ grid.y * (sign1 ? -1.0 : 1.0),
216
+ grid.z * (sign2 ? -1.0 : 1.0),
217
+ grid.w * (sign3 ? -1.0 : 1.0)
218
+ );
219
+ }
220
+ #endif
221
+
222
+ #if defined(DATA_A_IQ3_XXS)
223
+ vec2 dequantize(uint ib, uint iqs, uint a_offset) {
224
+ const uint ib4 = iqs / 4;
225
+ const uint ib32 = iqs / 32;
226
+ const uint is = QUANT_K / 4 + 4 * ib32;
227
+ const uint qs = data_a[a_offset + ib].qs[ib4];
228
+ // Scales are stored as packed 7+7+7+7+4 bits (4 sign tuples and 1 int4 scale)
229
+ const uint signs = pack32(u16vec2(data_a_packed16[a_offset + ib].qs[is / 2],
230
+ data_a_packed16[a_offset + ib].qs[is / 2 + 1]));
231
+ const float db = 0.5 * (0.5 + (signs >> 28));
232
+ const uint sign7 = bitfieldExtract(signs, 7 * (int(ib4 / 2) % 4), 7);
233
+ // Add parity bit
234
+ const uint sign8 = sign7 | (bitCount(sign7) << 7);
235
+ const uint sign = sign8 >> (iqs % 8);
236
+ const u8vec4 grid = unpack8(iq3xxs_grid[qs] >> (8 * (iqs % 4)));
237
+ bool sign0 = (sign & 1) != 0;
238
+ bool sign1 = (sign & 2) != 0;
239
+ return db * vec2(
240
+ grid.x * (sign0 ? -1.0 : 1.0),
241
+ grid.y * (sign1 ? -1.0 : 1.0)
242
+ );
243
+ }
244
+ vec4 dequantize4(uint ib, uint iqs, uint a_offset) {
245
+ const uint ib4 = iqs / 4;
246
+ const uint ib32 = iqs / 32;
247
+ const uint is = QUANT_K / 4 + 4 * ib32;
248
+ const uint qs = data_a[a_offset + ib].qs[ib4];
249
+ const uint signs = pack32(u16vec2(data_a_packed16[a_offset + ib].qs[is / 2],
250
+ data_a_packed16[a_offset + ib].qs[is / 2 + 1]));
251
+ const float db = 0.5 * (0.5 + (signs >> 28));
252
+ const uint sign7 = bitfieldExtract(signs, 7 * (int(ib4 / 2) % 4), 7);
253
+ // Add parity bit
254
+ const uint sign8 = sign7 | (bitCount(sign7) << 7);
255
+ const uint sign = sign8 >> (iqs % 8);
256
+ const u8vec4 grid = unpack8(iq3xxs_grid[qs]);
257
+ bool sign0 = (sign & 1) != 0;
258
+ bool sign1 = (sign & 2) != 0;
259
+ bool sign2 = (sign & 4) != 0;
260
+ bool sign3 = (sign & 8) != 0;
261
+ return db * vec4(
262
+ grid.x * (sign0 ? -1.0 : 1.0),
263
+ grid.y * (sign1 ? -1.0 : 1.0),
264
+ grid.z * (sign2 ? -1.0 : 1.0),
265
+ grid.w * (sign3 ? -1.0 : 1.0)
266
+ );
267
+ }
268
+ #endif
269
+
270
+ #if defined(DATA_A_IQ3_S)
271
+ vec2 dequantize(uint ib, uint iqs, uint a_offset) {
272
+ const uint qs = data_a[a_offset + ib].qs[iqs / 4];
273
+ const uint qh = data_a[a_offset + ib].qh[iqs / 32];
274
+ const uint sign = data_a[a_offset + ib].signs[iqs / 8] >> (iqs % 8);
275
+ const uint scale = data_a[a_offset + ib].scales[iqs / 64];
276
+ bool sign0 = (sign & 1) != 0;
277
+ bool sign1 = (sign & 2) != 0;
278
+ const float db = 1 + 2 * ((scale >> (4 * ((iqs / 32) & 1))) & 0xf);
279
+ const uint32_t grid = iq3s_grid[qs | ((qh << (8 - ((iqs / 4) % 8))) & 256)] >> (8 * (iqs % 4));
280
+ return db * vec2(
281
+ int(grid & 0xFF) * (sign0 ? -1.0 : 1.0),
282
+ int((grid >> 8) & 0xFF) * (sign1 ? -1.0 : 1.0)
283
+ );
284
+ }
285
+ vec4 dequantize4(uint ib, uint iqs, uint a_offset) {
286
+ const uint ib4 = iqs / 4;
287
+ const uint ib32 = iqs / 32;
288
+ const uint qs = data_a[a_offset + ib].qs[ib4];
289
+ const uint qh = data_a[a_offset + ib].qh[ib32];
290
+ const uint sign = data_a[a_offset + ib].signs[iqs / 8] >> (iqs % 8);
291
+ const uint scale = data_a[a_offset + ib].scales[ib32 / 2];
292
+ bool sign0 = (sign & 1) != 0;
293
+ bool sign1 = (sign & 2) != 0;
294
+ bool sign2 = (sign & 4) != 0;
295
+ bool sign3 = (sign & 8) != 0;
296
+ const float db = 1 + 2 * ((scale >> (4 * (ib32 & 1))) & 0xf);
297
+ const uint32_t grid = iq3s_grid[qs | ((qh << (8 - ib4 % 8)) & 256)] >> (8 * (iqs % 4));
298
+ return db * vec4(
299
+ int(grid & 0xFF) * (sign0 ? -1.0 : 1.0),
300
+ int((grid >> 8) & 0xFF) * (sign1 ? -1.0 : 1.0),
301
+ int((grid >> 16) & 0xFF) * (sign2 ? -1.0 : 1.0),
302
+ int((grid >> 24) & 0xFF) * (sign3 ? -1.0 : 1.0)
303
+ );
304
+ }
305
+ #endif
306
+
91
307
#if defined(DATA_A_IQ4_NL)
92
308
vec2 dequantize(uint ib, uint iqs, uint a_offset) {
93
309
const uint vui = uint(data_a[a_offset + ib].qs[iqs]);
@@ -105,7 +321,7 @@ vec2 get_dm(uint ib, uint a_offset) {
105
321
}
106
322
#endif
107
323
108
- #if defined(DATA_A_Q4_0) || defined(DATA_A_Q5_0) || defined(DATA_A_Q8_0) || defined(DATA_A_IQ4_NL)
324
+ #if defined(DATA_A_Q4_0) || defined(DATA_A_Q5_0) || defined(DATA_A_Q8_0) || defined(DATA_A_IQ2_XXS) || defined(DATA_A_IQ2_XS) || defined(DATA_A_IQ2_S) || defined(DATA_A_IQ3_XXS) || defined(DATA_A_IQ3_S) || defined( DATA_A_IQ4_NL)
109
325
vec2 get_dm(uint ib, uint a_offset) {
110
326
return vec2(float(data_a[a_offset + ib].d), 0);
111
327
}
0 commit comments