@@ -3806,18 +3806,27 @@ void ggml_vec_dot_q2_2_q8_0(int n, float * restrict s, size_t bs, const void * r
3806
3806
3807
3807
const __m256 d = _mm256_set1_ps( GGML_FP16_TO_FP32(y[i].d) );
3808
3808
3809
- __m256i xq8 = _mm256_set_epi32(
3810
- (int)q22_grid[x[i].qs[7]],
3811
- (int)q22_grid[x[i].qs[6]],
3812
- (int)q22_grid[x[i].qs[5]],
3813
- (int)q22_grid[x[i].qs[4]],
3814
- (int)q22_grid[x[i].qs[3]],
3815
- (int)q22_grid[x[i].qs[2]],
3816
- (int)q22_grid[x[i].qs[1]],
3817
- (int)q22_grid[x[i].qs[0]]
3818
- );
3819
-
3820
- __m256i yq8 = _mm256_loadu_si256((const __m256i*)(y[i].qs));
3809
+ __m128i xq8b = _mm_loadu_si64(x[i].qs);
3810
+ __m256i xq8 = MM256_SET_M128I(xq8b, xq8b);
3811
+ __m256i xq8l = _mm256_shuffle_epi8(xq8, _mm256_set_epi8(5, -1, 5, -1, 5, -1, 5, -1,
3812
+ 4, -1, 4, -1, 4, -1, 4, -1,
3813
+ 1, -1, 1, -1, 1, -1, 1, -1,
3814
+ 0, -1, 0, -1, 0, -1, 0, -1));
3815
+ __m256i xq8h = _mm256_shuffle_epi8(xq8, _mm256_set_epi8(7, -1, 7, -1, 7, -1, 7, -1,
3816
+ 6, -1, 6, -1, 6, -1, 6, -1,
3817
+ 3, -1, 3, -1, 3, -1, 3, -1,
3818
+ 2, -1, 2, -1, 2, -1, 2, -1));
3819
+ __m256i shift = _mm256_set_epi16(64, 16, 4, 1,
3820
+ 64, 16, 4, 1,
3821
+ 64, 16, 4, 1,
3822
+ 64, 16, 4, 1);
3823
+ xq8l = _mm256_mullo_epi16(xq8l, shift);
3824
+ xq8h = _mm256_mullo_epi16(xq8h, shift);
3825
+ xq8l = _mm256_srai_epi16(xq8l, 14);
3826
+ xq8h = _mm256_srai_epi16(xq8h, 14);
3827
+ xq8 = _mm256_packs_epi16(xq8l, xq8h);
3828
+
3829
+ __m256i yq8 = _mm256_lddqu_si256((const __m256i*)(y[i].qs));
3821
3830
const __m256 q = mul_sum_i8_pairs_float(xq8, yq8);
3822
3831
3823
3832
acc = _mm256_fmadd_ps( d, q, acc );
0 commit comments