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