1919typedef void (*dequantize_kernel_t )(const void * vx, const int64_t ib, const int iqs, dfloat2 & v);
2020typedef void (*dequantize_kernel_t_reorder)(const void *d, const int64_t ib, const void *qs,
2121 const int iqs, dfloat2 &v);
22+ typedef void (*dequantize_kernel_f32_t )(const void * vx, const int64_t ib, const int iqs, float & v0, float & v1);
2223
2324#if QK_K == 256
2425static inline void get_scale_min_k4 (int j, const uint8_t * q, uint8_t & d, uint8_t & m);
@@ -85,6 +86,21 @@ static __dpct_inline__ void dequantize_q1_0_reorder(const void *d_ptr, const int
8586 v.y () = (2 * bit_1 - 1 ) * d;
8687}
8788
89+ static __dpct_inline__ void dequantize_q1_0 (const void *vx, const int64_t ib,
90+ const int iqs, dfloat2 &v) {
91+ const block_q1_0 * x = (const block_q1_0 *) vx;
92+ const dfloat d = x[ib].d ;
93+
94+ const int bit_index_0 = iqs + 0 ;
95+ const int bit_index_1 = iqs + 1 ;
96+
97+ const int bit_0 = (x[ib].qs [bit_index_0 / 8 ] >> (bit_index_0 % 8 )) & 1 ;
98+ const int bit_1 = (x[ib].qs [bit_index_1 / 8 ] >> (bit_index_1 % 8 )) & 1 ;
99+
100+ v.x () = (2 * bit_0 - 1 ) * d;
101+ v.y () = (2 * bit_1 - 1 ) * d;
102+ }
103+
88104static __dpct_inline__ void dequantize_q4_1 (const void *vx, const int64_t ib,
89105 const int iqs, dfloat2 &v) {
90106 const block_q4_1 * x = (const block_q4_1 *) vx;
@@ -140,6 +156,39 @@ static __dpct_inline__ void dequantize_q4_K(const void *vx, const int64_t ib,
140156#endif
141157}
142158
159+ static __dpct_inline__ void dequantize_q4_K_f32 (const void *vx, const int64_t ib,
160+ const int iqs, float &v0, float &v1) {
161+ #if QK_K == 256
162+ const block_q4_K * x = (const block_q4_K *) vx;
163+ const sycl::half2 dm = x[ib].dm ;
164+ const float dall = dm[0 ];
165+ const float dmin = dm[1 ];
166+
167+ auto dequantize_one = [&](const int idx) -> float {
168+ const int il = idx / 64 ;
169+ const int in = idx % 64 ;
170+ const int is = 2 * il + (in >= 32 ? 1 : 0 );
171+ const int qsi = 32 * il + (in & 31 );
172+
173+ uint8_t sc;
174+ uint8_t m;
175+ get_scale_min_k4 (is, x[ib].scales , sc, m);
176+
177+ const float d = dall * sc;
178+ const float mn = dmin * m;
179+ const uint8_t q = x[ib].qs [qsi];
180+ const uint8_t qv = (in >= 32 ) ? (q >> 4 ) : (q & 0xF );
181+
182+ return d * qv - mn;
183+ };
184+
185+ v0 = dequantize_one (iqs + 0 );
186+ v1 = dequantize_one (iqs + 1 );
187+ #else
188+ GGML_ABORT (" Q4_K dequantize not supported for QK_K != 256" );
189+ #endif
190+ }
191+
143192static __dpct_inline__ void dequantize_q2_K (const void *vx, const int64_t ib,
144193 const int iqs, dfloat2 &v) {
145194#if QK_K == 256
@@ -159,7 +208,7 @@ static __dpct_inline__ void dequantize_q2_K(const void *vx, const int64_t ib,
159208 const float d = dall * (sc & 0xF );
160209 const float m = dmin * (sc >> 4 );
161210
162- return sycl::fma ( (dfloat) ((q >> (2 * g)) & 3 ), (dfloat) d, (dfloat) (-m)) ;
211+ return (dfloat) d * (dfloat) ((q >> (2 * g)) & 3 ) - (dfloat) m ;
163212 };
164213
165214 v.x () = dequantize_one (iqs + 0 );
@@ -169,6 +218,35 @@ static __dpct_inline__ void dequantize_q2_K(const void *vx, const int64_t ib,
169218#endif
170219}
171220
221+ static __dpct_inline__ void dequantize_q2_K_f32 (const void *vx, const int64_t ib,
222+ const int iqs, float &v0, float &v1) {
223+ #if QK_K == 256
224+ const block_q2_K * x = (const block_q2_K *) vx;
225+ const float dall = x[ib].dm [0 ];
226+ const float dmin = x[ib].dm [1 ];
227+
228+ auto dequantize_one = [&](const int idx) -> float {
229+ const int n = idx / 128 ;
230+ const int r = idx % 128 ;
231+ const int g = r / 32 ;
232+ const int l = r % 32 ;
233+ const int is = 8 * n + l / 16 ;
234+
235+ const uint8_t q = x[ib].qs [32 * n + l];
236+ const uint8_t sc = x[ib].scales [is + 2 * g];
237+ const float d = dall * (sc & 0xF );
238+ const float m = dmin * (sc >> 4 );
239+
240+ return d * ((q >> (2 * g)) & 3 ) - m;
241+ };
242+
243+ v0 = dequantize_one (iqs + 0 );
244+ v1 = dequantize_one (iqs + 1 );
245+ #else
246+ GGML_ABORT (" Q2_K dequantize not supported for QK_K != 256" );
247+ #endif
248+ }
249+
172250static __dpct_inline__ void dequantize_q3_K (const void *vx, const int64_t ib,
173251 const int iqs, dfloat2 &v) {
174252#if QK_K == 256
@@ -242,6 +320,42 @@ static __dpct_inline__ void dequantize_q5_K(const void *vx, const int64_t ib,
242320#endif
243321}
244322
323+ static __dpct_inline__ void dequantize_q5_K_f32 (const void *vx, const int64_t ib,
324+ const int iqs, float &v0, float &v1) {
325+ #if QK_K == 256
326+ const block_q5_K * x = (const block_q5_K *) vx;
327+ const float dall = x[ib].dm [0 ];
328+ const float dmin = x[ib].dm [1 ];
329+
330+ auto dequantize_one = [&](const int idx) -> float {
331+ const int il = idx / 64 ;
332+ const int in = idx % 64 ;
333+ const int is = 2 * il + (in >= 32 ? 1 : 0 );
334+ const int ir = (in & 31 ) / 2 ;
335+ const int iq = in & 1 ;
336+
337+ const uint8_t q = x[ib].qs [32 * il + 2 * ir + iq];
338+ const uint8_t h = x[ib].qh [2 * ir + iq];
339+ const uint8_t qv = (in >= 32 ) ? (q >> 4 ) : (q & 0xF );
340+
341+ uint8_t sc;
342+ uint8_t m;
343+ get_scale_min_k4 (is, x[ib].scales , sc, m);
344+
345+ const float d = dall * sc;
346+ const float mn = dmin * m;
347+ const uint8_t hm = 1 << (2 * il + (in >= 32 ? 1 : 0 ));
348+
349+ return (qv + ((h & hm) ? 16 : 0 )) * d - mn;
350+ };
351+
352+ v0 = dequantize_one (iqs + 0 );
353+ v1 = dequantize_one (iqs + 1 );
354+ #else
355+ GGML_ABORT (" Q5_K dequantize not supported for QK_K != 256" );
356+ #endif
357+ }
358+
245359static __dpct_inline__ void dequantize_q6_K (const void *vx, const int64_t ib,
246360 const int iqs, dfloat2 &v) {
247361#if QK_K == 256
@@ -296,21 +410,6 @@ static __dpct_inline__ void dequantize_mxfp4(const void *vx, const int64_t ib,
296410 v.y () = d * kvalues_mxfp4[q >> 4 ] * 0 .5f ;
297411}
298412
299- static __dpct_inline__ void dequantize_q1_0 (const void *vx, const int64_t ib,
300- const int iqs, dfloat2 &v) {
301- const block_q1_0 * x = (const block_q1_0 *) vx;
302- const dfloat d = x[ib].d ;
303-
304- const int bit_index_0 = iqs + 0 ;
305- const int bit_index_1 = iqs + 1 ;
306-
307- const int bit_0 = (x[ib].qs [bit_index_0 / 8 ] >> (bit_index_0 % 8 )) & 1 ;
308- const int bit_1 = (x[ib].qs [bit_index_1 / 8 ] >> (bit_index_1 % 8 )) & 1 ;
309-
310- v.x () = (2 * bit_0 - 1 ) * d;
311- v.y () = (2 * bit_1 - 1 ) * d;
312- }
313-
314413static __dpct_inline__ void dequantize_nvfp4 (const void *vx, const int64_t ib,
315414 const int iqs, dfloat2 &v) {
316415 const block_nvfp4 & xb = ((const block_nvfp4 *) vx)[ib];
0 commit comments