@@ -88,6 +88,222 @@ vec4 dequantize4(uint ib, uint iqs, uint a_offset) {
8888}
8989#endif
9090
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+
91307#if defined(DATA_A_IQ4_NL)
92308vec2 dequantize(uint ib, uint iqs, uint a_offset) {
93309 const uint vui = uint(data_a[a_offset + ib].qs[iqs]);
@@ -105,7 +321,7 @@ vec2 get_dm(uint ib, uint a_offset) {
105321}
106322#endif
107323
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)
109325vec2 get_dm(uint ib, uint a_offset) {
110326 return vec2(float(data_a[a_offset + ib].d), 0);
111327}
0 commit comments