char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
8fe90e1fb
char/aliceai-t5-moe
1#if !defined(DATA_A_F32 )&& !defined(DATA_A_F16 ) 2#extension GL_EXT_shader_explicit_arithmetic_types_int8 : require 3#endif 4 5#include "types.glsl" 6 7#if defined(DATA_A_F32 ) 8FLOAT_TYPE dequantize1 (uint ib ,uint iqs ,uint a_offset ) { 9return data_a [a_offset + ib ]; 10} 11vec2 dequantize (uint ib ,uint iqs ,uint a_offset ) { 12return vec2 (data_a [a_offset + ib ],data_a [a_offset + ib + 1 ]); 13} 14vec4 dequantize4 (uint ib ,uint iqs ,uint a_offset ) { 15return vec4 (data_a [a_offset + ib ],data_a [a_offset + ib + 1 ], 16data_a [a_offset + ib + 2 ],data_a [a_offset + ib + 3 ]); 17} 18vec4 dequantize4_2aligned (uint ib ,uint iqs ,uint a_offset ) { 19return vec4 (data_a [a_offset + ib ],data_a [a_offset + ib + 1 ], 20data_a [a_offset + ib + 2 ],data_a [a_offset + ib + 3 ]); 21} 22 23#endif 24 25#if defined(DATA_A_F16 ) 26FLOAT_TYPE dequantize1 (uint ib ,uint iqs ,uint a_offset ) { 27return data_a [a_offset + ib ]; 28} 29vec2 dequantize (uint ib ,uint iqs ,uint a_offset ) { 30return vec2 (data_a [a_offset + ib ],data_a [a_offset + ib + 1 ]); 31} 32vec4 dequantize4 (uint ib ,uint iqs ,uint a_offset ) { 33return vec4 (data_a [a_offset + ib ],data_a [a_offset + ib + 1 ], 34data_a [a_offset + ib + 2 ],data_a [a_offset + ib + 3 ]); 35} 36vec4 dequantize4_2aligned (uint ib ,uint iqs ,uint a_offset ) { 37const vec2 a = data_a_packed32 [(a_offset + ib )/2 ]; 38const vec2 b = data_a_packed32 [(a_offset + ib )/2 + 1 ]; 39return vec4 (a ,b ); 40} 41#endif 42 43#if defined(DATA_A_BF16 ) 44FLOAT_TYPE dequantize1 (uint ib ,uint iqs ,uint a_offset ) { 45return bf16_to_fp32 (data_a [a_offset + ib ]); 46} 47vec2 dequantize (uint ib ,uint iqs ,uint a_offset ) { 48return vec2 (bf16_to_fp32 (data_a [a_offset + ib ]),bf16_to_fp32 (data_a [a_offset + ib + 1 ])); 49} 50vec4 dequantize4 (uint ib ,uint iqs ,uint a_offset ) { 51return vec4 (bf16_to_fp32 (data_a [a_offset + ib ]),bf16_to_fp32 (data_a [a_offset + ib + 1 ]), 52bf16_to_fp32 (data_a [a_offset + ib + 2 ]),bf16_to_fp32 (data_a [a_offset + ib + 3 ])); 53} 54vec4 dequantize4_2aligned (uint ib ,uint iqs ,uint a_offset ) { 55const uint a = data_a_packed32 [(a_offset + ib )/2 ]; 56const uint b = data_a_packed32 [(a_offset + ib )/2 + 1 ]; 57return vec4 (uintBitsToFloat ((a & 0x0000ffff ) <<16 ), 58uintBitsToFloat (a & 0xffff0000 ), 59uintBitsToFloat ((b & 0x0000ffff ) <<16 ), 60uintBitsToFloat (b & 0xffff0000 )); 61} 62#endif 63 64#if defined(DATA_A_Q4_0 ) 65vec2 dequantize (uint ib ,uint iqs ,uint a_offset ) { 66const uint vui = uint (data_a [a_offset + ib ].qs [iqs ]); 67return (vec2 (vui & 0xF ,vui >>4 )- 8.0f ); 68} 69vec4 dequantize4 (uint ib ,uint iqs ,uint a_offset ) { 70const uint vui = uint (data_a_packed16 [a_offset + ib ].qs [iqs /2 ]); 71return (vec4 (vui & 0xF , (vui >>4 )& 0xF , (vui >>8 )& 0xF ,vui >>12 )- 8.0f ); 72} 73#endif 74 75#if defined(DATA_A_Q4_1 ) 76vec2 dequantize (uint ib ,uint iqs ,uint a_offset ) { 77const uint vui = uint (data_a [a_offset + ib ].qs [iqs ]); 78return vec2 (vui & 0xF ,vui >>4 ); 79} 80vec4 dequantize4 (uint ib ,uint iqs ,uint a_offset ) { 81const uint vui = uint (data_a_packed16 [a_offset + ib ].qs [iqs /2 ]); 82return vec4 (vui & 0xF , (vui >>4 )& 0xF , (vui >>8 )& 0xF ,vui >>12 ); 83} 84#endif 85 86#if defined(DATA_A_Q5_0 ) 87vec2 dequantize (uint ib ,uint iqs ,uint a_offset ) { 88const uint uint_qh = uint (data_a [a_offset + ib ].qh [1 ]) <<16 |data_a [a_offset + ib ].qh [0 ]; 89const ivec2 qh = ivec2 (((uint_qh >>iqs ) <<4 )& 0x10 , (uint_qh >> (iqs + 12 ))& 0x10 ); 90const uint vui = uint (data_a [a_offset + ib ].qs [iqs ]); 91return (vec2 ((vui & 0xF ) |qh .x , (vui >>4 ) |qh .y )- 16.0f ); 92} 93vec4 dequantize4 (uint ib ,uint iqs ,uint a_offset ) { 94const uint uint_qh = uint (data_a_packed16 [a_offset + ib ].qh [1 ]) <<16 |data_a_packed16 [a_offset + ib ].qh [0 ]; 95const ivec2 qh0 = ivec2 (((uint_qh >>iqs ) <<4 )& 0x10 , (uint_qh >> (iqs + 12 ))& 0x10 ); 96const ivec2 qh1 = ivec2 (((uint_qh >> (iqs + 1 )) <<4 )& 0x10 , (uint_qh >> (iqs + 13 ))& 0x10 ); 97const uint vui = uint (data_a_packed16 [a_offset + ib ].qs [iqs /2 ]); 98return (vec4 ((vui & 0xF ) |qh0 .x , ((vui >>4 )& 0xF ) |qh0 .y , ((vui >>8 )& 0xF ) |qh1 .x , (vui >>12 ) |qh1 .y )- 16.0f ); 99} 100#endif 101 102#if defined(DATA_A_Q5_1 ) 103vec2 dequantize (uint ib ,uint iqs ,uint a_offset ) { 104const uint uint_qh = data_a [a_offset + ib ].qh ; 105const ivec2 qh = ivec2 (((uint_qh >>iqs ) <<4 )& 0x10 , (uint_qh >> (iqs + 12 ))& 0x10 ); 106const uint vui = uint (data_a [a_offset + ib ].qs [iqs ]); 107return vec2 ((vui & 0xF ) |qh .x , (vui >>4 ) |qh .y ); 108} 109vec4 dequantize4 (uint ib ,uint iqs ,uint a_offset ) { 110const uint uint_qh = data_a_packed16 [a_offset + ib ].qh ; 111const ivec2 qh0 = ivec2 (((uint_qh >>iqs ) <<4 )& 0x10 , (uint_qh >> (iqs + 12 ))& 0x10 ); 112const ivec2 qh1 = ivec2 (((uint_qh >> (iqs + 1 )) <<4 )& 0x10 , (uint_qh >> (iqs + 13 ))& 0x10 ); 113const uint vui = uint (data_a_packed16 [a_offset + ib ].qs [iqs /2 ]); 114return vec4 ((vui & 0xF ) |qh0 .x , ((vui >>4 )& 0xF ) |qh0 .y , ((vui >>8 )& 0xF ) |qh1 .x , (vui >>12 ) |qh1 .y ); 115} 116#endif 117 118#if defined(DATA_A_Q8_0 ) 119vec2 dequantize (uint ib ,uint iqs ,uint a_offset ) { 120return vec2 (int (data_a [a_offset + ib ].qs [iqs ]),int (data_a [a_offset + ib ].qs [iqs + 1 ])); 121} 122vec4 dequantize4 (uint ib ,uint iqs ,uint a_offset ) { 123const i8vec2 v0 = unpack8 (int32_t (data_a_packed16 [a_offset + ib ].qs [iqs /2 ])).xy ;// vec4 used due to #12147 124const i8vec2 v1 = unpack8 (int32_t (data_a_packed16 [a_offset + ib ].qs [iqs /2 + 1 ])).xy ; 125return vec4 (v0 .x ,v0 .y ,v1 .x ,v1 .y ); 126} 127#endif 128 129#if defined(DATA_A_Q1_0 ) 130vec2 dequantize (uint ib ,uint iqs ,uint a_offset ) { 131const uint bits = uint (data_a [a_offset + ib ].qs [iqs /8u ]) >> (iqs %8u ); 132return vec2 ( 133 (bits & 1u )!= 0u ?1.0f :-1.0f , 134 (bits & 2u )!= 0u ?1.0f :-1.0f ); 135} 136vec4 dequantize4 (uint ib ,uint iqs ,uint a_offset ) { 137const uint bits = uint (data_a [a_offset + ib ].qs [iqs /8u ]) >> (iqs %8u ); 138return vec4 ( 139 (bits & 1u )!= 0u ?1.0f :-1.0f , 140 (bits & 2u )!= 0u ?1.0f :-1.0f , 141 (bits & 4u )!= 0u ?1.0f :-1.0f , 142 (bits & 8u )!= 0u ?1.0f :-1.0f ); 143} 144#endif 145 146#if defined(DATA_A_Q2_0 ) 147vec2 dequantize (uint ib ,uint iqs ,uint a_offset ) { 148const uint bits = uint (data_a [a_offset + ib ].qs [iqs /4u ]) >> (2u * (iqs %4u )); 149return vec2 (bits & 3u , (bits >>2u )& 3u )- 1.0f ; 150} 151vec4 dequantize4 (uint ib ,uint iqs ,uint a_offset ) { 152const uint bits = uint (data_a [a_offset + ib ].qs [iqs /4u ]); 153return vec4 (bits & 3u , (bits >>2u )& 3u , (bits >>4u )& 3u ,bits >>6u )- 1.0f ; 154} 155#endif 156 157#if defined(DATA_A_IQ1_S ) 158vec2 dequantize (uint ib ,uint iqs ,uint a_offset ) { 159const uint ib32 = iqs /32 ; 160const uint ib8 = iqs /8 ; 161const int i8 = int (iqs %8 ); 162const uint qh = data_a [a_offset + ib ].qh [ib32 ]; 163const uint qs = data_a [a_offset + ib ].qs [ib8 ]; 164const float dl = float (2 * bitfieldExtract (qh ,12 ,3 )+ 1 ); 165const float delta = ((qh & 0x8000 )!= 0 ) ?- IQ1S_DELTA :IQ1S_DELTA ; 166const uint idxhi = bitfieldExtract (qh ,3 * int (ib8 & 3 ),3 ); 167const int16_t grid = int16_t (iq1s_grid [qs | (idxhi <<8 )]); 168// Signed bitfield extract. 169const ivec2 gvec = ivec2 ( 170bitfieldExtract (grid ,2 * (i8 ),2 ), 171bitfieldExtract (grid ,2 * (i8 + 1 ),2 ) 172 ); 173return dl * (vec2 (gvec )+ delta ); 174} 175vec4 dequantize4 (uint ib ,uint iqs ,uint a_offset ) { 176const uint ib32 = iqs /32 ; 177const uint ib8 = iqs /8 ; 178const int i8 = int (iqs %8 ); 179const uint qh = data_a [a_offset + ib ].qh [ib32 ]; 180const uint qs = data_a [a_offset + ib ].qs [ib8 ]; 181const float dl = 2 * bitfieldExtract (qh ,12 ,3 )+ 1 ; 182const float delta = ((qh & 0x8000 )!= 0 ) ?- IQ1S_DELTA :IQ1S_DELTA ; 183const int16_t grid = int16_t (iq1s_grid [qs | (bitfieldExtract (qh ,3 * int (ib8 & 3 ),3 ) <<8 )]); 184// Signed bitfield extract. 185const ivec4 gvec = ivec4 ( 186bitfieldExtract (grid ,2 * (i8 ),2 ), 187bitfieldExtract (grid ,2 * (i8 + 1 ),2 ), 188bitfieldExtract (grid ,2 * (i8 + 2 ),2 ), 189bitfieldExtract (grid ,2 * (i8 + 3 ),2 ) 190 ); 191return dl * (vec4 (gvec )+ delta ); 192} 193#endif 194 195#if defined(DATA_A_IQ1_M ) 196vec2 dequantize (uint ib ,uint iqs ,uint a_offset ) { 197const uint ib8 = iqs /8 ; 198const uint ib16 = iqs /16 ; 199const int i8 = int (iqs %8 ); 200const uint sc = data_a [a_offset + ib ].scales [iqs /64 ]; 201const uint qs = data_a [a_offset + ib ].qs [ib8 ]; 202const uint qh = data_a [a_offset + ib ].qh [ib16 ] >> (4 * (ib8 & 1 )); 203const float dl = 2 * bitfieldExtract (sc ,3 * int (ib16 & 3 ),3 )+ 1 ; 204const float delta = ((qh & 8 )!= 0 ) ?- IQ1M_DELTA :IQ1M_DELTA ; 205const int16_t grid = int16_t (iq1s_grid [qs | ((qh & 7 ) <<8 )]); 206// Signed bitfield extract. 207const ivec2 gvec = ivec2 ( 208bitfieldExtract (grid ,2 * (i8 ),2 ), 209bitfieldExtract (grid ,2 * (i8 + 1 ),2 ) 210 ); 211return dl * (vec2 (gvec )+ delta ); 212} 213vec4 dequantize4 (uint ib ,uint iqs ,uint a_offset ) { 214const uint ib8 = iqs /8 ; 215const uint ib16 = iqs /16 ; 216const int i8 = int (iqs %8 ); 217const uint sc = data_a [a_offset + ib ].scales [iqs /64 ]; 218const uint qs = data_a [a_offset + ib ].qs [ib8 ]; 219const uint qh = data_a [a_offset + ib ].qh [ib16 ] >> (4 * (ib8 & 1 )); 220const float dl = 2 * bitfieldExtract (sc ,3 * int (ib16 & 3 ),3 )+ 1 ; 221const float delta = ((qh & 8 )!= 0 ) ?- IQ1M_DELTA :IQ1M_DELTA ; 222const int16_t grid = int16_t (iq1s_grid [qs | ((qh & 7 ) <<8 )]); 223// Signed bitfield extract. 224const ivec4 gvec = ivec4 ( 225bitfieldExtract (grid ,2 * (i8 ),2 ), 226bitfieldExtract (grid ,2 * (i8 + 1 ),2 ), 227bitfieldExtract (grid ,2 * (i8 + 2 ),2 ), 228bitfieldExtract (grid ,2 * (i8 + 3 ),2 ) 229 ); 230return dl * (vec4 (gvec )+ delta ); 231} 232#endif 233 234#if defined(DATA_A_IQ2_XXS ) 235vec2 dequantize (uint ib ,uint iqs ,uint a_offset ) { 236const uint ib32 = iqs /32 ; 237const uint ib8 = (iqs /8 ) %4 ; 238const uint qs = data_a [a_offset + ib ].qs [8 * ib32 + ib8 ]; 239// Scales are stored as packed 7+7+7+7+4 bits (4 sign tuples and 1 int4 scale) 240const uint signs = pack32 (u16vec2 (data_a_packed16 [a_offset + ib ].qs [4 * ib32 + 2 ], 241data_a_packed16 [a_offset + ib ].qs [4 * ib32 + 3 ])); 242const float db = 0.25 * (0.5 + (signs >>28 )); 243const uint sign7 = bitfieldExtract (signs ,7 * int (ib8 ),7 ); 244// Add parity bit 245const uint sign8 = sign7 | (bitCount (sign7 ) <<7 ); 246const uint sign = sign8 >> (iqs %8 ); 247const u8vec4 grid = unpack8 (iq2xxs_grid [qs ][(iqs %8 ) /4 ] >> (8 * (iqs %4 ))); 248bool sign0 = (sign & 1 )!= 0 ; 249bool sign1 = (sign & 2 )!= 0 ; 250return db * vec2 ( 251grid .x * (sign0 ?-1.0 :1.0 ), 252grid .y * (sign1 ?-1.0 :1.0 ) 253 ); 254} 255vec4 dequantize4 (uint ib ,uint iqs ,uint a_offset ) { 256const uint ib32 = iqs /32 ; 257const uint ib8 = (iqs /8 ) %4 ; 258const uint qs = data_a [a_offset + ib ].qs [8 * ib32 + ib8 ]; 259// Scales are stored as packed 7+7+7+7+4 bits (4 sign tuples and 1 int4 scale) 260const uint signs = pack32 (u16vec2 (data_a_packed16 [a_offset + ib ].qs [4 * ib32 + 2 ], 261data_a_packed16 [a_offset + ib ].qs [4 * ib32 + 3 ])); 262const float db = 0.25 * (0.5 + (signs >>28 )); 263const uint sign7 = bitfieldExtract (signs ,7 * int (ib8 ),7 ); 264// Add parity bit 265const uint sign8 = sign7 | (bitCount (sign7 ) <<7 ); 266const uint sign = sign8 >> (iqs %8 ); 267const u8vec4 grid = unpack8 (iq2xxs_grid [qs ][(iqs %8 ) /4 ] >> (8 * (iqs %4 ))); 268bool sign0 = (sign & 1 )!= 0 ; 269bool sign1 = (sign & 2 )!= 0 ; 270bool sign2 = (sign & 4 )!= 0 ; 271bool sign3 = (sign & 8 )!= 0 ; 272return db * vec4 ( 273grid .x * (sign0 ?-1.0 :1.0 ), 274grid .y * (sign1 ?-1.0 :1.0 ), 275grid .z * (sign2 ?-1.0 :1.0 ), 276grid .w * (sign3 ?-1.0 :1.0 ) 277 ); 278} 279#endif 280 281#if defined(DATA_A_IQ2_XS ) 282vec2 dequantize (uint ib ,uint iqs ,uint a_offset ) { 283const uint scale = (data_a [a_offset + ib ].scales [iqs /32 ] >> (4 * ((iqs /16 )& 1 )))& 0xf ; 284const uint qs = data_a [a_offset + ib ].qs [iqs /8 ]; 285const float db = 0.25 * (0.5 + scale ); 286const uint sign7 = qs >>9 ; 287// Add parity bit 288const uint sign8 = sign7 | (bitCount (sign7 ) <<7 ); 289const uint sign = sign8 >> (iqs %8 ); 290const u8vec4 grid = unpack8 (iq2xs_grid [qs & 511 ][(iqs %8 ) /4 ] >> (8 * (iqs %4 ))); 291bool sign0 = (sign & 1 )!= 0 ; 292bool sign1 = (sign & 2 )!= 0 ; 293return db * vec2 ( 294grid .x * (sign0 ?-1.0 :1.0 ), 295grid .y * (sign1 ?-1.0 :1.0 ) 296 ); 297} 298vec4 dequantize4 (uint ib ,uint iqs ,uint a_offset ) { 299const uint scale = (data_a [a_offset + ib ].scales [iqs /32 ] >> (4 * ((iqs /16 )& 1 )))& 0xf ; 300const uint qs = data_a [a_offset + ib ].qs [iqs /8 ]; 301const float db = 0.25 * (0.5 + scale ); 302const uint sign7 = qs >>9 ; 303// Add parity bit 304const uint sign8 = sign7 | (bitCount (sign7 ) <<7 ); 305const uint sign = sign8 >> (iqs %8 ); 306const u8vec4 grid = unpack8 (iq2xs_grid [qs & 511 ][(iqs %8 ) /4 ] >> (8 * (iqs %4 ))); 307bool sign0 = (sign & 1 )!= 0 ; 308bool sign1 = (sign & 2 )!= 0 ; 309bool sign2 = (sign & 4 )!= 0 ; 310bool sign3 = (sign & 8 )!= 0 ; 311return db * vec4 ( 312grid .x * (sign0 ?-1.0 :1.0 ), 313grid .y * (sign1 ?-1.0 :1.0 ), 314grid .z * (sign2 ?-1.0 :1.0 ), 315grid .w * (sign3 ?-1.0 :1.0 ) 316 ); 317} 318#endif 319 320#if defined(DATA_A_IQ2_S ) 321vec2 dequantize (uint ib ,uint iqs ,uint a_offset ) { 322const uint ib32 = iqs /32 ; 323const uint ib8 = iqs /8 ; 324 325const uint scale = (data_a [a_offset + ib ].scales [ib32 ] >> (4 * ((iqs /16 )& 1 )))& 0xf ; 326const uint qs = data_a [a_offset + ib ].qs [ib8 ]; 327const uint qh = data_a [a_offset + ib ].qh [ib32 ]; 328const uint qhshift = 2 * (ib8 %4 ); 329const uint sign = data_a [a_offset + ib ].qs [QUANT_K /8 + ib8 ] >> (iqs %8 ); 330 331const float db = 0.25 * (0.5 + scale ); 332const u8vec4 grid = unpack8 (iq2s_grid [qs | ((qh << (8 - qhshift ))& 0x300 )][(iqs %8 ) /4 ]); 333bool sign0 = (sign & 1 )!= 0 ; 334bool sign1 = (sign & 2 )!= 0 ; 335return db * vec2 ( 336grid [iqs %4 ]* (sign0 ?-1.0 :1.0 ), 337grid [(iqs %4 )+ 1 ]* (sign1 ?-1.0 :1.0 ) 338 ); 339} 340vec4 dequantize4 (uint ib ,uint iqs ,uint a_offset ) { 341const uint ib32 = iqs /32 ; 342const uint ib8 = iqs /8 ; 343 344const uint scale = (data_a [a_offset + ib ].scales [ib32 ] >> (4 * ((iqs /16 )& 1 )))& 0xf ; 345const uint qs = data_a [a_offset + ib ].qs [ib8 ]; 346const uint qh = data_a [a_offset + ib ].qh [ib32 ]; 347const uint qhshift = 2 * (ib8 %4 ); 348const uint sign = data_a [a_offset + ib ].qs [QUANT_K /8 + ib8 ] >> (iqs %8 ); 349 350const float db = 0.25 * (0.5 + scale ); 351const u8vec4 grid = unpack8 (iq2s_grid [qs | ((qh << (8 - qhshift ))& 0x300 )][(iqs %8 ) /4 ]); 352bool sign0 = (sign & 1 )!= 0 ; 353bool sign1 = (sign & 2 )!= 0 ; 354bool sign2 = (sign & 4 )!= 0 ; 355bool sign3 = (sign & 8 )!= 0 ; 356return db * vec4 ( 357grid .x * (sign0 ?-1.0 :1.0 ), 358grid .y * (sign1 ?-1.0 :1.0 ), 359grid .z * (sign2 ?-1.0 :1.0 ), 360grid .w * (sign3 ?-1.0 :1.0 ) 361 ); 362} 363#endif 364 365#if defined(DATA_A_IQ3_XXS ) 366vec2 dequantize (uint ib ,uint iqs ,uint a_offset ) { 367const uint ib4 = iqs /4 ; 368const uint ib32 = iqs /32 ; 369const uint is = QUANT_K /4 + 4 * ib32 ; 370const uint qs = data_a [a_offset + ib ].qs [ib4 ]; 371// Scales are stored as packed 7+7+7+7+4 bits (4 sign tuples and 1 int4 scale) 372const uint signs = pack32 (u16vec2 (data_a_packed16 [a_offset + ib ].qs [is /2 ], 373data_a_packed16 [a_offset + ib ].qs [is /2 + 1 ])); 374const float db = 0.5 * (0.5 + (signs >>28 )); 375const uint sign7 = bitfieldExtract (signs ,7 * (int (ib4 /2 ) %4 ),7 ); 376// Add parity bit 377const uint sign8 = sign7 | (bitCount (sign7 ) <<7 ); 378const uint sign = sign8 >> (iqs %8 ); 379const u8vec4 grid = unpack8 (iq3xxs_grid [qs ] >> (8 * (iqs %4 ))); 380bool sign0 = (sign & 1 )!= 0 ; 381bool sign1 = (sign & 2 )!= 0 ; 382return db * vec2 ( 383grid .x * (sign0 ?-1.0 :1.0 ), 384grid .y * (sign1 ?-1.0 :1.0 ) 385 ); 386} 387vec4 dequantize4 (uint ib ,uint iqs ,uint a_offset ) { 388const uint ib4 = iqs /4 ; 389const uint ib32 = iqs /32 ; 390const uint is = QUANT_K /4 + 4 * ib32 ; 391const uint qs = data_a [a_offset + ib ].qs [ib4 ]; 392const uint signs = pack32 (u16vec2 (data_a_packed16 [a_offset + ib ].qs [is /2 ], 393data_a_packed16 [a_offset + ib ].qs [is /2 + 1 ])); 394const float db = 0.5 * (0.5 + (signs >>28 )); 395const uint sign7 = bitfieldExtract (signs ,7 * (int (ib4 /2 ) %4 ),7 ); 396// Add parity bit 397const uint sign8 = sign7 | (bitCount (sign7 ) <<7 ); 398const uint sign = sign8 >> (iqs %8 ); 399const u8vec4 grid = unpack8 (iq3xxs_grid [qs ]); 400bool sign0 = (sign & 1 )!= 0 ; 401bool sign1 = (sign & 2 )!= 0 ; 402bool sign2 = (sign & 4 )!= 0 ; 403bool sign3 = (sign & 8 )!= 0 ; 404return db * vec4 ( 405grid .x * (sign0 ?-1.0 :1.0 ), 406grid .y * (sign1 ?-1.0 :1.0 ), 407grid .z * (sign2 ?-1.0 :1.0 ), 408grid .w * (sign3 ?-1.0 :1.0 ) 409 ); 410} 411#endif 412 413#if defined(DATA_A_IQ3_S ) 414vec2 dequantize (uint ib ,uint iqs ,uint a_offset ) { 415const uint qs = data_a [a_offset + ib ].qs [iqs /4 ]; 416const uint qh = data_a [a_offset + ib ].qh [iqs /32 ]; 417const uint sign = data_a [a_offset + ib ].signs [iqs /8 ] >> (iqs %8 ); 418const uint scale = data_a [a_offset + ib ].scales [iqs /64 ]; 419bool sign0 = (sign & 1 )!= 0 ; 420bool sign1 = (sign & 2 )!= 0 ; 421const float db = 1 + 2 * ((scale >> (4 * ((iqs /32 )& 1 )))& 0xf ); 422const uint32_t grid = iq3s_grid [qs | ((qh << (8 - ((iqs /4 ) %8 )))& 256 )] >> (8 * (iqs %4 )); 423return db * vec2 ( 424int (grid & 0xFF )* (sign0 ?-1.0 :1.0 ), 425int ((grid >>8 )& 0xFF )* (sign1 ?-1.0 :1.0 ) 426 ); 427} 428vec4 dequantize4 (uint ib ,uint iqs ,uint a_offset ) { 429const uint ib4 = iqs /4 ; 430const uint ib32 = iqs /32 ; 431const uint qs = data_a [a_offset + ib ].qs [ib4 ]; 432const uint qh = data_a [a_offset + ib ].qh [ib32 ]; 433const uint sign = data_a [a_offset + ib ].signs [iqs /8 ] >> (iqs %8 ); 434const uint scale = data_a [a_offset + ib ].scales [ib32 /2 ]; 435bool sign0 = (sign & 1 )!= 0 ; 436bool sign1 = (sign & 2 )!= 0 ; 437bool sign2 = (sign & 4 )!= 0 ; 438bool sign3 = (sign & 8 )!= 0 ; 439const float db = 1 + 2 * ((scale >> (4 * (ib32 & 1 )))& 0xf ); 440const uint32_t grid = iq3s_grid [qs | ((qh << (8 - ib4 %8 ))& 256 )] >> (8 * (iqs %4 )); 441return db * vec4 ( 442int (grid & 0xFF )* (sign0 ?-1.0 :1.0 ), 443int ((grid >>8 )& 0xFF )* (sign1 ?-1.0 :1.0 ), 444int ((grid >>16 )& 0xFF )* (sign2 ?-1.0 :1.0 ), 445int ((grid >>24 )& 0xFF )* (sign3 ?-1.0 :1.0 ) 446 ); 447} 448#endif 449 450#if defined(DATA_A_IQ4_XS ) 451vec2 dequantize (uint ib ,uint iqs ,uint a_offset ) { 452const uint ib32 = iqs /32 ; 453const uint iq = 16 * ib32 + (iqs %16 ); 454 455const uint sl = (data_a [a_offset + ib ].scales_l [ib32 /2 ] >> (4 * (ib32 & 1 )))& 0xF ; 456const uint sh = (data_a [a_offset + ib ].scales_h >> (2 * ib32 ))& 3 ; 457const uint qshift = (iqs & 16 ) >>2 ; 458u8vec2 qs = u8vec2 (data_a [a_offset + ib ].qs [iq ],data_a [a_offset + ib ].qs [iq + 1 ]); 459qs = (qs >>qshift )& uint8_t (0xF ); 460 461const float dl = float (int (sl | (sh <<4 ))- 32 ); 462return dl * vec2 (kvalues_iq4nl [qs .x ],kvalues_iq4nl [qs .y ]); 463} 464vec4 dequantize4 (uint ib ,uint iqs ,uint a_offset ) { 465const uint ib32 = iqs /32 ; 466const uint iq = 16 * ib32 + (iqs %16 ); 467 468const uint sl = (data_a [a_offset + ib ].scales_l [ib32 /2 ] >> (4 * (ib32 & 1 )))& 0xF ; 469const uint sh = (data_a [a_offset + ib ].scales_h >> (2 * ib32 ))& 3 ; 470const uint qshift = (iqs & 16 ) >>2 ; 471const u8vec4 qs = unpack8 ((data_a_packed32 [a_offset + ib ].qs [iq /4 ] >>qshift )& 0x0F0F0F0F ); 472 473const float dl = float (int (sl | (sh <<4 ))- 32 ); 474return dl * vec4 ( 475kvalues_iq4nl [qs .x ],kvalues_iq4nl [qs .y ], 476kvalues_iq4nl [qs .z ],kvalues_iq4nl [qs .w ]); 477} 478#endif 479 480#if defined(DATA_A_IQ4_NL ) 481vec2 dequantize (uint ib ,uint iqs ,uint a_offset ) { 482const uint vui = uint (data_a [a_offset + ib ].qs [iqs ]); 483return vec2 (kvalues_iq4nl [vui & 0xF ],kvalues_iq4nl [vui >>4 ]); 484} 485vec4 dequantize4 (uint ib ,uint iqs ,uint a_offset ) { 486const uint vui = uint (data_a_packed16 [a_offset + ib ].qs [iqs /2 ]); 487return vec4 (kvalues_iq4nl [vui & 0xF ],kvalues_iq4nl [(vui >>4 )& 0xF ],kvalues_iq4nl [(vui >>8 )& 0xF ],kvalues_iq4nl [vui >>12 ]); 488} 489#endif 490 491#if defined(DATA_A_MXFP4 ) 492vec2 dequantize (uint ib ,uint iqs ,uint a_offset ) { 493const uint vui = uint (data_a [a_offset + ib ].qs [iqs ]); 494#ifdef USE_OCP_FP4 495return vec2 (unpackFloat2xfe2m1EXT (uint8_t (vui ))); 496#else 497return vec2 (kvalues_mxfp4 [vui & 0xF ],kvalues_mxfp4 [vui >>4 ])* 0.5 ; 498#endif 499} 500vec4 dequantize4 (uint ib ,uint iqs ,uint a_offset ) { 501#ifdef USE_OCP_FP4 502const uint16_t vui = uint16_t (uint (data_a [a_offset + ib ].qs [iqs ]) | 503uint (data_a [a_offset + ib ].qs [iqs + 1 ]) <<8 ); 504return vec4 (unpackFloat4xfe2m1EXT (vui )); 505#else 506vec2 v0 = dequantize (ib ,iqs ,a_offset ); 507vec2 v1 = dequantize (ib ,iqs + 1 ,a_offset ); 508return vec4 (v0 .x ,v0 .y ,v1 .x ,v1 .y ); 509#endif 510} 511#endif 512 513#if defined(DATA_A_NVFP4 ) 514vec2 dequantize (uint ib ,uint iqs ,uint a_offset ) { 515const uint sub = iqs >>4 ; 516const float d = ue4m3_to_fp32 (data_a [a_offset + ib ].d [sub ]); 517const uint j = iqs & 7 ; 518const uint shift = (iqs & 8 ) >>1 ;// 0 or 4 519#ifdef USE_OCP_FP4 520const uint vui = uint (data_a_packed16 [a_offset + ib ].qs [(sub * 8u + j ) /2u ]); 521return vec2 (bitcastExtractfe2m1EXT (unpack8 (vui ).xy ,shift ))* d ; 522#else 523const uint vui0 = uint (data_a [a_offset + ib ].qs [sub * 8u + j ]); 524const uint vui1 = uint (data_a [a_offset + ib ].qs [sub * 8u + j + 1 ]); 525const uint qs0 = (vui0 >>shift )& 0xF ; 526const uint qs1 = (vui1 >>shift )& 0xF ; 527return vec2 (float (kvalues_mxfp4 [qs0 ]),float (kvalues_mxfp4 [qs1 ]))* d * 0.5 ; 528#endif 529} 530vec4 dequantize4 (uint ib ,uint iqs ,uint a_offset ) { 531#ifdef USE_OCP_FP4 532const uint sub = iqs >>4 ; 533const float d = ue4m3_to_fp32 (data_a [a_offset + ib ].d [sub ]); 534const uint j = iqs & 7 ; 535const uint shift = (iqs & 8 ) >>1 ;// 0 or 4 536const uint vui = data_a_packed32 [a_offset + ib ].qs [(sub * 8u + j ) /4u ]; 537return vec4 (bitcastExtractfe2m1EXT (unpack8 (vui ),shift ))* d ; 538#else 539const vec2 v0 = dequantize (ib ,iqs ,a_offset ); 540const vec2 v1 = dequantize (ib ,iqs + 2u ,a_offset ); 541return vec4 (v0 .x ,v0 .y ,v1 .x ,v1 .y ); 542#endif 543} 544#endif 545 546#if defined(DATA_A_F32 )|| defined(DATA_A_F16 )|| defined(DATA_A_BF16 ) 547vec2 get_dm (uint ib ,uint a_offset ) { 548return vec2 (0 ,0 ); 549} 550#endif 551 552#if defined(DATA_A_IQ1_M ) 553vec2 get_dm (uint ib ,uint a_offset ) { 554const uint16_t [ 4 ] scales = data_a[a_offset + ib]. scales ; 555const u16vec4 s = u16vec4(scales[ 0 ], scales[ 1 ], scales[ 2 ], scales[ 3 ]) >> 12 ; 556const float d = float(unpackHalf2x16(s. x | (s. y << 4 ) | (s. z << 8 ) | (s. w << 12 )). x ); 557return vec2(d, 0 ); 558} 559#endif 560 561#if defined(DATA_A_Q2_0) || defined(DATA_A_Q4_0) || defined(DATA_A_Q5_0) || defined(DATA_A_Q8_0) || defined(DATA_A_IQ1_S) || 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_XS) || defined(DATA_A_IQ4_NL) 562vec2 get_dm( uint ib, uint a_offset) { 563return vec2(float(data_a[a_offset + ib]. d ), 0 ); 564} 565#endif 566 567#if defined(DATA_A_Q1_0) 568vec2 get_dm( uint ib, uint a_offset) { 569const float d = float(data_a[a_offset + ib]. d ); 570return vec2(d, 0 ); 571} 572#endif 573 574#if defined(DATA_A_MXFP4) 575vec2 get_dm( uint ib, uint a_offset) { 576return vec2(e8m0_to_fp32(data_a[a_offset + ib]. e ), 0 ); 577} 578#endif 579 580#if defined(DATA_A_NVFP4) 581vec2 get_dm( uint ib, uint a_offset) { 582return vec2( 1.0 , 0.0 ); 583} 584#endif 585 586#if defined(DATA_A_Q4_1) || defined(DATA_A_Q5_1) 587vec2 get_dm( uint ib, uint a_offset) { 588const vec2 dm = vec2(data_a_packed32[a_offset + ib]. dm ); 589return dm; 590} 591#endif 592 593#if defined(DATA_A_Q2_K) 594vec2 dequantize( uint ib, uint iqs, uint a_offset) { 595iqs /= 2 ; 596const uint qsi = (iqs / 64 ) * 32 + (iqs % 16 ) * 2 ; // 0,2,4..30 597const uint scalesi = iqs / 8 ; // 0..15 598const uint qsshift = ((iqs % 64 ) / 16 ) * 2 ; // 0,2,4,6 599 600const uvec2 qs = uvec2(data_a[a_offset + ib]. qs [qsi], data_a[a_offset + ib]. qs [qsi + 1 ]); 601const uint scales = data_a[a_offset + ib]. scales [scalesi]; 602const vec2 dm = vec2(data_a[a_offset + ib]. dm ); 603 604return dm. x * float(scales & 0xF ) * vec2((qs >> qsshift) & 3 ) - dm. y * float(scales >> 4 ); 605} 606vec2 get_dm( uint ib, uint a_offset) { 607return vec2( 1 , 0 ); 608} 609#endif 610 611#if defined(DATA_A_TQ1_0) 612float tq1_0_val( uint ib, uint e, uint a_offset) { 613const uint bidx = tq1_0_byte_of(e); 614const uint qbyte = uint(bidx < 48u ? data_a[a_offset + ib]. qs [bidx] 615: data_a[a_offset + ib]. qh [bidx - 48u ]); 616return float(tq1_0_trit(qbyte, tq1_0_digit_of(e))) - 1.0 ; 617} 618vec2 dequantize( uint ib, uint iqs, uint a_offset) { 619return vec2(tq1_0_val(ib, iqs, a_offset), tq1_0_val(ib, iqs + 1u , a_offset)); 620} 621vec2 get_dm( uint ib, uint a_offset) { 622return vec2(float(data_a[a_offset + ib]. d ), 0 ); 623} 624#endif 625 626#if defined(DATA_A_TQ2_0) 627vec2 dequantize( uint ib, uint iqs, uint a_offset) { 628// elem e -> byte qs[(e/128)*32 + e%32], bits 2*((e%128)/32); w = q - 1 (d applied via get_dm) 629const uint qsi = (iqs / 128 ) * 32 + (iqs % 32 ); // iqs even -> qsi, qsi+1 in same group/level 630const uint shift = 2 * ((iqs % 128 ) / 32 ); 631 632const uvec2 qs = uvec2(data_a[a_offset + ib]. qs [qsi], data_a[a_offset + ib]. qs [qsi + 1 ]); 633return vec2((qs >> shift) & 3 ) - 1.0 ; 634} 635vec2 get_dm( uint ib, uint a_offset) { 636return vec2(float(data_a[a_offset + ib]. d ), 0 ); 637} 638#endif 639 640#if defined(DATA_A_Q3_K) 641vec2 dequantize( uint ib, uint iqs, uint a_offset) { 642iqs /= 2 ; 643const uint n = iqs / 64 ; // 0,1 644const uint qsi = n * 32 + (iqs % 16 ) * 2 ; // 0,2,4..62 645const uint hmi = (iqs % 16 ) * 2 ; // 0,2,4..30 646const uint j = (iqs % 64 ) / 4 ; // 0..3 647const uint is = iqs / 8 ; // 0..15 648const uint halfsplit = ((iqs % 64 ) / 16 ); // 0,1,2,3 649const uint qsshift = halfsplit * 2 ; // 0,2,4,6 650const uint m = 1 << ( 4 * n + halfsplit); // 1,2,4,8,16,32,64,128 651 652const int8_t us = int8_t(((data_a[a_offset + ib]. scales [is % 8 ] >> ( 4 * int(is / 8 ))) & 0xF ) 653| (((data_a[a_offset + ib]. scales [ 8 + (is % 4 )] >> ( 2 * int(is / 4 ))) & 3 ) << 4 )); 654const float dl = float(data_a[a_offset + ib]. d ) * float(us - 32 ); 655 656return vec2(dl * float(int8_t((data_a[a_offset + ib]. qs [qsi ] >> qsshift) & 3 ) - (((data_a[a_offset + ib]. hmask [hmi ] & m) != 0 ) ? 0 : 4 )), 657dl * float(int8_t((data_a[a_offset + ib]. qs [qsi + 1 ] >> qsshift) & 3 ) - (((data_a[a_offset + ib]. hmask [hmi + 1 ] & m) != 0 ) ? 0 : 4 ))); 658} 659vec2 get_dm( uint ib, uint a_offset) { 660return vec2( 1 , 0 ); 661} 662#endif 663 664#if defined(DATA_A_Q4_K) 665vec2 dequantize( uint ib, uint iqs, uint a_offset) { 666iqs /= 2 ; 667const uint n = iqs / 32 ; // 0,1,2,3 668const uint b = (iqs % 32 ) / 16 ; // 0,1 669const uint is = 2 * n + b; // 0..7 670const uint qsi = n * 32 + (iqs % 16 ) * 2 ; // 0,2,4..126 671 672const vec2 loadd = vec2(data_a[a_offset + ib]. dm ); 673 674const uint scidx0 = (is < 4 ) ? is : (is + 4 ); 675const uint scidx1 = (is < 4 ) ? is : (is - 4 ); 676const uint scidxmask1 = (is < 4 ) ? 0x30 : 0xC0 ; 677const uint scidxshift1 = (is < 4 ) ? 0 : 2 ; 678const uint mbidx0 = is + 4 ; 679const uint mbidx1 = (is < 4 ) ? is + 4 : is; 680const uint mbidxmask0 = (is < 4 ) ? 0xF : 0xF0 ; 681const uint mbidxshift0 = (is < 4 ) ? 0 : 4 ; 682const uint mbidxmask1 = (is < 4 ) ? 0x30 : 0xC0 ; 683const uint mbidxshift1 = (is < 4 ) ? 0 : 2 ; 684 685const uint8_t sc = uint8_t((data_a[a_offset + ib]. scales [scidx0] & 0xF ) | ((data_a[a_offset + ib]. scales [scidx1] & scidxmask1) >> scidxshift1)); 686const uint8_t mbyte = uint8_t((data_a[a_offset + ib]. scales [mbidx0] & mbidxmask0) >> mbidxshift0 | ((data_a[a_offset + ib]. scales [mbidx1] & mbidxmask1) >> mbidxshift1)); 687 688const float d = loadd. x * sc; 689const float m = - loadd. y * mbyte; 690 691return vec2(fma(d, float((data_a[a_offset + ib]. qs [qsi ] >> (b * 4 )) & 0xF ), m), 692fma(d, float((data_a[a_offset + ib]. qs [qsi + 1 ] >> (b * 4 )) & 0xF ), m)); 693} 694vec2 get_dm( uint ib, uint a_offset) { 695return vec2( 1 , 0 ); 696} 697#endif 698 699#if defined(DATA_A_Q5_K) 700vec2 dequantize( uint ib, uint iqs, uint a_offset) { 701iqs /= 2 ; 702const uint n = iqs / 32 ; // 0,1,2,3 703const uint b = (iqs % 32 ) / 16 ; // 0,1 704const uint is = 2 * n + b; // 0..7 705const uint qsi = n * 32 + (iqs % 16 ) * 2 ; // 0,2,4..126 706const uint qhi = (iqs % 16 ) * 2 ; // 0,2,4..30 707 708const uint8_t hm = uint8_t( 1 << (iqs / 16 )); 709 710const vec2 loadd = vec2(data_a[a_offset + ib]. dm ); 711 712const uint scidx0 = (is < 4 ) ? is : (is + 4 ); 713const uint scidx1 = (is < 4 ) ? is : (is - 4 ); 714const uint scidxmask1 = (is < 4 ) ? 0x30 : 0xC0 ; 715const uint scidxshift1 = (is < 4 ) ? 0 : 2 ; 716const uint mbidx0 = is + 4 ; 717const uint mbidx1 = (is < 4 ) ? is + 4 : is; 718const uint mbidxmask0 = (is < 4 ) ? 0xF : 0xF0 ; 719const uint mbidxshift0 = (is < 4 ) ? 0 : 4 ; 720const uint mbidxmask1 = (is < 4 ) ? 0x30 : 0xC0 ; 721const uint mbidxshift1 = (is < 4 ) ? 0 : 2 ; 722 723const uint8_t sc = uint8_t((data_a[a_offset + ib]. scales [scidx0] & 0xF ) | ((data_a[a_offset + ib]. scales [scidx1] & scidxmask1) >> scidxshift1)); 724const uint8_t mbyte = uint8_t(((data_a[a_offset + ib]. scales [mbidx0] & mbidxmask0) >> mbidxshift0) | ((data_a[a_offset + ib]. scales [mbidx1] & mbidxmask1) >> mbidxshift1)); 725 726const float d = loadd. x * sc; 727const float m = - loadd. y * mbyte; 728 729return vec2(fma(d, float((data_a[a_offset + ib]. qs [qsi ] >> (b * 4 )) & 0xF ) + float((data_a[a_offset + ib]. qh [qhi ] & hm) != 0 ? 16 : 0 ), m), 730fma(d, float((data_a[a_offset + ib]. qs [qsi + 1 ] >> (b * 4 )) & 0xF ) + float((data_a[a_offset + ib]. qh [qhi + 1 ] & hm) != 0 ? 16 : 0 ), m)); 731} 732vec2 get_dm( uint ib, uint a_offset) { 733return vec2( 1 , 0 ); 734} 735#endif 736 737#if defined(DATA_A_Q6_K) 738vec2 dequantize( uint ib, uint iqs, uint a_offset) { 739iqs /= 2 ; 740const uint n = iqs / 64 ; // 0,1 741const uint b = (iqs % 64 ) / 32 ; // 0,1 742const uint is_b = (iqs % 16 ) / 8 ; // 0,1 743const uint qhshift = ((iqs % 64 ) / 16 ) * 2 ; // 0,2,4,6 744const uint is = 8 * n + qhshift + is_b; // 0..15 745const uint qsi = n * 64 + (iqs % 32 ) * 2 ; // 0,2,4..126 746const uint qhi = n * 32 + (iqs % 16 ) * 2 ; // 0,2,4..62 747 748const float dscale = float(data_a[a_offset + ib]. d ) * float(data_a[a_offset + ib]. scales [is]); 749 750return vec2(dscale * float(int8_t(((data_a[a_offset + ib]. ql [qsi ] >> (b * 4 )) & 0xF ) | (((data_a[a_offset + ib]. qh [qhi ] >> qhshift) & 3 ) << 4 )) - 32 ), 751dscale * float(int8_t(((data_a[a_offset + ib]. ql [qsi + 1 ] >> (b * 4 )) & 0xF ) | (((data_a[a_offset + ib]. qh [qhi + 1 ] >> qhshift) & 3 ) << 4 )) - 32 )); 752} 753vec2 get_dm( uint ib, uint a_offset) { 754return vec2( 1 , 0 ); 755} 756#endif