char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
bec4772f6
char/aliceai-t5-moe
1#define GGML_COMMON_IMPL_C 2#include "ggml-common.h" 3 4#include "ggml-cpu-impl.h" 5#include "simd-mappings.h" 6#include "ggml-quants.h" 7#include "quants.h" 8 9#include "arch-fallback.h" 10 11#include <string.h> 12#include <assert.h> 13#include <float.h> 14#include <stdlib.h> // for qsort 15#include <stdio.h> // for GGML_ASSERT 16 17#define GROUP_MAX_EPS 1e-15f 18#define GROUP_MAX_EPS_IQ3_XXS 1e-8f 19#define GROUP_MAX_EPS_IQ2_S 1e-8f 20#define GROUP_MAX_EPS_IQ1_M 1e-7f 21#define GROUP_MAX_EPS_IQ1_S 1e-12f 22 23#define UNUSED GGML_UNUSED 24 25void quantize_row_q1_0 (const float * GGML_RESTRICT x ,void * GGML_RESTRICT y ,int64_t k ) { 26quantize_row_q1_0_ref (x ,y ,k ); 27} 28 29void quantize_row_q2_0 (const float * GGML_RESTRICT x ,void * GGML_RESTRICT y ,int64_t k ) { 30quantize_row_q2_0_ref (x ,y ,k ); 31} 32 33void quantize_row_q4_0 (const float * GGML_RESTRICT x ,void * GGML_RESTRICT y ,int64_t k ) { 34quantize_row_q4_0_ref (x ,y ,k ); 35} 36 37void quantize_row_q4_1 (const float * GGML_RESTRICT x ,void * GGML_RESTRICT y ,int64_t k ) { 38quantize_row_q4_1_ref (x ,y ,k ); 39} 40 41void quantize_row_q5_0 (const float * GGML_RESTRICT x ,void * GGML_RESTRICT y ,int64_t k ) { 42quantize_row_q5_0_ref (x ,y ,k ); 43} 44 45void quantize_row_q5_1 (const float * GGML_RESTRICT x ,void * GGML_RESTRICT y ,int64_t k ) { 46quantize_row_q5_1_ref (x ,y ,k ); 47} 48 49void quantize_row_q8_0_generic (const float * GGML_RESTRICT x ,void * GGML_RESTRICT y ,int64_t k ) { 50quantize_row_q8_0_ref (x ,y ,k ); 51} 52 53void quantize_row_q8_1_generic (const float * GGML_RESTRICT x ,void * GGML_RESTRICT y ,int64_t k ) { 54quantize_row_q8_1_ref (x ,y ,k ); 55} 56 57void quantize_row_mxfp4 (const float * GGML_RESTRICT x ,void * GGML_RESTRICT y ,int64_t k ) { 58quantize_row_mxfp4_ref (x ,y ,k ); 59} 60 61void quantize_row_nvfp4 (const float * GGML_RESTRICT x ,void * GGML_RESTRICT y ,int64_t k ) { 62quantize_row_nvfp4_ref (x ,y ,k ); 63} 64 65// 66// 2-6 bit quantization in super-blocks 67// 68 69//========================- 2-bit (de)-quantization 70 71void quantize_row_q2_K (const float * GGML_RESTRICT x ,void * GGML_RESTRICT vy ,int64_t k ) { 72quantize_row_q2_K_ref (x ,vy ,k ); 73} 74 75//========================= 3-bit (de)-quantization 76 77void quantize_row_q3_K (const float * GGML_RESTRICT x ,void * GGML_RESTRICT vy ,int64_t k ) { 78quantize_row_q3_K_ref (x ,vy ,k ); 79} 80 81// ====================== 4-bit (de)-quantization 82 83void quantize_row_q4_K (const float * GGML_RESTRICT x ,void * GGML_RESTRICT vy ,int64_t k ) { 84assert (k %QK_K == 0 ); 85block_q4_K * GGML_RESTRICT y = vy ; 86quantize_row_q4_K_ref (x ,y ,k ); 87} 88 89// ====================== 5-bit (de)-quantization 90 91void quantize_row_q5_K (const float * GGML_RESTRICT x ,void * GGML_RESTRICT vy ,int64_t k ) { 92assert (k %QK_K == 0 ); 93block_q5_K * GGML_RESTRICT y = vy ; 94quantize_row_q5_K_ref (x ,y ,k ); 95} 96 97// ====================== 6-bit (de)-quantization 98 99void quantize_row_q6_K (const float * GGML_RESTRICT x ,void * GGML_RESTRICT vy ,int64_t k ) { 100assert (k %QK_K == 0 ); 101block_q6_K * GGML_RESTRICT y = vy ; 102quantize_row_q6_K_ref (x ,y ,k ); 103} 104 105// ====================== Ternary (de)-quantization (BitNet b1.58 and TriLMs) 106 107void quantize_row_tq1_0 (const float * GGML_RESTRICT x ,void * GGML_RESTRICT vy ,int64_t k ) { 108assert (k %QK_K == 0 ); 109block_tq1_0 * GGML_RESTRICT y = vy ; 110quantize_row_tq1_0_ref (x ,y ,k ); 111} 112 113void quantize_row_tq2_0 (const float * GGML_RESTRICT x ,void * GGML_RESTRICT vy ,int64_t k ) { 114assert (k %QK_K == 0 ); 115block_tq2_0 * GGML_RESTRICT y = vy ; 116quantize_row_tq2_0_ref (x ,y ,k ); 117} 118 119//===================================== Q8_K ============================================== 120 121void quantize_row_q8_K_generic (const float * GGML_RESTRICT x ,void * GGML_RESTRICT y ,int64_t k ) { 122quantize_row_q8_K_ref (x ,y ,k ); 123} 124 125//===================================== Dot products ================================= 126 127void ggml_vec_dot_q1_0_q8_0_generic (int n ,float * GGML_RESTRICT s ,size_t bs ,const void * GGML_RESTRICT vx ,size_t bx ,const void * GGML_RESTRICT vy ,size_t by ,int nrc ) { 128const int qk = QK1_0 ; 129const int nb = n /qk ; 130 131assert (n %qk == 0 ); 132assert (nrc == 1 ); 133UNUSED (nrc ); 134UNUSED (bx ); 135UNUSED (by ); 136UNUSED (bs ); 137 138const block_q1_0 * GGML_RESTRICT x = vx ; 139const block_q8_0 * GGML_RESTRICT y = vy ; 140 141float sumf = 0.0 ; 142 143for (int i = 0 ;i < nb ;i ++ ) { 144const float d0 = GGML_CPU_FP16_TO_FP32 (x [i ].d ); 145 146float sumi = 0.0f ; 147 148for (int k = 0 ;k < 4 ;k ++ ) { 149const block_q8_0 * GGML_RESTRICT yb = & y [i * 4 + k ]; 150const float d1 = GGML_CPU_FP16_TO_FP32 (yb -> d ); 151int sumi_block = 0 ; 152 153const uint8_t * GGML_RESTRICT bits = & x [i ].qs [k * 4 ]; 154const int8_t * GGML_RESTRICT qy = yb -> qs ; 155 156for (int b = 0 ;b < 4 ;++ b ,qy += 8 ) { 157const unsigned mask = bits [b ]; 158sumi_block += ((mask & 0x01 ) ?qy [0 ] :- qy [0 ]) 159+ ((mask & 0x02 ) ?qy [1 ] :- qy [1 ]) 160+ ((mask & 0x04 ) ?qy [2 ] :- qy [2 ]) 161+ ((mask & 0x08 ) ?qy [3 ] :- qy [3 ]) 162+ ((mask & 0x10 ) ?qy [4 ] :- qy [4 ]) 163+ ((mask & 0x20 ) ?qy [5 ] :- qy [5 ]) 164+ ((mask & 0x40 ) ?qy [6 ] :- qy [6 ]) 165+ ((mask & 0x80 ) ?qy [7 ] :- qy [7 ]); 166 } 167 168sumi += d1 * sumi_block ; 169 } 170 171sumf += d0 * sumi ; 172 } 173 174* s = sumf ; 175} 176 177void ggml_vec_dot_q2_0_q8_0_generic (int n ,float * GGML_RESTRICT s ,size_t bs ,const void * GGML_RESTRICT vx ,size_t bx ,const void * GGML_RESTRICT vy ,size_t by ,int nrc ) { 178const int qk = QK2_0 ; 179const int nb = n /qk ; 180 181assert (n %qk == 0 ); 182assert (nrc == 1 ); 183UNUSED (nrc ); 184UNUSED (bx ); 185UNUSED (by ); 186UNUSED (bs ); 187 188const block_q2_0 * GGML_RESTRICT x = vx ; 189const block_q8_0 * GGML_RESTRICT y = vy ; 190 191float sumf = 0.0f ; 192 193for (int i = 0 ;i < nb ;i ++ ) { 194const float d0 = GGML_CPU_FP16_TO_FP32 (x [i ].d ); 195 196float sumi = 0.0f ; 197 198// group 64: one Q2_0 block (64 weights) maps to two Q8_0 blocks (2 * 32 = 64) 199for (int k = 0 ;k < 2 ;k ++ ) { 200const block_q8_0 * GGML_RESTRICT yb = & y [i * 2 + k ]; 201const float d1 = GGML_CPU_FP16_TO_FP32 (yb -> d ); 202int sumi_block = 0 ; 203 204const uint8_t * GGML_RESTRICT qs = & x [i ].qs [k * 8 ]; 205const int8_t * GGML_RESTRICT qy = yb -> qs ; 206 207for (int b = 0 ;b < 8 ;++ b ) { 208const uint8_t byte = qs [b ]; 209// Extract 4 two-bit values, map {0,1,2,3} -> {-1,0,1,2} 210sumi_block += ((int )((byte >>0 )& 3 )- 1 )* qy [b * 4 + 0 ]; 211sumi_block += ((int )((byte >>2 )& 3 )- 1 )* qy [b * 4 + 1 ]; 212sumi_block += ((int )((byte >>4 )& 3 )- 1 )* qy [b * 4 + 2 ]; 213sumi_block += ((int )((byte >>6 )& 3 )- 1 )* qy [b * 4 + 3 ]; 214 } 215 216sumi += d1 * sumi_block ; 217 } 218 219sumf += d0 * sumi ; 220 } 221 222* s = sumf ; 223} 224 225void ggml_vec_dot_q4_0_q8_0_generic (int n ,float * GGML_RESTRICT s ,size_t bs ,const void * GGML_RESTRICT vx ,size_t bx ,const void * GGML_RESTRICT vy ,size_t by ,int nrc ) { 226const int qk = QK8_0 ; 227const int nb = n /qk ; 228 229assert (n %qk == 0 ); 230assert (nrc == 1 ); 231UNUSED (nrc ); 232UNUSED (bx ); 233UNUSED (by ); 234UNUSED (bs ); 235 236const block_q4_0 * GGML_RESTRICT x = vx ; 237const block_q8_0 * GGML_RESTRICT y = vy ; 238 239int ib = 0 ; 240float sumf = 0 ; 241 242for (;ib < nb ;++ ib ) { 243int sumi0 = 0 ; 244int sumi1 = 0 ; 245 246for (int j = 0 ;j < qk /2 ;++ j ) { 247const int v0 = (x [ib ].qs [j ]& 0x0F )- 8 ; 248const int v1 = (x [ib ].qs [j ] >>4 )- 8 ; 249 250sumi0 += (v0 * y [ib ].qs [j ]); 251sumi1 += (v1 * y [ib ].qs [j + qk /2 ]); 252 } 253 254int sumi = sumi0 + sumi1 ; 255sumf += sumi * GGML_CPU_FP16_TO_FP32 (x [ib ].d )* GGML_CPU_FP16_TO_FP32 (y [ib ].d ); 256 } 257 258* s = sumf ; 259} 260 261// TODO: add WASM SIMD 262void ggml_vec_dot_q4_1_q8_1_generic (int n ,float * GGML_RESTRICT s ,size_t bs ,const void * GGML_RESTRICT vx ,size_t bx ,const void * GGML_RESTRICT vy ,size_t by ,int nrc ) { 263const int qk = QK8_1 ; 264const int nb = n /qk ; 265 266assert (n %qk == 0 ); 267assert (nrc == 1 ); 268UNUSED (nrc ); 269UNUSED (bx ); 270UNUSED (by ); 271UNUSED (bs ); 272 273const block_q4_1 * GGML_RESTRICT x = vx ; 274const block_q8_1 * GGML_RESTRICT y = vy ; 275 276int ib = 0 ; 277float sumf = 0 ; 278 279for (;ib < nb ;++ ib ) { 280int sumi0 = 0 ; 281int sumi1 = 0 ; 282 283for (int j = 0 ;j < qk /2 ;++ j ) { 284const int v0 = (x [ib ].qs [j ]& 0x0F ); 285const int v1 = (x [ib ].qs [j ] >>4 ); 286 287sumi0 += (v0 * y [ib ].qs [j ]); 288sumi1 += (v1 * y [ib ].qs [j + qk /2 ]); 289 } 290 291int sumi = sumi0 + sumi1 ; 292sumf += (GGML_CPU_FP16_TO_FP32 (x [ib ].d )* GGML_CPU_FP16_TO_FP32 (y [ib ].d ))* sumi + GGML_CPU_FP16_TO_FP32 (x [ib ].m )* GGML_CPU_FP16_TO_FP32 (y [ib ].s ); 293 } 294 295* s = sumf ; 296} 297 298void ggml_vec_dot_mxfp4_q8_0_generic (int n ,float * GGML_RESTRICT s ,size_t bs ,const void * GGML_RESTRICT vx ,size_t bx ,const void * GGML_RESTRICT vy ,size_t by ,int nrc ) { 299assert (nrc == 1 ); 300UNUSED (nrc ); 301UNUSED (bx ); 302UNUSED (by ); 303UNUSED (bs ); 304assert (n %QK_MXFP4 == 0 ); 305static_assert (QK_MXFP4 == QK8_0 ,"QK_MXFP4 and QK8_0 must be the same" ); 306 307const block_mxfp4 * GGML_RESTRICT x = vx ; 308const block_q8_0 * GGML_RESTRICT y = vy ; 309 310const int nb = n /QK_MXFP4 ; 311 312int ib = 0 ; 313float sumf = 0 ; 314 315for (;ib < nb ;++ ib ) { 316const float d = GGML_CPU_FP16_TO_FP32 (y [ib ].d )* GGML_E8M0_TO_FP32_HALF (x [ib ].e ); 317 318int sumi1 = 0 ; 319int sumi2 = 0 ; 320for (int j = 0 ;j < QK_MXFP4 /2 ;++ j ) { 321sumi1 += y [ib ].qs [j + 0 ]* kvalues_mxfp4 [x [ib ].qs [j ]& 0xf ]; 322sumi2 += y [ib ].qs [j + QK_MXFP4 /2 ]* kvalues_mxfp4 [x [ib ].qs [j ] >>4 ]; 323 } 324sumf += d * (sumi1 + sumi2 ); 325 } 326* s = sumf ; 327} 328 329// NVFP4: super-block of 64 elements = 4 sub-blocks of 16 = 2 q8_0 blocks 330void ggml_vec_dot_nvfp4_q8_0_generic (int n ,float * GGML_RESTRICT s ,size_t bs ,const void * GGML_RESTRICT vx ,size_t bx ,const void * GGML_RESTRICT vy ,size_t by ,int nrc ) { 331assert (nrc == 1 ); 332UNUSED (nrc ); 333UNUSED (bx ); 334UNUSED (by ); 335UNUSED (bs ); 336assert (n %QK_NVFP4 == 0 ); 337 338const block_nvfp4 * GGML_RESTRICT x = vx ; 339const block_q8_0 * GGML_RESTRICT y = vy ; 340 341const int nb = n /QK_NVFP4 ; 342 343float sumf = 0 ; 344 345for (int ib = 0 ;ib < nb ;++ ib ) { 346for (int s_idx = 0 ;s_idx < 4 ;++ s_idx ) { 347const float d = ggml_ue4m3_to_fp32 (x [ib ].d [s_idx ]); 348const int q8_block = s_idx /2 ; 349const int q8_off = (s_idx %2 )* QK_NVFP4_SUB ; 350const float dy = GGML_CPU_FP16_TO_FP32 (y [2 * ib + q8_block ].d ); 351 352int sumi_lo = 0 ,sumi_hi = 0 ; 353for (int j = 0 ;j < QK_NVFP4_SUB /2 ;++ j ) { 354const uint8_t qv = x [ib ].qs [s_idx * (QK_NVFP4_SUB /2 )+ j ]; 355sumi_lo += y [2 * ib + q8_block ].qs [q8_off + j + 0 ]* kvalues_mxfp4 [qv & 0xf ]; 356sumi_hi += y [2 * ib + q8_block ].qs [q8_off + j + QK_NVFP4_SUB /2 ]* kvalues_mxfp4 [qv >>4 ]; 357 } 358 359sumf += dy * d * (sumi_lo + sumi_hi ); 360 } 361 } 362* s = sumf ; 363} 364 365void ggml_vec_dot_q5_0_q8_0_generic (int n ,float * GGML_RESTRICT s ,size_t bs ,const void * GGML_RESTRICT vx ,size_t bx ,const void * GGML_RESTRICT vy ,size_t by ,int nrc ) { 366const int qk = QK8_0 ; 367const int nb = n /qk ; 368 369int ib = 0 ; 370float sumf = 0 ; 371 372assert (n %qk == 0 ); 373assert (qk == QK5_0 ); 374assert (nrc == 1 ); 375UNUSED (nrc ); 376UNUSED (bx ); 377UNUSED (by ); 378UNUSED (bs ); 379 380const block_q5_0 * GGML_RESTRICT x = vx ; 381const block_q8_0 * GGML_RESTRICT y = vy ; 382 383for (;ib < nb ;++ ib ) { 384uint32_t qh ; 385memcpy (& qh ,x [ib ].qh ,sizeof (qh )); 386 387int sumi0 = 0 ; 388int sumi1 = 0 ; 389 390for (int j = 0 ;j < qk /2 ;++ j ) { 391const uint8_t xh_0 = ((qh & (1u << (j + 0 ))) >> (j + 0 )) <<4 ; 392const uint8_t xh_1 = ((qh & (1u << (j + 16 ))) >> (j + 12 )); 393 394const int32_t x0 = (int8_t )(((x [ib ].qs [j ]& 0x0F ) |xh_0 )- 16 ); 395const int32_t x1 = (int8_t )(((x [ib ].qs [j ] >>4 ) |xh_1 )- 16 ); 396 397sumi0 += (x0 * y [ib ].qs [j ]); 398sumi1 += (x1 * y [ib ].qs [j + qk /2 ]); 399 } 400 401int sumi = sumi0 + sumi1 ; 402sumf += (GGML_CPU_FP16_TO_FP32 (x [ib ].d )* GGML_CPU_FP16_TO_FP32 (y [ib ].d ))* sumi ; 403 } 404 405* s = sumf ; 406} 407 408void ggml_vec_dot_q5_1_q8_1_generic (int n ,float * GGML_RESTRICT s ,size_t bs ,const void * GGML_RESTRICT vx ,size_t bx ,const void * GGML_RESTRICT vy ,size_t by ,int nrc ) { 409const int qk = QK8_1 ; 410const int nb = n /qk ; 411 412int ib = 0 ; 413float sumf = 0 ; 414 415assert (n %qk == 0 ); 416assert (qk == QK5_1 ); 417assert (nrc == 1 ); 418UNUSED (nrc ); 419UNUSED (bx ); 420UNUSED (by ); 421UNUSED (bs ); 422 423const block_q5_1 * GGML_RESTRICT x = vx ; 424const block_q8_1 * GGML_RESTRICT y = vy ; 425 426for (;ib < nb ;++ ib ) { 427uint32_t qh ; 428memcpy (& qh ,x [ib ].qh ,sizeof (qh )); 429 430int sumi0 = 0 ; 431int sumi1 = 0 ; 432 433for (int j = 0 ;j < qk /2 ;++ j ) { 434const uint8_t xh_0 = ((qh >> (j + 0 )) <<4 )& 0x10 ; 435const uint8_t xh_1 = ((qh >> (j + 12 )) )& 0x10 ; 436 437const int32_t x0 = (x [ib ].qs [j ]& 0xF ) |xh_0 ; 438const int32_t x1 = (x [ib ].qs [j ] >>4 ) |xh_1 ; 439 440sumi0 += (x0 * y [ib ].qs [j ]); 441sumi1 += (x1 * y [ib ].qs [j + qk /2 ]); 442 } 443 444int sumi = sumi0 + sumi1 ; 445sumf += (GGML_CPU_FP16_TO_FP32 (x [ib ].d )* GGML_CPU_FP16_TO_FP32 (y [ib ].d ))* sumi + GGML_CPU_FP16_TO_FP32 (x [ib ].m )* GGML_CPU_FP16_TO_FP32 (y [ib ].s ); 446 } 447 448* s = sumf ; 449} 450 451void ggml_vec_dot_q8_0_q8_0_generic (int n ,float * GGML_RESTRICT s ,size_t bs ,const void * GGML_RESTRICT vx ,size_t bx ,const void * GGML_RESTRICT vy ,size_t by ,int nrc ) { 452const int qk = QK8_0 ; 453const int nb = n /qk ; 454 455assert (n %qk == 0 ); 456assert (nrc == 1 ); 457UNUSED (nrc ); 458UNUSED (bx ); 459UNUSED (by ); 460UNUSED (bs ); 461 462const block_q8_0 * GGML_RESTRICT x = vx ; 463const block_q8_0 * GGML_RESTRICT y = vy ; 464 465int ib = 0 ; 466float sumf = 0 ; 467 468for (;ib < nb ;++ ib ) { 469int sumi = 0 ; 470 471for (int j = 0 ;j < qk ;j ++ ) { 472sumi += x [ib ].qs [j ]* y [ib ].qs [j ]; 473 } 474 475sumf += sumi * (GGML_CPU_FP16_TO_FP32 (x [ib ].d )* GGML_CPU_FP16_TO_FP32 (y [ib ].d )); 476 } 477 478* s = sumf ; 479} 480 481void ggml_vec_dot_tq1_0_q8_K_generic (int n ,float * GGML_RESTRICT s ,size_t bs ,const void * GGML_RESTRICT vx ,size_t bx ,const void * GGML_RESTRICT vy ,size_t by ,int nrc ) { 482assert (nrc == 1 ); 483UNUSED (nrc ); 484UNUSED (bx ); 485UNUSED (by ); 486UNUSED (bs ); 487 488const block_tq1_0 * GGML_RESTRICT x = vx ; 489const block_q8_K * GGML_RESTRICT y = vy ; 490 491const int nb = n /QK_K ; 492 493const uint8_t pow3 [6 ]= {1 ,3 ,9 ,27 ,81 ,243 }; 494 495float sumf = 0.0f ; 496 497for (int i = 0 ;i < nb ;++ i ) { 498int sum = 0 ; 499 500for (size_t j = 0 ;j < sizeof (x -> qs )- sizeof (x -> qs ) %32 ;j += 32 ) { 501for (size_t l = 0 ;l < 5 ;++ l ) { 502for (size_t m = 0 ;m < 32 ;++ m ) { 503uint8_t q = x [i ].qs [j + m ]* pow3 [l ]; 504uint16_t xi = ((uint16_t )q * 3 ) >>8 ; 505sum += (xi - 1 )* y [i ].qs [j * 5 + l * 32 + m ]; 506 } 507 } 508 } 509for (size_t j = sizeof (x -> qs )- sizeof (x -> qs ) %32 ;j < sizeof (x -> qs );j += 16 ) { 510for (size_t l = 0 ;l < 5 ;++ l ) { 511for (size_t m = 0 ;m < 16 ;++ m ) { 512uint8_t q = x [i ].qs [j + m ]* pow3 [l ]; 513uint16_t xi = ((uint16_t )q * 3 ) >>8 ; 514sum += (xi - 1 )* y [i ].qs [j * 5 + l * 16 + m ]; 515 } 516 } 517 } 518 519for (size_t l = 0 ;l < 4 ;++ l ) { 520for (size_t j = 0 ;j < sizeof (x -> qh );++ j ) { 521uint8_t q = x [i ].qh [j ]* pow3 [l ]; 522uint16_t xi = ((uint16_t )q * 3 ) >>8 ; 523sum += (xi - 1 )* y [i ].qs [sizeof (x -> qs )* 5 + l * sizeof (x -> qh )+ j ]; 524 } 525 } 526 527sumf += (float )sum * (GGML_CPU_FP16_TO_FP32 (x [i ].d )* y [i ].d ); 528 } 529 530* s = sumf ; 531} 532 533void ggml_vec_dot_tq2_0_q8_K_generic (int n ,float * GGML_RESTRICT s ,size_t bs ,const void * GGML_RESTRICT vx ,size_t bx ,const void * GGML_RESTRICT vy ,size_t by ,int nrc ) { 534assert (nrc == 1 ); 535UNUSED (nrc ); 536UNUSED (bx ); 537UNUSED (by ); 538UNUSED (bs ); 539 540const block_tq2_0 * GGML_RESTRICT x = vx ; 541const block_q8_K * GGML_RESTRICT y = vy ; 542 543const int nb = n /QK_K ; 544float sumf = 0.0f ; 545 546for (int i = 0 ;i < nb ;++ i ) { 547int32_t sumi = 0 ; 548 549for (size_t j = 0 ;j < sizeof (x -> qs );j += 32 ) { 550for (size_t l = 0 ;l < 4 ;++ l ) { 551for (size_t k = 0 ;k < 32 ;++ k ) { 552sumi += y [i ].qs [j * 4 + l * 32 + k ]* (((x [i ].qs [j + k ] >> (l * 2 ))& 3 )- 1 ); 553 } 554 } 555 } 556 557const float d = y [i ].d * GGML_CPU_FP16_TO_FP32 (x [i ].d ); 558 559sumf += (float )sumi * d ; 560 } 561 562* s = sumf ; 563} 564 565void ggml_vec_dot_q2_K_q8_K_generic (int n ,float * GGML_RESTRICT s ,size_t bs ,const void * GGML_RESTRICT vx ,size_t bx ,const void * GGML_RESTRICT vy ,size_t by ,int nrc ) { 566assert (nrc == 1 ); 567UNUSED (nrc ); 568UNUSED (bx ); 569UNUSED (by ); 570UNUSED (bs ); 571 572const block_q2_K * GGML_RESTRICT x = vx ; 573const block_q8_K * GGML_RESTRICT y = vy ; 574 575const int nb = n /QK_K ; 576 577float sumf = 0 ; 578 579for (int i = 0 ;i < nb ;++ i ) { 580 581const uint8_t * q2 = x [i ].qs ; 582const int8_t * q8 = y [i ].qs ; 583const uint8_t * sc = x [i ].scales ; 584 585int summs = 0 ; 586for (int j = 0 ;j < 16 ;++ j ) { 587summs += y [i ].bsums [j ]* (sc [j ] >>4 ); 588 } 589 590const float dall = y [i ].d * GGML_CPU_FP16_TO_FP32 (x [i ].d ); 591const float dmin = y [i ].d * GGML_CPU_FP16_TO_FP32 (x [i ].dmin ); 592 593int isum = 0 ; 594int is = 0 ; 595int d ; 596for (int k = 0 ;k < QK_K /128 ;++ k ) { 597int shift = 0 ; 598for (int j = 0 ;j < 4 ;++ j ) { 599d = sc [is ++ ]& 0xF ; 600int isuml = 0 ; 601for (int l = 0 ;l < 16 ;++ l )isuml += q8 [l ]* ((q2 [l ] >>shift )& 3 ); 602isum += d * isuml ; 603d = sc [is ++ ]& 0xF ; 604isuml = 0 ; 605for (int l = 16 ;l < 32 ;++ l )isuml += q8 [l ]* ((q2 [l ] >>shift )& 3 ); 606isum += d * isuml ; 607shift += 2 ; 608q8 += 32 ; 609 } 610q2 += 32 ; 611 } 612sumf += dall * isum - dmin * summs ; 613 } 614* s = sumf ; 615} 616 617void ggml_vec_dot_q3_K_q8_K_generic (int n ,float * GGML_RESTRICT s ,size_t bs ,const void * GGML_RESTRICT vx ,size_t bx ,const void * GGML_RESTRICT vy ,size_t by ,int nrc ) { 618assert (n %QK_K == 0 ); 619assert (nrc == 1 ); 620UNUSED (nrc ); 621UNUSED (bx ); 622UNUSED (by ); 623UNUSED (bs ); 624 625const uint32_t kmask1 = 0x03030303 ; 626const uint32_t kmask2 = 0x0f0f0f0f ; 627 628const block_q3_K * GGML_RESTRICT x = vx ; 629const block_q8_K * GGML_RESTRICT y = vy ; 630 631const int nb = n /QK_K ; 632 633// scalar version 634// This function is written like this so the compiler can manage to vectorize most of it 635// Using -Ofast, GCC and clang manage to produce code that is within a factor of 2 or so from the 636// manually vectorized version above. Every other version I tried would run at least 4 times slower. 637// The ideal situation would be if we could just write the code once, and the compiler would 638// automatically produce the best possible set of machine instructions, instead of us having to manually 639// write vectorized versions for AVX, ARM_NEON, etc. 640 641int8_t aux8 [QK_K ]; 642int16_t aux16 [8 ]; 643float sums [8 ]; 644int32_t aux32 [8 ]; 645memset (sums ,0 ,8 * sizeof (float )); 646 647uint32_t auxs [4 ]; 648const int8_t * scales = (const int8_t * )auxs ; 649 650float sumf = 0 ; 651for (int i = 0 ;i < nb ;++ i ) { 652const uint8_t * GGML_RESTRICT q3 = x [i ].qs ; 653const uint8_t * GGML_RESTRICT hm = x [i ].hmask ; 654const int8_t * GGML_RESTRICT q8 = y [i ].qs ; 655memset (aux32 ,0 ,8 * sizeof (int32_t )); 656int8_t * GGML_RESTRICT a = aux8 ; 657uint8_t m = 1 ; 658for (int j = 0 ;j < QK_K ;j += 128 ) { 659for (int l = 0 ;l < 32 ;++ l )a [l ]= q3 [l ]& 3 ; 660for (int l = 0 ;l < 32 ;++ l )a [l ]-= (hm [l ]& m ?0 :4 ); 661a += 32 ;m <<=1 ; 662for (int l = 0 ;l < 32 ;++ l )a [l ]= (q3 [l ] >>2 )& 3 ; 663for (int l = 0 ;l < 32 ;++ l )a [l ]-= (hm [l ]& m ?0 :4 ); 664a += 32 ;m <<=1 ; 665for (int l = 0 ;l < 32 ;++ l )a [l ]= (q3 [l ] >>4 )& 3 ; 666for (int l = 0 ;l < 32 ;++ l )a [l ]-= (hm [l ]& m ?0 :4 ); 667a += 32 ;m <<=1 ; 668for (int l = 0 ;l < 32 ;++ l )a [l ]= (q3 [l ] >>6 )& 3 ; 669for (int l = 0 ;l < 32 ;++ l )a [l ]-= (hm [l ]& m ?0 :4 ); 670a += 32 ;m <<=1 ; 671q3 += 32 ; 672 } 673a = aux8 ; 674 675memcpy (auxs ,x [i ].scales ,12 ); 676uint32_t tmp = auxs [2 ]; 677auxs [2 ]= ((auxs [0 ] >>4 )& kmask2 ) | (((tmp >>4 )& kmask1 ) <<4 ); 678auxs [3 ]= ((auxs [1 ] >>4 )& kmask2 ) | (((tmp >>6 )& kmask1 ) <<4 ); 679auxs [0 ]= (auxs [0 ]& kmask2 ) | (((tmp >>0 )& kmask1 ) <<4 ); 680auxs [1 ]= (auxs [1 ]& kmask2 ) | (((tmp >>2 )& kmask1 ) <<4 ); 681for (int j = 0 ;j < QK_K /16 ;++ j ) { 682for (int l = 0 ;l < 8 ;++ l )aux16 [l ]= q8 [l ]* a [l ]; 683for (int l = 0 ;l < 8 ;++ l )aux32 [l ]+= (scales [j ]- 32 )* aux16 [l ]; 684q8 += 8 ;a += 8 ; 685for (int l = 0 ;l < 8 ;++ l )aux16 [l ]= q8 [l ]* a [l ]; 686for (int l = 0 ;l < 8 ;++ l )aux32 [l ]+= (scales [j ]- 32 )* aux16 [l ]; 687q8 += 8 ;a += 8 ; 688 } 689const float d = GGML_CPU_FP16_TO_FP32 (x [i ].d )* y [i ].d ; 690for (int l = 0 ;l < 8 ;++ l )sums [l ]+= d * aux32 [l ]; 691 } 692for (int l = 0 ;l < 8 ;++ l )sumf += sums [l ]; 693* s = sumf ; 694} 695 696void ggml_vec_dot_q4_K_q8_K_generic (int n ,float * GGML_RESTRICT s ,size_t bs ,const void * GGML_RESTRICT vx ,size_t bx ,const void * GGML_RESTRICT vy ,size_t by ,int nrc ) { 697assert (n %QK_K == 0 ); 698assert (nrc == 1 ); 699UNUSED (nrc ); 700UNUSED (bx ); 701UNUSED (by ); 702UNUSED (bs ); 703 704const block_q4_K * GGML_RESTRICT x = vx ; 705const block_q8_K * GGML_RESTRICT y = vy ; 706 707const int nb = n /QK_K ; 708 709static const uint32_t kmask1 = 0x3f3f3f3f ; 710static const uint32_t kmask2 = 0x0f0f0f0f ; 711static const uint32_t kmask3 = 0x03030303 ; 712 713uint32_t utmp [4 ]; 714 715const uint8_t * scales = (const uint8_t * )& utmp [0 ]; 716const uint8_t * mins = (const uint8_t * )& utmp [2 ]; 717 718int8_t aux8 [QK_K ]; 719int16_t aux16 [8 ]; 720float sums [8 ]; 721int32_t aux32 [8 ]; 722memset (sums ,0 ,8 * sizeof (float )); 723 724float sumf = 0 ; 725for (int i = 0 ;i < nb ;++ i ) { 726const uint8_t * GGML_RESTRICT q4 = x [i ].qs ; 727const int8_t * GGML_RESTRICT q8 = y [i ].qs ; 728memset (aux32 ,0 ,8 * sizeof (int32_t )); 729int8_t * GGML_RESTRICT a = aux8 ; 730for (int j = 0 ;j < QK_K /64 ;++ j ) { 731for (int l = 0 ;l < 32 ;++ l )a [l ]= (int8_t )(q4 [l ]& 0xF ); 732a += 32 ; 733for (int l = 0 ;l < 32 ;++ l )a [l ]= (int8_t )(q4 [l ] >>4 ); 734a += 32 ;q4 += 32 ; 735 } 736memcpy (utmp ,x [i ].scales ,12 ); 737utmp [3 ]= ((utmp [2 ] >>4 )& kmask2 ) | (((utmp [1 ] >>6 )& kmask3 ) <<4 ); 738const uint32_t uaux = utmp [1 ]& kmask1 ; 739utmp [1 ]= (utmp [2 ]& kmask2 ) | (((utmp [0 ] >>6 )& kmask3 ) <<4 ); 740utmp [2 ]= uaux ; 741utmp [0 ] &=kmask1 ; 742 743int sumi = 0 ; 744for (int j = 0 ;j < QK_K /16 ;++ j )sumi += y [i ].bsums [j ]* mins [j /2 ]; 745a = aux8 ; 746int is = 0 ; 747for (int j = 0 ;j < QK_K /32 ;++ j ) { 748int32_t scale = scales [is ++ ]; 749for (int l = 0 ;l < 8 ;++ l )aux16 [l ]= q8 [l ]* a [l ]; 750for (int l = 0 ;l < 8 ;++ l )aux32 [l ]+= scale * aux16 [l ]; 751q8 += 8 ;a += 8 ; 752for (int l = 0 ;l < 8 ;++ l )aux16 [l ]= q8 [l ]* a [l ]; 753for (int l = 0 ;l < 8 ;++ l )aux32 [l ]+= scale * aux16 [l ]; 754q8 += 8 ;a += 8 ; 755for (int l = 0 ;l < 8 ;++ l )aux16 [l ]= q8 [l ]* a [l ]; 756for (int l = 0 ;l < 8 ;++ l )aux32 [l ]+= scale * aux16 [l ]; 757q8 += 8 ;a += 8 ; 758for (int l = 0 ;l < 8 ;++ l )aux16 [l ]= q8 [l ]* a [l ]; 759for (int l = 0 ;l < 8 ;++ l )aux32 [l ]+= scale * aux16 [l ]; 760q8 += 8 ;a += 8 ; 761 } 762const float d = GGML_CPU_FP16_TO_FP32 (x [i ].d )* y [i ].d ; 763for (int l = 0 ;l < 8 ;++ l )sums [l ]+= d * aux32 [l ]; 764const float dmin = GGML_CPU_FP16_TO_FP32 (x [i ].dmin )* y [i ].d ; 765sumf -= dmin * sumi ; 766 } 767for (int l = 0 ;l < 8 ;++ l )sumf += sums [l ]; 768* s = sumf ; 769} 770 771void ggml_vec_dot_q5_K_q8_K_generic (int n ,float * GGML_RESTRICT s ,size_t bs ,const void * GGML_RESTRICT vx ,size_t bx ,const void * GGML_RESTRICT vy ,size_t by ,int nrc ) { 772assert (n %QK_K == 0 ); 773assert (nrc == 1 ); 774UNUSED (nrc ); 775UNUSED (bx ); 776UNUSED (by ); 777UNUSED (bs ); 778 779const block_q5_K * GGML_RESTRICT x = vx ; 780const block_q8_K * GGML_RESTRICT y = vy ; 781 782const int nb = n /QK_K ; 783 784static const uint32_t kmask1 = 0x3f3f3f3f ; 785static const uint32_t kmask2 = 0x0f0f0f0f ; 786static const uint32_t kmask3 = 0x03030303 ; 787 788uint32_t utmp [4 ]; 789 790const uint8_t * scales = (const uint8_t * )& utmp [0 ]; 791const uint8_t * mins = (const uint8_t * )& utmp [2 ]; 792 793int8_t aux8 [QK_K ]; 794int16_t aux16 [8 ]; 795float sums [8 ]; 796int32_t aux32 [8 ]; 797memset (sums ,0 ,8 * sizeof (float )); 798 799float sumf = 0 ; 800for (int i = 0 ;i < nb ;++ i ) { 801const uint8_t * GGML_RESTRICT q4 = x [i ].qs ; 802const uint8_t * GGML_RESTRICT hm = x [i ].qh ; 803const int8_t * GGML_RESTRICT q8 = y [i ].qs ; 804memset (aux32 ,0 ,8 * sizeof (int32_t )); 805int8_t * GGML_RESTRICT a = aux8 ; 806uint8_t m = 1 ; 807for (int j = 0 ;j < QK_K /64 ;++ j ) { 808for (int l = 0 ;l < 32 ;++ l )a [l ]= (int8_t )(q4 [l ]& 0xF ); 809for (int l = 0 ;l < 32 ;++ l )a [l ]+= (hm [l ]& m ?16 :0 ); 810a += 32 ;m <<=1 ; 811for (int l = 0 ;l < 32 ;++ l )a [l ]= (int8_t )(q4 [l ] >>4 ); 812for (int l = 0 ;l < 32 ;++ l )a [l ]+= (hm [l ]& m ?16 :0 ); 813a += 32 ;m <<=1 ; 814q4 += 32 ; 815 } 816memcpy (utmp ,x [i ].scales ,12 ); 817utmp [3 ]= ((utmp [2 ] >>4 )& kmask2 ) | (((utmp [1 ] >>6 )& kmask3 ) <<4 ); 818const uint32_t uaux = utmp [1 ]& kmask1 ; 819utmp [1 ]= (utmp [2 ]& kmask2 ) | (((utmp [0 ] >>6 )& kmask3 ) <<4 ); 820utmp [2 ]= uaux ; 821utmp [0 ] &=kmask1 ; 822 823int sumi = 0 ; 824for (int j = 0 ;j < QK_K /16 ;++ j )sumi += y [i ].bsums [j ]* mins [j /2 ]; 825a = aux8 ; 826int is = 0 ; 827for (int j = 0 ;j < QK_K /32 ;++ j ) { 828int32_t scale = scales [is ++ ]; 829for (int l = 0 ;l < 8 ;++ l )aux16 [l ]= q8 [l ]* a [l ]; 830for (int l = 0 ;l < 8 ;++ l )aux32 [l ]+= scale * aux16 [l ]; 831q8 += 8 ;a += 8 ; 832for (int l = 0 ;l < 8 ;++ l )aux16 [l ]= q8 [l ]* a [l ]; 833for (int l = 0 ;l < 8 ;++ l )aux32 [l ]+= scale * aux16 [l ]; 834q8 += 8 ;a += 8 ; 835for (int l = 0 ;l < 8 ;++ l )aux16 [l ]= q8 [l ]* a [l ]; 836for (int l = 0 ;l < 8 ;++ l )aux32 [l ]+= scale * aux16 [l ]; 837q8 += 8 ;a += 8 ; 838for (int l = 0 ;l < 8 ;++ l )aux16 [l ]= q8 [l ]* a [l ]; 839for (int l = 0 ;l < 8 ;++ l )aux32 [l ]+= scale * aux16 [l ]; 840q8 += 8 ;a += 8 ; 841 } 842const float d = GGML_CPU_FP16_TO_FP32 (x [i ].d )* y [i ].d ; 843for (int l = 0 ;l < 8 ;++ l )sums [l ]+= d * aux32 [l ]; 844const float dmin = GGML_CPU_FP16_TO_FP32 (x [i ].dmin )* y [i ].d ; 845sumf -= dmin * sumi ; 846 } 847for (int l = 0 ;l < 8 ;++ l )sumf += sums [l ]; 848* s = sumf ; 849} 850 851void ggml_vec_dot_q6_K_q8_K_generic (int n ,float * GGML_RESTRICT s ,size_t bs ,const void * GGML_RESTRICT vx ,size_t bx ,const void * GGML_RESTRICT vy ,size_t by ,int nrc ) { 852assert (n %QK_K == 0 ); 853assert (nrc == 1 ); 854UNUSED (nrc ); 855UNUSED (bx ); 856UNUSED (by ); 857UNUSED (bs ); 858 859const block_q6_K * GGML_RESTRICT x = vx ; 860const block_q8_K * GGML_RESTRICT y = vy ; 861 862const int nb = n /QK_K ; 863 864int8_t aux8 [QK_K ]; 865int16_t aux16 [8 ]; 866float sums [8 ]; 867int32_t aux32 [8 ]; 868memset (sums ,0 ,8 * sizeof (float )); 869 870float sumf = 0 ; 871for (int i = 0 ;i < nb ;++ i ) { 872const uint8_t * GGML_RESTRICT q4 = x [i ].ql ; 873const uint8_t * GGML_RESTRICT qh = x [i ].qh ; 874const int8_t * GGML_RESTRICT q8 = y [i ].qs ; 875memset (aux32 ,0 ,8 * sizeof (int32_t )); 876int8_t * GGML_RESTRICT a = aux8 ; 877for (int j = 0 ;j < QK_K ;j += 128 ) { 878for (int l = 0 ;l < 32 ;++ l ) { 879a [l + 0 ]= (int8_t )((q4 [l + 0 ]& 0xF ) | (((qh [l ] >>0 )& 3 ) <<4 ))- 32 ; 880a [l + 32 ]= (int8_t )((q4 [l + 32 ]& 0xF ) | (((qh [l ] >>2 )& 3 ) <<4 ))- 32 ; 881a [l + 64 ]= (int8_t )((q4 [l + 0 ] >>4 ) | (((qh [l ] >>4 )& 3 ) <<4 ))- 32 ; 882a [l + 96 ]= (int8_t )((q4 [l + 32 ] >>4 ) | (((qh [l ] >>6 )& 3 ) <<4 ))- 32 ; 883 } 884a += 128 ; 885q4 += 64 ; 886qh += 32 ; 887 } 888a = aux8 ; 889int is = 0 ; 890for (int j = 0 ;j < QK_K /16 ;++ j ) { 891int scale = x [i ].scales [is ++ ]; 892for (int l = 0 ;l < 8 ;++ l )aux16 [l ]= q8 [l ]* a [l ]; 893for (int l = 0 ;l < 8 ;++ l )aux32 [l ]+= scale * aux16 [l ]; 894q8 += 8 ;a += 8 ; 895for (int l = 0 ;l < 8 ;++ l )aux16 [l ]= q8 [l ]* a [l ]; 896for (int l = 0 ;l < 8 ;++ l )aux32 [l ]+= scale * aux16 [l ]; 897q8 += 8 ;a += 8 ; 898 } 899const float d = GGML_CPU_FP16_TO_FP32 (x [i ].d )* y [i ].d ; 900for (int l = 0 ;l < 8 ;++ l )sums [l ]+= d * aux32 [l ]; 901 } 902for (int l = 0 ;l < 8 ;++ l )sumf += sums [l ]; 903* s = sumf ; 904} 905 906void ggml_vec_dot_iq2_xxs_q8_K_generic (int n ,float * GGML_RESTRICT s ,size_t bs ,const void * GGML_RESTRICT vx ,size_t bx ,const void * GGML_RESTRICT vy ,size_t by ,int nrc ) { 907assert (n %QK_K == 0 ); 908assert (nrc == 1 ); 909UNUSED (nrc ); 910UNUSED (bx ); 911UNUSED (by ); 912UNUSED (bs ); 913 914const block_iq2_xxs * GGML_RESTRICT x = vx ; 915const block_q8_K * GGML_RESTRICT y = vy ; 916 917const int nb = n /QK_K ; 918 919uint32_t aux32 [2 ]; 920const uint8_t * aux8 = (const uint8_t * )aux32 ; 921 922float sumf = 0.f ; 923for (int i = 0 ;i < nb ;++ i ) { 924const float d = GGML_CPU_FP16_TO_FP32 (x [i ].d )* y [i ].d ; 925const uint16_t * GGML_RESTRICT q2 = x [i ].qs ; 926const int8_t * GGML_RESTRICT q8 = y [i ].qs ; 927int32_t bsum = 0 ; 928for (int ib32 = 0 ;ib32 < QK_K /32 ;++ ib32 ) { 929memcpy (aux32 ,q2 ,2 * sizeof (uint32_t )); 930q2 += 4 ; 931const uint32_t ls = 2 * (aux32 [1 ] >>28 )+ 1 ; 932int32_t sumi = 0 ; 933for (int l = 0 ;l < 4 ;++ l ) { 934const uint8_t * grid = (const uint8_t * )(iq2xxs_grid + aux8 [l ]); 935const uint8_t signs = ksigns_iq2xs [(aux32 [1 ] >>7 * l )& 127 ]; 936for (int j = 0 ;j < 8 ;++ j ) { 937sumi += grid [j ]* q8 [j ]* (signs & kmask_iq2xs [j ] ?-1 :1 ); 938 } 939q8 += 8 ; 940 } 941bsum += sumi * ls ; 942 } 943sumf += d * bsum ; 944 } 945* s = 0.125f * sumf ; 946} 947 948void ggml_vec_dot_iq2_xs_q8_K_generic (int n ,float * GGML_RESTRICT s ,size_t bs ,const void * GGML_RESTRICT vx ,size_t bx ,const void * GGML_RESTRICT vy ,size_t by ,int nrc ) { 949assert (n %QK_K == 0 ); 950assert (nrc == 1 ); 951UNUSED (nrc ); 952UNUSED (bx ); 953UNUSED (by ); 954UNUSED (bs ); 955 956const block_iq2_xs * GGML_RESTRICT x = vx ; 957const block_q8_K * GGML_RESTRICT y = vy ; 958 959const int nb = n /QK_K ; 960 961float sumf = 0.f ; 962for (int i = 0 ;i < nb ;++ i ) { 963const float d = GGML_CPU_FP16_TO_FP32 (x [i ].d )* y [i ].d ; 964const uint16_t * GGML_RESTRICT q2 = x [i ].qs ; 965const uint8_t * GGML_RESTRICT sc = x [i ].scales ; 966const int8_t * GGML_RESTRICT q8 = y [i ].qs ; 967int32_t bsum = 0 ; 968for (int ib32 = 0 ;ib32 < QK_K /32 ;++ ib32 ) { 969const uint16_t ls1 = 2 * (sc [ib32 ]& 0xf )+ 1 ; 970const uint16_t ls2 = 2 * (sc [ib32 ] >>4 )+ 1 ; 971int32_t sumi = 0 ; 972for (int l = 0 ;l < 2 ;++ l ) { 973const uint8_t * grid = (const uint8_t * )(iq2xs_grid + (q2 [l ]& 511 )); 974const uint8_t signs = ksigns_iq2xs [q2 [l ] >>9 ]; 975for (int j = 0 ;j < 8 ;++ j ) { 976sumi += grid [j ]* q8 [j ]* (signs & kmask_iq2xs [j ] ?-1 :1 ); 977 } 978q8 += 8 ; 979 } 980bsum += sumi * ls1 ; 981sumi = 0 ; 982for (int l = 2 ;l < 4 ;++ l ) { 983const uint8_t * grid = (const uint8_t * )(iq2xs_grid + (q2 [l ]& 511 )); 984const uint8_t signs = ksigns_iq2xs [q2 [l ] >>9 ]; 985for (int j = 0 ;j < 8 ;++ j ) { 986sumi += grid [j ]* q8 [j ]* (signs & kmask_iq2xs [j ] ?-1 :1 ); 987 } 988q8 += 8 ; 989 } 990bsum += sumi * ls2 ; 991q2 += 4 ; 992 } 993sumf += d * bsum ; 994 } 995* s = 0.125f * sumf ; 996} 997 998void ggml_vec_dot_iq2_s_q8_K_generic (int n ,float * GGML_RESTRICT s ,size_t bs ,const void * GGML_RESTRICT vx ,size_t bx ,const void * GGML_RESTRICT vy ,size_t by ,int nrc ) { 999assert (n %QK_K == 0 ); 1000assert (nrc == 1 ); 1001UNUSED (nrc ); 1002UNUSED (bx ); 1003UNUSED (by ); 1004UNUSED (bs ); 1005 1006const block_iq2_s * GGML_RESTRICT x = vx ; 1007const block_q8_K * GGML_RESTRICT y = vy ; 1008 1009const int nb = n /QK_K ; 1010 1011float sumf = 0 ; 1012for (int i = 0 ;i < nb ;i ++ ) { 1013 1014const float d = GGML_CPU_FP16_TO_FP32 (x [i ].d )* y [i ].d ; 1015const int8_t * q8 = y [i ].qs ; 1016const uint8_t * qs = x [i ].qs ; 1017const uint8_t * qh = x [i ].qh ; 1018const uint8_t * signs = qs + QK_K /8 ; 1019 1020int bsum = 0 ; 1021for (int ib32 = 0 ;ib32 < QK_K /32 ;++ ib32 ) { 1022int ls1 = 1 + 2 * (x [i ].scales [ib32 ]& 0xf ); 1023int ls2 = 1 + 2 * (x [i ].scales [ib32 ] >>4 ); 1024int sumi1 = 0 ,sumi2 = 0 ; 1025for (int l = 0 ;l < 2 ;++ l ) { 1026const uint8_t * grid = (const uint8_t * )(iq2s_grid + (qs [l ] | (qh [ib32 ] << (8 - 2 * l )& 0x300 ))); 1027for (int j = 0 ;j < 8 ;++ j ) { 1028sumi1 += q8 [j ]* grid [j ]* (signs [l ]& kmask_iq2xs [j ] ?-1 :1 ); 1029 } 1030q8 += 8 ; 1031 } 1032for (int l = 2 ;l < 4 ;++ l ) { 1033const uint8_t * grid = (const uint8_t * )(iq2s_grid + (qs [l ] | (qh [ib32 ] << (8 - 2 * l )& 0x300 ))); 1034for (int j = 0 ;j < 8 ;++ j ) { 1035sumi2 += q8 [j ]* grid [j ]* (signs [l ]& kmask_iq2xs [j ] ?-1 :1 ); 1036 } 1037q8 += 8 ; 1038 } 1039bsum += ls1 * sumi1 + ls2 * sumi2 ; 1040qs += 4 ; 1041signs += 4 ; 1042 } 1043 1044sumf += d * bsum ; 1045 } 1046 1047* s = 0.125f * sumf ; 1048} 1049 1050void ggml_vec_dot_iq3_xxs_q8_K_generic (int n ,float * GGML_RESTRICT s ,size_t bs ,const void * GGML_RESTRICT vx ,size_t bx ,const void * GGML_RESTRICT vy ,size_t by ,int nrc ) { 1051assert (n %QK_K == 0 ); 1052assert (nrc == 1 ); 1053UNUSED (nrc ); 1054UNUSED (bx ); 1055UNUSED (by ); 1056UNUSED (bs ); 1057 1058const block_iq3_xxs * GGML_RESTRICT x = vx ; 1059const block_q8_K * GGML_RESTRICT y = vy ; 1060 1061const int nb = n /QK_K ; 1062 1063uint32_t aux32 ; 1064 1065float sumf = 0.f ; 1066for (int i = 0 ;i < nb ;++ i ) { 1067const float d = GGML_CPU_FP16_TO_FP32 (x [i ].d )* y [i ].d ; 1068const uint8_t * GGML_RESTRICT q3 = x [i ].qs ; 1069const uint8_t * GGML_RESTRICT gas = x [i ].qs + QK_K /4 ; 1070const int8_t * GGML_RESTRICT q8 = y [i ].qs ; 1071int32_t bsum = 0 ; 1072for (int ib32 = 0 ;ib32 < QK_K /32 ;++ ib32 ) { 1073memcpy (& aux32 ,gas ,sizeof (uint32_t ));gas += sizeof (uint32_t ); 1074const uint32_t ls = 2 * (aux32 >>28 )+ 1 ; 1075int32_t sumi = 0 ; 1076for (int l = 0 ;l < 4 ;++ l ) { 1077const uint8_t * grid1 = (const uint8_t * )(iq3xxs_grid + q3 [2 * l + 0 ]); 1078const uint8_t * grid2 = (const uint8_t * )(iq3xxs_grid + q3 [2 * l + 1 ]); 1079const uint8_t signs = ksigns_iq2xs [(aux32 >>7 * l )& 127 ]; 1080for (int j = 0 ;j < 4 ;++ j ) { 1081sumi += grid1 [j ]* q8 [j + 0 ]* (signs & kmask_iq2xs [j + 0 ] ?-1 :1 ); 1082sumi += grid2 [j ]* q8 [j + 4 ]* (signs & kmask_iq2xs [j + 4 ] ?-1 :1 ); 1083 } 1084q8 += 8 ; 1085 } 1086q3 += 8 ; 1087bsum += sumi * ls ; 1088 } 1089sumf += d * bsum ; 1090 } 1091* s = 0.25f * sumf ; 1092} 1093 1094void ggml_vec_dot_iq3_s_q8_K_generic (int n ,float * GGML_RESTRICT s ,size_t bs ,const void * GGML_RESTRICT vx ,size_t bx ,const void * GGML_RESTRICT vy ,size_t by ,int nrc ) { 1095assert (n %QK_K == 0 ); 1096assert (nrc == 1 ); 1097UNUSED (nrc ); 1098UNUSED (bx ); 1099UNUSED (by ); 1100UNUSED (bs ); 1101 1102const block_iq3_s * GGML_RESTRICT x = vx ; 1103const block_q8_K * GGML_RESTRICT y = vy ; 1104 1105const int nb = n /QK_K ; 1106 1107float sumf = 0.f ; 1108for (int i = 0 ;i < nb ;++ i ) { 1109const float d = GGML_CPU_FP16_TO_FP32 (x [i ].d )* y [i ].d ; 1110const uint8_t * GGML_RESTRICT qs = x [i ].qs ; 1111const uint8_t * GGML_RESTRICT qh = x [i ].qh ; 1112const uint8_t * GGML_RESTRICT signs = x [i ].signs ; 1113const int8_t * GGML_RESTRICT q8 = y [i ].qs ; 1114int32_t bsum = 0 ; 1115for (int ib32 = 0 ;ib32 < QK_K /32 ;ib32 += 2 ) { 1116const uint32_t ls1 = 2 * (x [i ].scales [ib32 /2 ]& 0xf )+ 1 ; 1117const uint32_t ls2 = 2 * (x [i ].scales [ib32 /2 ] >>4 )+ 1 ; 1118int32_t sumi = 0 ; 1119for (int l = 0 ;l < 4 ;++ l ) { 1120const uint8_t * grid1 = (const uint8_t * )(iq3s_grid + (qs [2 * l + 0 ] | ((qh [ib32 + 0 ] << (8 - 2 * l ))& 256 ))); 1121const uint8_t * grid2 = (const uint8_t * )(iq3s_grid + (qs [2 * l + 1 ] | ((qh [ib32 + 0 ] << (7 - 2 * l ))& 256 ))); 1122for (int j = 0 ;j < 4 ;++ j ) { 1123sumi += grid1 [j ]* q8 [j + 0 ]* (signs [l ]& kmask_iq2xs [j + 0 ] ?-1 :1 ); 1124sumi += grid2 [j ]* q8 [j + 4 ]* (signs [l ]& kmask_iq2xs [j + 4 ] ?-1 :1 ); 1125 } 1126q8 += 8 ; 1127 } 1128qs += 8 ; 1129signs += 4 ; 1130bsum += sumi * ls1 ; 1131sumi = 0 ; 1132for (int l = 0 ;l < 4 ;++ l ) { 1133const uint8_t * grid1 = (const uint8_t * )(iq3s_grid + (qs [2 * l + 0 ] | ((qh [ib32 + 1 ] << (8 - 2 * l ))& 256 ))); 1134const uint8_t * grid2 = (const uint8_t * )(iq3s_grid + (qs [2 * l + 1 ] | ((qh [ib32 + 1 ] << (7 - 2 * l ))& 256 ))); 1135for (int j = 0 ;j < 4 ;++ j ) { 1136sumi += grid1 [j ]* q8 [j + 0 ]* (signs [l ]& kmask_iq2xs [j + 0 ] ?-1 :1 ); 1137sumi += grid2 [j ]* q8 [j + 4 ]* (signs [l ]& kmask_iq2xs [j + 4 ] ?-1 :1 ); 1138 } 1139q8 += 8 ; 1140 } 1141qs += 8 ; 1142signs += 4 ; 1143bsum += sumi * ls2 ; 1144 } 1145sumf += d * bsum ; 1146 } 1147* s = sumf ; 1148} 1149 1150void ggml_vec_dot_iq1_s_q8_K_generic (int n ,float * GGML_RESTRICT s ,size_t bs ,const void * GGML_RESTRICT vx ,size_t bx ,const void * GGML_RESTRICT vy ,size_t by ,int nrc ) { 1151assert (n %QK_K == 0 ); 1152assert (nrc == 1 ); 1153UNUSED (nrc ); 1154UNUSED (bx ); 1155UNUSED (by ); 1156UNUSED (bs ); 1157 1158const block_iq1_s * GGML_RESTRICT x = vx ; 1159const block_q8_K * GGML_RESTRICT y = vy ; 1160 1161const int nb = n /QK_K ; 1162 1163float sumf = 0 ; 1164for (int i = 0 ;i < nb ;i ++ ) { 1165 1166const int8_t * q8 = y [i ].qs ; 1167const uint8_t * qs = x [i ].qs ; 1168const uint16_t * qh = x [i ].qh ; 1169 1170int sumi = 0 ,sumi1 = 0 ; 1171for (int ib = 0 ;ib < QK_K /32 ;++ ib ) { 1172const int ls = 2 * ((qh [ib ] >>12 )& 7 )+ 1 ; 1173const int delta = qh [ib ]& 0x8000 ?-1 :1 ; 1174int lsum = 0 ; 1175for (int l = 0 ;l < 4 ;++ l ) { 1176const int8_t * grid = (const int8_t * )(iq1s_grid + (qs [l ] | (((qh [ib ] >>3 * l )& 7 ) <<8 ))); 1177for (int j = 0 ;j < 8 ;++ j ) { 1178lsum += q8 [j ]* grid [j ]; 1179 } 1180q8 += 8 ; 1181 } 1182sumi += ls * lsum ; 1183sumi1 += ls * delta * (y [i ].bsums [2 * ib + 0 ]+ y [i ].bsums [2 * ib + 1 ]); 1184qs += 4 ; 1185 } 1186 1187sumf += GGML_CPU_FP16_TO_FP32 (x [i ].d )* y [i ].d * (sumi + IQ1S_DELTA * sumi1 ); 1188 } 1189 1190* s = sumf ; 1191} 1192 1193void ggml_vec_dot_iq1_m_q8_K_generic (int n ,float * GGML_RESTRICT s ,size_t bs ,const void * GGML_RESTRICT vx ,size_t bx ,const void * GGML_RESTRICT vy ,size_t by ,int nrc ) { 1194assert (n %QK_K == 0 ); 1195assert (nrc == 1 ); 1196UNUSED (nrc ); 1197UNUSED (bx ); 1198UNUSED (by ); 1199UNUSED (bs ); 1200 1201const block_iq1_m * GGML_RESTRICT x = vx ; 1202const block_q8_K * GGML_RESTRICT y = vy ; 1203 1204const int nb = n /QK_K ; 1205 1206iq1m_scale_t scale ; 1207 1208int sum1 [2 ],sum2 [2 ],delta [4 ]; 1209 1210float sumf = 0 ; 1211for (int i = 0 ;i < nb ;i ++ ) { 1212 1213const int8_t * q8 = y [i ].qs ; 1214const uint8_t * qs = x [i ].qs ; 1215const uint8_t * qh = x [i ].qh ; 1216const uint16_t * sc = (const uint16_t * )x [i ].scales ; 1217 1218scale .u16 = (sc [0 ] >>12 ) | ((sc [1 ] >>8 )& 0x00f0 ) | ((sc [2 ] >>4 )& 0x0f00 ) | (sc [3 ]& 0xf000 ); 1219 1220int sumi1 = 0 ,sumi2 = 0 ; 1221for (int ib = 0 ;ib < QK_K /32 ;++ ib ) { 1222delta [0 ]= qh [0 ]& 0x08 ?-1 :1 ; 1223delta [1 ]= qh [0 ]& 0x80 ?-1 :1 ; 1224delta [2 ]= qh [1 ]& 0x08 ?-1 :1 ; 1225delta [3 ]= qh [1 ]& 0x80 ?-1 :1 ; 1226sum1 [0 ]= sum1 [1 ]= sum2 [0 ]= sum2 [1 ]= 0 ; 1227for (int l = 0 ;l < 4 ;++ l ) { 1228const int8_t * grid = (const int8_t * )(iq1s_grid + (qs [l ] | (((uint16_t )qh [l /2 ] << (8 - 4 * (l %2 )))& 0x700 ))); 1229int lsum1 = 0 ,lsum2 = 0 ; 1230for (int j = 0 ;j < 8 ;++ j ) { 1231lsum1 += q8 [j ]* grid [j ]; 1232lsum2 += q8 [j ]; 1233 } 1234q8 += 8 ; 1235sum1 [l /2 ]+= lsum1 ; 1236sum2 [l /2 ]+= lsum2 * delta [l ]; 1237 } 1238 1239const int ls1 = 2 * ((sc [ib /2 ] >> (6 * (ib %2 )+ 0 ))& 0x7 )+ 1 ; 1240const int ls2 = 2 * ((sc [ib /2 ] >> (6 * (ib %2 )+ 3 ))& 0x7 )+ 1 ; 1241 1242sumi1 += sum1 [0 ]* ls1 + sum1 [1 ]* ls2 ; 1243sumi2 += sum2 [0 ]* ls1 + sum2 [1 ]* ls2 ; 1244qs += 4 ; 1245qh += 2 ; 1246 } 1247 1248sumf += GGML_CPU_FP16_TO_FP32 (scale .f16 )* y [i ].d * (sumi1 + IQ1M_DELTA * sumi2 ); 1249 } 1250 1251* s = sumf ; 1252} 1253 1254void ggml_vec_dot_iq4_nl_q8_0_generic (int n ,float * GGML_RESTRICT s ,size_t bs ,const void * GGML_RESTRICT vx ,size_t bx ,const void * GGML_RESTRICT vy ,size_t by ,int nrc ) { 1255assert (nrc == 1 ); 1256UNUSED (nrc ); 1257UNUSED (bx ); 1258UNUSED (by ); 1259UNUSED (bs ); 1260assert (n %QK4_NL == 0 ); 1261static_assert (QK4_NL == QK8_0 ,"QK4_NL and QK8_0 must be the same" ); 1262 1263const block_iq4_nl * GGML_RESTRICT x = vx ; 1264const block_q8_0 * GGML_RESTRICT y = vy ; 1265 1266const int nb = n /QK4_NL ; 1267 1268int ib = 0 ; 1269float sumf = 0 ; 1270 1271for (;ib < nb ;++ ib ) { 1272const float d = GGML_CPU_FP16_TO_FP32 (y [ib ].d )* GGML_CPU_FP16_TO_FP32 (x [ib ].d ); 1273int sumi1 = 0 ,sumi2 = 0 ; 1274for (int j = 0 ;j < QK4_NL /2 ;++ j ) { 1275sumi1 += y [ib ].qs [j + 0 ]* kvalues_iq4nl [x [ib ].qs [j ]& 0xf ]; 1276sumi2 += y [ib ].qs [j + QK4_NL /2 ]* kvalues_iq4nl [x [ib ].qs [j ] >>4 ]; 1277 } 1278sumf += d * (sumi1 + sumi2 ); 1279 } 1280* s = sumf ; 1281} 1282 1283void ggml_vec_dot_iq4_xs_q8_K_generic (int n ,float * GGML_RESTRICT s ,size_t bs ,const void * GGML_RESTRICT vx ,size_t bx ,const void * GGML_RESTRICT vy ,size_t by ,int nrc ) { 1284assert (nrc == 1 ); 1285UNUSED (nrc ); 1286UNUSED (bx ); 1287UNUSED (by ); 1288UNUSED (bs ); 1289assert (n %QK_K == 0 ); 1290 1291const block_iq4_xs * GGML_RESTRICT x = vx ; 1292const block_q8_K * GGML_RESTRICT y = vy ; 1293 1294const int nb = n /QK_K ; 1295 1296float sumf = 0 ; 1297for (int ibl = 0 ;ibl < nb ;++ ibl ) { 1298const float d4d8 = GGML_CPU_FP16_TO_FP32 (x [ibl ].d )* y [ibl ].d ; 1299uint16_t h = x [ibl ].scales_h ; 1300const uint8_t * qs = x [ibl ].qs ; 1301const int8_t * q8 = y [ibl ].qs ; 1302for (int ib = 0 ;ib < QK_K /32 ;ib += 2 ) { 1303const uint8_t ls1 = (x [ibl ].scales_l [ib /2 ]& 0xf ) | ((h <<4 )& 0x30 ); 1304const uint8_t ls2 = (x [ibl ].scales_l [ib /2 ] >>4 ) | ((h <<2 )& 0x30 ); 1305h >>=4 ; 1306const float d1 = d4d8 * (ls1 - 32 ); 1307const float d2 = d4d8 * (ls2 - 32 ); 1308int sumi1 = 0 ,sumi2 = 0 ; 1309for (int j = 0 ;j < 16 ;++ j ) { 1310sumi1 += q8 [j + 0 ]* kvalues_iq4nl [qs [j ]& 0xf ]; 1311sumi2 += q8 [j + 16 ]* kvalues_iq4nl [qs [j ] >>4 ]; 1312 } 1313sumf += d1 * (sumi1 + sumi2 ); 1314qs += 16 ; 1315q8 += 32 ; 1316sumi1 = sumi2 = 0 ; 1317for (int j = 0 ;j < 16 ;++ j ) { 1318sumi1 += q8 [j + 0 ]* kvalues_iq4nl [qs [j ]& 0xf ]; 1319sumi2 += q8 [j + 16 ]* kvalues_iq4nl [qs [j ] >>4 ]; 1320 } 1321sumf += d2 * (sumi1 + sumi2 ); 1322qs += 16 ; 1323q8 += 32 ; 1324 } 1325 } 1326* s = sumf ; 1327} 1328 1329// ============================ 4-bit non-linear quants 1330 1331void quantize_row_iq4_nl (const float * GGML_RESTRICT x ,void * GGML_RESTRICT y ,int64_t k ) { 1332assert (k %QK4_NL == 0 ); 1333quantize_row_iq4_nl_ref (x ,y ,k ); 1334} 1335 1336void quantize_row_iq4_xs (const float * GGML_RESTRICT x ,void * GGML_RESTRICT y ,int64_t k ) { 1337assert (k %QK_K == 0 ); 1338quantize_iq4_xs (x ,y ,1 ,k ,NULL ); 1339}