|
1 | 1 | #if !defined(DATA_A_F32) && !defined(DATA_A_F16) |
2 | 2 | #extension GL_EXT_shader_explicit_arithmetic_types_int8 : require |
3 | 3 | #endif |
| 4 | +#if defined(DATA_A_IQ1_M) |
| 5 | +#extension GL_EXT_shader_explicit_arithmetic_types_float16 : require |
| 6 | +#endif |
4 | 7 |
|
5 | 8 | #include "types.comp" |
6 | 9 |
|
@@ -88,6 +91,83 @@ vec4 dequantize4(uint ib, uint iqs, uint a_offset) { |
88 | 91 | } |
89 | 92 | #endif |
90 | 93 |
|
| 94 | +#if defined(DATA_A_IQ1_S) |
| 95 | +vec2 dequantize(uint ib, uint iqs, uint a_offset) { |
| 96 | + const uint ib32 = iqs / 32; |
| 97 | + const uint ib8 = iqs / 8; |
| 98 | + const int i8 = int(iqs % 8); |
| 99 | + const uint qh = data_a[a_offset + ib].qh[ib32]; |
| 100 | + const uint qs = data_a[a_offset + ib].qs[ib8]; |
| 101 | + const float dl = float(2 * bitfieldExtract(qh, 12, 3) + 1); |
| 102 | + const float delta = ((qh & 0x8000) != 0) ? -IQ1S_DELTA : IQ1S_DELTA; |
| 103 | + const uint idxhi = bitfieldExtract(qh, 3 * int(ib8 & 3), 3); |
| 104 | + const int16_t grid = int16_t(iq1s_grid[qs | (idxhi << 8)]); |
| 105 | + // Signed bitfield extract. |
| 106 | + const ivec2 gvec = ivec2( |
| 107 | + bitfieldExtract(grid, 2 * (i8), 2), |
| 108 | + bitfieldExtract(grid, 2 * (i8 + 1), 2) |
| 109 | + ); |
| 110 | + return dl * (vec2(gvec) + delta); |
| 111 | +} |
| 112 | +vec4 dequantize4(uint ib, uint iqs, uint a_offset) { |
| 113 | + const uint ib32 = iqs / 32; |
| 114 | + const uint ib8 = iqs / 8; |
| 115 | + const int i8 = int(iqs % 8); |
| 116 | + const uint qh = data_a[a_offset + ib].qh[ib32]; |
| 117 | + const uint qs = data_a[a_offset + ib].qs[ib8]; |
| 118 | + const float dl = 2 * bitfieldExtract(qh, 12, 3) + 1; |
| 119 | + const float delta = ((qh & 0x8000) != 0) ? -IQ1S_DELTA : IQ1S_DELTA; |
| 120 | + const int16_t grid = int16_t(iq1s_grid[qs | (bitfieldExtract(qh, 3 * int(ib8 & 3), 3) << 8)]); |
| 121 | + // Signed bitfield extract. |
| 122 | + const ivec4 gvec = ivec4( |
| 123 | + bitfieldExtract(grid, 2 * (i8), 2), |
| 124 | + bitfieldExtract(grid, 2 * (i8 + 1), 2), |
| 125 | + bitfieldExtract(grid, 2 * (i8 + 2), 2), |
| 126 | + bitfieldExtract(grid, 2 * (i8 + 3), 2) |
| 127 | + ); |
| 128 | + return dl * (vec4(gvec) + delta); |
| 129 | +} |
| 130 | +#endif |
| 131 | + |
| 132 | +#if defined(DATA_A_IQ1_M) |
| 133 | +vec2 dequantize(uint ib, uint iqs, uint a_offset) { |
| 134 | + const uint ib8 = iqs / 8; |
| 135 | + const uint ib16 = iqs / 16; |
| 136 | + const int i8 = int(iqs % 8); |
| 137 | + const uint sc = data_a[a_offset + ib].scales[iqs / 64]; |
| 138 | + const uint qs = data_a[a_offset + ib].qs[ib8]; |
| 139 | + const uint qh = data_a[a_offset + ib].qh[ib16] >> (4 * (ib8 & 1)); |
| 140 | + const float dl = 2 * bitfieldExtract(sc, 3 * int(ib16 & 3), 3) + 1; |
| 141 | + const float delta = ((qh & 8) != 0) ? -IQ1M_DELTA : IQ1M_DELTA; |
| 142 | + const int16_t grid = int16_t(iq1s_grid[qs | ((qh & 7) << 8)]); |
| 143 | + // Signed bitfield extract. |
| 144 | + const ivec2 gvec = ivec2( |
| 145 | + bitfieldExtract(grid, 2 * (i8), 2), |
| 146 | + bitfieldExtract(grid, 2 * (i8 + 1), 2) |
| 147 | + ); |
| 148 | + return dl * (vec2(gvec) + delta); |
| 149 | +} |
| 150 | +vec4 dequantize4(uint ib, uint iqs, uint a_offset) { |
| 151 | + const uint ib8 = iqs / 8; |
| 152 | + const uint ib16 = iqs / 16; |
| 153 | + const int i8 = int(iqs % 8); |
| 154 | + const uint sc = data_a[a_offset + ib].scales[iqs / 64]; |
| 155 | + const uint qs = data_a[a_offset + ib].qs[ib8]; |
| 156 | + const uint qh = data_a[a_offset + ib].qh[ib16] >> (4 * (ib8 & 1)); |
| 157 | + const float dl = 2 * bitfieldExtract(sc, 3 * int(ib16 & 3), 3) + 1; |
| 158 | + const float delta = ((qh & 8) != 0) ? -IQ1M_DELTA : IQ1M_DELTA; |
| 159 | + const int16_t grid = int16_t(iq1s_grid[qs | ((qh & 7) << 8)]); |
| 160 | + // Signed bitfield extract. |
| 161 | + const ivec4 gvec = ivec4( |
| 162 | + bitfieldExtract(grid, 2 * (i8), 2), |
| 163 | + bitfieldExtract(grid, 2 * (i8 + 1), 2), |
| 164 | + bitfieldExtract(grid, 2 * (i8 + 2), 2), |
| 165 | + bitfieldExtract(grid, 2 * (i8 + 3), 2) |
| 166 | + ); |
| 167 | + return dl * (vec4(gvec) + delta); |
| 168 | +} |
| 169 | +#endif |
| 170 | + |
91 | 171 | #if defined(DATA_A_IQ2_XXS) |
92 | 172 | vec2 dequantize(uint ib, uint iqs, uint a_offset) { |
93 | 173 | const uint ib32 = iqs / 32; |
@@ -357,7 +437,16 @@ vec2 get_dm(uint ib, uint a_offset) { |
357 | 437 | } |
358 | 438 | #endif |
359 | 439 |
|
360 | | -#if defined(DATA_A_Q4_0) || defined(DATA_A_Q5_0) || defined(DATA_A_Q8_0) || defined(DATA_A_IQ2_XXS) || defined(DATA_A_IQ2_XS) || defined(DATA_A_IQ2_S) || defined(DATA_A_IQ3_XXS) || defined(DATA_A_IQ3_S) || defined(DATA_A_IQ4_XS) || defined(DATA_A_IQ4_NL) |
| 440 | +#if defined(DATA_A_IQ1_M) |
| 441 | +vec2 get_dm(uint ib, uint a_offset) { |
| 442 | + const uint16_t[4] scales = data_a[a_offset + ib].scales; |
| 443 | + const u16vec4 s = u16vec4(scales[0], scales[1], scales[2], scales[3]) >> 12; |
| 444 | + const float d = float(uint16BitsToHalf(s.x | (s.y << 4) | (s.z << 8) | (s.w << 12))); |
| 445 | + return vec2(d, 0); |
| 446 | +} |
| 447 | +#endif |
| 448 | + |
| 449 | +#if 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) |
361 | 450 | vec2 get_dm(uint ib, uint a_offset) { |
362 | 451 | return vec2(float(data_a[a_offset + ib].d), 0); |
363 | 452 | } |
|
0 commit comments