char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
78d550b54
char/aliceai-t5-moe
1#define GGML_COMMON_IMPL_CPP 2#define GGML_COMMON_DECL_CPP 3#include "ggml-common.h" 4#include "ggml-backend-impl.h" 5 6#include "ggml-impl.h" 7#include "ggml-cpu.h" 8#include "ggml-cpu-impl.h" 9#include "simd-mappings.h" 10#include "traits.h" 11 12#include <cmath> 13#include <cstring> 14#include <cassert> 15#include <cstdlib> // for qsort 16#include <cstdio> // for GGML_ASSERT 17 18#define GGML_CPU_CLANG_WORKAROUND 19#include "../../repack.h" 20 21#if defined(__GNUC__ ) 22#pragma GCC diagnostic ignored "-Woverlength-strings" 23#endif 24 25#define UNUSED GGML_UNUSED 26 27#if defined(__AVX__ ) 28#if defined(__F16C__ ) 29#if defined(__AVX512F__ ) 30#define GGML_F32Cx8x2_LOAD (x ,y ) _mm512_cvtph_ps(_mm256_set_m128i(_mm_loadu_si128((const __m128i *)(y)), _mm_loadu_si128((const __m128i *)(x)))) 31#define GGML_F32Cx16_REPEAT_LOAD (x ) _mm512_cvtph_ps(_mm256_set_m128i(x, x)) 32#endif 33// the _mm256_cvt intrinsics require F16C 34#define GGML_F32Cx8_LOAD (x ) _mm256_cvtph_ps(_mm_loadu_si128((const __m128i *)(x))) 35#define GGML_F32Cx8_REPEAT_LOAD (x ,loadMask ) _mm256_cvtph_ps(_mm_shuffle_epi32(_mm_maskload_epi32((int const*)(x), loadMask), 68)) 36#define GGML_F32Cx8_REARRANGE_LOAD (x ,arrangeMask ) _mm256_cvtph_ps(_mm_shuffle_epi8(_mm_loadu_si128((const __m128i *) x), arrangeMask)) 37#else 38#if defined(__AVX512F__ ) 39static inline __m512 __avx512_f32cx8x2_load (ggml_fp16_t * x ,ggml_fp16_t * y ) { 40float tmp [16 ]; 41 42for (int i = 0 ;i < 8 ;i ++ ) { 43tmp [i ]= GGML_CPU_FP16_TO_FP32 (x [i ]); 44 } 45 46for (int i = 0 ;i < 8 ;i ++ ) { 47tmp [i + 8 ]= GGML_CPU_FP16_TO_FP32 (y [i ]); 48 } 49 50return _mm512_loadu_ps (tmp ); 51} 52static inline __m512 __avx512_repeat_f32cx16_load (__m128i x ) { 53float tmp [16 ]; 54uint16_t tmphalf [8 ]; 55_mm_storeu_si128 ((__m128i * )tmphalf ,x ); 56 57for (int i = 0 ;i < 4 ;i ++ ) { 58tmp [i ]= GGML_CPU_FP16_TO_FP32 (tmphalf [i ]); 59tmp [i + 4 ]= GGML_CPU_FP16_TO_FP32 (tmphalf [i ]); 60tmp [i + 8 ]= GGML_CPU_FP16_TO_FP32 (tmphalf [i ]); 61tmp [i + 12 ]= GGML_CPU_FP16_TO_FP32 (tmphalf [i ]); 62 } 63 64return _mm512_loadu_ps (tmp ); 65} 66#endif 67static inline __m256 __avx_f32cx8_load (ggml_fp16_t * x ) { 68float tmp [8 ]; 69 70for (int i = 0 ;i < 8 ;i ++ ) { 71tmp [i ]= GGML_CPU_FP16_TO_FP32 (x [i ]); 72 } 73 74return _mm256_loadu_ps (tmp ); 75} 76static inline __m256 __avx_repeat_f32cx8_load (ggml_fp16_t * x ) { 77float tmp [8 ]; 78 79for (int i = 0 ;i < 4 ;i ++ ) { 80tmp [i ]= GGML_CPU_FP16_TO_FP32 (x [i ]); 81tmp [i + 4 ]= GGML_CPU_FP16_TO_FP32 (x [i ]); 82 } 83 84return _mm256_loadu_ps (tmp ); 85} 86static inline __m256 __avx_rearranged_f32cx8_load (ggml_fp16_t * x ,__m128i arrangeMask ) { 87uint16_t tmphalf [8 ]; 88float tmp [8 ]; 89 90_mm_storeu_si128 ((__m128i * )tmphalf ,_mm_shuffle_epi8 (_mm_loadu_si128 ((const __m128i * )x ),arrangeMask )); 91for (int i = 0 ;i < 8 ;i ++ ) { 92tmp [i ]= GGML_CPU_FP16_TO_FP32 (tmphalf [i ]); 93 } 94 95return _mm256_loadu_ps (tmp ); 96} 97 98#define GGML_F32Cx8_LOAD (x ) __avx_f32cx8_load(x) 99#define GGML_F32Cx8_REPEAT_LOAD (x ,loadMask ) __avx_repeat_f32cx8_load(x) 100#define GGML_F32Cx8_REARRANGE_LOAD (x ,arrangeMask ) __avx_rearranged_f32cx8_load(x, arrangeMask) 101#if defined(__AVX512F__ ) 102#define GGML_F32Cx8x2_LOAD (x ,y ) __avx512_f32cx8x2_load(x, y) 103#define GGML_F32Cx16_REPEAT_LOAD (x ) __avx512_repeat_f32cx16_load(x) 104#endif 105#endif 106#endif 107 108static inline int nearest_int (float fval ) { 109assert (fabsf (fval ) <=4194303.f ); 110float val = fval + 12582912.f ; 111int i ;memcpy (& i ,& val ,sizeof (int )); 112return (i & 0x007fffff )- 0x00400000 ; 113} 114 115#if defined(__AVX2__ )|| defined(__AVX512F__ ) 116#if defined(__AVX512F__ ) 117// add int16_t pairwise and return as 512 bit int vector, then add the accumulator 118static inline __m512i sum_i16_pairs_acc_int32x16 (const __m512i acc ,const __m512i x ) { 119const __m512i ones = _mm512_set1_epi16 (1 ); 120return _mm512_add_epi32 (acc ,_mm512_madd_epi16 (ones ,x )); 121} 122 123static inline __m512i mul_sum_us8_pairs_acc_int32x16 (const __m512i acc ,const __m512i ax ,const __m512i sy ) { 124#if defined(__AVX512VNNI__ ) 125return _mm512_dpbusd_epi32 (acc ,ax ,sy ); 126#else 127// Perform multiplication and create 16-bit values 128const __m512i dot = _mm512_maddubs_epi16 (ax ,sy ); 129return sum_i16_pairs_acc_int32x16 (acc ,dot ); 130#endif 131} 132 133// multiply int8_t, add results pairwise twice and return as 512 bit int vector,then add the accumulator 134static inline __m512i mul_sum_i8_pairs_acc_int32x16 (const __m512i acc ,const __m512i x ,const __m512i y ) { 135const __m512i zero = _mm512_setzero_si512 (); 136// Get absolute values of x vectors 137const __m512i ax = _mm512_abs_epi8 (x ); 138// Sign the values of the y vectors 139__mmask64 blt0 = _mm512_movepi8_mask (x ); 140const __m512i sy = _mm512_mask_sub_epi8 (y ,blt0 ,zero ,y ); 141return mul_sum_us8_pairs_acc_int32x16 (acc ,ax ,sy ); 142} 143#endif 144 145// add int16_t pairwise and return as 256 bit int vector, then add the accumulator 146static inline __m256i sum_i16_pairs_acc_int32x8 (const __m256i acc ,const __m256i x ) { 147const __m256i ones = _mm256_set1_epi16 (1 ); 148return _mm256_add_epi32 (acc ,_mm256_madd_epi16 (ones ,x )); 149} 150 151static inline __m256i mul_sum_us8_pairs_acc_int32x8 (const __m256i acc ,const __m256i ax ,const __m256i sy ) { 152#if defined(__AVX512VNNI__ )&& defined(__AVX512VL__ ) 153return _mm256_dpbusd_epi32 (acc ,ax ,sy ); 154#elif defined(__AVXVNNI__ ) 155return _mm256_dpbusd_avx_epi32 (acc ,ax ,sy ); 156#else 157// Perform multiplication and create 16-bit values 158const __m256i dot = _mm256_maddubs_epi16 (ax ,sy ); 159return sum_i16_pairs_acc_int32x8 (acc ,dot ); 160#endif 161} 162 163// Integer variant of the function defined in ggml-quants.c 164// multiply int8_t, add results pairwise twice and return as 256 bit int vector, then add the accumulator 165static inline __m256i mul_sum_i8_pairs_acc_int32x8 (const __m256i acc ,const __m256i x ,const __m256i y ) { 166#if defined(__AVXVNNIINT8__ ) 167return _mm256_dpbssd_epi32 (acc ,x ,y ); 168#else 169// Get absolute values of x vectors 170const __m256i ax = _mm256_sign_epi8 (x ,x ); 171// Sign the values of the y vectors 172const __m256i sy = _mm256_sign_epi8 (y ,x ); 173return mul_sum_us8_pairs_acc_int32x8 (acc ,ax ,sy ); 174#endif 175} 176#endif 177 178void ggml_quantize_mat_q8_0_4x8 (const float * GGML_RESTRICT x ,void * GGML_RESTRICT vy ,int64_t k ) { 179assert (QK8_0 == 32 ); 180assert (k %QK8_0 == 0 ); 181const int nb = k /QK8_0 ; 182 183block_q8_0x4 * GGML_RESTRICT y = (block_q8_0x4 * )vy ; 184 185#if defined(__AVX2__ )|| defined(__AVX__ ) 186float id [4 ]; 187__m256 srcv [4 ][4 ]; 188__m256 idvec [4 ]; 189 190for (int i = 0 ;i < nb ;i ++ ) { 191for (int row_iter = 0 ;row_iter < 4 ;row_iter ++ ) { 192// Load elements into 4 AVX vectors 193__m256 v0 = _mm256_loadu_ps (x + row_iter * k + i * 32 ); 194__m256 v1 = _mm256_loadu_ps (x + row_iter * k + i * 32 + 8 ); 195__m256 v2 = _mm256_loadu_ps (x + row_iter * k + i * 32 + 16 ); 196__m256 v3 = _mm256_loadu_ps (x + row_iter * k + i * 32 + 24 ); 197 198// Compute max(abs(e)) for the block 199const __m256 signBit = _mm256_set1_ps (-0.0f ); 200__m256 maxAbs = _mm256_andnot_ps (signBit ,v0 ); 201maxAbs = _mm256_max_ps (maxAbs ,_mm256_andnot_ps (signBit ,v1 ) ); 202maxAbs = _mm256_max_ps (maxAbs ,_mm256_andnot_ps (signBit ,v2 ) ); 203maxAbs = _mm256_max_ps (maxAbs ,_mm256_andnot_ps (signBit ,v3 ) ); 204 205__m128 max4 = _mm_max_ps (_mm256_extractf128_ps (maxAbs ,1 ),_mm256_castps256_ps128 (maxAbs ) ); 206max4 = _mm_max_ps (max4 ,_mm_movehl_ps (max4 ,max4 ) ); 207max4 = _mm_max_ss (max4 ,_mm_movehdup_ps (max4 ) ); 208const float maxScalar = _mm_cvtss_f32 (max4 ); 209 210// Divided by 127.f to mirror results in quantize_row_q8_0 211const float d = maxScalar /127.f ; 212id [row_iter ]= (maxScalar != 0.0f ) ?127.f /maxScalar :0.0f ;//d ? 1.0f / d : 0.0f; 213 214// Store the scale for the individual block 215y [i ].d [row_iter ]= GGML_CPU_FP32_TO_FP16 (d ); 216 217// Store the values in blocks of eight values - Aim is to use these later for block interleaving 218srcv [row_iter ][0 ]= v0 ; 219srcv [row_iter ][1 ]= v1 ; 220srcv [row_iter ][2 ]= v2 ; 221srcv [row_iter ][3 ]= v3 ; 222idvec [row_iter ]= _mm256_set1_ps (id [row_iter ]); 223 } 224 225// The loop iterates four times - The aim is to get 4 corresponding chunks of eight bytes from the original weight blocks that are interleaved 226for (int j = 0 ;j < 4 ;j ++ ) { 227// Apply the multiplier 228__m256 v0 = _mm256_mul_ps (srcv [0 ][j ],idvec [0 ]); 229__m256 v1 = _mm256_mul_ps (srcv [1 ][j ],idvec [1 ]); 230__m256 v2 = _mm256_mul_ps (srcv [2 ][j ],idvec [2 ]); 231__m256 v3 = _mm256_mul_ps (srcv [3 ][j ],idvec [3 ]); 232 233// Round to nearest integer 234v0 = _mm256_round_ps (v0 ,_MM_ROUND_NEAREST ); 235v1 = _mm256_round_ps (v1 ,_MM_ROUND_NEAREST ); 236v2 = _mm256_round_ps (v2 ,_MM_ROUND_NEAREST ); 237v3 = _mm256_round_ps (v3 ,_MM_ROUND_NEAREST ); 238 239// Convert floats to integers 240__m256i i0 = _mm256_cvtps_epi32 (v0 ); 241__m256i i1 = _mm256_cvtps_epi32 (v1 ); 242__m256i i2 = _mm256_cvtps_epi32 (v2 ); 243__m256i i3 = _mm256_cvtps_epi32 (v3 ); 244 245#if defined(__AVX2__ ) 246// Convert int32 to int16 247i0 = _mm256_packs_epi32 (i0 ,i1 ); 248i2 = _mm256_packs_epi32 (i2 ,i3 ); 249// Convert int16 to int8 250i0 = _mm256_packs_epi16 (i0 ,i2 ); 251 252// Permute and store the quantized weights in the required order after the pack instruction 253const __m256i perm = _mm256_setr_epi32 (0 ,4 ,1 ,5 ,2 ,6 ,3 ,7 ); 254i0 = _mm256_permutevar8x32_epi32 (i0 ,perm ); 255 256_mm256_storeu_si256 ((__m256i * )(y [i ].qs + 32 * j ),i0 ); 257#else 258// Since we don't have in AVX some necessary functions, 259// we split the registers in half and call AVX2 analogs from SSE 260__m128i ni0 = _mm256_castsi256_si128 (i0 ); 261__m128i ni1 = _mm256_extractf128_si256 (i0 ,1 ); 262__m128i ni2 = _mm256_castsi256_si128 (i1 ); 263__m128i ni3 = _mm256_extractf128_si256 (i1 ,1 ); 264__m128i ni4 = _mm256_castsi256_si128 (i2 ); 265__m128i ni5 = _mm256_extractf128_si256 (i2 ,1 ); 266__m128i ni6 = _mm256_castsi256_si128 (i3 ); 267__m128i ni7 = _mm256_extractf128_si256 (i3 ,1 ); 268 269// Convert int32 to int16 270ni0 = _mm_packs_epi32 (ni0 ,ni1 ); 271ni2 = _mm_packs_epi32 (ni2 ,ni3 ); 272ni4 = _mm_packs_epi32 (ni4 ,ni5 ); 273ni6 = _mm_packs_epi32 (ni6 ,ni7 ); 274// Convert int16 to int8 275ni0 = _mm_packs_epi16 (ni0 ,ni2 ); 276ni4 = _mm_packs_epi16 (ni4 ,ni6 ); 277_mm_storeu_si128 ((__m128i * )(y [i ].qs + 32 * j ),ni0 ); 278_mm_storeu_si128 ((__m128i * )(y [i ].qs + 32 * j + 16 ),ni4 ); 279#endif 280 } 281 } 282 283#else 284UNUSED (nb ); 285UNUSED (y ); 286ggml_quantize_mat_q8_0_4x8_generic (x ,vy ,k ); 287#endif 288} 289 290void ggml_quantize_mat_q8_K_4x8 (const float * GGML_RESTRICT x ,void * GGML_RESTRICT vy ,int64_t k ) { 291assert (QK_K == 256 ); 292assert (k %QK_K == 0 ); 293const int nb = k /QK_K ; 294 295block_q8_Kx4 * GGML_RESTRICT y = (block_q8_Kx4 * )vy ; 296 297#if defined(__AVX2__ ) 298float iscale [4 ]; 299__m256 srcv [4 ][32 ]; 300__m256 iscale_vec [4 ]; 301 302for (int i = 0 ;i < nb ;i ++ ) { 303for (int row_iter = 0 ;row_iter < 4 ;row_iter ++ ) { 304// Load elements into 4 AVX vectors 305__m256 v0 = _mm256_loadu_ps (x + row_iter * k + i * 256 ); 306__m256 v1 = _mm256_loadu_ps (x + row_iter * k + i * 256 + 8 ); 307__m256 v2 = _mm256_loadu_ps (x + row_iter * k + i * 256 + 16 ); 308__m256 v3 = _mm256_loadu_ps (x + row_iter * k + i * 256 + 24 ); 309 310// Compute max(abs(e)) for the block 311const __m256 signBit = _mm256_set1_ps (-0.0f ); 312__m256 abs0 = _mm256_andnot_ps (signBit ,v0 ); 313__m256 abs1 = _mm256_andnot_ps (signBit ,v1 ); 314__m256 abs2 = _mm256_andnot_ps (signBit ,v2 ); 315__m256 abs3 = _mm256_andnot_ps (signBit ,v3 ); 316 317__m256 maxAbs = _mm256_max_ps (abs0 ,abs1 ); 318maxAbs = _mm256_max_ps (maxAbs ,abs2 ); 319maxAbs = _mm256_max_ps (maxAbs ,abs3 ); 320 321__m256 mask0 = _mm256_cmp_ps (maxAbs ,v0 ,_CMP_EQ_OQ ); 322__m256 mask1 = _mm256_cmp_ps (maxAbs ,v1 ,_CMP_EQ_OQ ); 323__m256 mask2 = _mm256_cmp_ps (maxAbs ,v2 ,_CMP_EQ_OQ ); 324__m256 mask3 = _mm256_cmp_ps (maxAbs ,v3 ,_CMP_EQ_OQ ); 325 326__m256 maskAbs = _mm256_or_ps (_mm256_or_ps (mask0 ,mask1 ),_mm256_or_ps (mask2 ,mask3 )); 327 328srcv [row_iter ][0 ]= v0 ; 329srcv [row_iter ][1 ]= v1 ; 330srcv [row_iter ][2 ]= v2 ; 331srcv [row_iter ][3 ]= v3 ; 332 333for (int sb = 1 ;sb < 8 ;sb ++ ) { 334// Temporarily stores absolute quant values 335__m256 tempAbs = maxAbs ; 336 337// Load elements into 4 AVX vectors 338__m256 v0 = _mm256_loadu_ps (x + row_iter * k + i * 256 + sb * 32 ); 339__m256 v1 = _mm256_loadu_ps (x + row_iter * k + i * 256 + sb * 32 + 8 ); 340__m256 v2 = _mm256_loadu_ps (x + row_iter * k + i * 256 + sb * 32 + 16 ); 341__m256 v3 = _mm256_loadu_ps (x + row_iter * k + i * 256 + sb * 32 + 24 ); 342 343// Compute max(abs(e)) for the block 344__m256 abs0 = _mm256_andnot_ps (signBit ,v0 ); 345__m256 abs1 = _mm256_andnot_ps (signBit ,v1 ); 346__m256 abs2 = _mm256_andnot_ps (signBit ,v2 ); 347__m256 abs3 = _mm256_andnot_ps (signBit ,v3 ); 348 349maxAbs = _mm256_max_ps (maxAbs ,abs0 ); 350maxAbs = _mm256_max_ps (maxAbs ,abs1 ); 351maxAbs = _mm256_max_ps (maxAbs ,abs2 ); 352maxAbs = _mm256_max_ps (maxAbs ,abs3 ); 353 354__m256 mask_prev = _mm256_cmp_ps (tempAbs ,maxAbs ,_CMP_EQ_OQ ); 355maskAbs = _mm256_and_ps (maskAbs ,mask_prev ); 356 357mask0 = _mm256_cmp_ps (maxAbs ,v0 ,_CMP_EQ_OQ ); 358mask1 = _mm256_cmp_ps (maxAbs ,v1 ,_CMP_EQ_OQ ); 359mask2 = _mm256_cmp_ps (maxAbs ,v2 ,_CMP_EQ_OQ ); 360mask3 = _mm256_cmp_ps (maxAbs ,v3 ,_CMP_EQ_OQ ); 361 362__m256 mask_curr = _mm256_or_ps (_mm256_or_ps (mask0 ,mask1 ),_mm256_or_ps (mask2 ,mask3 )); 363maskAbs = _mm256_or_ps (maskAbs ,mask_curr ); 364 365srcv [row_iter ][sb * 4 ]= v0 ; 366srcv [row_iter ][sb * 4 + 1 ]= v1 ; 367srcv [row_iter ][sb * 4 + 2 ]= v2 ; 368srcv [row_iter ][sb * 4 + 3 ]= v3 ; 369 } 370 371__m128 max4 = _mm_max_ps (_mm256_extractf128_ps (maxAbs ,1 ),_mm256_castps256_ps128 (maxAbs ) ); 372max4 = _mm_max_ps (max4 ,_mm_movehl_ps (max4 ,max4 ) ); 373max4 = _mm_max_ss (max4 ,_mm_movehdup_ps (max4 ) ); 374const float maxScalar = _mm_cvtss_f32 (max4 ); 375 376__m256 maxScalarVec = _mm256_set1_ps (maxScalar ); 377 378__m256 mask_next = _mm256_cmp_ps (maxScalarVec ,maxAbs ,_CMP_EQ_OQ ); 379__m256 finalMask = _mm256_and_ps (maskAbs ,mask_next ); 380 381const int mask = _mm256_movemask_ps (finalMask ); 382iscale [row_iter ]= (maxScalar != 0.0f ) ?127.f /maxScalar :0.0f ; 383 384if (mask ) { 385iscale [row_iter ]= (maxScalar != 0.0f ) ?-127.f /maxScalar :0.0f ; 386 } 387 388y [i ].d [row_iter ]= maxScalar ?1 /iscale [row_iter ] :0 ; 389iscale_vec [row_iter ]= _mm256_set1_ps (iscale [row_iter ]); 390 } 391 392__m256i quants_interleaved [32 ]; 393for (int j = 0 ;j < 32 ;j ++ ) { 394// Apply the multiplier 395__m256 v0 = _mm256_mul_ps (srcv [0 ][j ],iscale_vec [0 ]); 396__m256 v1 = _mm256_mul_ps (srcv [1 ][j ],iscale_vec [1 ]); 397__m256 v2 = _mm256_mul_ps (srcv [2 ][j ],iscale_vec [2 ]); 398__m256 v3 = _mm256_mul_ps (srcv [3 ][j ],iscale_vec [3 ]); 399 400// Round to nearest integer 401v0 = _mm256_round_ps (v0 ,_MM_ROUND_NEAREST ); 402v1 = _mm256_round_ps (v1 ,_MM_ROUND_NEAREST ); 403v2 = _mm256_round_ps (v2 ,_MM_ROUND_NEAREST ); 404v3 = _mm256_round_ps (v3 ,_MM_ROUND_NEAREST ); 405 406// Convert floats to integers 407__m256i i0 = _mm256_cvtps_epi32 (v0 ); 408__m256i i1 = _mm256_cvtps_epi32 (v1 ); 409__m256i i2 = _mm256_cvtps_epi32 (v2 ); 410__m256i i3 = _mm256_cvtps_epi32 (v3 ); 411 412// Convert int32 to int16 413i0 = _mm256_packs_epi32 (i0 ,i1 ); 414i2 = _mm256_packs_epi32 (i2 ,i3 ); 415// Convert int16 to int8 416i0 = _mm256_packs_epi16 (i0 ,i2 ); 417 418// Permute and store the quantized weights in the required order after the pack instruction 419const __m256i perm = _mm256_setr_epi32 (0 ,4 ,1 ,5 ,2 ,6 ,3 ,7 ); 420i0 = _mm256_permutevar8x32_epi32 (i0 ,perm ); 421 422_mm256_storeu_si256 ((__m256i * )(y [i ].qs + 32 * j ),i0 ); 423quants_interleaved [j ]= i0 ; 424 } 425 426// Masks to shuffle the quants of corresponding sub blocks for rearranging quants for vectorized bsums computation 427__m256i shuffle_mask_sb2 = _mm256_castsi128_si256 (_mm_setr_epi8 (0 ,1 ,0 ,1 ,4 ,5 ,6 ,7 ,8 ,9 ,8 ,9 ,12 ,13 ,14 ,15 )); 428shuffle_mask_sb2 = _mm256_permute2f128_si256 (shuffle_mask_sb2 ,shuffle_mask_sb2 ,0 ); 429__m256i shuffle_mask_sb3 = _mm256_castsi128_si256 (_mm_setr_epi8 (0 ,1 ,2 ,3 ,0 ,1 ,6 ,7 ,8 ,9 ,10 ,11 ,8 ,9 ,14 ,15 )); 430shuffle_mask_sb3 = _mm256_permute2f128_si256 (shuffle_mask_sb3 ,shuffle_mask_sb3 ,0 ); 431__m256i shuffle_mask_sb4 = _mm256_castsi128_si256 (_mm_setr_epi8 (0 ,1 ,2 ,3 ,4 ,5 ,0 ,1 ,8 ,9 ,10 ,11 ,12 ,13 ,8 ,9 )); 432shuffle_mask_sb4 = _mm256_permute2f128_si256 (shuffle_mask_sb4 ,shuffle_mask_sb4 ,0 ); 433 434for (int k = 0 ;k < 4 ;k ++ ) { 435// Quants from four different sub blocks are taken 436__m256i q0 = quants_interleaved [k * 8 + 0 ]; 437__m256i q1 = quants_interleaved [k * 8 + 1 ]; 438__m256i q2 = quants_interleaved [k * 8 + 2 ]; 439__m256i q3 = quants_interleaved [k * 8 + 3 ]; 440__m256i q4 = quants_interleaved [k * 8 + 4 ]; 441__m256i q5 = quants_interleaved [k * 8 + 5 ]; 442__m256i q6 = quants_interleaved [k * 8 + 6 ]; 443__m256i q7 = quants_interleaved [k * 8 + 7 ]; 444 445 446// The below code block has the first half of different sub blocks shuffled and blended so as to process 2 values from each sub block at a time 447__m256i sb2_h1_shuffled = _mm256_shuffle_epi8 (q2 ,shuffle_mask_sb2 ); 448__m256i sb_h1_interleaved = _mm256_blend_epi16 (q0 ,sb2_h1_shuffled ,34 ); 449__m256i sb3_h1_shuffled = _mm256_shuffle_epi8 (q4 ,shuffle_mask_sb3 ); 450sb_h1_interleaved = _mm256_blend_epi16 (sb_h1_interleaved ,sb3_h1_shuffled ,68 ); 451__m256i sb4_h1_shuffled = _mm256_shuffle_epi8 (q6 ,shuffle_mask_sb4 ); 452sb_h1_interleaved = _mm256_blend_epi16 (sb_h1_interleaved ,sb4_h1_shuffled ,136 ); 453 454__m256i one = _mm256_set1_epi8 (1 ); 455__m256i bsums_r1 = _mm256_maddubs_epi16 (one ,sb_h1_interleaved ); 456 457for (int l = 0 ;l < 3 ;l ++ ) { 458// Quants value shifted to process next two values from each sub block 459q0 = _mm256_srli_epi64 (q0 ,16 ); 460q2 = _mm256_srli_epi64 (q2 ,16 ); 461q4 = _mm256_srli_epi64 (q4 ,16 ); 462q6 = _mm256_srli_epi64 (q6 ,16 ); 463 464sb2_h1_shuffled = _mm256_shuffle_epi8 (q2 ,shuffle_mask_sb2 ); 465sb_h1_interleaved = _mm256_blend_epi16 (q0 ,sb2_h1_shuffled ,34 ); 466sb3_h1_shuffled = _mm256_shuffle_epi8 (q4 ,shuffle_mask_sb3 ); 467sb_h1_interleaved = _mm256_blend_epi16 (sb_h1_interleaved ,sb3_h1_shuffled ,68 ); 468sb4_h1_shuffled = _mm256_shuffle_epi8 (q6 ,shuffle_mask_sb4 ); 469sb_h1_interleaved = _mm256_blend_epi16 (sb_h1_interleaved ,sb4_h1_shuffled ,136 ); 470 471bsums_r1 = _mm256_add_epi16 (bsums_r1 ,_mm256_maddubs_epi16 (one ,sb_h1_interleaved )); 472 } 473 474// The below code block has the second half of different sub blocks shuffled and blended so as to process 2 values from each sub block at a time 475__m256i sb2_h2_shuffled = _mm256_shuffle_epi8 (q3 ,shuffle_mask_sb2 ); 476__m256i sb_h2_interleaved = _mm256_blend_epi16 (q1 ,sb2_h2_shuffled ,34 ); 477__m256i sb3_h2_shuffled = _mm256_shuffle_epi8 (q5 ,shuffle_mask_sb3 ); 478sb_h2_interleaved = _mm256_blend_epi16 (sb_h2_interleaved ,sb3_h2_shuffled ,68 ); 479__m256i sb4_h2_shuffled = _mm256_shuffle_epi8 (q7 ,shuffle_mask_sb4 ); 480sb_h2_interleaved = _mm256_blend_epi16 (sb_h2_interleaved ,sb4_h2_shuffled ,136 ); 481 482__m256i bsums_r2 = _mm256_maddubs_epi16 (one ,sb_h2_interleaved ); 483 484for (int l = 0 ;l < 3 ;l ++ ) { 485// Quants value shifted to process next two values from each sub block 486q1 = _mm256_srli_epi64 (q1 ,16 ); 487q3 = _mm256_srli_epi64 (q3 ,16 ); 488q5 = _mm256_srli_epi64 (q5 ,16 ); 489q7 = _mm256_srli_epi64 (q7 ,16 ); 490 491sb2_h2_shuffled = _mm256_shuffle_epi8 (q3 ,shuffle_mask_sb2 ); 492sb_h2_interleaved = _mm256_blend_epi16 (q1 ,sb2_h2_shuffled ,34 ); 493sb3_h2_shuffled = _mm256_shuffle_epi8 (q5 ,shuffle_mask_sb3 ); 494sb_h2_interleaved = _mm256_blend_epi16 (sb_h2_interleaved ,sb3_h2_shuffled ,68 ); 495sb4_h2_shuffled = _mm256_shuffle_epi8 (q7 ,shuffle_mask_sb4 ); 496sb_h2_interleaved = _mm256_blend_epi16 (sb_h2_interleaved ,sb4_h2_shuffled ,136 ); 497 498bsums_r2 = _mm256_add_epi16 (bsums_r2 ,_mm256_maddubs_epi16 (one ,sb_h2_interleaved )); 499 } 500 501// Overall bsums in interleaved fashion computed by adding results of both halves 502__m256i bsums_r = _mm256_add_epi16 (bsums_r1 ,bsums_r2 ); 503_mm256_storeu_si256 ((__m256i * )(y [i ].bsums + 16 * k ),bsums_r ); 504 } 505 } 506 507#else 508UNUSED (nb ); 509UNUSED (y ); 510ggml_quantize_mat_q8_K_4x8_generic (x ,vy ,k ); 511#endif 512} 513 514// 515// GEMV/GEMM templates 516// 517 518#if defined(__AVX2__ )|| defined(__AVX512F__ ) 519 520// GEMV for 8x blocks of 32 4-bit quants with a single scale factor per block 521template < typename block_tx8 > 522static void gemv_q4_b32_8x8_q8_0_lut_avx (int n ,float * GGML_RESTRICT s ,size_t bs ,const void * GGML_RESTRICT vx ,const void * GGML_RESTRICT vy ,int nr ,int nc ,__m256i signextendlut ) { 523 static_assert( 524 std::is_same_v < block_tx8 ,block_q4_0x8 > || 525 std::is_same_v < block_tx8 ,block_iq4_nlx8 > || 526 std::is_same_v < block_tx8 ,block_mxfp4x8 > , 527"Unsupported block type" ); 528 529const int qk = QK8_0 ; 530const int nb = n /qk ; 531 532UNUSED (bs ); 533 534__m256i finalpermutemask = _mm256_set_epi32 (7 ,5 ,3 ,1 ,6 ,4 ,2 ,0 ); 535 536// Permute mask used for easier vector processing at later stages 537const __m256i m4b = _mm256_set1_epi8 (0x0F ); 538 539int64_t b_nb = n /32 ; 540 541const block_tx8 * b_ptr_start = (const block_tx8 * )vx ; 542const block_q8_0 * a_ptr_start = (const block_q8_0 * )vy ; 543 544// Process Q8_0 blocks one by one 545for (int64_t y = 0 ;y < nr ;y ++ ) { 546 547// Pointers to LHS blocks of block_q8_0 format 548const block_q8_0 * a_ptr = a_ptr_start + (y * nb ); 549 550// Take group of eight blocks at each pass of the loop and perform dot product operation 551for (int64_t x = 0 ;x < nc /8 ;x ++ ) { 552 553// Pointers to RHS blocks 554const block_tx8 * b_ptr = b_ptr_start + (x * b_nb ); 555 556// Master FP accumulator 557__m256 acc_row = _mm256_setzero_ps (); 558 559for (int64_t b = 0 ;b < nb ;b ++ ) { 560// Load 8 blocks of 32 interleaved as 8 bytes (B0 - B7) 561const __m256i rhs_raw_vec_0123_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs )); 562const __m256i rhs_raw_vec_4567_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs )+ 1 ); 563const __m256i rhs_raw_vec_0123_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs )+ 2 ); 564const __m256i rhs_raw_vec_4567_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs )+ 3 ); 565 566// 4-bit -> 8-bit - Sign is maintained 567const __m256i rhs_vec_0123_0 = _mm256_shuffle_epi8 (signextendlut ,_mm256_and_si256 (rhs_raw_vec_0123_0 ,m4b ));// B0(0-7) B1(0-7) B2(0-7) B3(0-7) 568const __m256i rhs_vec_4567_0 = _mm256_shuffle_epi8 (signextendlut ,_mm256_and_si256 (rhs_raw_vec_4567_0 ,m4b ));// B4(0-7) B5(0-7) B6(0-7) B7(0-7) 569const __m256i rhs_vec_0123_1 = _mm256_shuffle_epi8 (signextendlut ,_mm256_and_si256 (rhs_raw_vec_0123_1 ,m4b ));// B0(8-15) B1(8-15) B2(8-15) B3(8-15) 570const __m256i rhs_vec_4567_1 = _mm256_shuffle_epi8 (signextendlut ,_mm256_and_si256 (rhs_raw_vec_4567_1 ,m4b ));// B0(8-15) B1(8-15) B2(8-15) B3(8-15) 571 572const __m256i rhs_vec_0123_2 = _mm256_shuffle_epi8 (signextendlut ,_mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_vec_0123_0 ,4 ),m4b ));// B0(16-23) B1(16-23) B2(16-23) B3(16-23) 573const __m256i rhs_vec_4567_2 = _mm256_shuffle_epi8 (signextendlut ,_mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_vec_4567_0 ,4 ),m4b ));// B4(16-23) B5(16-23) B6(16-23) B7(16-23) 574const __m256i rhs_vec_0123_3 = _mm256_shuffle_epi8 (signextendlut ,_mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_vec_0123_1 ,4 ),m4b ));// B0(24-31) B1(24-31) B2(24-31) B3(24-31) 575const __m256i rhs_vec_4567_3 = _mm256_shuffle_epi8 (signextendlut ,_mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_vec_4567_1 ,4 ),m4b ));// B4(24-31) B5(24-31) B6(24-31) B7(24-31) 576 577// Load the scale values for the 8 blocks interleaved in block_tx8 578__m256 col_scale_f32 ; 579if constexpr ( 580 std::is_same_v < block_tx8 ,block_q4_0x8 > || 581 std::is_same_v < block_tx8 ,block_iq4_nlx8 > ) { 582const __m128i changemask = _mm_set_epi8 (15 ,14 ,7 ,6 ,13 ,12 ,5 ,4 ,11 ,10 ,3 ,2 ,9 ,8 ,1 ,0 ); 583col_scale_f32 = GGML_F32Cx8_REARRANGE_LOAD (b_ptr [b ].d ,changemask ); 584 }else if constexpr (std::is_same_v < block_tx8 ,block_mxfp4x8 > ) { 585// Load 8 E8M0 exponents and convert to float via LUT 586// Rearranged to match changemask order: 0,4,1,5,2,6,3,7 587col_scale_f32 = _mm256_set_ps ( 588GGML_CPU_E8M0_TO_FP32_HALF (b_ptr [b ].e [7 ]), 589GGML_CPU_E8M0_TO_FP32_HALF (b_ptr [b ].e [3 ]), 590GGML_CPU_E8M0_TO_FP32_HALF (b_ptr [b ].e [6 ]), 591GGML_CPU_E8M0_TO_FP32_HALF (b_ptr [b ].e [2 ]), 592GGML_CPU_E8M0_TO_FP32_HALF (b_ptr [b ].e [5 ]), 593GGML_CPU_E8M0_TO_FP32_HALF (b_ptr [b ].e [1 ]), 594GGML_CPU_E8M0_TO_FP32_HALF (b_ptr [b ].e [4 ]), 595GGML_CPU_E8M0_TO_FP32_HALF (b_ptr [b ].e [0 ])); 596 } 597 598// Load and convert to FP32 scale from block_q8_0 599const __m256 row_scale_f32 = _mm256_set1_ps (GGML_CPU_FP16_TO_FP32 (a_ptr [b ].d )); 600 601// Load the block values in block_q8_0 in batches of 16 bytes and replicate the same across 256 bit vector 602__m256i lhs_vec_0 = _mm256_castsi128_si256 (_mm_loadu_si128 ((const __m128i * )a_ptr [b ].qs )); 603__m256i lhs_vec_1 = _mm256_castsi128_si256 (_mm_loadu_si128 ((const __m128i * )(a_ptr [b ].qs + 16 ))); 604 605lhs_vec_0 = _mm256_permute2f128_si256 (lhs_vec_0 ,lhs_vec_0 ,0 );// A0 (0-15) A0(0-15) 606lhs_vec_1 = _mm256_permute2f128_si256 (lhs_vec_1 ,lhs_vec_1 ,0 );// A0 (16-31) A0(16-31)) 607 608__m256i iacc = _mm256_setzero_si256 (); 609 610// Dot product done within 32 bit lanes and accumulated in the same vector 611// B0(0-3) B4(0-3) B1(0-3) B5(0-3) B2(0-3) B6(0-3) B3(0-3) B7(0-3) with A0(0-3) 612// B0(4-7) B4(4-7) B1(4-7) B5(4-7) B2(4-7) B6(4-7) B3(4-7) B7(4-7) with A0(4-7) 613// ........................................................................... 614// B0(28-31) B4(28-31) B1(28-31) B5(28-31) B2(28-31) B6(28-31) B3(28-31) B7(28-31) with A0(28-31) 615 616iacc = mul_sum_i8_pairs_acc_int32x8 (iacc ,_mm256_blend_epi32 (rhs_vec_0123_0 ,_mm256_shuffle_epi32 (rhs_vec_4567_0 ,177 ),170 ),_mm256_shuffle_epi32 (lhs_vec_0 ,0 )); 617iacc = mul_sum_i8_pairs_acc_int32x8 (iacc ,_mm256_blend_epi32 (_mm256_shuffle_epi32 (rhs_vec_0123_0 ,177 ) ,rhs_vec_4567_0 ,170 ),_mm256_shuffle_epi32 (lhs_vec_0 ,85 )); 618 619iacc = mul_sum_i8_pairs_acc_int32x8 (iacc ,_mm256_blend_epi32 (rhs_vec_0123_1 ,_mm256_shuffle_epi32 (rhs_vec_4567_1 ,177 ),170 ),_mm256_shuffle_epi32 (lhs_vec_0 ,170 )); 620iacc = mul_sum_i8_pairs_acc_int32x8 (iacc ,_mm256_blend_epi32 (_mm256_shuffle_epi32 (rhs_vec_0123_1 ,177 ) ,rhs_vec_4567_1 ,170 ),_mm256_shuffle_epi32 (lhs_vec_0 ,255 )); 621 622iacc = mul_sum_i8_pairs_acc_int32x8 (iacc ,_mm256_blend_epi32 (rhs_vec_0123_2 ,_mm256_shuffle_epi32 (rhs_vec_4567_2 ,177 ),170 ),_mm256_shuffle_epi32 (lhs_vec_1 ,0 )); 623iacc = mul_sum_i8_pairs_acc_int32x8 (iacc ,_mm256_blend_epi32 (_mm256_shuffle_epi32 (rhs_vec_0123_2 ,177 ) ,rhs_vec_4567_2 ,170 ),_mm256_shuffle_epi32 (lhs_vec_1 ,85 )); 624 625iacc = mul_sum_i8_pairs_acc_int32x8 (iacc ,_mm256_blend_epi32 (rhs_vec_0123_3 ,_mm256_shuffle_epi32 (rhs_vec_4567_3 ,177 ),170 ),_mm256_shuffle_epi32 (lhs_vec_1 ,170 )); 626iacc = mul_sum_i8_pairs_acc_int32x8 (iacc ,_mm256_blend_epi32 (_mm256_shuffle_epi32 (rhs_vec_0123_3 ,177 ) ,rhs_vec_4567_3 ,170 ),_mm256_shuffle_epi32 (lhs_vec_1 ,255 )); 627 628// Accumulated values multiplied with appropriate scales 629acc_row = _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc ),_mm256_mul_ps (col_scale_f32 ,row_scale_f32 ),acc_row ); 630 } 631 632// Accumulated output values permuted so as to be stored in appropriate order post accumulation 633acc_row = _mm256_permutevar8x32_ps (acc_row ,finalpermutemask ); 634_mm256_storeu_ps (s + (y * nr + x * 8 ),acc_row ); 635 } 636 } 637} 638 639// GEMM for 8x blocks of 32 4-bit quants with a single scale factor per block 640template < typename block_tx8 > 641static void gemm_q4_b32_8x8_q8_0_lut_avx (int n ,float * GGML_RESTRICT s ,size_t bs ,const void * GGML_RESTRICT vx ,const void * GGML_RESTRICT vy ,int nr ,int nc ,__m256i signextendlut ) { 642 static_assert( 643 std::is_same_v < block_tx8 ,block_q4_0x8 > || 644 std::is_same_v < block_tx8 ,block_iq4_nlx8 > || 645 std::is_same_v < block_tx8 ,block_mxfp4x8 > , 646"Unsupported block type" ); 647 648const int qk = QK8_0 ; 649const int nb = n /qk ; 650 651const block_tx8 * b_ptr_start = (const block_tx8 * )vx ; 652const block_q8_0x4 * a_ptr_start = (const block_q8_0x4 * )vy ; 653 654int64_t b_nb = n /32 ; 655int64_t y = 0 ; 656// Mask to mask out nibbles from packed bytes 657const __m256i m4b = _mm256_set1_epi8 (0x0F ); 658const __m128i loadMask = _mm_blend_epi32 (_mm_setzero_si128 (),_mm_set1_epi32 (0xFFFFFFFF ),3 ); 659// Permute mask used for easier vector processing at later stages 660__m256i requiredOrder = _mm256_set_epi32 (3 ,2 ,1 ,0 ,7 ,6 ,5 ,4 ); 661int64_t xstart = 0 ; 662int anr = nr - nr %16 ;// Used to align nr with boundary of 16 663#if defined(__AVX512BW__ )&& defined(__AVX512DQ__ ) 664int anc = nc - nc %16 ;// Used to align nc with boundary of 16 665// Mask to mask out nibbles from packed bytes expanded to 512 bit length 666const __m512i m4bexpanded = _mm512_set1_epi8 (0x0F ); 667// Lookup table to convert signed nibbles to signed bytes expanded to 512 bit length 668__m512i signextendlutexpanded = _mm512_inserti32x8 (_mm512_castsi256_si512 (signextendlut ),signextendlut ,1 ); 669 670// Take group of four block_q8_0x4 structures at each pass of the loop and perform dot product operation 671for (;y < anr /4 ;y += 4 ) { 672 673const block_q8_0x4 * a_ptrs [4 ]; 674 675a_ptrs [0 ]= a_ptr_start + (y * nb ); 676for (int i = 0 ;i < 3 ;++ i ) { 677a_ptrs [i + 1 ]= a_ptrs [i ]+ nb ; 678 } 679 680// Take group of two block_tx8 structures at each pass of the loop and perform dot product operation 681for (int64_t x = 0 ;x < anc /8 ;x += 2 ) { 682 683const block_tx8 * b_ptr_0 = b_ptr_start + ((x )* b_nb ); 684const block_tx8 * b_ptr_1 = b_ptr_start + ((x + 1 )* b_nb ); 685 686// Master FP accumulators 687__m512 acc_rows [16 ]; 688for (int i = 0 ;i < 16 ;i ++ ) { 689acc_rows [i ]= _mm512_setzero_ps (); 690 } 691 692for (int64_t b = 0 ;b < nb ;b ++ ) { 693// Load the sixteen blocks of quantized values interleaved with each other in chunks of eight - B0,B1 ....BE,BF 694const __m256i rhs_raw_mat_0123_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs )); 695const __m256i rhs_raw_mat_4567_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + 32 )); 696const __m256i rhs_raw_mat_0123_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + 64 )); 697const __m256i rhs_raw_mat_4567_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + 96 )); 698 699const __m256i rhs_raw_mat_89AB_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs )); 700const __m256i rhs_raw_mat_CDEF_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + 32 )); 701const __m256i rhs_raw_mat_89AB_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + 64 )); 702const __m256i rhs_raw_mat_CDEF_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + 96 )); 703 704// Save the values in the following vectors in the formats B0B1B4B5B8B9BCBD, B2B3B6B7BABBBEBF for further processing and storing of values 705const __m256i rhs_raw_mat_0145_0 = _mm256_blend_epi32 (rhs_raw_mat_0123_0 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_0 ,requiredOrder ),240 ); 706const __m256i rhs_raw_mat_2367_0 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_0 ,requiredOrder ),rhs_raw_mat_4567_0 ,240 ); 707const __m256i rhs_raw_mat_0145_1 = _mm256_blend_epi32 (rhs_raw_mat_0123_1 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_1 ,requiredOrder ),240 ); 708const __m256i rhs_raw_mat_2367_1 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_1 ,requiredOrder ),rhs_raw_mat_4567_1 ,240 ); 709 710const __m256i rhs_raw_mat_89CD_0 = _mm256_blend_epi32 (rhs_raw_mat_89AB_0 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_CDEF_0 ,requiredOrder ),240 ); 711const __m256i rhs_raw_mat_ABEF_0 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_89AB_0 ,requiredOrder ),rhs_raw_mat_CDEF_0 ,240 ); 712const __m256i rhs_raw_mat_89CD_1 = _mm256_blend_epi32 (rhs_raw_mat_89AB_1 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_CDEF_1 ,requiredOrder ),240 ); 713const __m256i rhs_raw_mat_ABEF_1 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_89AB_1 ,requiredOrder ),rhs_raw_mat_CDEF_1 ,240 ); 714 715const __m512i rhs_raw_mat_014589CD_0 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_0145_0 ),rhs_raw_mat_89CD_0 ,1 ); 716const __m512i rhs_raw_mat_2367ABEF_0 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_2367_0 ),rhs_raw_mat_ABEF_0 ,1 ); 717const __m512i rhs_raw_mat_014589CD_1 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_0145_1 ),rhs_raw_mat_89CD_1 ,1 ); 718const __m512i rhs_raw_mat_2367ABEF_1 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_2367_1 ),rhs_raw_mat_ABEF_1 ,1 ); 719 720// 4-bit -> 8-bit - Sign is maintained 721const __m512i rhs_mat_014589CD_0 = _mm512_shuffle_epi8 (signextendlutexpanded ,_mm512_and_si512 (rhs_raw_mat_014589CD_0 ,m4bexpanded ));//B0(0-7) B1(0-7) B4(0-7) B5(0-7) B8(0-7) B9(0-7) BC(0-7) BD(0-7) 722const __m512i rhs_mat_2367ABEF_0 = _mm512_shuffle_epi8 (signextendlutexpanded ,_mm512_and_si512 (rhs_raw_mat_2367ABEF_0 ,m4bexpanded ));//B2(0-7) B3(0-7) B6(0-7) B7(0-7) BA(0-7) BB(0-7) BE(0-7) BF(0-7) 723 724const __m512i rhs_mat_014589CD_1 = _mm512_shuffle_epi8 (signextendlutexpanded ,_mm512_and_si512 (rhs_raw_mat_014589CD_1 ,m4bexpanded ));//B0(8-15) B1(8-15) B4(8-15) B5(8-15) B8(8-15) B9(8-15) BC(8-15) BD(8-15) 725const __m512i rhs_mat_2367ABEF_1 = _mm512_shuffle_epi8 (signextendlutexpanded ,_mm512_and_si512 (rhs_raw_mat_2367ABEF_1 ,m4bexpanded ));//B2(8-15) B3(8-15) B6(8-15) B7(8-15) BA(8-15) BB(8-15) BE(8-15) BF(8-15) 726 727const __m512i rhs_mat_014589CD_2 = _mm512_shuffle_epi8 (signextendlutexpanded ,_mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_014589CD_0 ,4 ),m4bexpanded ));//B0(16-23) B1(16-23) B4(16-23) B5(16-23) B8(16-23) B9(16-23) BC(16-23) BD(16-23) 728const __m512i rhs_mat_2367ABEF_2 = _mm512_shuffle_epi8 (signextendlutexpanded ,_mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_2367ABEF_0 ,4 ),m4bexpanded ));//B2(16-23) B3(16-23) B6(16-23) B7(16-23) BA(16-23) BB(16-23) BE(16-23) BF(16-23) 729 730const __m512i rhs_mat_014589CD_3 = _mm512_shuffle_epi8 (signextendlutexpanded ,_mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_014589CD_1 ,4 ),m4bexpanded ));//B0(24-31) B1(24-31) B4(24-31) B5(24-31) B8(24-31) B9(24-31) BC(24-31) BD(24-31) 731const __m512i rhs_mat_2367ABEF_3 = _mm512_shuffle_epi8 (signextendlutexpanded ,_mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_2367ABEF_1 ,4 ),m4bexpanded ));//B2(24-31) B3(24-31) B6(24-31) B7(24-31) BA(24-31) BB(24-31) BE(24-31) BF(24-31) 732 733// Shuffle pattern one - right side input 734const __m512i rhs_mat_014589CD_0_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_0 , (_MM_PERM_ENUM )136 );//B0(0-3) B1(0-3) B0(0-3) B1(0-3) B4(0-3) B5(0-3) B4(0-3) B5(0-3) B8(0-3) B9(0-3) B8(0-3) B9(0-3) BC(0-3) BD(0-3) BC(0-3) BD(0-3) 735const __m512i rhs_mat_2367ABEF_0_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_0 , (_MM_PERM_ENUM )136 );//B2(0-3) B3(0-3) B2(0-3) B3(0-3) B6(0-3) B7(0-3) B6(0-3) B7(0-3) BA(0-3) BB(0-3) BA(0-3) BB(0-3) BE(0-3) BF(0-3) BE(0-3) BF(0-3) 736 737const __m512i rhs_mat_014589CD_1_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_1 , (_MM_PERM_ENUM )136 );//B0(8-11) B1(8-11) B0(8-11) B1(8-11) B4(8-11) B5(8-11) B4(8-11) B5(8-11) B8(8-11) B9(8-11) B8(8-11) B9(8-11) BC(8-11) BD(8-11) BC(8-11) BD(8-11) 738const __m512i rhs_mat_2367ABEF_1_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_1 , (_MM_PERM_ENUM )136 );//B2(8-11) B3(8-11) B2(8-11) B3(8-11) B6(8-11) B7(8-11) B6(8-11) B7(8-11) BA(8-11) BB(8-11) BA(8-11) BB(8-11) BE(8-11) BF(8-11) BE(8-11) BF(8-11) 739 740const __m512i rhs_mat_014589CD_2_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_2 , (_MM_PERM_ENUM )136 );//B0(16-19) B1(16-19) B0(16-19) B1(16-19) B4(16-19) B5(16-19) B4(16-19) B5(16-19) B8(16-19) B9(16-19) B8(16-19) B9(16-19) BC(16-19) BD(16-19) BC(16-19) BD(16-19) 741const __m512i rhs_mat_2367ABEF_2_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_2 , (_MM_PERM_ENUM )136 );//B2(16-19) B3(16-19) B2(16-19) B3(16-19) B6(16-19) B7(16-19) B6(16-19) B7(16-19) BA(16-19) BB(16-19) BA(16-19) BB(16-19) BE(16-19) BF(16-19) BE(16-19) BF(16-19) 742 743const __m512i rhs_mat_014589CD_3_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_3 , (_MM_PERM_ENUM )136 );//B0(24-27) B1(24-27) B0(24-27) B1(24-27) B4(24-27) B5(24-27) B4(24-27) B5(24-27) B8(24-27) B9(24-27) B8(24-27) B9(24-27) BC(24-27) BD(24-27) BC(24-27) BD(24-27) 744const __m512i rhs_mat_2367ABEF_3_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_3 , (_MM_PERM_ENUM )136 );//B2(24-27) B3(24-27) B2(24-27) B3(24-27) B6(24-27) B7(24-27) B6(24-27) B7(24-27) BA(24-27) BB(24-27) BA(24-27) BB(24-27) BE(24-27) BF(24-27) BE(24-27) BF(24-27) 745 746// Shuffle pattern two - right side input 747 748const __m512i rhs_mat_014589CD_0_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_0 , (_MM_PERM_ENUM )221 );//B0(4-7) B1(4-7) B0(4-7) B1(4-7) B4(4-7) B5(4-7) B4(4-7) B5(4-7) B8(4-7) B9(4-7) B8(4-7) B9(4-7) BC(4-7) BD(4-7) BC(4-7) BD(4-7) 749const __m512i rhs_mat_2367ABEF_0_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_0 , (_MM_PERM_ENUM )221 );//B2(4-7) B3(4-7) B2(4-7) B3(4-7) B6(4-7) B7(4-7) B6(4-7) B7(4-7) BA(4-7) BB(4-7) BA(4-7) BB(4-7) BE(4-7) BF(4-7) BE(4-7) BF(4-7) 750 751const __m512i rhs_mat_014589CD_1_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_1 , (_MM_PERM_ENUM )221 );//B0(12-15) B1(12-15) B0(12-15) B1(12-15) B4(12-15) B5(12-15) B4(12-15) B5(12-15) B8(12-15) B9(12-15) B8(12-15) B9(12-15) BC(12-15) BD(12-15) BC(12-15) BD(12-15) 752const __m512i rhs_mat_2367ABEF_1_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_1 , (_MM_PERM_ENUM )221 );//B2(12-15) B3(12-15) B2(12-15) B3(12-15) B6(12-15) B7(12-15) B6(12-15) B7(12-15) BA(12-15) BB(12-15) BA(12-15) BB(12-15) BE(12-15) BF(12-15) BE(12-15) BF(12-15) 753 754const __m512i rhs_mat_014589CD_2_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_2 , (_MM_PERM_ENUM )221 );//B0(20-23) B1(20-23) B0(20-23) B1(20-23) B4(20-23) B5(20-23) B4(20-23) B5(20-23) B8(20-23) B9(20-23) B8(20-23) B9(20-23) BC(20-23) BD(20-23) BC(20-23) BD(20-23) 755const __m512i rhs_mat_2367ABEF_2_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_2 , (_MM_PERM_ENUM )221 );//B2(20-23) B3(20-23) B2(20-23) B3(20-23) B6(20-23) B7(20-23) B6(20-23) B7(20-23) BA(20-23) BB(20-23) BA(20-23) BB(20-23) BE(20-23) BF(20-23) BE(20-23) BF(20-23) 756 757const __m512i rhs_mat_014589CD_3_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_3 , (_MM_PERM_ENUM )221 );//B0(28-31) B1(28-31) B0(28-31) B1(28-31) B4(28-31) B5(28-31) B4(28-31) B5(28-31) B8(28-31) B9(28-31) B8(28-31) B9(28-31) BC(28-31) BD(28-31) BC(28-31) BD(28-31) 758const __m512i rhs_mat_2367ABEF_3_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_3 , (_MM_PERM_ENUM )221 );//B2(28-31) B3(28-31) B2(28-31) B3(28-31) B6(28-31) B7(28-31) B6(28-31) B7(28-31) BA(28-31) BB(28-31) BA(28-31) BB(28-31) BE(28-31) BF(28-31) BE(28-31) BF(28-31) 759 760// Scale values - Load the weight scale values of two block_tx8 761__m512 col_scale_f32 ; 762if constexpr ( 763 std::is_same_v < block_tx8 ,block_q4_0x8 > || 764 std::is_same_v < block_tx8 ,block_iq4_nlx8 > ) { 765col_scale_f32 = GGML_F32Cx8x2_LOAD (b_ptr_0 [b ].d ,b_ptr_1 [b ].d ); 766 }else if constexpr (std::is_same_v < block_tx8 ,block_mxfp4x8 > ) { 767//TODO: simd-ify 768col_scale_f32 = _mm512_set_ps ( 769GGML_CPU_E8M0_TO_FP32_HALF (b_ptr_1 [b ].e [7 ]), 770GGML_CPU_E8M0_TO_FP32_HALF (b_ptr_1 [b ].e [6 ]), 771GGML_CPU_E8M0_TO_FP32_HALF (b_ptr_1 [b ].e [5 ]), 772GGML_CPU_E8M0_TO_FP32_HALF (b_ptr_1 [b ].e [4 ]), 773GGML_CPU_E8M0_TO_FP32_HALF (b_ptr_1 [b ].e [3 ]), 774GGML_CPU_E8M0_TO_FP32_HALF (b_ptr_1 [b ].e [2 ]), 775GGML_CPU_E8M0_TO_FP32_HALF (b_ptr_1 [b ].e [1 ]), 776GGML_CPU_E8M0_TO_FP32_HALF (b_ptr_1 [b ].e [0 ]), 777GGML_CPU_E8M0_TO_FP32_HALF (b_ptr_0 [b ].e [7 ]), 778GGML_CPU_E8M0_TO_FP32_HALF (b_ptr_0 [b ].e [6 ]), 779GGML_CPU_E8M0_TO_FP32_HALF (b_ptr_0 [b ].e [5 ]), 780GGML_CPU_E8M0_TO_FP32_HALF (b_ptr_0 [b ].e [4 ]), 781GGML_CPU_E8M0_TO_FP32_HALF (b_ptr_0 [b ].e [3 ]), 782GGML_CPU_E8M0_TO_FP32_HALF (b_ptr_0 [b ].e [2 ]), 783GGML_CPU_E8M0_TO_FP32_HALF (b_ptr_0 [b ].e [1 ]), 784GGML_CPU_E8M0_TO_FP32_HALF (b_ptr_0 [b ].e [0 ])); 785 } 786 787// Process LHS in pairs of rows 788for (int rp = 0 ;rp < 4 ;rp ++ ) { 789 790// Load the four blocks of quantized values interleaved with each other in chunks of eight - A0,A1,A2,A3 791// Loaded as set of 128 bit vectors and repeated and stored into a 256 bit vector before again repeating into 512 bit vector 792__m256i lhs_mat_ymm_0123_0 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs ))); 793__m256i lhs_mat_ymm_01_0 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_0 ,lhs_mat_ymm_0123_0 ,0 ); 794__m256i lhs_mat_ymm_23_0 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_0 ,lhs_mat_ymm_0123_0 ,17 ); 795__m256i lhs_mat_ymm_0123_1 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 32 ))); 796__m256i lhs_mat_ymm_01_1 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_1 ,lhs_mat_ymm_0123_1 ,0 ); 797__m256i lhs_mat_ymm_23_1 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_1 ,lhs_mat_ymm_0123_1 ,17 ); 798__m256i lhs_mat_ymm_0123_2 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 64 ))); 799__m256i lhs_mat_ymm_01_2 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_2 ,lhs_mat_ymm_0123_2 ,0 ); 800__m256i lhs_mat_ymm_23_2 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_2 ,lhs_mat_ymm_0123_2 ,17 ); 801__m256i lhs_mat_ymm_0123_3 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 96 ))); 802__m256i lhs_mat_ymm_01_3 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_3 ,lhs_mat_ymm_0123_3 ,0 ); 803__m256i lhs_mat_ymm_23_3 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_3 ,lhs_mat_ymm_0123_3 ,17 ); 804 805__m512i lhs_mat_01_0 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_0 ),lhs_mat_ymm_01_0 ,1 ); 806__m512i lhs_mat_23_0 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_0 ),lhs_mat_ymm_23_0 ,1 ); 807__m512i lhs_mat_01_1 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_1 ),lhs_mat_ymm_01_1 ,1 ); 808__m512i lhs_mat_23_1 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_1 ),lhs_mat_ymm_23_1 ,1 ); 809__m512i lhs_mat_01_2 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_2 ),lhs_mat_ymm_01_2 ,1 ); 810__m512i lhs_mat_23_2 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_2 ),lhs_mat_ymm_23_2 ,1 ); 811__m512i lhs_mat_01_3 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_3 ),lhs_mat_ymm_01_3 ,1 ); 812__m512i lhs_mat_23_3 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_3 ),lhs_mat_ymm_23_3 ,1 ); 813 814// Shuffle pattern one - left side input 815 816const __m512i lhs_mat_01_0_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_0 , (_MM_PERM_ENUM )160 );//A0(0-3) A0(0-3) A1(0-3) A1(0-3) A0(0-3) A0(0-3) A1(0-3) A1(0-3) A0(0-3) A0(0-3) A1(0-3) A1(0-3) A0(0-3) A0(0-3) A1(0-3) A1(0-3) 817const __m512i lhs_mat_23_0_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_0 , (_MM_PERM_ENUM )160 );//A2(0-3) A2(0-3) A3(0-3) A3(0-3) A2(0-3) A2(0-3) A3(0-3) A3(0-3) A2(0-3) A2(0-3) A3(0-3) A3(0-3) A2(0-3) A2(0-3) A3(0-3) A3(0-3) 818 819const __m512i lhs_mat_01_1_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_1 , (_MM_PERM_ENUM )160 );//A0(8-11) A0(8-11) A1(8-11) A1(8-11) A0(8-11) A0(8-11) A1(8-11) A1(8-11) A0(8-11) A0(8-11) A1(8-11) A1(8-11) A0(8-11) A0(8-11) A1(8-11) A1(8-11) 820const __m512i lhs_mat_23_1_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_1 , (_MM_PERM_ENUM )160 );//A2(8-11) A2(8-11) A3(8-11) A3(8-11) A2(8-11) A2(8-11) A3(8-11) A3(8-11) A2(8-11) A2(8-11) A3(8-11) A3(8-11) A2(8-11) A2(8-11) A3(8-11) A3(8-11) 821 822const __m512i lhs_mat_01_2_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_2 , (_MM_PERM_ENUM )160 );//A0(16-19) A0(16-19) A1(16-19) A1(16-19) A0(16-19) A0(16-19) A1(16-19) A1(16-19) A0(16-19) A0(16-19) A1(16-19) A1(16-19) A0(16-19) A0(16-19) A1(16-19) A1(16-19) 823const __m512i lhs_mat_23_2_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_2 , (_MM_PERM_ENUM )160 );//A2(16-19) A2(16-19) A3(16-19) A3(16-19) A2(16-19) A2(16-19) A3(16-19) A3(16-19) A2(16-19) A2(16-19) A3(16-19) A3(16-19) A2(16-19) A2(16-19) A3(16-19) A3(16-19) 824 825const __m512i lhs_mat_01_3_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_3 , (_MM_PERM_ENUM )160 );//A0(24-27) A0(24-27) A1(24-27) A1(24-27) A0(24-27) A0(24-27) A1(24-27) A1(24-27) A0(24-27) A0(24-27) A1(24-27) A1(24-27) A0(24-27) A0(24-27) A1(24-27) A1(24-27) 826const __m512i lhs_mat_23_3_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_3 , (_MM_PERM_ENUM )160 );//A2(24-27) A2(24-27) A3(24-27) A3(24-27) A2(24-27) A2(24-27) A3(24-27) A3(24-27) A2(24-27) A2(24-27) A3(24-27) A3(24-27) A2(24-27) A2(24-27) A3(24-27) A3(24-27) 827 828// Shuffle pattern two - left side input 829 830const __m512i lhs_mat_01_0_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_0 , (_MM_PERM_ENUM )245 );//A0(4-7) A0(4-7) A1(4-7) A1(4-7) A0(4-7) A0(4-7) A1(4-7) A1(4-7) A0(4-7) A0(4-7) A1(4-7) A1(4-7) A0(4-7) A0(4-7) A1(4-7) A1(4-7) 831const __m512i lhs_mat_23_0_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_0 , (_MM_PERM_ENUM )245 );//A2(4-7) A2(4-7) A3(4-7) A3(4-7) A2(4-7) A2(4-7) A3(4-7) A3(4-7) A2(4-7) A2(4-7) A3(4-7) A3(4-7) A2(4-7) A2(4-7) A3(4-7) A3(4-7) 832 833const __m512i lhs_mat_01_1_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_1 , (_MM_PERM_ENUM )245 );//A0(12-15) A0(12-15) A1(12-15) A1(12-15) A0(12-15) A0(12-15) A1(12-15) A1(12-15) A0(12-15) A0(12-15) A1(12-15) A1(12-15) A0(12-15) A0(12-15) A1(12-15) A1(12-15) 834const __m512i lhs_mat_23_1_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_1 , (_MM_PERM_ENUM )245 );//A2(12-15) A2(12-15) A3(12-15) A3(12-15) A2(12-15) A2(12-15) A3(12-15) A3(12-15) A2(12-15) A2(12-15) A3(12-15) A3(12-15) A2(12-15) A2(12-15) A3(12-15) A3(12-15) 835 836const __m512i lhs_mat_01_2_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_2 , (_MM_PERM_ENUM )245 );//A0(20-23) A0(20-23) A1(20-23) A1(20-23) A0(20-23) A0(20-23) A1(20-23) A1(20-23) A0(20-23) A0(20-23) A1(20-23) A1(20-23) A0(20-23) A0(20-23) A1(20-23) A1(20-23) 837const __m512i lhs_mat_23_2_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_2 , (_MM_PERM_ENUM )245 );//A2(20-23) A2(20-23) A3(20-23) A3(20-23) A2(20-23) A2(20-23) A3(20-23) A3(20-23) A2(20-23) A2(20-23) A3(20-23) A3(20-23) A2(20-23) A2(20-23) A3(20-23) A3(20-23) 838 839const __m512i lhs_mat_01_3_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_3 , (_MM_PERM_ENUM )245 );//A0(28-31) A0(28-31) A1(28-31) A1(28-31) A0(28-31) A0(28-31) A1(28-31) A1(28-31) A0(28-31) A0(28-31) A1(28-31) A1(28-31) A0(28-31) A0(28-31) A1(28-31) A1(28-31) 840const __m512i lhs_mat_23_3_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_3 , (_MM_PERM_ENUM )245 );//A2(28-31) A2(28-31) A3(28-31) A3(28-31) A2(28-31) A2(28-31) A3(28-31) A3(28-31) A2(28-31) A2(28-31) A3(28-31) A3(28-31) A2(28-31) A2(28-31) A3(28-31) A3(28-31) 841 842// The values arranged in shuffle patterns are operated with dot product operation within 32 bit lane i.e corresponding bytes and multiplied and added into 32 bit integers within 32 bit lane 843// Resembles MMLAs into 2x2 matrices in ARM Version 844const __m512i zero = _mm512_setzero_epi32 (); 845__m512i iacc_mat_00_sp1 = mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (zero ,lhs_mat_01_3_sp1 ,rhs_mat_014589CD_3_sp1 ),lhs_mat_01_2_sp1 ,rhs_mat_014589CD_2_sp1 ),lhs_mat_01_1_sp1 ,rhs_mat_014589CD_1_sp1 ),lhs_mat_01_0_sp1 ,rhs_mat_014589CD_0_sp1 ); 846__m512i iacc_mat_01_sp1 = mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (zero ,lhs_mat_01_3_sp1 ,rhs_mat_2367ABEF_3_sp1 ),lhs_mat_01_2_sp1 ,rhs_mat_2367ABEF_2_sp1 ),lhs_mat_01_1_sp1 ,rhs_mat_2367ABEF_1_sp1 ),lhs_mat_01_0_sp1 ,rhs_mat_2367ABEF_0_sp1 ); 847__m512i iacc_mat_10_sp1 = mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (zero ,lhs_mat_23_3_sp1 ,rhs_mat_014589CD_3_sp1 ),lhs_mat_23_2_sp1 ,rhs_mat_014589CD_2_sp1 ),lhs_mat_23_1_sp1 ,rhs_mat_014589CD_1_sp1 ),lhs_mat_23_0_sp1 ,rhs_mat_014589CD_0_sp1 ); 848__m512i iacc_mat_11_sp1 = mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (zero ,lhs_mat_23_3_sp1 ,rhs_mat_2367ABEF_3_sp1 ),lhs_mat_23_2_sp1 ,rhs_mat_2367ABEF_2_sp1 ),lhs_mat_23_1_sp1 ,rhs_mat_2367ABEF_1_sp1 ),lhs_mat_23_0_sp1 ,rhs_mat_2367ABEF_0_sp1 ); 849__m512i iacc_mat_00_sp2 = mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (zero ,lhs_mat_01_3_sp2 ,rhs_mat_014589CD_3_sp2 ),lhs_mat_01_2_sp2 ,rhs_mat_014589CD_2_sp2 ),lhs_mat_01_1_sp2 ,rhs_mat_014589CD_1_sp2 ),lhs_mat_01_0_sp2 ,rhs_mat_014589CD_0_sp2 ); 850__m512i iacc_mat_01_sp2 = mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (zero ,lhs_mat_01_3_sp2 ,rhs_mat_2367ABEF_3_sp2 ),lhs_mat_01_2_sp2 ,rhs_mat_2367ABEF_2_sp2 ),lhs_mat_01_1_sp2 ,rhs_mat_2367ABEF_1_sp2 ),lhs_mat_01_0_sp2 ,rhs_mat_2367ABEF_0_sp2 ); 851__m512i iacc_mat_10_sp2 = mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (zero ,lhs_mat_23_3_sp2 ,rhs_mat_014589CD_3_sp2 ),lhs_mat_23_2_sp2 ,rhs_mat_014589CD_2_sp2 ),lhs_mat_23_1_sp2 ,rhs_mat_014589CD_1_sp2 ),lhs_mat_23_0_sp2 ,rhs_mat_014589CD_0_sp2 ); 852__m512i iacc_mat_11_sp2 = mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (zero ,lhs_mat_23_3_sp2 ,rhs_mat_2367ABEF_3_sp2 ),lhs_mat_23_2_sp2 ,rhs_mat_2367ABEF_2_sp2 ),lhs_mat_23_1_sp2 ,rhs_mat_2367ABEF_1_sp2 ),lhs_mat_23_0_sp2 ,rhs_mat_2367ABEF_0_sp2 ); 853 854// Output of both shuffle patterns are added in order to sum dot product outputs of all 32 values in block 855__m512i iacc_mat_00 = _mm512_add_epi32 (iacc_mat_00_sp1 ,iacc_mat_00_sp2 ); 856__m512i iacc_mat_01 = _mm512_add_epi32 (iacc_mat_01_sp1 ,iacc_mat_01_sp2 ); 857__m512i iacc_mat_10 = _mm512_add_epi32 (iacc_mat_10_sp1 ,iacc_mat_10_sp2 ); 858__m512i iacc_mat_11 = _mm512_add_epi32 (iacc_mat_11_sp1 ,iacc_mat_11_sp2 ); 859 860 861// Straighten out to make 4 row vectors 862__m512i iacc_row_0 = _mm512_mask_blend_epi32 (0xCCCC ,iacc_mat_00 ,_mm512_shuffle_epi32 (iacc_mat_01 , (_MM_PERM_ENUM )78 )); 863__m512i iacc_row_1 = _mm512_mask_blend_epi32 (0xCCCC ,_mm512_shuffle_epi32 (iacc_mat_00 , (_MM_PERM_ENUM )78 ),iacc_mat_01 ); 864__m512i iacc_row_2 = _mm512_mask_blend_epi32 (0xCCCC ,iacc_mat_10 ,_mm512_shuffle_epi32 (iacc_mat_11 , (_MM_PERM_ENUM )78 )); 865__m512i iacc_row_3 = _mm512_mask_blend_epi32 (0xCCCC ,_mm512_shuffle_epi32 (iacc_mat_10 , (_MM_PERM_ENUM )78 ),iacc_mat_11 ); 866 867// Load the scale(d) values for all the 4 Q8_0 blocks and repeat it across lanes 868const __m128i row_scale_f16 = _mm_shuffle_epi32 (_mm_maskload_epi32 ((int const * )(a_ptrs [rp ][b ].d ),loadMask ),68 ); 869const __m512 row_scale_f32 = GGML_F32Cx16_REPEAT_LOAD (row_scale_f16 ); 870 871// Multiply with appropriate scales and accumulate 872acc_rows [rp * 4 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_0 ),_mm512_mul_ps (col_scale_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,0 )),acc_rows [rp * 4 ]); 873acc_rows [rp * 4 + 1 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_1 ),_mm512_mul_ps (col_scale_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,85 )),acc_rows [rp * 4 + 1 ]); 874acc_rows [rp * 4 + 2 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_2 ),_mm512_mul_ps (col_scale_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,170 )),acc_rows [rp * 4 + 2 ]); 875acc_rows [rp * 4 + 3 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_3 ),_mm512_mul_ps (col_scale_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,255 )),acc_rows [rp * 4 + 3 ]); 876 } 877 } 878 879// Store the accumulated values 880for (int i = 0 ;i < 16 ;i ++ ) { 881_mm512_storeu_ps ((float * )(s + ((y * 4 + i )* bs + x * 8 )),acc_rows [i ]); 882 } 883 } 884 } 885 886// Take a block_q8_0x4 structures at each pass of the loop and perform dot product operation 887for (;y < nr /4 ;y ++ ) { 888const block_q8_0x4 * a_ptr = a_ptr_start + (y * nb ); 889 890// Take group of two block_tx8 structures at each pass of the loop and perform dot product operation 891for (int64_t x = 0 ;x < anc /8 ;x += 2 ) { 892 893const block_tx8 * b_ptr_0 = b_ptr_start + ((x )* b_nb ); 894const block_tx8 * b_ptr_1 = b_ptr_start + ((x + 1 )* b_nb ); 895 896// Master FP accumulators 897__m512 acc_rows [4 ]; 898for (int i = 0 ;i < 4 ;i ++ ) { 899acc_rows [i ]= _mm512_setzero_ps (); 900 } 901 902for (int64_t b = 0 ;b < nb ;b ++ ) { 903// Load the sixteen blocks of quantized values interleaved with each other in chunks of eight - B0,B1 ....BE,BF 904const __m256i rhs_raw_mat_0123_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs )); 905const __m256i rhs_raw_mat_4567_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + 32 )); 906const __m256i rhs_raw_mat_0123_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + 64 )); 907const __m256i rhs_raw_mat_4567_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + 96 )); 908 909const __m256i rhs_raw_mat_89AB_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs )); 910const __m256i rhs_raw_mat_CDEF_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + 32 )); 911const __m256i rhs_raw_mat_89AB_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + 64 )); 912const __m256i rhs_raw_mat_CDEF_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + 96 )); 913 914// Save the values in the following vectors in the formats B0B1B4B5, B2B3B6B7 for further processing and storing of values 915const __m256i rhs_raw_mat_0145_0 = _mm256_blend_epi32 (rhs_raw_mat_0123_0 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_0 ,requiredOrder ),240 ); 916const __m256i rhs_raw_mat_2367_0 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_0 ,requiredOrder ),rhs_raw_mat_4567_0 ,240 ); 917const __m256i rhs_raw_mat_0145_1 = _mm256_blend_epi32 (rhs_raw_mat_0123_1 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_1 ,requiredOrder ),240 ); 918const __m256i rhs_raw_mat_2367_1 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_1 ,requiredOrder ),rhs_raw_mat_4567_1 ,240 ); 919 920const __m256i rhs_raw_mat_89CD_0 = _mm256_blend_epi32 (rhs_raw_mat_89AB_0 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_CDEF_0 ,requiredOrder ),240 ); 921const __m256i rhs_raw_mat_ABEF_0 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_89AB_0 ,requiredOrder ),rhs_raw_mat_CDEF_0 ,240 ); 922const __m256i rhs_raw_mat_89CD_1 = _mm256_blend_epi32 (rhs_raw_mat_89AB_1 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_CDEF_1 ,requiredOrder ),240 ); 923const __m256i rhs_raw_mat_ABEF_1 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_89AB_1 ,requiredOrder ),rhs_raw_mat_CDEF_1 ,240 ); 924 925const __m512i rhs_raw_mat_014589CD_0 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_0145_0 ),rhs_raw_mat_89CD_0 ,1 ); 926const __m512i rhs_raw_mat_2367ABEF_0 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_2367_0 ),rhs_raw_mat_ABEF_0 ,1 ); 927const __m512i rhs_raw_mat_014589CD_1 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_0145_1 ),rhs_raw_mat_89CD_1 ,1 ); 928const __m512i rhs_raw_mat_2367ABEF_1 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_2367_1 ),rhs_raw_mat_ABEF_1 ,1 ); 929 930// 4-bit -> 8-bit - Sign is maintained 931const __m512i rhs_mat_014589CD_0 = _mm512_shuffle_epi8 (signextendlutexpanded ,_mm512_and_si512 (rhs_raw_mat_014589CD_0 ,m4bexpanded ));//B0(0-7) B1(0-7) B4(0-7) B5(0-7) B8(0-7) B9(0-7) BC(0-7) BD(0-7) 932const __m512i rhs_mat_2367ABEF_0 = _mm512_shuffle_epi8 (signextendlutexpanded ,_mm512_and_si512 (rhs_raw_mat_2367ABEF_0 ,m4bexpanded ));//B2(0-7) B3(0-7) B6(0-7) B7(0-7) BA(0-7) BB(0-7) BE(0-7) BF(0-7) 933 934const __m512i rhs_mat_014589CD_1 = _mm512_shuffle_epi8 (signextendlutexpanded ,_mm512_and_si512 (rhs_raw_mat_014589CD_1 ,m4bexpanded ));//B0(8-15) B1(8-15) B4(8-15) B5(8-15) B8(8-15) B9(8-15) BC(8-15) BD(8-15) 935const __m512i rhs_mat_2367ABEF_1 = _mm512_shuffle_epi8 (signextendlutexpanded ,_mm512_and_si512 (rhs_raw_mat_2367ABEF_1 ,m4bexpanded ));//B2(8-15) B3(8-15) B6(8-15) B7(8-15) BA(8-15) BB(8-15) BE(8-15) BF(8-15) 936 937const __m512i rhs_mat_014589CD_2 = _mm512_shuffle_epi8 (signextendlutexpanded ,_mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_014589CD_0 ,4 ),m4bexpanded ));//B0(16-23) B1(16-23) B4(16-23) B5(16-23) B8(16-23) B9(16-23) BC(16-23) BD(16-23) 938const __m512i rhs_mat_2367ABEF_2 = _mm512_shuffle_epi8 (signextendlutexpanded ,_mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_2367ABEF_0 ,4 ),m4bexpanded ));//B2(16-23) B3(16-23) B6(16-23) B7(16-23) BA(16-23) BB(16-23) BE(16-23) BF(16-23) 939 940const __m512i rhs_mat_014589CD_3 = _mm512_shuffle_epi8 (signextendlutexpanded ,_mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_014589CD_1 ,4 ),m4bexpanded ));//B0(24-31) B1(24-31) B4(24-31) B5(24-31) B8(24-31) B9(24-31) BC(24-31) BD(24-31) 941const __m512i rhs_mat_2367ABEF_3 = _mm512_shuffle_epi8 (signextendlutexpanded ,_mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_2367ABEF_1 ,4 ),m4bexpanded ));//B2(24-31) B3(24-31) B6(24-31) B7(24-31) BA(24-31) BB(24-31) BE(24-31) BF(24-31) 942 943// Shuffle pattern one - right side input 944const __m512i rhs_mat_014589CD_0_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_0 , (_MM_PERM_ENUM )136 );//B0(0-3) B1(0-3) B0(0-3) B1(0-3) B4(0-3) B5(0-3) B4(0-3) B5(0-3) B8(0-3) B9(0-3) B8(0-3) B9(0-3) BC(0-3) BD(0-3) BC(0-3) BD(0-3) 945const __m512i rhs_mat_2367ABEF_0_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_0 , (_MM_PERM_ENUM )136 );//B2(0-3) B3(0-3) B2(0-3) B3(0-3) B6(0-3) B7(0-3) B6(0-3) B7(0-3) BA(0-3) BB(0-3) BA(0-3) BB(0-3) BE(0-3) BF(0-3) BE(0-3) BF(0-3) 946 947const __m512i rhs_mat_014589CD_1_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_1 , (_MM_PERM_ENUM )136 );//B0(8-11) B1(8-11) B0(8-11) B1(8-11) B4(8-11) B5(8-11) B4(8-11) B5(8-11) B8(8-11) B9(8-11) B8(8-11) B9(8-11) BC(8-11) BD(8-11) BC(8-11) BD(8-11) 948const __m512i rhs_mat_2367ABEF_1_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_1 , (_MM_PERM_ENUM )136 );//B2(8-11) B3(8-11) B2(8-11) B3(8-11) B6(8-11) B7(8-11) B6(8-11) B7(8-11) BA(8-11) BB(8-11) BA(8-11) BB(8-11) BE(8-11) BF(8-11) BE(8-11) BF(8-11) 949 950const __m512i rhs_mat_014589CD_2_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_2 , (_MM_PERM_ENUM )136 );//B0(16-19) B1(16-19) B0(16-19) B1(16-19) B4(16-19) B5(16-19) B4(16-19) B5(16-19) B8(16-19) B9(16-19) B8(16-19) B9(16-19) BC(16-19) BD(16-19) BC(16-19) BD(16-19) 951const __m512i rhs_mat_2367ABEF_2_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_2 , (_MM_PERM_ENUM )136 );//B2(16-19) B3(16-19) B2(16-19) B3(16-19) B6(16-19) B7(16-19) B6(16-19) B7(16-19) BA(16-19) BB(16-19) BA(16-19) BB(16-19) BE(16-19) BF(16-19) BE(16-19) BF(16-19) 952 953const __m512i rhs_mat_014589CD_3_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_3 , (_MM_PERM_ENUM )136 );//B0(24-27) B1(24-27) B0(24-27) B1(24-27) B4(24-27) B5(24-27) B4(24-27) B5(24-27) B8(24-27) B9(24-27) B8(24-27) B9(24-27) BC(24-27) BD(24-27) BC(24-27) BD(24-27) 954const __m512i rhs_mat_2367ABEF_3_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_3 , (_MM_PERM_ENUM )136 );//B2(24-27) B3(24-27) B2(24-27) B3(24-27) B6(24-27) B7(24-27) B6(24-27) B7(24-27) BA(24-27) BB(24-27) BA(24-27) BB(24-27) BE(24-27) BF(24-27) BE(24-27) BF(24-27) 955 956// Shuffle pattern two - right side input 957 958const __m512i rhs_mat_014589CD_0_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_0 , (_MM_PERM_ENUM )221 );//B0(4-7) B1(4-7) B0(4-7) B1(4-7) B4(4-7) B5(4-7) B4(4-7) B5(4-7) B8(4-7) B9(4-7) B8(4-7) B9(4-7) BC(4-7) BD(4-7) BC(4-7) BD(4-7) 959const __m512i rhs_mat_2367ABEF_0_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_0 , (_MM_PERM_ENUM )221 );//B2(4-7) B3(4-7) B2(4-7) B3(4-7) B6(4-7) B7(4-7) B6(4-7) B7(4-7) BA(4-7) BB(4-7) BA(4-7) BB(4-7) BE(4-7) BF(4-7) BE(4-7) BF(4-7) 960 961const __m512i rhs_mat_014589CD_1_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_1 , (_MM_PERM_ENUM )221 );//B0(12-15) B1(12-15) B0(12-15) B1(12-15) B4(12-15) B5(12-15) B4(12-15) B5(12-15) B8(12-15) B9(12-15) B8(12-15) B9(12-15) BC(12-15) BD(12-15) BC(12-15) BD(12-15) 962const __m512i rhs_mat_2367ABEF_1_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_1 , (_MM_PERM_ENUM )221 );//B2(12-15) B3(12-15) B2(12-15) B3(12-15) B6(12-15) B7(12-15) B6(12-15) B7(12-15) BA(12-15) BB(12-15) BA(12-15) BB(12-15) BE(12-15) BF(12-15) BE(12-15) BF(12-15) 963 964const __m512i rhs_mat_014589CD_2_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_2 , (_MM_PERM_ENUM )221 );//B0(20-23) B1(20-23) B0(20-23) B1(20-23) B4(20-23) B5(20-23) B4(20-23) B5(20-23) B8(20-23) B9(20-23) B8(20-23) B9(20-23) BC(20-23) BD(20-23) BC(20-23) BD(20-23) 965const __m512i rhs_mat_2367ABEF_2_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_2 , (_MM_PERM_ENUM )221 );//B2(20-23) B3(20-23) B2(20-23) B3(20-23) B6(20-23) B7(20-23) B6(20-23) B7(20-23) BA(20-23) BB(20-23) BA(20-23) BB(20-23) BE(20-23) BF(20-23) BE(20-23) BF(20-23) 966 967const __m512i rhs_mat_014589CD_3_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_3 , (_MM_PERM_ENUM )221 );//B0(28-31) B1(28-31) B0(28-31) B1(28-31) B4(28-31) B5(28-31) B4(28-31) B5(28-31) B8(28-31) B9(28-31) B8(28-31) B9(28-31) BC(28-31) BD(28-31) BC(28-31) BD(28-31) 968const __m512i rhs_mat_2367ABEF_3_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_3 , (_MM_PERM_ENUM )221 );//B2(28-31) B3(28-31) B2(28-31) B3(28-31) B6(28-31) B7(28-31) B6(28-31) B7(28-31) BA(28-31) BB(28-31) BA(28-31) BB(28-31) BE(28-31) BF(28-31) BE(28-31) BF(28-31) 969 970 971// Scale values - Load the weight scale values of two block_tx8 972__m512 col_scale_f32 ; 973if constexpr ( 974 std::is_same_v < block_tx8 ,block_q4_0x8 > || 975 std::is_same_v < block_tx8 ,block_iq4_nlx8 > ) { 976col_scale_f32 = GGML_F32Cx8x2_LOAD (b_ptr_0 [b ].d ,b_ptr_1 [b ].d ); 977 }else if constexpr (std::is_same_v < block_tx8 ,block_mxfp4x8 > ) { 978//TODO: simd-ify 979col_scale_f32 = _mm512_set_ps ( 980GGML_CPU_E8M0_TO_FP32_HALF (b_ptr_1 [b ].e [7 ]), 981GGML_CPU_E8M0_TO_FP32_HALF (b_ptr_1 [b ].e [6 ]), 982GGML_CPU_E8M0_TO_FP32_HALF (b_ptr_1 [b ].e [5 ]), 983GGML_CPU_E8M0_TO_FP32_HALF (b_ptr_1 [b ].e [4 ]), 984GGML_CPU_E8M0_TO_FP32_HALF (b_ptr_1 [b ].e [3 ]), 985GGML_CPU_E8M0_TO_FP32_HALF (b_ptr_1 [b ].e [2 ]), 986GGML_CPU_E8M0_TO_FP32_HALF (b_ptr_1 [b ].e [1 ]), 987GGML_CPU_E8M0_TO_FP32_HALF (b_ptr_1 [b ].e [0 ]), 988GGML_CPU_E8M0_TO_FP32_HALF (b_ptr_0 [b ].e [7 ]), 989GGML_CPU_E8M0_TO_FP32_HALF (b_ptr_0 [b ].e [6 ]), 990GGML_CPU_E8M0_TO_FP32_HALF (b_ptr_0 [b ].e [5 ]), 991GGML_CPU_E8M0_TO_FP32_HALF (b_ptr_0 [b ].e [4 ]), 992GGML_CPU_E8M0_TO_FP32_HALF (b_ptr_0 [b ].e [3 ]), 993GGML_CPU_E8M0_TO_FP32_HALF (b_ptr_0 [b ].e [2 ]), 994GGML_CPU_E8M0_TO_FP32_HALF (b_ptr_0 [b ].e [1 ]), 995GGML_CPU_E8M0_TO_FP32_HALF (b_ptr_0 [b ].e [0 ])); 996 } 997 998// Load the four blocks of quantized values interleaved with each other in chunks of eight - A0,A1,A2,A3 999// Loaded as set of 128 bit vectors and repeated and stored into a 256 bit vector before again repeating into 512 bit vector 1000__m256i lhs_mat_ymm_0123_0 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs ))); 1001__m256i lhs_mat_ymm_01_0 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_0 ,lhs_mat_ymm_0123_0 ,0 ); 1002__m256i lhs_mat_ymm_23_0 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_0 ,lhs_mat_ymm_0123_0 ,17 ); 1003__m256i lhs_mat_ymm_0123_1 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 32 ))); 1004__m256i lhs_mat_ymm_01_1 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_1 ,lhs_mat_ymm_0123_1 ,0 ); 1005__m256i lhs_mat_ymm_23_1 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_1 ,lhs_mat_ymm_0123_1 ,17 ); 1006__m256i lhs_mat_ymm_0123_2 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 64 ))); 1007__m256i lhs_mat_ymm_01_2 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_2 ,lhs_mat_ymm_0123_2 ,0 ); 1008__m256i lhs_mat_ymm_23_2 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_2 ,lhs_mat_ymm_0123_2 ,17 ); 1009__m256i lhs_mat_ymm_0123_3 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 96 ))); 1010__m256i lhs_mat_ymm_01_3 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_3 ,lhs_mat_ymm_0123_3 ,0 ); 1011__m256i lhs_mat_ymm_23_3 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_3 ,lhs_mat_ymm_0123_3 ,17 ); 1012 1013__m512i lhs_mat_01_0 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_0 ),lhs_mat_ymm_01_0 ,1 ); 1014__m512i lhs_mat_23_0 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_0 ),lhs_mat_ymm_23_0 ,1 ); 1015__m512i lhs_mat_01_1 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_1 ),lhs_mat_ymm_01_1 ,1 ); 1016__m512i lhs_mat_23_1 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_1 ),lhs_mat_ymm_23_1 ,1 ); 1017__m512i lhs_mat_01_2 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_2 ),lhs_mat_ymm_01_2 ,1 ); 1018__m512i lhs_mat_23_2 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_2 ),lhs_mat_ymm_23_2 ,1 ); 1019__m512i lhs_mat_01_3 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_3 ),lhs_mat_ymm_01_3 ,1 ); 1020__m512i lhs_mat_23_3 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_3 ),lhs_mat_ymm_23_3 ,1 ); 1021 1022// Shuffle pattern one - left side input 1023 1024const __m512i lhs_mat_01_0_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_0 , (_MM_PERM_ENUM )160 );//A0(0-3) A0(0-3) A1(0-3) A1(0-3) A0(0-3) A0(0-3) A1(0-3) A1(0-3) A0(0-3) A0(0-3) A1(0-3) A1(0-3) A0(0-3) A0(0-3) A1(0-3) A1(0-3) 1025const __m512i lhs_mat_23_0_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_0 , (_MM_PERM_ENUM )160 );//A2(0-3) A2(0-3) A3(0-3) A3(0-3) A2(0-3) A2(0-3) A3(0-3) A3(0-3) A2(0-3) A2(0-3) A3(0-3) A3(0-3) A2(0-3) A2(0-3) A3(0-3) A3(0-3) 1026 1027const __m512i lhs_mat_01_1_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_1 , (_MM_PERM_ENUM )160 );//A0(8-11) A0(8-11) A1(8-11) A1(8-11) A0(8-11) A0(8-11) A1(8-11) A1(8-11) A0(8-11) A0(8-11) A1(8-11) A1(8-11) A0(8-11) A0(8-11) A1(8-11) A1(8-11) 1028const __m512i lhs_mat_23_1_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_1 , (_MM_PERM_ENUM )160 );//A2(8-11) A2(8-11) A3(8-11) A3(8-11) A2(8-11) A2(8-11) A3(8-11) A3(8-11) A2(8-11) A2(8-11) A3(8-11) A3(8-11) A2(8-11) A2(8-11) A3(8-11) A3(8-11) 1029 1030const __m512i lhs_mat_01_2_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_2 , (_MM_PERM_ENUM )160 );//A0(16-19) A0(16-19) A1(16-19) A1(16-19) A0(16-19) A0(16-19) A1(16-19) A1(16-19) A0(16-19) A0(16-19) A1(16-19) A1(16-19) A0(16-19) A0(16-19) A1(16-19) A1(16-19) 1031const __m512i lhs_mat_23_2_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_2 , (_MM_PERM_ENUM )160 );//A2(16-19) A2(16-19) A3(16-19) A3(16-19) A2(16-19) A2(16-19) A3(16-19) A3(16-19) A2(16-19) A2(16-19) A3(16-19) A3(16-19) A2(16-19) A2(16-19) A3(16-19) A3(16-19) 1032 1033const __m512i lhs_mat_01_3_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_3 , (_MM_PERM_ENUM )160 );//A0(24-27) A0(24-27) A1(24-27) A1(24-27) A0(24-27) A0(24-27) A1(24-27) A1(24-27) A0(24-27) A0(24-27) A1(24-27) A1(24-27) A0(24-27) A0(24-27) A1(24-27) A1(24-27) 1034const __m512i lhs_mat_23_3_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_3 , (_MM_PERM_ENUM )160 );//A2(24-27) A2(24-27) A3(24-27) A3(24-27) A2(24-27) A2(24-27) A3(24-27) A3(24-27) A2(24-27) A2(24-27) A3(24-27) A3(24-27) A2(24-27) A2(24-27) A3(24-27) A3(24-27) 1035 1036// Shuffle pattern two - left side input 1037 1038const __m512i lhs_mat_01_0_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_0 , (_MM_PERM_ENUM )245 );//A0(4-7) A0(4-7) A1(4-7) A1(4-7) A0(4-7) A0(4-7) A1(4-7) A1(4-7) A0(4-7) A0(4-7) A1(4-7) A1(4-7) A0(4-7) A0(4-7) A1(4-7) A1(4-7) 1039const __m512i lhs_mat_23_0_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_0 , (_MM_PERM_ENUM )245 );//A2(4-7) A2(4-7) A3(4-7) A3(4-7) A2(4-7) A2(4-7) A3(4-7) A3(4-7) A2(4-7) A2(4-7) A3(4-7) A3(4-7) A2(4-7) A2(4-7) A3(4-7) A3(4-7) 1040 1041const __m512i lhs_mat_01_1_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_1 , (_MM_PERM_ENUM )245 );//A0(12-15) A0(12-15) A1(12-15) A1(12-15) A0(12-15) A0(12-15) A1(12-15) A1(12-15) A0(12-15) A0(12-15) A1(12-15) A1(12-15) A0(12-15) A0(12-15) A1(12-15) A1(12-15) 1042const __m512i lhs_mat_23_1_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_1 , (_MM_PERM_ENUM )245 );//A2(12-15) A2(12-15) A3(12-15) A3(12-15) A2(12-15) A2(12-15) A3(12-15) A3(12-15) A2(12-15) A2(12-15) A3(12-15) A3(12-15) A2(12-15) A2(12-15) A3(12-15) A3(12-15) 1043 1044const __m512i lhs_mat_01_2_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_2 , (_MM_PERM_ENUM )245 );//A0(20-23) A0(20-23) A1(20-23) A1(20-23) A0(20-23) A0(20-23) A1(20-23) A1(20-23) A0(20-23) A0(20-23) A1(20-23) A1(20-23) A0(20-23) A0(20-23) A1(20-23) A1(20-23) 1045const __m512i lhs_mat_23_2_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_2 , (_MM_PERM_ENUM )245 );//A2(20-23) A2(20-23) A3(20-23) A3(20-23) A2(20-23) A2(20-23) A3(20-23) A3(20-23) A2(20-23) A2(20-23) A3(20-23) A3(20-23) A2(20-23) A2(20-23) A3(20-23) A3(20-23) 1046 1047const __m512i lhs_mat_01_3_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_3 , (_MM_PERM_ENUM )245 );//A0(28-31) A0(28-31) A1(28-31) A1(28-31) A0(28-31) A0(28-31) A1(28-31) A1(28-31) A0(28-31) A0(28-31) A1(28-31) A1(28-31) A0(28-31) A0(28-31) A1(28-31) A1(28-31) 1048const __m512i lhs_mat_23_3_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_3 , (_MM_PERM_ENUM )245 );//A2(28-31) A2(28-31) A3(28-31) A3(28-31) A2(28-31) A2(28-31) A3(28-31) A3(28-31) A2(28-31) A2(28-31) A3(28-31) A3(28-31) A2(28-31) A2(28-31) A3(28-31) A3(28-31) 1049 1050// The values arranged in shuffle patterns are operated with dot product operation within 32 bit lane i.e corresponding bytes and multiplied and added into 32 bit integers within 32 bit lane 1051// Resembles MMLAs into 2x2 matrices in ARM Version 1052const __m512i zero = _mm512_setzero_epi32 (); 1053__m512i iacc_mat_00_sp1 = mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (zero ,lhs_mat_01_3_sp1 ,rhs_mat_014589CD_3_sp1 ),lhs_mat_01_2_sp1 ,rhs_mat_014589CD_2_sp1 ),lhs_mat_01_1_sp1 ,rhs_mat_014589CD_1_sp1 ),lhs_mat_01_0_sp1 ,rhs_mat_014589CD_0_sp1 ); 1054__m512i iacc_mat_01_sp1 = mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (zero ,lhs_mat_01_3_sp1 ,rhs_mat_2367ABEF_3_sp1 ),lhs_mat_01_2_sp1 ,rhs_mat_2367ABEF_2_sp1 ),lhs_mat_01_1_sp1 ,rhs_mat_2367ABEF_1_sp1 ),lhs_mat_01_0_sp1 ,rhs_mat_2367ABEF_0_sp1 ); 1055__m512i iacc_mat_10_sp1 = mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (zero ,lhs_mat_23_3_sp1 ,rhs_mat_014589CD_3_sp1 ),lhs_mat_23_2_sp1 ,rhs_mat_014589CD_2_sp1 ),lhs_mat_23_1_sp1 ,rhs_mat_014589CD_1_sp1 ),lhs_mat_23_0_sp1 ,rhs_mat_014589CD_0_sp1 ); 1056__m512i iacc_mat_11_sp1 = mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (zero ,lhs_mat_23_3_sp1 ,rhs_mat_2367ABEF_3_sp1 ),lhs_mat_23_2_sp1 ,rhs_mat_2367ABEF_2_sp1 ),lhs_mat_23_1_sp1 ,rhs_mat_2367ABEF_1_sp1 ),lhs_mat_23_0_sp1 ,rhs_mat_2367ABEF_0_sp1 ); 1057__m512i iacc_mat_00_sp2 = mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (zero ,lhs_mat_01_3_sp2 ,rhs_mat_014589CD_3_sp2 ),lhs_mat_01_2_sp2 ,rhs_mat_014589CD_2_sp2 ),lhs_mat_01_1_sp2 ,rhs_mat_014589CD_1_sp2 ),lhs_mat_01_0_sp2 ,rhs_mat_014589CD_0_sp2 ); 1058__m512i iacc_mat_01_sp2 = mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (zero ,lhs_mat_01_3_sp2 ,rhs_mat_2367ABEF_3_sp2 ),lhs_mat_01_2_sp2 ,rhs_mat_2367ABEF_2_sp2 ),lhs_mat_01_1_sp2 ,rhs_mat_2367ABEF_1_sp2 ),lhs_mat_01_0_sp2 ,rhs_mat_2367ABEF_0_sp2 ); 1059__m512i iacc_mat_10_sp2 = mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (zero ,lhs_mat_23_3_sp2 ,rhs_mat_014589CD_3_sp2 ),lhs_mat_23_2_sp2 ,rhs_mat_014589CD_2_sp2 ),lhs_mat_23_1_sp2 ,rhs_mat_014589CD_1_sp2 ),lhs_mat_23_0_sp2 ,rhs_mat_014589CD_0_sp2 ); 1060__m512i iacc_mat_11_sp2 = mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (mul_sum_i8_pairs_acc_int32x16 (zero ,lhs_mat_23_3_sp2 ,rhs_mat_2367ABEF_3_sp2 ),lhs_mat_23_2_sp2 ,rhs_mat_2367ABEF_2_sp2 ),lhs_mat_23_1_sp2 ,rhs_mat_2367ABEF_1_sp2 ),lhs_mat_23_0_sp2 ,rhs_mat_2367ABEF_0_sp2 ); 1061 1062// Output of both shuffle patterns are added in order to sum dot product outputs of all 32 values in block 1063__m512i iacc_mat_00 = _mm512_add_epi32 (iacc_mat_00_sp1 ,iacc_mat_00_sp2 ); 1064__m512i iacc_mat_01 = _mm512_add_epi32 (iacc_mat_01_sp1 ,iacc_mat_01_sp2 ); 1065__m512i iacc_mat_10 = _mm512_add_epi32 (iacc_mat_10_sp1 ,iacc_mat_10_sp2 ); 1066__m512i iacc_mat_11 = _mm512_add_epi32 (iacc_mat_11_sp1 ,iacc_mat_11_sp2 ); 1067 1068 1069// Straighten out to make 4 row vectors 1070__m512i iacc_row_0 = _mm512_mask_blend_epi32 (0xCCCC ,iacc_mat_00 ,_mm512_shuffle_epi32 (iacc_mat_01 , (_MM_PERM_ENUM )78 )); 1071__m512i iacc_row_1 = _mm512_mask_blend_epi32 (0xCCCC ,_mm512_shuffle_epi32 (iacc_mat_00 , (_MM_PERM_ENUM )78 ),iacc_mat_01 ); 1072__m512i iacc_row_2 = _mm512_mask_blend_epi32 (0xCCCC ,iacc_mat_10 ,_mm512_shuffle_epi32 (iacc_mat_11 , (_MM_PERM_ENUM )78 )); 1073__m512i iacc_row_3 = _mm512_mask_blend_epi32 (0xCCCC ,_mm512_shuffle_epi32 (iacc_mat_10 , (_MM_PERM_ENUM )78 ),iacc_mat_11 ); 1074 1075// Load the scale(d) values for all the 4 Q8_0 blocks and repeat it across lanes 1076const __m128i row_scale_f16 = _mm_shuffle_epi32 (_mm_maskload_epi32 ((int const * )(a_ptr [b ].d ),loadMask ),68 ); 1077const __m512 row_scale_f32 = GGML_F32Cx16_REPEAT_LOAD (row_scale_f16 ); 1078 1079// Multiply with appropriate scales and accumulate 1080acc_rows [0 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_0 ),_mm512_mul_ps (col_scale_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,0 )),acc_rows [0 ]); 1081acc_rows [1 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_1 ),_mm512_mul_ps (col_scale_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,85 )),acc_rows [1 ]); 1082acc_rows [2 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_2 ),_mm512_mul_ps (col_scale_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,170 )),acc_rows [2 ]); 1083acc_rows [3 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_3 ),_mm512_mul_ps (col_scale_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,255 )),acc_rows [3 ]); 1084 } 1085 1086// Store the accumulated values 1087for (int i = 0 ;i < 4 ;i ++ ) { 1088_mm512_storeu_ps ((float * )(s + ((y * 4 + i )* bs + x * 8 )),acc_rows [i ]); 1089 } 1090 } 1091 } 1092if (anc != nc ) { 1093xstart = anc /8 ; 1094y = 0 ; 1095 } 1096#endif // __AVX512BW__ && __AVX512DQ__ 1097 1098// Take group of four block_q8_0x4 structures at each pass of the loop and perform dot product operation 1099 1100for (;y < anr /4 ;y += 4 ) { 1101const block_q8_0x4 * a_ptrs [4 ]; 1102 1103a_ptrs [0 ]= a_ptr_start + (y * nb ); 1104for (int i = 0 ;i < 3 ;++ i ) { 1105a_ptrs [i + 1 ]= a_ptrs [i ]+ nb ; 1106 } 1107 1108// Take group of eight block_tx8 structures at each pass of the loop and perform dot product operation 1109for (int64_t x = xstart ;x < nc /8 ;x ++ ) { 1110 1111const block_tx8 * b_ptr = b_ptr_start + (x * b_nb ); 1112 1113// Master FP accumulators 1114__m256 acc_rows [16 ]; 1115for (int i = 0 ;i < 16 ;i ++ ) { 1116acc_rows [i ]= _mm256_setzero_ps (); 1117 } 1118 1119for (int64_t b = 0 ;b < nb ;b ++ ) { 1120// Load the eight blocks of quantized values interleaved with each other in chunks of eight - B0,B1 ....B6,B7 1121const __m256i rhs_raw_mat_0123_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs )); 1122const __m256i rhs_raw_mat_4567_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 32 )); 1123const __m256i rhs_raw_mat_0123_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 64 )); 1124const __m256i rhs_raw_mat_4567_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 96 )); 1125 1126// Save the values in the following vectors in the formats B0B1B4B5, B2B3B6B7 for further processing and storing of values 1127const __m256i rhs_raw_mat_0145_0 = _mm256_blend_epi32 (rhs_raw_mat_0123_0 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_0 ,requiredOrder ),240 ); 1128const __m256i rhs_raw_mat_2367_0 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_0 ,requiredOrder ),rhs_raw_mat_4567_0 ,240 ); 1129const __m256i rhs_raw_mat_0145_1 = _mm256_blend_epi32 (rhs_raw_mat_0123_1 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_1 ,requiredOrder ),240 ); 1130const __m256i rhs_raw_mat_2367_1 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_1 ,requiredOrder ),rhs_raw_mat_4567_1 ,240 ); 1131 1132// 4-bit -> 8-bit - Sign is maintained 1133const __m256i rhs_mat_0145_0 = _mm256_shuffle_epi8 (signextendlut ,_mm256_and_si256 (rhs_raw_mat_0145_0 ,m4b ));//B0(0-7) B1(0-7) B4(0-7) B5(0-7) 1134const __m256i rhs_mat_2367_0 = _mm256_shuffle_epi8 (signextendlut ,_mm256_and_si256 (rhs_raw_mat_2367_0 ,m4b ));//B2(0-7) B3(0-7) B6(0-7) B7(0-7) 1135 1136const __m256i rhs_mat_0145_1 = _mm256_shuffle_epi8 (signextendlut ,_mm256_and_si256 (rhs_raw_mat_0145_1 ,m4b ));//B0(8-15) B1(8-15) B4(8-15) B5(8-15) 1137const __m256i rhs_mat_2367_1 = _mm256_shuffle_epi8 (signextendlut ,_mm256_and_si256 (rhs_raw_mat_2367_1 ,m4b ));//B2(8-15) B3(8-15) B6(8-15) B7(8-15) 1138 1139const __m256i rhs_mat_0145_2 = _mm256_shuffle_epi8 (signextendlut ,_mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_0145_0 ,4 ),m4b ));//B0(16-23) B1(16-23) B4(16-23) B5(16-23) 1140const __m256i rhs_mat_2367_2 = _mm256_shuffle_epi8 (signextendlut ,_mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_2367_0 ,4 ),m4b ));//B2(16-23) B3(16-23) B6(16-23) B7(16-23) 1141 1142const __m256i rhs_mat_0145_3 = _mm256_shuffle_epi8 (signextendlut ,_mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_0145_1 ,4 ),m4b ));//B0(24-31) B1(24-31) B4(24-31) B5(24-31) 1143const __m256i rhs_mat_2367_3 = _mm256_shuffle_epi8 (signextendlut ,_mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_2367_1 ,4 ),m4b ));//B2(24-31) B3(24-31) B6(24-31) B7(24-31) 1144 1145// Shuffle pattern one - right side input 1146const __m256i rhs_mat_0145_0_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_0 ,136 );//B0(0-3) B1(0-3) B0(0-3) B1(0-3) B4(0-3) B5(0-3) B4(0-3) B5(0-3) 1147const __m256i rhs_mat_2367_0_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_0 ,136 );//B2(0-3) B3(0-3) B2(0-3) B3(0-3) B6(0-3) B7(0-3) B6(0-3) B7(0-3) 1148 1149const __m256i rhs_mat_0145_1_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_1 ,136 );//B0(8-11) B1(8-11) B0(8-11) B1(8-11) B4(8-11) B5(8-11) B4(8-11) B5(8-11) 1150const __m256i rhs_mat_2367_1_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_1 ,136 );//B2(8-11) B3(8-11) B2(8-11) B3(8-11) B6(8-11) B7(8-11) B6(8-11) B7(8-11) 1151 1152const __m256i rhs_mat_0145_2_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_2 ,136 );//B0(16-19) B1(16-19) B0(16-19) B1(16-19) B4(16-19) B5(16-19) B4(16-19) B5(16-19) 1153const __m256i rhs_mat_2367_2_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_2 ,136 );//B2(16-19) B3(16-19) B2(16-19) B3(16-19) B6(16-19) B7(16-19) B6(16-19) B7(16-19) 1154 1155const __m256i rhs_mat_0145_3_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_3 ,136 );//B0(24-27) B1(24-27) B0(24-27) B1(24-27) B4(24-27) B5(24-27) B4(24-27) B5(24-27) 1156const __m256i rhs_mat_2367_3_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_3 ,136 );//B2(24-27) B3(24-27) B2(24-27) B3(24-27) B6(24-27) B7(24-27) B6(24-27) B7(24-27) 1157 1158// Shuffle pattern two - right side input 1159 1160const __m256i rhs_mat_0145_0_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_0 ,221 );//B0(4-7) B1(4-7) B0(4-7) B1(4-7) B4(4-7) B5(4-7) B4(4-7) B5(4-7) 1161const __m256i rhs_mat_2367_0_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_0 ,221 );//B2(4-7) B3(4-7) B2(4-7) B3(4-7) B6(4-7) B7(4-7) B6(4-7) B7(4-7) 1162 1163const __m256i rhs_mat_0145_1_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_1 ,221 );//B0(12-15) B1(12-15) B0(12-15) B1(12-15) B4(12-15) B5(12-15) B4(12-15) B5(12-15) 1164const __m256i rhs_mat_2367_1_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_1 ,221 );//B2(12-15) B3(12-15) B2(12-15) B3(12-15) B6(12-15) B7(12-15) B6(12-15) B7(12-15) 1165 1166const __m256i rhs_mat_0145_2_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_2 ,221 );//B0(20-23) B1(20-23) B0(20-23) B1(20-23) B4(20-23) B5(20-23) B4(20-23) B5(20-23) 1167const __m256i rhs_mat_2367_2_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_2 ,221 );//B2(20-23) B3(20-23) B2(20-23) B3(20-23) B6(20-23) B7(20-23) B6(20-23) B7(20-23) 1168 1169const __m256i rhs_mat_0145_3_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_3 ,221 );//B0(28-31) B1(28-31) B0(28-31) B1(28-31) B4(28-31) B5(28-31) B4(28-31) B5(28-31) 1170const __m256i rhs_mat_2367_3_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_3 ,221 );//B2(28-31) B3(28-31) B2(28-31) B3(28-31) B6(28-31) B7(28-31) B6(28-31) B7(28-31) 1171 1172// Scale values - Load the wight scale values of block_tx8 1173__m256 col_scale_f32 ; 1174if constexpr ( 1175 std::is_same_v < block_tx8 ,block_q4_0x8 > || 1176 std::is_same_v < block_tx8 ,block_iq4_nlx8 > ) { 1177col_scale_f32 = GGML_F32Cx8_LOAD (b_ptr [b ].d ); 1178 }else if constexpr (std::is_same_v < block_tx8 ,block_mxfp4x8 > ) { 1179col_scale_f32 = _mm256_set_ps ( 1180GGML_CPU_E8M0_TO_FP32_HALF (b_ptr [b ].e [7 ]), 1181GGML_CPU_E8M0_TO_FP32_HALF (b_ptr [b ].e [6 ]), 1182GGML_CPU_E8M0_TO_FP32_HALF (b_ptr [b ].e [5 ]), 1183GGML_CPU_E8M0_TO_FP32_HALF (b_ptr [b ].e [4 ]), 1184GGML_CPU_E8M0_TO_FP32_HALF (b_ptr [b ].e [3 ]), 1185GGML_CPU_E8M0_TO_FP32_HALF (b_ptr [b ].e [2 ]), 1186GGML_CPU_E8M0_TO_FP32_HALF (b_ptr [b ].e [1 ]), 1187GGML_CPU_E8M0_TO_FP32_HALF (b_ptr [b ].e [0 ])); 1188 } 1189 1190// Process LHS in groups of four 1191for (int rp = 0 ;rp < 4 ;rp ++ ) { 1192// Load the four blocks of quantized values interleaved with each other in chunks of eight - A0,A1,A2,A3 1193// Loaded as set of 128 bit vectors and repeated into a 256 bit vector 1194__m256i lhs_mat_0123_0 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs ))); 1195__m256i lhs_mat_01_0 = _mm256_permute2f128_si256 (lhs_mat_0123_0 ,lhs_mat_0123_0 ,0 ); 1196__m256i lhs_mat_23_0 = _mm256_permute2f128_si256 (lhs_mat_0123_0 ,lhs_mat_0123_0 ,17 ); 1197__m256i lhs_mat_0123_1 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 32 ))); 1198__m256i lhs_mat_01_1 = _mm256_permute2f128_si256 (lhs_mat_0123_1 ,lhs_mat_0123_1 ,0 ); 1199__m256i lhs_mat_23_1 = _mm256_permute2f128_si256 (lhs_mat_0123_1 ,lhs_mat_0123_1 ,17 ); 1200__m256i lhs_mat_0123_2 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 64 ))); 1201__m256i lhs_mat_01_2 = _mm256_permute2f128_si256 (lhs_mat_0123_2 ,lhs_mat_0123_2 ,0 ); 1202__m256i lhs_mat_23_2 = _mm256_permute2f128_si256 (lhs_mat_0123_2 ,lhs_mat_0123_2 ,17 ); 1203__m256i lhs_mat_0123_3 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 96 ))); 1204__m256i lhs_mat_01_3 = _mm256_permute2f128_si256 (lhs_mat_0123_3 ,lhs_mat_0123_3 ,0 ); 1205__m256i lhs_mat_23_3 = _mm256_permute2f128_si256 (lhs_mat_0123_3 ,lhs_mat_0123_3 ,17 ); 1206 1207// Shuffle pattern one - left side input 1208const __m256i lhs_mat_01_0_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_0 ,160 );//A0(0-3) A0(0-3) A1(0-3) A1(0-3) A0(0-3) A0(0-3) A1(0-3) A1(0-3) 1209const __m256i lhs_mat_23_0_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_0 ,160 );//A2(0-3) A2(0-3) A3(0-3) A3(0-3) A2(0-3) A2(0-3) A3(0-3) A3(0-3) 1210 1211const __m256i lhs_mat_01_1_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_1 ,160 );//A0(8-11) A0(8-11) A1(8-11) A1(8-11) A0(8-11) A0(8-11) A1(8-11) A1(8-11) 1212const __m256i lhs_mat_23_1_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_1 ,160 );//A2(8-11) A2(8-11) A3(8-11) A3(8-11) A2(8-11) A2(8-11) A3(8-11) A3(8-11) 1213 1214const __m256i lhs_mat_01_2_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_2 ,160 );//A0(16-19) A0(16-19) A1(16-19) A1(16-19) A0(16-19) A0(16-19) A1(16-19) A1(16-19) 1215const __m256i lhs_mat_23_2_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_2 ,160 );//A2(16-19) A2(16-19) A3(16-19) A3(16-19) A2(16-19) A2(16-19) A3(16-19) A3(16-19) 1216 1217const __m256i lhs_mat_01_3_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_3 ,160 );//A0(24-27) A0(24-27) A1(24-27) A1(24-27) A0(24-27) A0(24-27) A1(24-27) A1(24-27) 1218const __m256i lhs_mat_23_3_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_3 ,160 );//A2(24-27) A2(24-27) A3(24-27) A3(24-27) A2(24-27) A2(24-27) A3(24-27) A3(24-27) 1219 1220// Shuffle pattern two - left side input 1221const __m256i lhs_mat_01_0_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_0 ,245 );//A0(4-7) A0(4-7) A1(4-7) A1(4-7) A0(4-7) A0(4-7) A1(4-7) A1(4-7) 1222const __m256i lhs_mat_23_0_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_0 ,245 );//A2(4-7) A2(4-7) A3(4-7) A3(4-7) A2(4-7) A2(4-7) A3(4-7) A3(4-7) 1223 1224const __m256i lhs_mat_01_1_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_1 ,245 );//A0(12-15) A0(12-15) A1(12-15) A1(12-15) A0(12-15) A0(12-15) A1(12-15) A1(12-15) 1225const __m256i lhs_mat_23_1_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_1 ,245 );//A2(12-15) A2(12-15) A3(12-15) A3(12-15) A2(12-15) A2(12-15) A3(12-15) A3(12-15) 1226 1227const __m256i lhs_mat_01_2_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_2 ,245 );//A0(20-23) A0(20-23) A1(20-23) A1(20-23) A0(20-23) A0(20-23) A1(20-23) A1(20-23) 1228const __m256i lhs_mat_23_2_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_2 ,245 );//A2(20-23) A2(20-23) A3(20-23) A3(20-23) A2(20-23) A2(20-23) A3(20-23) A3(20-23) 1229 1230const __m256i lhs_mat_01_3_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_3 ,245 );//A0(28-31) A0(28-31) A1(28-31) A1(28-31) A0(28-31) A0(28-31) A1(28-31) A1(28-31) 1231const __m256i lhs_mat_23_3_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_3 ,245 );//A2(28-31) A2(28-31) A3(28-31) A3(28-31) A2(28-31) A2(28-31) A3(28-31) A3(28-31) 1232 1233// The values arranged in shuffle patterns are operated with dot product operation within 32 bit lane i.e corresponding bytes and multiplied and added into 32 bit integers within 32 bit lane 1234// Resembles MMLAs into 2x2 matrices in ARM Version 1235const __m256i zero = _mm256_setzero_si256 (); 1236__m256i iacc_mat_00_sp1 = mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (zero ,lhs_mat_01_3_sp1 ,rhs_mat_0145_3_sp1 ),lhs_mat_01_2_sp1 ,rhs_mat_0145_2_sp1 ),lhs_mat_01_1_sp1 ,rhs_mat_0145_1_sp1 ),lhs_mat_01_0_sp1 ,rhs_mat_0145_0_sp1 ); 1237__m256i iacc_mat_01_sp1 = mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (zero ,lhs_mat_01_3_sp1 ,rhs_mat_2367_3_sp1 ),lhs_mat_01_2_sp1 ,rhs_mat_2367_2_sp1 ),lhs_mat_01_1_sp1 ,rhs_mat_2367_1_sp1 ),lhs_mat_01_0_sp1 ,rhs_mat_2367_0_sp1 ); 1238__m256i iacc_mat_10_sp1 = mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (zero ,lhs_mat_23_3_sp1 ,rhs_mat_0145_3_sp1 ),lhs_mat_23_2_sp1 ,rhs_mat_0145_2_sp1 ),lhs_mat_23_1_sp1 ,rhs_mat_0145_1_sp1 ),lhs_mat_23_0_sp1 ,rhs_mat_0145_0_sp1 ); 1239__m256i iacc_mat_11_sp1 = mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (zero ,lhs_mat_23_3_sp1 ,rhs_mat_2367_3_sp1 ),lhs_mat_23_2_sp1 ,rhs_mat_2367_2_sp1 ),lhs_mat_23_1_sp1 ,rhs_mat_2367_1_sp1 ),lhs_mat_23_0_sp1 ,rhs_mat_2367_0_sp1 ); 1240__m256i iacc_mat_00_sp2 = mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (zero ,lhs_mat_01_3_sp2 ,rhs_mat_0145_3_sp2 ),lhs_mat_01_2_sp2 ,rhs_mat_0145_2_sp2 ),lhs_mat_01_1_sp2 ,rhs_mat_0145_1_sp2 ),lhs_mat_01_0_sp2 ,rhs_mat_0145_0_sp2 ); 1241__m256i iacc_mat_01_sp2 = mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (zero ,lhs_mat_01_3_sp2 ,rhs_mat_2367_3_sp2 ),lhs_mat_01_2_sp2 ,rhs_mat_2367_2_sp2 ),lhs_mat_01_1_sp2 ,rhs_mat_2367_1_sp2 ),lhs_mat_01_0_sp2 ,rhs_mat_2367_0_sp2 ); 1242__m256i iacc_mat_10_sp2 = mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (zero ,lhs_mat_23_3_sp2 ,rhs_mat_0145_3_sp2 ),lhs_mat_23_2_sp2 ,rhs_mat_0145_2_sp2 ),lhs_mat_23_1_sp2 ,rhs_mat_0145_1_sp2 ),lhs_mat_23_0_sp2 ,rhs_mat_0145_0_sp2 ); 1243__m256i iacc_mat_11_sp2 = mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (zero ,lhs_mat_23_3_sp2 ,rhs_mat_2367_3_sp2 ),lhs_mat_23_2_sp2 ,rhs_mat_2367_2_sp2 ),lhs_mat_23_1_sp2 ,rhs_mat_2367_1_sp2 ),lhs_mat_23_0_sp2 ,rhs_mat_2367_0_sp2 ); 1244 1245// Output of both shuffle patterns are added in order to sum dot product outputs of all 32 values in block 1246__m256i iacc_mat_00 = _mm256_add_epi32 (iacc_mat_00_sp1 ,iacc_mat_00_sp2 ); 1247__m256i iacc_mat_01 = _mm256_add_epi32 (iacc_mat_01_sp1 ,iacc_mat_01_sp2 ); 1248__m256i iacc_mat_10 = _mm256_add_epi32 (iacc_mat_10_sp1 ,iacc_mat_10_sp2 ); 1249__m256i iacc_mat_11 = _mm256_add_epi32 (iacc_mat_11_sp1 ,iacc_mat_11_sp2 ); 1250 1251// Straighten out to make 4 row vectors 1252__m256i iacc_row_0 = _mm256_blend_epi32 (iacc_mat_00 ,_mm256_shuffle_epi32 (iacc_mat_01 ,78 ),204 ); 1253__m256i iacc_row_1 = _mm256_blend_epi32 (_mm256_shuffle_epi32 (iacc_mat_00 ,78 ),iacc_mat_01 ,204 ); 1254__m256i iacc_row_2 = _mm256_blend_epi32 (iacc_mat_10 ,_mm256_shuffle_epi32 (iacc_mat_11 ,78 ),204 ); 1255__m256i iacc_row_3 = _mm256_blend_epi32 (_mm256_shuffle_epi32 (iacc_mat_10 ,78 ),iacc_mat_11 ,204 ); 1256 1257// Load the scale(d) values for all the 4 Q8_0 blocks and repeat it across lanes 1258const __m256 row_scale_f32 = GGML_F32Cx8_REPEAT_LOAD (a_ptrs [rp ][b ].d ,loadMask ); 1259 1260// Multiply with appropriate scales and accumulate 1261acc_rows [rp * 4 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_0 ),_mm256_mul_ps (col_scale_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,0 )),acc_rows [rp * 4 ]); 1262acc_rows [rp * 4 + 1 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_1 ),_mm256_mul_ps (col_scale_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,85 )),acc_rows [rp * 4 + 1 ]); 1263acc_rows [rp * 4 + 2 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_2 ),_mm256_mul_ps (col_scale_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,170 )),acc_rows [rp * 4 + 2 ]); 1264acc_rows [rp * 4 + 3 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_3 ),_mm256_mul_ps (col_scale_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,255 )),acc_rows [rp * 4 + 3 ]); 1265 } 1266 } 1267 1268// Store the accumulated values 1269for (int i = 0 ;i < 16 ;i ++ ) { 1270_mm256_storeu_ps ((float * )(s + ((y * 4 + i )* bs + x * 8 )),acc_rows [i ]); 1271 } 1272 } 1273 } 1274 1275// Take a block_q8_0x4 structures at each pass of the loop and perform dot product operation 1276for (;y < nr /4 ;y ++ ) { 1277const block_q8_0x4 * a_ptr = a_ptr_start + (y * nb ); 1278 1279// Load the eight blocks of quantized values interleaved with each other in chunks of eight - B0,B1 ....B6,B7 1280for (int64_t x = xstart ;x < nc /8 ;x ++ ) { 1281const block_tx8 * b_ptr = b_ptr_start + (x * b_nb ); 1282 1283// Master FP accumulators 1284__m256 acc_rows [4 ]; 1285for (int i = 0 ;i < 4 ;i ++ ) { 1286acc_rows [i ]= _mm256_setzero_ps (); 1287 } 1288 1289for (int64_t b = 0 ;b < nb ;b ++ ) { 1290// Load the eight block_q8_0 quantized values interleaved with each other in chunks of eight - B0,B1 ....B6,B7 1291const __m256i rhs_raw_mat_0123_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs )); 1292const __m256i rhs_raw_mat_4567_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 32 )); 1293const __m256i rhs_raw_mat_0123_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 64 )); 1294const __m256i rhs_raw_mat_4567_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 96 )); 1295 1296// Save the values in the following vectors in the formats B0B1B4B5, B2B3B6B7 for further processing and storing of values 1297const __m256i rhs_raw_mat_0145_0 = _mm256_blend_epi32 (rhs_raw_mat_0123_0 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_0 ,requiredOrder ),240 ); 1298const __m256i rhs_raw_mat_2367_0 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_0 ,requiredOrder ),rhs_raw_mat_4567_0 ,240 ); 1299const __m256i rhs_raw_mat_0145_1 = _mm256_blend_epi32 (rhs_raw_mat_0123_1 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_1 ,requiredOrder ),240 ); 1300const __m256i rhs_raw_mat_2367_1 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_1 ,requiredOrder ),rhs_raw_mat_4567_1 ,240 ); 1301 1302// 4-bit -> 8-bit - Sign is maintained 1303const __m256i rhs_mat_0145_0 = _mm256_shuffle_epi8 (signextendlut ,_mm256_and_si256 (rhs_raw_mat_0145_0 ,m4b ));//B0(0-7) B1(0-7) B4(0-7) B5(0-7) 1304const __m256i rhs_mat_2367_0 = _mm256_shuffle_epi8 (signextendlut ,_mm256_and_si256 (rhs_raw_mat_2367_0 ,m4b ));//B2(0-7) B3(0-7) B6(0-7) B7(0-7) 1305 1306const __m256i rhs_mat_0145_1 = _mm256_shuffle_epi8 (signextendlut ,_mm256_and_si256 (rhs_raw_mat_0145_1 ,m4b ));//B0(8-15) B1(8-15) B4(8-15) B5(8-15) 1307const __m256i rhs_mat_2367_1 = _mm256_shuffle_epi8 (signextendlut ,_mm256_and_si256 (rhs_raw_mat_2367_1 ,m4b ));//B2(8-15) B3(8-15) B6(8-15) B7(8-15) 1308 1309const __m256i rhs_mat_0145_2 = _mm256_shuffle_epi8 (signextendlut ,_mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_0145_0 ,4 ),m4b ));//B0(16-23) B1(16-23) B4(16-23) B5(16-23) 1310const __m256i rhs_mat_2367_2 = _mm256_shuffle_epi8 (signextendlut ,_mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_2367_0 ,4 ),m4b ));//B2(16-23) B3(16-23) B6(16-23) B7(16-23) 1311 1312const __m256i rhs_mat_0145_3 = _mm256_shuffle_epi8 (signextendlut ,_mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_0145_1 ,4 ),m4b ));//B0(24-31) B1(24-31) B4(24-31) B5(24-31) 1313const __m256i rhs_mat_2367_3 = _mm256_shuffle_epi8 (signextendlut ,_mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_2367_1 ,4 ),m4b ));//B2(24-31) B3(24-31) B6(24-31) B7(24-31) 1314 1315// Shuffle pattern one - right side input 1316const __m256i rhs_mat_0145_0_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_0 ,136 );//B0(0-3) B1(0-3) B0(0-3) B1(0-3) B4(0-3) B5(0-3) B4(0-3) B5(0-3) 1317const __m256i rhs_mat_2367_0_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_0 ,136 );//B2(0-3) B3(0-3) B2(0-3) B3(0-3) B6(0-3) B7(0-3) B6(0-3) B7(0-3) 1318 1319const __m256i rhs_mat_0145_1_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_1 ,136 );//B0(8-11) B1(8-11) B0(8-11) B1(8-11) B4(8-11) B5(8-11) B4(8-11) B5(8-11) 1320const __m256i rhs_mat_2367_1_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_1 ,136 );//B2(8-11) B3(8-11) B2(8-11) B3(8-11) B6(8-11) B7(8-11) B6(8-11) B7(8-11) 1321 1322const __m256i rhs_mat_0145_2_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_2 ,136 );//B0(16-19) B1(16-19) B0(16-19) B1(16-19) B4(16-19) B5(16-19) B4(16-19) B5(16-19) 1323const __m256i rhs_mat_2367_2_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_2 ,136 );//B2(16-19) B3(16-19) B2(16-19) B3(16-19) B6(16-19) B7(16-19) B6(16-19) B7(16-19) 1324 1325const __m256i rhs_mat_0145_3_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_3 ,136 );//B0(24-27) B1(24-27) B0(24-27) B1(24-27) B4(24-27) B5(24-27) B4(24-27) B5(24-27) 1326const __m256i rhs_mat_2367_3_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_3 ,136 );//B2(24-27) B3(24-27) B2(24-27) B3(24-27) B6(24-27) B7(24-27) B6(24-27) B7(24-27) 1327 1328// Shuffle pattern two - right side input 1329 1330const __m256i rhs_mat_0145_0_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_0 ,221 );//B0(4-7) B1(4-7) B0(4-7) B1(4-7) B4(4-7) B5(4-7) B4(4-7) B5(4-7) 1331const __m256i rhs_mat_2367_0_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_0 ,221 );//B2(4-7) B3(4-7) B2(4-7) B3(4-7) B6(4-7) B7(4-7) B6(4-7) B7(4-7) 1332 1333const __m256i rhs_mat_0145_1_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_1 ,221 );//B0(12-15) B1(12-15) B0(12-15) B1(12-15) B4(12-15) B5(12-15) B4(12-15) B5(12-15) 1334const __m256i rhs_mat_2367_1_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_1 ,221 );//B2(12-15) B3(12-15) B2(12-15) B3(12-15) B6(12-15) B7(12-15) B6(12-15) B7(12-15) 1335 1336const __m256i rhs_mat_0145_2_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_2 ,221 );//B0(20-23) B1(20-23) B0(20-23) B1(20-23) B4(20-23) B5(20-23) B4(20-23) B5(20-23) 1337const __m256i rhs_mat_2367_2_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_2 ,221 );//B2(20-23) B3(20-23) B2(20-23) B3(20-23) B6(20-23) B7(20-23) B6(20-23) B7(20-23) 1338 1339const __m256i rhs_mat_0145_3_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_3 ,221 );//B0(28-31) B1(28-31) B0(28-31) B1(28-31) B4(28-31) B5(28-31) B4(28-31) B5(28-31) 1340const __m256i rhs_mat_2367_3_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_3 ,221 );//B2(28-31) B3(28-31) B2(28-31) B3(28-31) B6(28-31) B7(28-31) B6(28-31) B7(28-31) 1341 1342// Scale values - Load the wight scale values of block_tx8 1343__m256 col_scale_f32 ; 1344if constexpr ( 1345 std::is_same_v < block_tx8 ,block_q4_0x8 > || 1346 std::is_same_v < block_tx8 ,block_iq4_nlx8 > ) { 1347col_scale_f32 = GGML_F32Cx8_LOAD (b_ptr [b ].d ); 1348 }else if constexpr (std::is_same_v < block_tx8 ,block_mxfp4x8 > ) { 1349col_scale_f32 = _mm256_set_ps ( 1350GGML_CPU_E8M0_TO_FP32_HALF (b_ptr [b ].e [7 ]), 1351GGML_CPU_E8M0_TO_FP32_HALF (b_ptr [b ].e [6 ]), 1352GGML_CPU_E8M0_TO_FP32_HALF (b_ptr [b ].e [5 ]), 1353GGML_CPU_E8M0_TO_FP32_HALF (b_ptr [b ].e [4 ]), 1354GGML_CPU_E8M0_TO_FP32_HALF (b_ptr [b ].e [3 ]), 1355GGML_CPU_E8M0_TO_FP32_HALF (b_ptr [b ].e [2 ]), 1356GGML_CPU_E8M0_TO_FP32_HALF (b_ptr [b ].e [1 ]), 1357GGML_CPU_E8M0_TO_FP32_HALF (b_ptr [b ].e [0 ])); 1358 } 1359 1360// Load the four blocks of quantized values interleaved with each other in chunks of eight - A0,A1,A2,A3 1361// Loaded as set of 128 bit vectors and repeated into a 256 bit vector 1362__m256i lhs_mat_0123_0 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs ))); 1363__m256i lhs_mat_01_0 = _mm256_permute2f128_si256 (lhs_mat_0123_0 ,lhs_mat_0123_0 ,0 ); 1364__m256i lhs_mat_23_0 = _mm256_permute2f128_si256 (lhs_mat_0123_0 ,lhs_mat_0123_0 ,17 ); 1365__m256i lhs_mat_0123_1 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 32 ))); 1366__m256i lhs_mat_01_1 = _mm256_permute2f128_si256 (lhs_mat_0123_1 ,lhs_mat_0123_1 ,0 ); 1367__m256i lhs_mat_23_1 = _mm256_permute2f128_si256 (lhs_mat_0123_1 ,lhs_mat_0123_1 ,17 ); 1368__m256i lhs_mat_0123_2 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 64 ))); 1369__m256i lhs_mat_01_2 = _mm256_permute2f128_si256 (lhs_mat_0123_2 ,lhs_mat_0123_2 ,0 ); 1370__m256i lhs_mat_23_2 = _mm256_permute2f128_si256 (lhs_mat_0123_2 ,lhs_mat_0123_2 ,17 ); 1371__m256i lhs_mat_0123_3 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 96 ))); 1372__m256i lhs_mat_01_3 = _mm256_permute2f128_si256 (lhs_mat_0123_3 ,lhs_mat_0123_3 ,0 ); 1373__m256i lhs_mat_23_3 = _mm256_permute2f128_si256 (lhs_mat_0123_3 ,lhs_mat_0123_3 ,17 ); 1374 1375// Shuffle pattern one - left side input 1376 1377const __m256i lhs_mat_01_0_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_0 ,160 );//A0(0-3) A0(0-3) A1(0-3) A1(0-3) A0(0-3) A0(0-3) A1(0-3) A1(0-3) 1378const __m256i lhs_mat_23_0_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_0 ,160 );//A2(0-3) A2(0-3) A3(0-3) A3(0-3) A2(0-3) A2(0-3) A3(0-3) A3(0-3) 1379 1380const __m256i lhs_mat_01_1_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_1 ,160 );//A0(8-11) A0(8-11) A1(8-11) A1(8-11) A0(8-11) A0(8-11) A1(8-11) A1(8-11) 1381const __m256i lhs_mat_23_1_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_1 ,160 );//A2(8-11) A2(8-11) A3(8-11) A3(8-11) A2(8-11) A2(8-11) A3(8-11) A3(8-11) 1382 1383const __m256i lhs_mat_01_2_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_2 ,160 );//A0(16-19) A0(16-19) A1(16-19) A1(16-19) A0(16-19) A0(16-19) A1(16-19) A1(16-19) 1384const __m256i lhs_mat_23_2_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_2 ,160 );//A2(16-19) A2(16-19) A3(16-19) A3(16-19) A2(16-19) A2(16-19) A3(16-19) A3(16-19) 1385 1386const __m256i lhs_mat_01_3_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_3 ,160 );//A0(24-27) A0(24-27) A1(24-27) A1(24-27) A0(24-27) A0(24-27) A1(24-27) A1(24-27) 1387const __m256i lhs_mat_23_3_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_3 ,160 );//A2(24-27) A2(24-27) A3(24-27) A3(24-27) A2(24-27) A2(24-27) A3(24-27) A3(24-27) 1388 1389// Shuffle pattern two - left side input 1390 1391const __m256i lhs_mat_01_0_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_0 ,245 );//A0(4-7) A0(4-7) A1(4-7) A1(4-7) A0(4-7) A0(4-7) A1(4-7) A1(4-7) 1392const __m256i lhs_mat_23_0_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_0 ,245 );//A2(4-7) A2(4-7) A3(4-7) A3(4-7) A2(4-7) A2(4-7) A3(4-7) A3(4-7) 1393 1394const __m256i lhs_mat_01_1_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_1 ,245 );//A0(12-15) A0(12-15) A1(12-15) A1(12-15) A0(12-15) A0(12-15) A1(12-15) A1(12-15) 1395const __m256i lhs_mat_23_1_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_1 ,245 );//A2(12-15) A2(12-15) A3(12-15) A3(12-15) A2(12-15) A2(12-15) A3(12-15) A3(12-15) 1396 1397const __m256i lhs_mat_01_2_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_2 ,245 );//A0(20-23) A0(20-23) A1(20-23) A1(20-23) A0(20-23) A0(20-23) A1(20-23) A1(20-23) 1398const __m256i lhs_mat_23_2_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_2 ,245 );//A2(20-23) A2(20-23) A3(20-23) A3(20-23) A2(20-23) A2(20-23) A3(20-23) A3(20-23) 1399 1400const __m256i lhs_mat_01_3_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_3 ,245 );//A0(28-31) A0(28-31) A1(28-31) A1(28-31) A0(28-31) A0(28-31) A1(28-31) A1(28-31) 1401const __m256i lhs_mat_23_3_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_3 ,245 );//A2(28-31) A2(28-31) A3(28-31) A3(28-31) A2(28-31) A2(28-31) A3(28-31) A3(28-31) 1402 1403// The values arranged in shuffle patterns are operated with dot product operation within 32 bit lane i.e corresponding bytes and multiplied and added into 32 bit integers within 32 bit lane 1404// Resembles MMLAs into 2x2 matrices in ARM Version 1405const __m256i zero = _mm256_setzero_si256 (); 1406__m256i iacc_mat_00_sp1 = mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (zero ,lhs_mat_01_3_sp1 ,rhs_mat_0145_3_sp1 ),lhs_mat_01_2_sp1 ,rhs_mat_0145_2_sp1 ),lhs_mat_01_1_sp1 ,rhs_mat_0145_1_sp1 ),lhs_mat_01_0_sp1 ,rhs_mat_0145_0_sp1 ); 1407__m256i iacc_mat_01_sp1 = mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (zero ,lhs_mat_01_3_sp1 ,rhs_mat_2367_3_sp1 ),lhs_mat_01_2_sp1 ,rhs_mat_2367_2_sp1 ),lhs_mat_01_1_sp1 ,rhs_mat_2367_1_sp1 ),lhs_mat_01_0_sp1 ,rhs_mat_2367_0_sp1 ); 1408__m256i iacc_mat_10_sp1 = mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (zero ,lhs_mat_23_3_sp1 ,rhs_mat_0145_3_sp1 ),lhs_mat_23_2_sp1 ,rhs_mat_0145_2_sp1 ),lhs_mat_23_1_sp1 ,rhs_mat_0145_1_sp1 ),lhs_mat_23_0_sp1 ,rhs_mat_0145_0_sp1 ); 1409__m256i iacc_mat_11_sp1 = mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (zero ,lhs_mat_23_3_sp1 ,rhs_mat_2367_3_sp1 ),lhs_mat_23_2_sp1 ,rhs_mat_2367_2_sp1 ),lhs_mat_23_1_sp1 ,rhs_mat_2367_1_sp1 ),lhs_mat_23_0_sp1 ,rhs_mat_2367_0_sp1 ); 1410__m256i iacc_mat_00_sp2 = mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (zero ,lhs_mat_01_3_sp2 ,rhs_mat_0145_3_sp2 ),lhs_mat_01_2_sp2 ,rhs_mat_0145_2_sp2 ),lhs_mat_01_1_sp2 ,rhs_mat_0145_1_sp2 ),lhs_mat_01_0_sp2 ,rhs_mat_0145_0_sp2 ); 1411__m256i iacc_mat_01_sp2 = mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (zero ,lhs_mat_01_3_sp2 ,rhs_mat_2367_3_sp2 ),lhs_mat_01_2_sp2 ,rhs_mat_2367_2_sp2 ),lhs_mat_01_1_sp2 ,rhs_mat_2367_1_sp2 ),lhs_mat_01_0_sp2 ,rhs_mat_2367_0_sp2 ); 1412__m256i iacc_mat_10_sp2 = mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (zero ,lhs_mat_23_3_sp2 ,rhs_mat_0145_3_sp2 ),lhs_mat_23_2_sp2 ,rhs_mat_0145_2_sp2 ),lhs_mat_23_1_sp2 ,rhs_mat_0145_1_sp2 ),lhs_mat_23_0_sp2 ,rhs_mat_0145_0_sp2 ); 1413__m256i iacc_mat_11_sp2 = mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (mul_sum_i8_pairs_acc_int32x8 (zero ,lhs_mat_23_3_sp2 ,rhs_mat_2367_3_sp2 ),lhs_mat_23_2_sp2 ,rhs_mat_2367_2_sp2 ),lhs_mat_23_1_sp2 ,rhs_mat_2367_1_sp2 ),lhs_mat_23_0_sp2 ,rhs_mat_2367_0_sp2 ); 1414 1415// Output of both shuffle patterns are added in order to sum dot product outputs of all 32 values in block 1416__m256i iacc_mat_00 = _mm256_add_epi32 (iacc_mat_00_sp1 ,iacc_mat_00_sp2 ); 1417__m256i iacc_mat_01 = _mm256_add_epi32 (iacc_mat_01_sp1 ,iacc_mat_01_sp2 ); 1418__m256i iacc_mat_10 = _mm256_add_epi32 (iacc_mat_10_sp1 ,iacc_mat_10_sp2 ); 1419__m256i iacc_mat_11 = _mm256_add_epi32 (iacc_mat_11_sp1 ,iacc_mat_11_sp2 ); 1420 1421 1422// Straighten out to make 4 row vectors 1423__m256i iacc_row_0 = _mm256_blend_epi32 (iacc_mat_00 ,_mm256_shuffle_epi32 (iacc_mat_01 ,78 ),204 ); 1424__m256i iacc_row_1 = _mm256_blend_epi32 (_mm256_shuffle_epi32 (iacc_mat_00 ,78 ),iacc_mat_01 ,204 ); 1425__m256i iacc_row_2 = _mm256_blend_epi32 (iacc_mat_10 ,_mm256_shuffle_epi32 (iacc_mat_11 ,78 ),204 ); 1426__m256i iacc_row_3 = _mm256_blend_epi32 (_mm256_shuffle_epi32 (iacc_mat_10 ,78 ),iacc_mat_11 ,204 ); 1427 1428// Load the scale(d) values for all the 4 Q8_0 blocks and repeat it across lanes 1429const __m256 row_scale_f32 = GGML_F32Cx8_REPEAT_LOAD (a_ptr [b ].d ,loadMask ); 1430 1431// Multiply with appropriate scales and accumulate 1432acc_rows [0 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_0 ),_mm256_mul_ps (col_scale_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,0 )),acc_rows [0 ]); 1433acc_rows [1 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_1 ),_mm256_mul_ps (col_scale_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,85 )),acc_rows [1 ]); 1434acc_rows [2 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_2 ),_mm256_mul_ps (col_scale_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,170 )),acc_rows [2 ]); 1435acc_rows [3 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_3 ),_mm256_mul_ps (col_scale_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,255 )),acc_rows [3 ]); 1436 } 1437 1438// Store the accumulated values 1439for (int i = 0 ;i < 4 ;i ++ ) { 1440_mm256_storeu_ps ((float * )(s + ((y * 4 + i )* bs + x * 8 )),acc_rows [i ]); 1441 } 1442 } 1443 } 1444} 1445 1446#endif // defined(__AVX2__) || defined(__AVX512F__) 1447 1448void ggml_gemv_q4_0_8x8_q8_0 (int n ,float * GGML_RESTRICT s ,size_t bs ,const void * GGML_RESTRICT vx ,const void * GGML_RESTRICT vy ,int nr ,int nc ) { 1449#if defined(__AVX2__ )|| defined(__AVX512F__ ) 1450 { 1451// Lookup table to convert signed nibbles to signed bytes 1452__m256i signextendlut = _mm256_castsi128_si256 (_mm_set_epi8 (-1 ,-2 ,-3 ,-4 ,-5 ,-6 ,-7 ,-8 ,7 ,6 ,5 ,4 ,3 ,2 ,1 ,0 )); 1453signextendlut = _mm256_permute2f128_si256 (signextendlut ,signextendlut ,0 ); 1454 1455gemv_q4_b32_8x8_q8_0_lut_avx < block_q4_0x8 > (n ,s ,bs ,vx ,vy ,nr ,nc ,signextendlut ); 1456 1457return ; 1458 } 1459#endif 1460 1461ggml_gemv_q4_0_8x8_q8_0_generic (n ,s ,bs ,vx ,vy ,nr ,nc ); 1462} 1463 1464void ggml_gemv_q4_K_8x8_q8_K (int n ,float * GGML_RESTRICT s ,size_t bs ,const void * GGML_RESTRICT vx ,const void * GGML_RESTRICT vy ,int nr ,int nc ) { 1465const int qk = QK_K ; 1466const int nb = n /qk ; 1467const int ncols_interleaved = 8 ; 1468const int blocklen = 8 ; 1469static const uint32_t kmask1 = 0x3f3f3f3f ; 1470static const uint32_t kmask2 = 0x0f0f0f0f ; 1471static const uint32_t kmask3 = 0x03030303 ; 1472 1473assert (n %qk == 0 ); 1474assert (nc %ncols_interleaved == 0 ); 1475 1476UNUSED (s ); 1477UNUSED (bs ); 1478UNUSED (vx ); 1479UNUSED (vy ); 1480UNUSED (nr ); 1481UNUSED (nc ); 1482UNUSED (nb ); 1483UNUSED (ncols_interleaved ); 1484UNUSED (blocklen ); 1485 1486#if defined(__AVX2__ ) 1487// Lookup table to convert signed nibbles to signed bytes 1488__m256i signextendlut = _mm256_castsi128_si256 (_mm_set_epi8 (-1 ,-2 ,-3 ,-4 ,-5 ,-6 ,-7 ,-8 ,7 ,6 ,5 ,4 ,3 ,2 ,1 ,0 )); 1489signextendlut = _mm256_permute2f128_si256 (signextendlut ,signextendlut ,0 ); 1490// Shuffle masks to rearrange delta and scale values to multiply with appropriate scales 1491__m128i deltamask = _mm_set_epi8 (15 ,14 ,7 ,6 ,13 ,12 ,5 ,4 ,11 ,10 ,3 ,2 ,9 ,8 ,1 ,0 ); 1492__m128i scalemask = _mm_set_epi8 (7 ,7 ,3 ,3 ,6 ,6 ,2 ,2 ,5 ,5 ,1 ,1 ,4 ,4 ,0 ,0 ); 1493// Permute mask used for easier vector processing at later stages 1494__m256i finalpermutemask = _mm256_set_epi32 (7 ,5 ,3 ,1 ,6 ,4 ,2 ,0 ); 1495 1496// Mask to extract nibbles from bytes 1497const __m256i m4b = _mm256_set1_epi8 (0x0F ); 1498 1499int64_t b_nb = n /QK_K ; 1500 1501const block_q4_Kx8 * b_ptr_start = (const block_q4_Kx8 * )vx ; 1502const block_q8_K * a_ptr_start = (const block_q8_K * )vy ; 1503 1504// Process Q8_K blocks one by one 1505for (int64_t y = 0 ;y < nr ;y ++ ) { 1506 1507// Pointers to LHS blocks of block_q8_K format 1508const block_q8_K * a_ptr = a_ptr_start + (y * nb ); 1509 1510// Take group of eight interleaved block_q4_K structures at each pass of the loop and perform dot product operation 1511for (int64_t x = 0 ;x < nc /8 ;x ++ ) { 1512 1513// Pointers to RHS blocks 1514const block_q4_Kx8 * b_ptr = b_ptr_start + (x * b_nb ); 1515 1516// Master FP accumulators 1517__m256 acc_row = _mm256_setzero_ps (); 1518__m256 acc_min_rows = _mm256_setzero_ps (); 1519 1520for (int64_t b = 0 ;b < nb ;b ++ ) { 1521 1522// Load and convert to FP32 scale from block_q8_K 1523const __m256 row_scale_f32 = _mm256_set1_ps ((a_ptr [b ].d )); 1524 1525// Load the scale values for the 8 blocks interleaved in block_q4_Kx8 1526// col_scale_f32 rearranged so as to multiply with appropriate quants 1527const __m256 col_scale_f32 = GGML_F32Cx8_REARRANGE_LOAD (b_ptr [b ].d ,deltamask ); 1528const __m256 col_dmin_f32 = GGML_F32Cx8_LOAD (b_ptr [b ].dmin ); 1529 1530__m256i iacc_b = _mm256_setzero_si256 (); 1531__m256i iacc_min_b = _mm256_setzero_si256 (); 1532 1533const __m256i q8sums = _mm256_loadu_si256 ((const __m256i * )(a_ptr [b ].bsums )); 1534__m256i q8s = _mm256_castsi128_si256 (_mm_hadd_epi16 (_mm256_castsi256_si128 (q8sums ),_mm256_extracti128_si256 (q8sums ,1 ))); 1535q8s = _mm256_permute2f128_si256 (q8s ,q8s ,0 ); 1536 1537// Processes two sub blocks from each Q4_K in each iteration 1538for (int sb = 0 ;sb < QK_K /64 ;sb ++ ) { 1539 1540// Load the eight block_q4_K for two sub blocks quantized values interleaved with each other in chunks of eight - B0,B1 ....B6,B7 1541const __m256i rhs_raw_vec_0123_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + sb * 256 )); 1542const __m256i rhs_raw_vec_4567_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 32 + sb * 256 )); 1543const __m256i rhs_raw_vec_0123_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 64 + sb * 256 )); 1544const __m256i rhs_raw_vec_4567_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 96 + sb * 256 )); 1545const __m256i rhs_raw_vec_0123_2 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 128 + sb * 256 )); 1546const __m256i rhs_raw_vec_4567_2 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 160 + sb * 256 )); 1547const __m256i rhs_raw_vec_0123_3 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 192 + sb * 256 )); 1548const __m256i rhs_raw_vec_4567_3 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 224 + sb * 256 )); 1549 1550// 4-bit -> 8-bit 1551// Values of the first sub block of eight block_q4_K structures for the sb loop 1552const __m256i rhs_vec_0123_00 = _mm256_and_si256 (rhs_raw_vec_0123_0 ,m4b ); 1553const __m256i rhs_vec_4567_00 = _mm256_and_si256 (rhs_raw_vec_4567_0 ,m4b ); 1554const __m256i rhs_vec_0123_01 = _mm256_and_si256 (rhs_raw_vec_0123_1 ,m4b ); 1555const __m256i rhs_vec_4567_01 = _mm256_and_si256 (rhs_raw_vec_4567_1 ,m4b ); 1556const __m256i rhs_vec_0123_02 = _mm256_and_si256 (rhs_raw_vec_0123_2 ,m4b ); 1557const __m256i rhs_vec_4567_02 = _mm256_and_si256 (rhs_raw_vec_4567_2 ,m4b ); 1558const __m256i rhs_vec_0123_03 = _mm256_and_si256 (rhs_raw_vec_0123_3 ,m4b ); 1559const __m256i rhs_vec_4567_03 = _mm256_and_si256 (rhs_raw_vec_4567_3 ,m4b ); 1560 1561// Values of the second sub block of eight block_q4_K structures when sb = 1 1562const __m256i rhs_vec_0123_10 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_vec_0123_0 ,4 ),m4b ); 1563const __m256i rhs_vec_4567_10 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_vec_4567_0 ,4 ),m4b ); 1564const __m256i rhs_vec_0123_11 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_vec_0123_1 ,4 ),m4b ); 1565const __m256i rhs_vec_4567_11 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_vec_4567_1 ,4 ),m4b ); 1566const __m256i rhs_vec_0123_12 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_vec_0123_2 ,4 ),m4b ); 1567const __m256i rhs_vec_4567_12 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_vec_4567_2 ,4 ),m4b ); 1568const __m256i rhs_vec_0123_13 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_vec_0123_3 ,4 ),m4b ); 1569const __m256i rhs_vec_4567_13 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_vec_4567_3 ,4 ),m4b ); 1570 1571uint32_t utmp_0 [4 ],utmp_1 [4 ]; 1572 1573// Scales and Mins of corresponding sub blocks from different Q8_K structures are stored together 1574// The below block is for eg to extract first sub block's scales and mins from different Q4_K structures for the sb loop 1575memcpy (utmp_0 ,b_ptr [b ].scales + 24 * sb ,12 ); 1576utmp_0 [3 ]= ((utmp_0 [2 ] >>4 )& kmask2 ) | (((utmp_0 [1 ] >>6 )& kmask3 ) <<4 ); 1577const uint32_t uaux_0 = utmp_0 [1 ]& kmask1 ; 1578utmp_0 [1 ]= (utmp_0 [2 ]& kmask2 ) | (((utmp_0 [0 ] >>6 )& kmask3 ) <<4 ); 1579utmp_0 [2 ]= uaux_0 ; 1580utmp_0 [0 ] &=kmask1 ; 1581 1582// The below block is for eg to extract second sub block's scales and mins from different Q4_K structures for the sb loop 1583memcpy (utmp_1 ,b_ptr [b ].scales + 12 + sb * 24 ,12 ); 1584utmp_1 [3 ]= ((utmp_1 [2 ] >>4 )& kmask2 ) | (((utmp_1 [1 ] >>6 )& kmask3 ) <<4 ); 1585const uint32_t uaux_1 = utmp_1 [1 ]& kmask1 ; 1586utmp_1 [1 ]= (utmp_1 [2 ]& kmask2 ) | (((utmp_1 [0 ] >>6 )& kmask3 ) <<4 ); 1587utmp_1 [2 ]= uaux_1 ; 1588utmp_1 [0 ] &=kmask1 ; 1589 1590// Scales of first sub block in the sb loop 1591const __m128i mins_and_scales_0 = _mm_set_epi32 (utmp_0 [3 ],utmp_0 [2 ],utmp_0 [1 ],utmp_0 [0 ]); 1592__m128i scales_rearrange_0 = _mm_shuffle_epi8 (mins_and_scales_0 ,scalemask ); 1593__m256i scales_0 = _mm256_cvtepu8_epi16 (scales_rearrange_0 ); 1594 1595// Scales of second sub block in the sb loop 1596__m128i mins_and_scales_1 = _mm_set_epi32 (utmp_1 [3 ],utmp_1 [2 ],utmp_1 [1 ],utmp_1 [0 ]); 1597__m128i scales_rearrange_1 = _mm_shuffle_epi8 (mins_and_scales_1 ,scalemask ); 1598__m256i scales_1 = _mm256_cvtepu8_epi16 (scales_rearrange_1 ); 1599 1600// Mins of first and second sub block of Q4_K block are arranged side by side 1601__m256i mins_01 = _mm256_cvtepu8_epi16 (_mm_unpacklo_epi8 (_mm_shuffle_epi32 (mins_and_scales_0 ,78 ),_mm_shuffle_epi32 (mins_and_scales_1 ,78 ))); 1602 1603// Load the two sub block values corresponding to sb in block_q8_K in batches of 16 bytes and replicate the same across 256 bit vector 1604__m256i lhs_vec_00 = _mm256_castsi128_si256 (_mm_loadu_si128 ((const __m128i * )(a_ptr [b ].qs + sb * 64 ))); 1605__m256i lhs_vec_01 = _mm256_castsi128_si256 (_mm_loadu_si128 ((const __m128i * )(a_ptr [b ].qs + 16 + sb * 64 ))); 1606__m256i lhs_vec_10 = _mm256_castsi128_si256 (_mm_loadu_si128 ((const __m128i * )(a_ptr [b ].qs + 32 + sb * 64 ))); 1607__m256i lhs_vec_11 = _mm256_castsi128_si256 (_mm_loadu_si128 ((const __m128i * )(a_ptr [b ].qs + 48 + sb * 64 ))); 1608 1609lhs_vec_00 = _mm256_permute2f128_si256 (lhs_vec_00 ,lhs_vec_00 ,0 ); 1610lhs_vec_01 = _mm256_permute2f128_si256 (lhs_vec_01 ,lhs_vec_01 ,0 ); 1611lhs_vec_10 = _mm256_permute2f128_si256 (lhs_vec_10 ,lhs_vec_10 ,0 ); 1612lhs_vec_11 = _mm256_permute2f128_si256 (lhs_vec_11 ,lhs_vec_11 ,0 ); 1613 1614// Dot product done within 32 bit lanes and accumulated in the same vector 1615// First done for first sub block and then for second sub block in each sb 1616// B0(0-3) B4(0-3) B1(0-3) B5(0-3) B2(0-3) B6(0-3) B3(0-3) B7(0-3) with A0(0-3) 1617// B0(4-7) B4(4-7) B1(4-7) B5(4-7) B2(4-7) B6(4-7) B3(4-7) B7(4-7) with A0(4-7) 1618// ........................................................................... 1619// B0(28-31) B4(28-31) B1(28-31) B5(28-31) B2(28-31) B6(28-31) B3(28-31) B7(28-31) with A0(28-31) 1620 1621 1622__m256i iacc_0 = _mm256_setzero_si256 (); 1623__m256i iacc_1 = _mm256_setzero_si256 (); 1624 1625iacc_0 = _mm256_add_epi16 (iacc_0 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (rhs_vec_0123_00 ,_mm256_shuffle_epi32 (rhs_vec_4567_00 ,177 ),170 ),_mm256_shuffle_epi32 (lhs_vec_00 ,0 ))); 1626iacc_0 = _mm256_add_epi16 (iacc_0 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (_mm256_shuffle_epi32 (rhs_vec_0123_00 ,177 ) ,rhs_vec_4567_00 ,170 ),_mm256_shuffle_epi32 (lhs_vec_00 ,85 ))); 1627 1628iacc_0 = _mm256_add_epi16 (iacc_0 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (rhs_vec_0123_01 ,_mm256_shuffle_epi32 (rhs_vec_4567_01 ,177 ),170 ),_mm256_shuffle_epi32 (lhs_vec_00 ,170 ))); 1629iacc_0 = _mm256_add_epi16 (iacc_0 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (_mm256_shuffle_epi32 (rhs_vec_0123_01 ,177 ) ,rhs_vec_4567_01 ,170 ),_mm256_shuffle_epi32 (lhs_vec_00 ,255 ))); 1630 1631iacc_0 = _mm256_add_epi16 (iacc_0 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (rhs_vec_0123_02 ,_mm256_shuffle_epi32 (rhs_vec_4567_02 ,177 ),170 ),_mm256_shuffle_epi32 (lhs_vec_01 ,0 ))); 1632iacc_0 = _mm256_add_epi16 (iacc_0 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (_mm256_shuffle_epi32 (rhs_vec_0123_02 ,177 ) ,rhs_vec_4567_02 ,170 ),_mm256_shuffle_epi32 (lhs_vec_01 ,85 ))); 1633 1634iacc_0 = _mm256_add_epi16 (iacc_0 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (rhs_vec_0123_03 ,_mm256_shuffle_epi32 (rhs_vec_4567_03 ,177 ),170 ),_mm256_shuffle_epi32 (lhs_vec_01 ,170 ))); 1635iacc_0 = _mm256_add_epi16 (iacc_0 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (_mm256_shuffle_epi32 (rhs_vec_0123_03 ,177 ) ,rhs_vec_4567_03 ,170 ),_mm256_shuffle_epi32 (lhs_vec_01 ,255 ))); 1636 1637iacc_0 = _mm256_madd_epi16 (iacc_0 ,scales_0 ); 1638 1639iacc_1 = _mm256_add_epi16 (iacc_1 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (rhs_vec_0123_10 ,_mm256_shuffle_epi32 (rhs_vec_4567_10 ,177 ),170 ),_mm256_shuffle_epi32 (lhs_vec_10 ,0 ))); 1640iacc_1 = _mm256_add_epi16 (iacc_1 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (_mm256_shuffle_epi32 (rhs_vec_0123_10 ,177 ) ,rhs_vec_4567_10 ,170 ),_mm256_shuffle_epi32 (lhs_vec_10 ,85 ))); 1641 1642iacc_1 = _mm256_add_epi16 (iacc_1 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (rhs_vec_0123_11 ,_mm256_shuffle_epi32 (rhs_vec_4567_11 ,177 ),170 ),_mm256_shuffle_epi32 (lhs_vec_10 ,170 ))); 1643iacc_1 = _mm256_add_epi16 (iacc_1 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (_mm256_shuffle_epi32 (rhs_vec_0123_11 ,177 ) ,rhs_vec_4567_11 ,170 ),_mm256_shuffle_epi32 (lhs_vec_10 ,255 ))); 1644 1645iacc_1 = _mm256_add_epi16 (iacc_1 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (rhs_vec_0123_12 ,_mm256_shuffle_epi32 (rhs_vec_4567_12 ,177 ),170 ),_mm256_shuffle_epi32 (lhs_vec_11 ,0 ))); 1646iacc_1 = _mm256_add_epi16 (iacc_1 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (_mm256_shuffle_epi32 (rhs_vec_0123_12 ,177 ) ,rhs_vec_4567_12 ,170 ),_mm256_shuffle_epi32 (lhs_vec_11 ,85 ))); 1647 1648iacc_1 = _mm256_add_epi16 (iacc_1 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (rhs_vec_0123_13 ,_mm256_shuffle_epi32 (rhs_vec_4567_13 ,177 ),170 ),_mm256_shuffle_epi32 (lhs_vec_11 ,170 ))); 1649iacc_1 = _mm256_add_epi16 (iacc_1 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (_mm256_shuffle_epi32 (rhs_vec_0123_13 ,177 ) ,rhs_vec_4567_13 ,170 ),_mm256_shuffle_epi32 (lhs_vec_11 ,255 ))); 1650 1651iacc_1 = _mm256_madd_epi16 (iacc_1 ,scales_1 ); 1652 1653// Accumulate the iacc value for one sb 1654__m256i iacc_sb = _mm256_add_epi32 (iacc_0 ,iacc_1 ); 1655 1656// Broadcast the bsums of the two sub blocks of the iteration of Q8_K across the vector 1657// Multiply-Add with corresponding mins of Q4_Kx8 with bsums 1658__m256i q8s_sb = _mm256_shuffle_epi32 (q8s ,0 ); 1659__m256i iacc_min_sb = _mm256_madd_epi16 (q8s_sb ,mins_01 ); 1660q8s = _mm256_bsrli_epi128 (q8s ,4 ); 1661 1662// Accumulate for the complete block 1663iacc_b = _mm256_add_epi32 (iacc_b ,iacc_sb ); 1664iacc_min_b = _mm256_add_epi32 (iacc_min_b ,iacc_min_sb ); 1665 } 1666 1667// Multiply-Add with scale values for the complete super block 1668acc_row = _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_b ),_mm256_mul_ps (col_scale_f32 ,row_scale_f32 ),acc_row ); 1669acc_min_rows = _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_min_b ),_mm256_mul_ps (col_dmin_f32 ,row_scale_f32 ),acc_min_rows ); 1670 1671 } 1672 1673// Accumulated output values permuted so as to be stored in appropriate order post accumulation 1674acc_row = _mm256_permutevar8x32_ps (acc_row ,finalpermutemask ); 1675_mm256_storeu_ps (s + (y * nr + x * 8 ),_mm256_sub_ps (acc_row ,acc_min_rows )); 1676 } 1677 } 1678 1679#else 1680UNUSED (kmask1 ); 1681UNUSED (kmask2 ); 1682UNUSED (kmask3 ); 1683ggml_gemv_q4_K_8x8_q8_K_generic (n ,s ,bs ,vx ,vy ,nr ,nc ); 1684#endif 1685} 1686 1687void ggml_gemv_iq4_nl_8x8_q8_0 (int n ,float * GGML_RESTRICT s ,size_t bs ,const void * GGML_RESTRICT vx ,const void * GGML_RESTRICT vy ,int nr ,int nc ) { 1688#if defined(__AVX2__ ) 1689__m256i signextendlut = _mm256_castsi128_si256 (_mm_loadu_si128 ((const __m128i * )kvalues_iq4nl )); 1690signextendlut = _mm256_permute2f128_si256 (signextendlut ,signextendlut ,0 ); 1691 1692gemv_q4_b32_8x8_q8_0_lut_avx < block_iq4_nlx8 > (n ,s ,bs ,vx ,vy ,nr ,nc ,signextendlut ); 1693 1694return ; 1695#endif 1696 1697ggml_gemv_iq4_nl_8x8_q8_0_generic (n ,s ,bs ,vx ,vy ,nr ,nc ); 1698} 1699 1700void ggml_gemv_mxfp4_8x8_q8_0 (int n ,float * GGML_RESTRICT s ,size_t bs ,const void * GGML_RESTRICT vx ,const void * GGML_RESTRICT vy ,int nr ,int nc ) { 1701#if defined(__AVX2__ ) 1702__m256i signextendlut = _mm256_castsi128_si256 (_mm_loadu_si128 ((const __m128i * )kvalues_mxfp4 )); 1703signextendlut = _mm256_permute2f128_si256 (signextendlut ,signextendlut ,0 ); 1704 1705gemv_q4_b32_8x8_q8_0_lut_avx < block_mxfp4x8 > (n ,s ,bs ,vx ,vy ,nr ,nc ,signextendlut ); 1706 1707return ; 1708#endif 1709 1710ggml_gemv_mxfp4_8x8_q8_0_generic (n ,s ,bs ,vx ,vy ,nr ,nc ); 1711} 1712 1713void ggml_gemv_q2_K_8x8_q8_K (int n ,float * GGML_RESTRICT s ,size_t bs ,const void * GGML_RESTRICT vx ,const void * GGML_RESTRICT vy ,int nr ,int nc ) { 1714const int qk = QK_K ; 1715const int nb = n /qk ; 1716const int ncols_interleaved = 8 ; 1717const int blocklen = 8 ; 1718 1719assert (n %qk == 0 ); 1720assert (nc %ncols_interleaved == 0 ); 1721 1722UNUSED (s ); 1723UNUSED (bs ); 1724UNUSED (vx ); 1725UNUSED (vy ); 1726UNUSED (nr ); 1727UNUSED (nc ); 1728UNUSED (nb ); 1729UNUSED (ncols_interleaved ); 1730UNUSED (blocklen ); 1731 1732#if defined(__AVX2__ ) 1733// Lookup table to convert signed nibbles to signed bytes 1734__m256i signextendlut = _mm256_castsi128_si256 (_mm_set_epi8 (-1 ,-2 ,-3 ,-4 ,-5 ,-6 ,-7 ,-8 ,7 ,6 ,5 ,4 ,3 ,2 ,1 ,0 )); 1735signextendlut = _mm256_permute2f128_si256 (signextendlut ,signextendlut ,0 ); 1736// Shuffle masks to rearrange delta values to multiply with appropriate scales 1737__m128i deltamask = _mm_set_epi8 (15 ,14 ,7 ,6 ,13 ,12 ,5 ,4 ,11 ,10 ,3 ,2 ,9 ,8 ,1 ,0 ); 1738// Permute mask used for easier vector processing at later stages 1739__m256i finalpermutemask = _mm256_set_epi32 (7 ,5 ,3 ,1 ,6 ,4 ,2 ,0 ); 1740 1741const __m256i m3b = _mm256_set1_epi8 (3 ); 1742const __m128i m4b_sse = _mm_set1_epi8 (0xF ); 1743 1744//Mask to get appropriate scales 1745__m128i scalemask1 = _mm_set_epi8 (14 ,14 ,6 ,6 ,12 ,12 ,4 ,4 ,10 ,10 ,2 ,2 ,8 ,8 ,0 ,0 ); 1746__m128i scalemask2 = _mm_set_epi8 (15 ,15 ,7 ,7 ,13 ,13 ,5 ,5 ,11 ,11 ,3 ,3 ,9 ,9 ,1 ,1 ); 1747 1748int64_t b_nb = n /QK_K ; 1749 1750const block_q2_Kx8 * b_ptr_start = (const block_q2_Kx8 * )vx ; 1751const block_q8_K * a_ptr_start = (const block_q8_K * )vy ; 1752 1753// Process Q8_K blocks one by one 1754for (int64_t y = 0 ;y < nr ;y ++ ) { 1755 1756// Pointers to LHS blocks of block_q8_K format 1757const block_q8_K * a_ptr = a_ptr_start + (y * nb ); 1758 1759// Take group of eight interleaved block_q2_K structures at each pass of the loop and perform dot product operation 1760for (int64_t x = 0 ;x < nc /8 ;x ++ ) { 1761 1762// Pointers to RHS blocks 1763const block_q2_Kx8 * b_ptr = b_ptr_start + (x * b_nb ); 1764 1765// Master FP accumulators 1766__m256 acc_row = _mm256_setzero_ps (); 1767__m256 acc_min_rows = _mm256_setzero_ps (); 1768 1769for (int64_t b = 0 ;b < nb ;b ++ ) { 1770 1771// Load and convert to FP32 delta from block_q8_K 1772const __m256 row_scale_f32 = _mm256_set1_ps ((a_ptr [b ].d )); 1773 1774// Load the delta values for the 8 blocks interleaved in block_q2_Kx8 1775// col_scale_f32 rearranged so as to multiply with appropriate quants 1776const __m256 col_scale_f32 = GGML_F32Cx8_REARRANGE_LOAD (b_ptr [b ].d ,deltamask ); 1777const __m256 col_dmin_f32 = GGML_F32Cx8_LOAD (b_ptr [b ].dmin ); 1778 1779__m256i iacc_b = _mm256_setzero_si256 (); 1780__m256i iacc_min_b = _mm256_setzero_si256 (); 1781 1782// Processes eight sub blocks from each Q2_K in each iteration 1783for (int sb = 0 ;sb < QK_K /128 ;sb ++ ) { 1784 1785// Load the eight block_q2_K for eight sub blocks quantized values interleaved with each other in chunks of eight - B0,B1 ....B6,B7 1786const __m256i rhs_raw_vec_0123_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + sb * 256 )); 1787const __m256i rhs_raw_vec_4567_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 32 + sb * 256 )); 1788const __m256i rhs_raw_vec_0123_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 64 + sb * 256 )); 1789const __m256i rhs_raw_vec_4567_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 96 + sb * 256 )); 1790const __m256i rhs_raw_vec_0123_2 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 128 + sb * 256 )); 1791const __m256i rhs_raw_vec_4567_2 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 160 + sb * 256 )); 1792const __m256i rhs_raw_vec_0123_3 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 192 + sb * 256 )); 1793const __m256i rhs_raw_vec_4567_3 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 224 + sb * 256 )); 1794 1795// 2-bit -> 8-bit 1796// Values of the 0th,2nd,4th,6th sub blocks of eight block_q2_K structures for the sb loop 1797const __m256i rhs_vec_0123_00 = _mm256_and_si256 (rhs_raw_vec_0123_0 ,m3b );//B00(0-7) B01(0-7) B02(0-7) B03(0-7) 1798const __m256i rhs_vec_0123_20 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_vec_0123_0 ,2 ),m3b );//B20(0-7) B21(0-7) B22(0-7) B23(0-7) 1799const __m256i rhs_vec_0123_40 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_vec_0123_0 ,4 ),m3b );//B40(0-7) B41(0-7) B42(0-7) B43(0-7) 1800const __m256i rhs_vec_0123_60 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_vec_0123_0 ,6 ),m3b );//B60(0-7) B61(0-7) B62(0-7) B63(0-7) 1801 1802const __m256i rhs_vec_4567_00 = _mm256_and_si256 (rhs_raw_vec_4567_0 ,m3b );//B04(0-7) B05(0-7) B06(0-7) B07(0-7) 1803const __m256i rhs_vec_4567_20 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_vec_4567_0 ,2 ),m3b );//B24(0-7) B25(0-7) B26(0-7) B27(0-7) 1804const __m256i rhs_vec_4567_40 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_vec_4567_0 ,4 ),m3b );//B44(0-7) B45(0-7) B46(0-7) B47(0-7) 1805const __m256i rhs_vec_4567_60 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_vec_4567_0 ,6 ),m3b );//B64(0-7) B65(0-7) B66(0-7) B67(0-7) 1806 1807const __m256i rhs_vec_0123_01 = _mm256_and_si256 (rhs_raw_vec_0123_1 ,m3b );//B00(8-15) B01(8-15) B02(8-15) B03(8-15) 1808const __m256i rhs_vec_0123_21 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_vec_0123_1 ,2 ),m3b );//B20(8-15) B21(8-15) B22(8-15) B23(8-15) 1809const __m256i rhs_vec_0123_41 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_vec_0123_1 ,4 ),m3b );//B40(8-15) B41(8-15) B42(8-15) B43(8-15) 1810const __m256i rhs_vec_0123_61 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_vec_0123_1 ,6 ),m3b );//B60(8-15) B61(8-15) B62(8-15) B63(8-15) 1811 1812const __m256i rhs_vec_4567_01 = _mm256_and_si256 (rhs_raw_vec_4567_1 ,m3b );//B04(8-15) B05(8-15) B06(8-15) B07(8-15) 1813const __m256i rhs_vec_4567_21 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_vec_4567_1 ,2 ),m3b );//B24(8-15) B25(8-15) B26(8-15) B27(8-15) 1814const __m256i rhs_vec_4567_41 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_vec_4567_1 ,4 ),m3b );//B44(8-15) B45(8-15) B46(8-15) B47(8-15) 1815const __m256i rhs_vec_4567_61 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_vec_4567_1 ,6 ),m3b );//B64(8-15) B65(8-15) B66(8-15) B67(8-15) 1816 1817// Values of the 1st,3rd,5th,7th sub blocks of eight block_q2_K structures for the sb loop 1818const __m256i rhs_vec_0123_10 = _mm256_and_si256 (rhs_raw_vec_0123_2 ,m3b );//B10(0-7) B11(0-7) B12(0-7) B13(0-7) 1819const __m256i rhs_vec_0123_30 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_vec_0123_2 ,2 ),m3b );//B30(0-7) B31(0-7) B32(0-7) B33(0-7) 1820const __m256i rhs_vec_0123_50 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_vec_0123_2 ,4 ),m3b );//B50(0-7) B51(0-7) B52(0-7) B53(0-7) 1821const __m256i rhs_vec_0123_70 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_vec_0123_2 ,6 ),m3b );//B70(0-7) B71(0-7) B72(0-7) B73(0-7) 1822 1823const __m256i rhs_vec_4567_10 = _mm256_and_si256 (rhs_raw_vec_4567_2 ,m3b );//B14(0-7) B15(0-7) B16(0-7) B17(0-7) 1824const __m256i rhs_vec_4567_30 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_vec_4567_2 ,2 ),m3b );//B34(0-7) B35(0-7) B36(0-7) B37(0-7) 1825const __m256i rhs_vec_4567_50 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_vec_4567_2 ,4 ),m3b );//B54(0-7) B55(0-7) B56(0-7) B57(0-7) 1826const __m256i rhs_vec_4567_70 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_vec_4567_2 ,6 ),m3b );//B74(0-7) B75(0-7) B76(0-7) B77(0-7) 1827 1828const __m256i rhs_vec_0123_11 = _mm256_and_si256 (rhs_raw_vec_0123_3 ,m3b );//B10(8-15) B11(8-15) B12(8-15) B13(8-15) 1829const __m256i rhs_vec_0123_31 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_vec_0123_3 ,2 ),m3b );//B30(8-15) B31(8-15) B32(8-15) B33(8-15) 1830const __m256i rhs_vec_0123_51 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_vec_0123_3 ,4 ),m3b );//B50(8-15) B51(8-15) B52(8-15) B53(8-15) 1831const __m256i rhs_vec_0123_71 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_vec_0123_3 ,6 ),m3b );//B70(8-15) B71(8-15) B72(8-15) B73(8-15) 1832 1833const __m256i rhs_vec_4567_11 = _mm256_and_si256 (rhs_raw_vec_4567_3 ,m3b );//B14(8-15) B15(8-15) B16(8-15) B17(8-15) 1834const __m256i rhs_vec_4567_31 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_vec_4567_3 ,2 ),m3b );//B34(8-15) B35(8-15) B36(8-15) B37(8-15) 1835const __m256i rhs_vec_4567_51 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_vec_4567_3 ,4 ),m3b );//B54(8-15) B55(8-15) B56(8-15) B57(8-15) 1836const __m256i rhs_vec_4567_71 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_vec_4567_3 ,6 ),m3b );//B74(8-15) B75(8-15) B76(8-15) B77(8-15) 1837 1838//Scales and Mins of corresponding sub blocks from different Q2_K structures are stored together 1839//s00 m00 s01 m01 s10 m10 s11 m11 s20 m20 s21 m21 s30 m30 s31 m31 s40 m40 s41 m41 s50 m50 s51 m51 s60 m60 s61 m61 s70 m70 s71 m71 1840 1841const __m128i mins_and_scales_01 = _mm_loadu_si128 ((const __m128i * )(b_ptr [b ].scales + sb * 64 )); 1842const __m128i mins_and_scales_23 = _mm_loadu_si128 ((const __m128i * )(b_ptr [b ].scales + 16 + sb * 64 )); 1843const __m128i mins_and_scales_45 = _mm_loadu_si128 ((const __m128i * )(b_ptr [b ].scales + 32 + sb * 64 )); 1844const __m128i mins_and_scales_67 = _mm_loadu_si128 ((const __m128i * )(b_ptr [b ].scales + 48 + sb * 64 )); 1845 1846// Extract scales which is lower half from mins_and_scales 1847const __m128i scales_01 = _mm_and_si128 (mins_and_scales_01 ,m4b_sse ); 1848const __m128i scales_23 = _mm_and_si128 (mins_and_scales_23 ,m4b_sse ); 1849const __m128i scales_45 = _mm_and_si128 (mins_and_scales_45 ,m4b_sse ); 1850const __m128i scales_67 = _mm_and_si128 (mins_and_scales_67 ,m4b_sse ); 1851 1852// Extract mins which is upper half from mins_and_scales 1853const __m256i mins_01 = _mm256_cvtepu8_epi16 (_mm_and_si128 (_mm_srli_epi16 (mins_and_scales_01 ,4 ),m4b_sse )); 1854const __m256i mins_23 = _mm256_cvtepu8_epi16 (_mm_and_si128 (_mm_srli_epi16 (mins_and_scales_23 ,4 ),m4b_sse )); 1855const __m256i mins_45 = _mm256_cvtepu8_epi16 (_mm_and_si128 (_mm_srli_epi16 (mins_and_scales_45 ,4 ),m4b_sse )); 1856const __m256i mins_67 = _mm256_cvtepu8_epi16 (_mm_and_si128 (_mm_srli_epi16 (mins_and_scales_67 ,4 ),m4b_sse )); 1857 1858// Scales of sub blocks in the sb loop 1859// Scales of the 0th sub block from each super block 1860__m128i scales_rearrange_0 = _mm_shuffle_epi8 (scales_01 ,scalemask1 ); 1861__m256i scales_0 = _mm256_cvtepu8_epi16 (scales_rearrange_0 ); 1862 1863// Scales of the 1st sub block from each super block 1864__m128i scales_rearrange_1 = _mm_shuffle_epi8 (scales_01 ,scalemask2 ); 1865__m256i scales_1 = _mm256_cvtepu8_epi16 (scales_rearrange_1 ); 1866 1867// Scales of the 2nd sub block from each super block 1868__m128i scales_rearrange_2 = _mm_shuffle_epi8 (scales_23 ,scalemask1 ); 1869__m256i scales_2 = _mm256_cvtepu8_epi16 (scales_rearrange_2 ); 1870 1871// Scales of the 3rd sub block from each super block 1872__m128i scales_rearrange_3 = _mm_shuffle_epi8 (scales_23 ,scalemask2 ); 1873__m256i scales_3 = _mm256_cvtepu8_epi16 (scales_rearrange_3 ); 1874 1875// Scales of the 4th sub block from each super block 1876__m128i scales_rearrange_4 = _mm_shuffle_epi8 (scales_45 ,scalemask1 ); 1877__m256i scales_4 = _mm256_cvtepu8_epi16 (scales_rearrange_4 ); 1878 1879// Scales of the 5th sub block from each super block 1880__m128i scales_rearrange_5 = _mm_shuffle_epi8 (scales_45 ,scalemask2 ); 1881__m256i scales_5 = _mm256_cvtepu8_epi16 (scales_rearrange_5 ); 1882 1883// Scales of the 6th sub block from each super block 1884__m128i scales_rearrange_6 = _mm_shuffle_epi8 (scales_67 ,scalemask1 ); 1885__m256i scales_6 = _mm256_cvtepu8_epi16 (scales_rearrange_6 ); 1886 1887// Scales of the 7th sub block from each super block 1888__m128i scales_rearrange_7 = _mm_shuffle_epi8 (scales_67 ,scalemask2 ); 1889__m256i scales_7 = _mm256_cvtepu8_epi16 (scales_rearrange_7 ); 1890 1891// Load the sub block values corresponding to sb in block_q8_K in batches of 16 bytes and replicate the same across 256 bit vector 1892__m256i lhs_vec_0 = _mm256_castsi128_si256 (_mm_loadu_si128 ((const __m128i * )(a_ptr [b ].qs + sb * 128 ))); 1893__m256i lhs_vec_1 = _mm256_castsi128_si256 (_mm_loadu_si128 ((const __m128i * )(a_ptr [b ].qs + 16 + sb * 128 ))); 1894__m256i lhs_vec_2 = _mm256_castsi128_si256 (_mm_loadu_si128 ((const __m128i * )(a_ptr [b ].qs + 32 + sb * 128 ))); 1895__m256i lhs_vec_3 = _mm256_castsi128_si256 (_mm_loadu_si128 ((const __m128i * )(a_ptr [b ].qs + 48 + sb * 128 ))); 1896__m256i lhs_vec_4 = _mm256_castsi128_si256 (_mm_loadu_si128 ((const __m128i * )(a_ptr [b ].qs + 64 + sb * 128 ))); 1897__m256i lhs_vec_5 = _mm256_castsi128_si256 (_mm_loadu_si128 ((const __m128i * )(a_ptr [b ].qs + 80 + sb * 128 ))); 1898__m256i lhs_vec_6 = _mm256_castsi128_si256 (_mm_loadu_si128 ((const __m128i * )(a_ptr [b ].qs + 96 + sb * 128 ))); 1899__m256i lhs_vec_7 = _mm256_castsi128_si256 (_mm_loadu_si128 ((const __m128i * )(a_ptr [b ].qs + 112 + sb * 128 ))); 1900 1901lhs_vec_0 = _mm256_permute2f128_si256 (lhs_vec_0 ,lhs_vec_0 ,0 ); 1902lhs_vec_1 = _mm256_permute2f128_si256 (lhs_vec_1 ,lhs_vec_1 ,0 ); 1903lhs_vec_2 = _mm256_permute2f128_si256 (lhs_vec_2 ,lhs_vec_2 ,0 ); 1904lhs_vec_3 = _mm256_permute2f128_si256 (lhs_vec_3 ,lhs_vec_3 ,0 ); 1905lhs_vec_4 = _mm256_permute2f128_si256 (lhs_vec_4 ,lhs_vec_4 ,0 ); 1906lhs_vec_5 = _mm256_permute2f128_si256 (lhs_vec_5 ,lhs_vec_5 ,0 ); 1907lhs_vec_6 = _mm256_permute2f128_si256 (lhs_vec_6 ,lhs_vec_6 ,0 ); 1908lhs_vec_7 = _mm256_permute2f128_si256 (lhs_vec_7 ,lhs_vec_7 ,0 ); 1909 1910__m256i iacc_0 = _mm256_setzero_si256 (); 1911__m256i iacc_1 = _mm256_setzero_si256 (); 1912__m256i iacc_2 = _mm256_setzero_si256 (); 1913__m256i iacc_3 = _mm256_setzero_si256 (); 1914__m256i iacc_4 = _mm256_setzero_si256 (); 1915__m256i iacc_5 = _mm256_setzero_si256 (); 1916__m256i iacc_6 = _mm256_setzero_si256 (); 1917__m256i iacc_7 = _mm256_setzero_si256 (); 1918 1919// Dot product done within 32 bit lanes and accumulated in the same vector 1920// First done for 0th sub block and then for seven (1st - 7th) other sub blocks processed for each sb (sb < QK_K/128 loop) // B0(0-3) B4(0-3) B1(0-3) B5(0-3) B2(0-3) B6(0-3) B3(0-3) B7(0-3) with A0(0-3) 1921// B0(4-7) B4(4-7) B1(4-7) B5(4-7) B2(4-7) B6(4-7) B3(4-7) B7(4-7) with A0(4-7) 1922// B0(8-11) B4(8-11) B1(8-11) B5(8-11) B2(8-11) B6(8-11) B3(8-11) B7(8-11) with A0(8-11) 1923// B0(12-15) B4(12-15) B1(12-15) B5(12-15) B2(12-15) B6(12-15) B3(12-15) B7(12-15) with A0(12-15) 1924 1925iacc_0 = _mm256_add_epi16 (iacc_0 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (rhs_vec_0123_00 ,_mm256_shuffle_epi32 (rhs_vec_4567_00 ,177 ),170 ),_mm256_shuffle_epi32 (lhs_vec_0 ,0 ))); 1926iacc_0 = _mm256_add_epi16 (iacc_0 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (_mm256_shuffle_epi32 (rhs_vec_0123_00 ,177 ) ,rhs_vec_4567_00 ,170 ),_mm256_shuffle_epi32 (lhs_vec_0 ,85 ))); 1927 1928iacc_0 = _mm256_add_epi16 (iacc_0 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (rhs_vec_0123_01 ,_mm256_shuffle_epi32 (rhs_vec_4567_01 ,177 ),170 ),_mm256_shuffle_epi32 (lhs_vec_0 ,170 ))); 1929iacc_0 = _mm256_add_epi16 (iacc_0 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (_mm256_shuffle_epi32 (rhs_vec_0123_01 ,177 ) ,rhs_vec_4567_01 ,170 ),_mm256_shuffle_epi32 (lhs_vec_0 ,255 ))); 1930 1931iacc_0 = _mm256_madd_epi16 (iacc_0 ,scales_0 ); 1932 1933iacc_1 = _mm256_add_epi16 (iacc_1 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (rhs_vec_0123_10 ,_mm256_shuffle_epi32 (rhs_vec_4567_10 ,177 ),170 ),_mm256_shuffle_epi32 (lhs_vec_1 ,0 ))); 1934iacc_1 = _mm256_add_epi16 (iacc_1 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (_mm256_shuffle_epi32 (rhs_vec_0123_10 ,177 ) ,rhs_vec_4567_10 ,170 ),_mm256_shuffle_epi32 (lhs_vec_1 ,85 ))); 1935 1936iacc_1 = _mm256_add_epi16 (iacc_1 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (rhs_vec_0123_11 ,_mm256_shuffle_epi32 (rhs_vec_4567_11 ,177 ),170 ),_mm256_shuffle_epi32 (lhs_vec_1 ,170 ))); 1937iacc_1 = _mm256_add_epi16 (iacc_1 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (_mm256_shuffle_epi32 (rhs_vec_0123_11 ,177 ) ,rhs_vec_4567_11 ,170 ),_mm256_shuffle_epi32 (lhs_vec_1 ,255 ))); 1938 1939iacc_1 = _mm256_madd_epi16 (iacc_1 ,scales_1 ); 1940 1941iacc_2 = _mm256_add_epi16 (iacc_2 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (rhs_vec_0123_20 ,_mm256_shuffle_epi32 (rhs_vec_4567_20 ,177 ),170 ),_mm256_shuffle_epi32 (lhs_vec_2 ,0 ))); 1942iacc_2 = _mm256_add_epi16 (iacc_2 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (_mm256_shuffle_epi32 (rhs_vec_0123_20 ,177 ) ,rhs_vec_4567_20 ,170 ),_mm256_shuffle_epi32 (lhs_vec_2 ,85 ))); 1943 1944iacc_2 = _mm256_add_epi16 (iacc_2 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (rhs_vec_0123_21 ,_mm256_shuffle_epi32 (rhs_vec_4567_21 ,177 ),170 ),_mm256_shuffle_epi32 (lhs_vec_2 ,170 ))); 1945iacc_2 = _mm256_add_epi16 (iacc_2 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (_mm256_shuffle_epi32 (rhs_vec_0123_21 ,177 ) ,rhs_vec_4567_21 ,170 ),_mm256_shuffle_epi32 (lhs_vec_2 ,255 ))); 1946 1947iacc_2 = _mm256_madd_epi16 (iacc_2 ,scales_2 ); 1948 1949iacc_3 = _mm256_add_epi16 (iacc_3 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (rhs_vec_0123_30 ,_mm256_shuffle_epi32 (rhs_vec_4567_30 ,177 ),170 ),_mm256_shuffle_epi32 (lhs_vec_3 ,0 ))); 1950iacc_3 = _mm256_add_epi16 (iacc_3 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (_mm256_shuffle_epi32 (rhs_vec_0123_30 ,177 ) ,rhs_vec_4567_30 ,170 ),_mm256_shuffle_epi32 (lhs_vec_3 ,85 ))); 1951 1952iacc_3 = _mm256_add_epi16 (iacc_3 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (rhs_vec_0123_31 ,_mm256_shuffle_epi32 (rhs_vec_4567_31 ,177 ),170 ),_mm256_shuffle_epi32 (lhs_vec_3 ,170 ))); 1953iacc_3 = _mm256_add_epi16 (iacc_3 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (_mm256_shuffle_epi32 (rhs_vec_0123_31 ,177 ) ,rhs_vec_4567_31 ,170 ),_mm256_shuffle_epi32 (lhs_vec_3 ,255 ))); 1954 1955iacc_3 = _mm256_madd_epi16 (iacc_3 ,scales_3 ); 1956 1957iacc_4 = _mm256_add_epi16 (iacc_4 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (rhs_vec_0123_40 ,_mm256_shuffle_epi32 (rhs_vec_4567_40 ,177 ),170 ),_mm256_shuffle_epi32 (lhs_vec_4 ,0 ))); 1958iacc_4 = _mm256_add_epi16 (iacc_4 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (_mm256_shuffle_epi32 (rhs_vec_0123_40 ,177 ) ,rhs_vec_4567_40 ,170 ),_mm256_shuffle_epi32 (lhs_vec_4 ,85 ))); 1959 1960iacc_4 = _mm256_add_epi16 (iacc_4 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (rhs_vec_0123_41 ,_mm256_shuffle_epi32 (rhs_vec_4567_41 ,177 ),170 ),_mm256_shuffle_epi32 (lhs_vec_4 ,170 ))); 1961iacc_4 = _mm256_add_epi16 (iacc_4 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (_mm256_shuffle_epi32 (rhs_vec_0123_41 ,177 ) ,rhs_vec_4567_41 ,170 ),_mm256_shuffle_epi32 (lhs_vec_4 ,255 ))); 1962 1963iacc_4 = _mm256_madd_epi16 (iacc_4 ,scales_4 ); 1964 1965iacc_5 = _mm256_add_epi16 (iacc_5 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (rhs_vec_0123_50 ,_mm256_shuffle_epi32 (rhs_vec_4567_50 ,177 ),170 ),_mm256_shuffle_epi32 (lhs_vec_5 ,0 ))); 1966iacc_5 = _mm256_add_epi16 (iacc_5 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (_mm256_shuffle_epi32 (rhs_vec_0123_50 ,177 ) ,rhs_vec_4567_50 ,170 ),_mm256_shuffle_epi32 (lhs_vec_5 ,85 ))); 1967 1968iacc_5 = _mm256_add_epi16 (iacc_5 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (rhs_vec_0123_51 ,_mm256_shuffle_epi32 (rhs_vec_4567_51 ,177 ),170 ),_mm256_shuffle_epi32 (lhs_vec_5 ,170 ))); 1969iacc_5 = _mm256_add_epi16 (iacc_5 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (_mm256_shuffle_epi32 (rhs_vec_0123_51 ,177 ) ,rhs_vec_4567_51 ,170 ),_mm256_shuffle_epi32 (lhs_vec_5 ,255 ))); 1970 1971iacc_5 = _mm256_madd_epi16 (iacc_5 ,scales_5 ); 1972 1973iacc_6 = _mm256_add_epi16 (iacc_6 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (rhs_vec_0123_60 ,_mm256_shuffle_epi32 (rhs_vec_4567_60 ,177 ),170 ),_mm256_shuffle_epi32 (lhs_vec_6 ,0 ))); 1974iacc_6 = _mm256_add_epi16 (iacc_6 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (_mm256_shuffle_epi32 (rhs_vec_0123_60 ,177 ) ,rhs_vec_4567_60 ,170 ),_mm256_shuffle_epi32 (lhs_vec_6 ,85 ))); 1975 1976iacc_6 = _mm256_add_epi16 (iacc_6 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (rhs_vec_0123_61 ,_mm256_shuffle_epi32 (rhs_vec_4567_61 ,177 ),170 ),_mm256_shuffle_epi32 (lhs_vec_6 ,170 ))); 1977iacc_6 = _mm256_add_epi16 (iacc_6 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (_mm256_shuffle_epi32 (rhs_vec_0123_61 ,177 ) ,rhs_vec_4567_61 ,170 ),_mm256_shuffle_epi32 (lhs_vec_6 ,255 ))); 1978 1979iacc_6 = _mm256_madd_epi16 (iacc_6 ,scales_6 ); 1980 1981iacc_7 = _mm256_add_epi16 (iacc_7 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (rhs_vec_0123_70 ,_mm256_shuffle_epi32 (rhs_vec_4567_70 ,177 ),170 ),_mm256_shuffle_epi32 (lhs_vec_7 ,0 ))); 1982iacc_7 = _mm256_add_epi16 (iacc_7 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (_mm256_shuffle_epi32 (rhs_vec_0123_70 ,177 ) ,rhs_vec_4567_70 ,170 ),_mm256_shuffle_epi32 (lhs_vec_7 ,85 ))); 1983 1984iacc_7 = _mm256_add_epi16 (iacc_7 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (rhs_vec_0123_71 ,_mm256_shuffle_epi32 (rhs_vec_4567_71 ,177 ),170 ),_mm256_shuffle_epi32 (lhs_vec_7 ,170 ))); 1985iacc_7 = _mm256_add_epi16 (iacc_7 ,_mm256_maddubs_epi16 (_mm256_blend_epi32 (_mm256_shuffle_epi32 (rhs_vec_0123_71 ,177 ) ,rhs_vec_4567_71 ,170 ),_mm256_shuffle_epi32 (lhs_vec_7 ,255 ))); 1986 1987iacc_7 = _mm256_madd_epi16 (iacc_7 ,scales_7 ); 1988 1989// Accumulate the iacc value for one sb 1990__m256i iacc_sb = _mm256_add_epi32 (_mm256_add_epi32 (_mm256_add_epi32 (iacc_0 ,iacc_1 ),_mm256_add_epi32 (iacc_2 ,iacc_3 )),_mm256_add_epi32 (_mm256_add_epi32 (iacc_4 ,iacc_5 ),_mm256_add_epi32 (iacc_6 ,iacc_7 ))); 1991 1992__m128i q8sums = _mm_loadu_si128 ((const __m128i * )(a_ptr [b ].bsums + sb * 8 )); 1993__m256i q8s = _mm256_castsi128_si256 (q8sums ); 1994q8s = _mm256_permute2f128_si256 (q8s ,q8s ,0 ); 1995 1996// Broadcast the bsums of the two corresponding subblocks of q8_k 1997// Multiply-Add with corresponding mins of Q2_Kx8 with bsums 1998__m256i iacc_min_sb_01 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (q8s ,0 ),mins_01 ); 1999__m256i iacc_min_sb_23 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (q8s ,85 ),mins_23 ); 2000__m256i iacc_min_sb_45 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (q8s ,170 ),mins_45 ); 2001__m256i iacc_min_sb_67 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (q8s ,255 ),mins_67 ); 2002 2003__m256i iacc_min_sb = _mm256_add_epi32 (_mm256_add_epi32 (iacc_min_sb_01 ,iacc_min_sb_23 ),_mm256_add_epi32 (iacc_min_sb_45 ,iacc_min_sb_67 )); 2004 2005// Accumulate for the complete block 2006iacc_b = _mm256_add_epi32 (iacc_b ,iacc_sb ); 2007iacc_min_b = _mm256_add_epi32 (iacc_min_b ,iacc_min_sb ); 2008 } 2009 2010//Multiply-Add with scale values for complete super block 2011acc_row = _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_b ),_mm256_mul_ps (col_scale_f32 ,row_scale_f32 ),acc_row ); 2012acc_min_rows = _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_min_b ),_mm256_mul_ps (col_dmin_f32 ,row_scale_f32 ),acc_min_rows ); 2013 } 2014// Accumulated output values permuted so as to be stored in appropriate order post accumulation 2015acc_row = _mm256_permutevar8x32_ps (acc_row ,finalpermutemask ); 2016_mm256_storeu_ps (s + (y * nr + x * 8 ),_mm256_sub_ps (acc_row ,acc_min_rows )); 2017 } 2018 } 2019#else 2020 2021ggml_gemv_q2_K_8x8_q8_K_generic (n ,s ,bs ,vx ,vy ,nr ,nc ); 2022 2023#endif 2024} 2025 2026void ggml_gemm_q4_0_8x8_q8_0 (int n ,float * GGML_RESTRICT s ,size_t bs ,const void * GGML_RESTRICT vx ,const void * GGML_RESTRICT vy ,int nr ,int nc ) { 2027#if defined(__AVX2__ )|| defined(__AVX512F__ ) 2028 { 2029// Lookup table to convert signed nibbles to signed bytes 2030__m256i signextendlut = _mm256_castsi128_si256 (_mm_set_epi8 (-1 ,-2 ,-3 ,-4 ,-5 ,-6 ,-7 ,-8 ,7 ,6 ,5 ,4 ,3 ,2 ,1 ,0 )); 2031signextendlut = _mm256_permute2f128_si256 (signextendlut ,signextendlut ,0 ); 2032 2033gemm_q4_b32_8x8_q8_0_lut_avx < block_q4_0x8 > (n ,s ,bs ,vx ,vy ,nr ,nc ,signextendlut ); 2034 2035return ; 2036 } 2037#endif // defined(__AVX2__) || defined(__AVX512F__) 2038 2039ggml_gemm_q4_0_8x8_q8_0_generic (n ,s ,bs ,vx ,vy ,nr ,nc ); 2040} 2041 2042void ggml_gemm_q4_K_8x8_q8_K (int n ,float * GGML_RESTRICT s ,size_t bs ,const void * GGML_RESTRICT vx ,const void * GGML_RESTRICT vy ,int nr ,int nc ) { 2043const int qk = QK_K ; 2044const int nb = n /qk ; 2045const int ncols_interleaved = 8 ; 2046const int blocklen = 8 ; 2047static const uint32_t kmask1 = 0x3f3f3f3f ; 2048static const uint32_t kmask2 = 0x0f0f0f0f ; 2049static const uint32_t kmask3 = 0x03030303 ; 2050 2051assert (n %qk == 0 ); 2052assert (nr %4 == 0 ); 2053assert (nc %ncols_interleaved == 0 ); 2054 2055UNUSED (s ); 2056UNUSED (bs ); 2057UNUSED (vx ); 2058UNUSED (vy ); 2059UNUSED (nr ); 2060UNUSED (nc ); 2061UNUSED (nb ); 2062UNUSED (ncols_interleaved ); 2063UNUSED (blocklen ); 2064 2065#if defined(__AVX2__ )|| defined(__AVX512F__ ) 2066const block_q4_Kx8 * b_ptr_start = (const block_q4_Kx8 * )vx ; 2067const block_q8_Kx4 * a_ptr_start = (const block_q8_Kx4 * )vy ; 2068int64_t b_nb = n /QK_K ; 2069int64_t y = 0 ; 2070 2071// Mask to mask out nibbles from packed bytes 2072const __m256i m4b = _mm256_set1_epi8 (0x0F ); 2073// Permute mask used for easier vector processing at later stages 2074__m256i requiredOrder = _mm256_set_epi32 (3 ,2 ,1 ,0 ,7 ,6 ,5 ,4 ); 2075int64_t xstart = 0 ; 2076int anr = nr - nr %16 ;;// Used to align nr with boundary of 16 2077#if defined(__AVX512BW__ )&& defined(__AVX512DQ__ ) 2078int anc = nc - nc %16 ;// Used to align nc with boundary of 16 2079// Mask to mask out nibbles from packed bytes expanded to 512 bit length 2080const __m512i m4bexpanded = _mm512_set1_epi8 (0x0F ); 2081//Take group of four block_q8_Kx4 structures at each pass of the loop and perform dot product operation 2082for (;y < anr /4 ;y += 4 ) { 2083 2084const block_q8_Kx4 * a_ptrs [4 ]; 2085 2086a_ptrs [0 ]= a_ptr_start + (y * nb ); 2087for (int i = 0 ;i < 3 ;++ i ) { 2088a_ptrs [i + 1 ]= a_ptrs [i ]+ nb ; 2089 } 2090 2091// Take group of eight block_q4_kx8 structures at each pass of the loop and perform dot product operation 2092for (int64_t x = 0 ;x < anc /8 ;x += 2 ) { 2093 2094const block_q4_Kx8 * b_ptr_0 = b_ptr_start + ((x )* b_nb ); 2095const block_q4_Kx8 * b_ptr_1 = b_ptr_start + ((x + 1 )* b_nb ); 2096 2097// Master FP accumulators 2098__m512 acc_rows [16 ]; 2099for (int i = 0 ;i < 16 ;i ++ ) { 2100acc_rows [i ]= _mm512_setzero_ps (); 2101 } 2102 2103__m512 acc_min_rows [16 ]; 2104for (int i = 0 ;i < 16 ;i ++ ) { 2105acc_min_rows [i ]= _mm512_setzero_ps (); 2106 } 2107 2108// For super block 2109for (int64_t b = 0 ;b < nb ;b ++ ) { 2110// Scale values - Load the sixteen scale values from two block_q4_kx8 structures 2111const __m512 col_scale_f32 = GGML_F32Cx8x2_LOAD (b_ptr_0 [b ].d ,b_ptr_1 [b ].d ); 2112 2113// dmin values - Load the sixteen dmin values from two block_q4_kx8 structures 2114const __m512 col_dmin_f32 = GGML_F32Cx8x2_LOAD (b_ptr_0 [b ].dmin ,b_ptr_1 [b ].dmin ); 2115 2116// Loop to iterate over the eight sub blocks of a super block - two sub blocks are processed per iteration 2117for (int sb = 0 ;sb < QK_K /64 ;sb ++ ) { 2118 2119const __m256i rhs_raw_mat_0123_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + sb * 256 )); 2120const __m256i rhs_raw_mat_4567_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + 32 + sb * 256 )); 2121const __m256i rhs_raw_mat_0123_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + 64 + sb * 256 )); 2122const __m256i rhs_raw_mat_4567_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + 96 + sb * 256 )); 2123const __m256i rhs_raw_mat_0123_2 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + 128 + sb * 256 )); 2124const __m256i rhs_raw_mat_4567_2 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + 160 + sb * 256 )); 2125const __m256i rhs_raw_mat_0123_3 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + 192 + sb * 256 )); 2126const __m256i rhs_raw_mat_4567_3 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + 224 + sb * 256 )); 2127 2128const __m256i rhs_raw_mat_89AB_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + sb * 256 )); 2129const __m256i rhs_raw_mat_CDEF_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + 32 + sb * 256 )); 2130const __m256i rhs_raw_mat_89AB_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + 64 + sb * 256 )); 2131const __m256i rhs_raw_mat_CDEF_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + 96 + sb * 256 )); 2132const __m256i rhs_raw_mat_89AB_2 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + 128 + sb * 256 )); 2133const __m256i rhs_raw_mat_CDEF_2 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + 160 + sb * 256 )); 2134const __m256i rhs_raw_mat_89AB_3 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + 192 + sb * 256 )); 2135const __m256i rhs_raw_mat_CDEF_3 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + 224 + sb * 256 )); 2136 2137const __m256i rhs_raw_mat_0145_0 = _mm256_blend_epi32 (rhs_raw_mat_0123_0 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_0 ,requiredOrder ),240 ); 2138const __m256i rhs_raw_mat_2367_0 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_0 ,requiredOrder ),rhs_raw_mat_4567_0 ,240 ); 2139const __m256i rhs_raw_mat_0145_1 = _mm256_blend_epi32 (rhs_raw_mat_0123_1 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_1 ,requiredOrder ),240 ); 2140const __m256i rhs_raw_mat_2367_1 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_1 ,requiredOrder ),rhs_raw_mat_4567_1 ,240 ); 2141const __m256i rhs_raw_mat_0145_2 = _mm256_blend_epi32 (rhs_raw_mat_0123_2 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_2 ,requiredOrder ),240 ); 2142const __m256i rhs_raw_mat_2367_2 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_2 ,requiredOrder ),rhs_raw_mat_4567_2 ,240 ); 2143const __m256i rhs_raw_mat_0145_3 = _mm256_blend_epi32 (rhs_raw_mat_0123_3 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_3 ,requiredOrder ),240 ); 2144const __m256i rhs_raw_mat_2367_3 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_3 ,requiredOrder ),rhs_raw_mat_4567_3 ,240 ); 2145 2146const __m256i rhs_raw_mat_89CD_0 = _mm256_blend_epi32 (rhs_raw_mat_89AB_0 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_CDEF_0 ,requiredOrder ),240 ); 2147const __m256i rhs_raw_mat_ABEF_0 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_89AB_0 ,requiredOrder ),rhs_raw_mat_CDEF_0 ,240 ); 2148const __m256i rhs_raw_mat_89CD_1 = _mm256_blend_epi32 (rhs_raw_mat_89AB_1 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_CDEF_1 ,requiredOrder ),240 ); 2149const __m256i rhs_raw_mat_ABEF_1 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_89AB_1 ,requiredOrder ),rhs_raw_mat_CDEF_1 ,240 ); 2150const __m256i rhs_raw_mat_89CD_2 = _mm256_blend_epi32 (rhs_raw_mat_89AB_2 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_CDEF_2 ,requiredOrder ),240 ); 2151const __m256i rhs_raw_mat_ABEF_2 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_89AB_2 ,requiredOrder ),rhs_raw_mat_CDEF_2 ,240 ); 2152const __m256i rhs_raw_mat_89CD_3 = _mm256_blend_epi32 (rhs_raw_mat_89AB_3 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_CDEF_3 ,requiredOrder ),240 ); 2153const __m256i rhs_raw_mat_ABEF_3 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_89AB_3 ,requiredOrder ),rhs_raw_mat_CDEF_3 ,240 ); 2154 2155const __m512i rhs_raw_mat_014589CD_0 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_0145_0 ),rhs_raw_mat_89CD_0 ,1 ); 2156const __m512i rhs_raw_mat_2367ABEF_0 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_2367_0 ),rhs_raw_mat_ABEF_0 ,1 ); 2157const __m512i rhs_raw_mat_014589CD_1 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_0145_1 ),rhs_raw_mat_89CD_1 ,1 ); 2158const __m512i rhs_raw_mat_2367ABEF_1 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_2367_1 ),rhs_raw_mat_ABEF_1 ,1 ); 2159 2160const __m512i rhs_raw_mat_014589CD_2 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_0145_2 ),rhs_raw_mat_89CD_2 ,1 ); 2161const __m512i rhs_raw_mat_2367ABEF_2 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_2367_2 ),rhs_raw_mat_ABEF_2 ,1 ); 2162const __m512i rhs_raw_mat_014589CD_3 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_0145_3 ),rhs_raw_mat_89CD_3 ,1 ); 2163const __m512i rhs_raw_mat_2367ABEF_3 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_2367_3 ),rhs_raw_mat_ABEF_3 ,1 ); 2164 2165//4-bit -> 8-bit 2166const __m512i rhs_mat_014589CD_00 = _mm512_and_si512 (rhs_raw_mat_014589CD_0 ,m4bexpanded );//B00(0-7) B01(0-7) B04(0-7) B05(0-7) B08(0-7) B09(0-7) B0C(0-7) B0D(0-7) 2167const __m512i rhs_mat_2367ABEF_00 = _mm512_and_si512 (rhs_raw_mat_2367ABEF_0 ,m4bexpanded );//B02(0-7) B03(0-7) B06(0-7) B07(0-7) B0A(0-7) B0B(0-7) B0E(0-7) B0F(0-7) 2168const __m512i rhs_mat_014589CD_01 = _mm512_and_si512 (rhs_raw_mat_014589CD_1 ,m4bexpanded );//B00(8-15) B01(8-15) B04(8-15) B05(8-15) B08(8-15) B09(8-15) B0C(8-15) B0D(8-15) 2169const __m512i rhs_mat_2367ABEF_01 = _mm512_and_si512 (rhs_raw_mat_2367ABEF_1 ,m4bexpanded );//B02(8-15) B03(8-15) B06(8-15) B07(8-15) B0A(8-15) B0B(8-15) B0E(8-15) B0F(8-15) 2170 2171const __m512i rhs_mat_014589CD_02 = _mm512_and_si512 (rhs_raw_mat_014589CD_2 ,m4bexpanded );//B00(16-23) B01(16-23) B04(16-23) B05(16-23) B08(16-23) B09(16-23) B0C(16-23) B0D(16-23) 2172const __m512i rhs_mat_2367ABEF_02 = _mm512_and_si512 (rhs_raw_mat_2367ABEF_2 ,m4bexpanded );//B02(16-23) B03(16-23) B06(16-23) B07(16-23) B0A(16-23) B0B(16-23) B0E(16-23) B0F(16-23) 2173const __m512i rhs_mat_014589CD_03 = _mm512_and_si512 (rhs_raw_mat_014589CD_3 ,m4bexpanded );//B00(24-31) B01(24-31) B04(24-31) B05(24-31) B08(24-31) B09(24-31) B0C(24-31) B0D(24-31) 2174const __m512i rhs_mat_2367ABEF_03 = _mm512_and_si512 (rhs_raw_mat_2367ABEF_3 ,m4bexpanded );//B02(24-31) B03(24-31) B06(24-31) B07(24-31) B0A(24-31) B0B(24-31) B0E(24-31) B0F(24-31) 2175 2176const __m512i rhs_mat_014589CD_10 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_014589CD_0 ,4 ),m4bexpanded );//B10(0-7) B11(0-7) B14(0-7) B15(0-7) B18(0-7) B19(0-7) B1C(0-7) B1D(0-7) 2177const __m512i rhs_mat_2367ABEF_10 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_2367ABEF_0 ,4 ),m4bexpanded );//B12(0-7) B13(0-7) B16(0-7) B17(0-7) B1A(0-7) B1B(0-7) B1E(0-7) B1F(0-7) 2178const __m512i rhs_mat_014589CD_11 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_014589CD_1 ,4 ),m4bexpanded );//B10(8-15) B11(8-15) B14(8-15) B15(8-15) B18(8-15) B19(8-15) B1C(8-15) B1D(8-15) 2179const __m512i rhs_mat_2367ABEF_11 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_2367ABEF_1 ,4 ),m4bexpanded );//B12(8-15) B13(8-15) B16(8-15) B17(8-15) B1A(8-15) B1B(8-15) B1E(8-15) B1F(8-15) 2180 2181const __m512i rhs_mat_014589CD_12 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_014589CD_2 ,4 ),m4bexpanded );//B10(16-23) B11(16-23) B14(16-23) B15(16-23) B18(16-23) B19(16-23) B1C(16-23) B1D(16-23) 2182const __m512i rhs_mat_2367ABEF_12 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_2367ABEF_2 ,4 ),m4bexpanded );//B12(16-23) B13(16-23) B16(16-23) B17(16-23) B1A(16-23) B1B(16-23) B1E(16-23) B1F(16-23) 2183const __m512i rhs_mat_014589CD_13 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_014589CD_3 ,4 ),m4bexpanded );//B10(24-31) B11(24-31) B14(24-31) B15(24-31) B18(24-31) B19(24-31) B1C(24-31) B1D(24-31) 2184const __m512i rhs_mat_2367ABEF_13 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_2367ABEF_3 ,4 ),m4bexpanded );//B12(24-31) B13(24-31) B16(24-31) B17(24-31) B1A(24-31) B1B(24-31) B1E(24-31) B1F(24-31) 2185 2186// Shuffle pattern one - right side input 2187const __m512i rhs_mat_014589CD_00_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_00 , (_MM_PERM_ENUM )136 );//B00(0-3) B01(0-3) B00(0-3) B01(0-3) B04(0-3) B05(0-3) B04(0-3) B05(0-3) B08(0-3) B09(0-3) B08(0-3) B09(0-3) B0C(0-3) B0D(0-3) B0C(0-3) B0D(0-3) 2188const __m512i rhs_mat_2367ABEF_00_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_00 , (_MM_PERM_ENUM )136 );//B02(0-3) B03(0-3) B02(0-3) B03(0-3) B06(0-3) B07(0-3) B06(0-3) B07(0-3) B0A(0-3) B0B(0-3) B0A(0-3) B0B(0-3) B0E(0-3) B0F(0-3) B0E(0-3) B0F(0-3) 2189const __m512i rhs_mat_014589CD_01_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_01 , (_MM_PERM_ENUM )136 );//B00(8-11) B01(8-11) B00(8-11) B01(8-11) B04(8-11) B05(8-11) B04(8-11) B05(8-11) B08(8-11) B09(8-11) B08(8-11) B09(8-11) B0C(8-11) B0D(8-11) B0C(8-11) B0D(8-11) 2190const __m512i rhs_mat_2367ABEF_01_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_01 , (_MM_PERM_ENUM )136 );//B02(8-11) B03(8-11) B02(8-11) B03(8-11) B06(8-11) B07(8-11) B06(8-11) B07(8-11) B0A(8-11) B0B(8-11) B0A(8-11) B0B(8-11) B0E(8-11) B0F(8-11) B0E(8-11) B0F(8-11) 2191const __m512i rhs_mat_014589CD_02_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_02 , (_MM_PERM_ENUM )136 );//B00(16-19) B01(16-19) B00(16-19) B01(16-19) B04(16-19) B05(16-19) B04(16-19) B05(16-19) B08(16-19) B09(16-19) B08(16-19) B09(16-19) B0C(16-19) B0D(16-19) B0C(16-19) B0D(16-19) 2192const __m512i rhs_mat_2367ABEF_02_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_02 , (_MM_PERM_ENUM )136 );//B02(16-19) B03(16-19) B02(16-19) B03(16-19) B06(16-19) B07(16-19) B06(16-19) B07(16-19) B0A(16-19) B0B(16-19) B0A(16-19) B0B(16-19) B0E(16-19) B0F(16-19) B0E(16-19) B0F(16-19) 2193const __m512i rhs_mat_014589CD_03_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_03 , (_MM_PERM_ENUM )136 );//B00(24-27) B01(24-27) B00(24-27) B01(24-27) B04(24-27) B05(24-27) B04(24-27) B05(24-27) B08(24-27) B09(24-27) B08(24-27) B09(24-27) B0C(24-27) B0D(24-27) B0C(24-27) B0D(24-27) 2194const __m512i rhs_mat_2367ABEF_03_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_03 , (_MM_PERM_ENUM )136 );//B02(24-27) B03(24-27) B02(24-27) B03(24-27) B06(24-27) B07(24-27) B06(24-27) B07(24-27) B0A(24-27) B0B(24-27) B0A(24-27) B0B(24-27) B0E(24-27) B0F(24-27) B0E(24-27) B0F(24-27) 2195 2196const __m512i rhs_mat_014589CD_10_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_10 , (_MM_PERM_ENUM )136 );//B10(0-3) B11(0-3) B10(0-3) B11(0-3) B14(0-3) B15(0-3) B14(0-3) B15(0-3) B18(0-3) B19(0-3) B18(0-3) B19(0-3) B1C(0-3) B1D(0-3) B1C(0-3) B1D(0-3) 2197const __m512i rhs_mat_2367ABEF_10_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_10 , (_MM_PERM_ENUM )136 );//B12(0-3) B13(0-3) B12(0-3) B13(0-3) B16(0-3) B17(0-3) B16(0-3) B17(0-3) B1A(0-3) B1B(0-3) B1A(0-3) B1B(0-3) B1E(0-3) B1F(0-3) B1E(0-3) B1F(0-3) 2198const __m512i rhs_mat_014589CD_11_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_11 , (_MM_PERM_ENUM )136 );//B10(8-11) B11(8-11) B10(8-11) B11(8-11) B14(8-11) B15(8-11) B14(8-11) B15(8-11) B18(8-11) B19(8-11) B18(8-11) B19(8-11) B1C(8-11) B1D(8-11) B1C(8-11) B1D(8-11) 2199const __m512i rhs_mat_2367ABEF_11_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_11 , (_MM_PERM_ENUM )136 );//B12(8-11) B13(8-11) B12(8-11) B13(8-11) B16(8-11) B17(8-11) B16(8-11) B17(8-11) B1A(8-11) B1B(8-11) B1A(8-11) B1B(8-11) B1E(8-11) B1F(8-11) B1E(8-11) B1F(8-11) 2200const __m512i rhs_mat_014589CD_12_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_12 , (_MM_PERM_ENUM )136 );//B10(16-19) B11(16-19) B10(16-19) B11(16-19) B14(16-19) B15(16-19) B14(16-19) B15(16-19) B18(16-19) B19(16-19) B18(16-19) B19(16-19) B1C(16-19) B1D(16-19) B1C(16-19) B1D(16-19) 2201const __m512i rhs_mat_2367ABEF_12_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_12 , (_MM_PERM_ENUM )136 );//B12(16-19) B13(16-19) B12(16-19) B13(16-19) B16(16-19) B17(16-19) B16(16-19) B17(16-19) B1A(16-19) B1B(16-19) B1A(16-19) B1B(16-19) B1E(16-19) B1F(16-19) B1E(16-19) B1F(16-19) 2202const __m512i rhs_mat_014589CD_13_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_13 , (_MM_PERM_ENUM )136 );//B10(24-27) B11(24-27) B10(24-27) B11(24-27) B14(24-27) B15(24-27) B14(24-27) B15(24-27) B18(24-27) B19(24-27) B18(24-27) B19(24-27) B1C(24-27) B1D(24-27) B1C(24-27) B1D(24-27) 2203const __m512i rhs_mat_2367ABEF_13_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_13 , (_MM_PERM_ENUM )136 );//B12(24-27) B13(24-27) B12(24-27) B13(24-27) B16(24-27) B17(24-27) B16(24-27) B17(24-27) B1A(24-27) B1B(24-27) B1A(24-27) B1B(24-27) B1E(24-27) B1F(24-27) B1E(24-27) B1F(24-27) 2204 2205// Shuffle pattern two - right side input 2206const __m512i rhs_mat_014589CD_00_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_00 , (_MM_PERM_ENUM )221 );//B00(4-7) B01(4-7) B00(4-7) B01(4-7) B04(4-7) B05(4-7) B04(4-7) B05(4-7) B08(4-7) B09(4-7) B08(4-7) B09(4-7) B0C(4-7) B0D(4-7) B0C(4-7) B0D(4-7) 2207const __m512i rhs_mat_2367ABEF_00_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_00 , (_MM_PERM_ENUM )221 );//B02(4-7) B03(4-7) B02(4-7) B03(4-7) B06(4-7) B07(4-7) B06(4-7) B07(4-7) B0A(4-7) B0B(4-7) B0A(4-7) B0B(4-7) B0E(4-7) B0F(4-7) B0E(4-7) B0F(4-7) 2208const __m512i rhs_mat_014589CD_01_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_01 , (_MM_PERM_ENUM )221 );//B00(12-15) B01(12-15) B00(12-15) B01(12-15) B04(12-15) B05(12-15) B04(12-15) B05(12-15) B08(12-15) B09(12-15) B08(12-15) B09(12-15) B0C(12-15) B0D(12-15) B0C(12-15) B0D(12-15) 2209const __m512i rhs_mat_2367ABEF_01_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_01 , (_MM_PERM_ENUM )221 );//B02(12-15) B03(12-15) B02(12-15) B03(12-15) B06(12-15) B07(12-15) B06(12-15) B07(12-15) B0A(12-15) B0B(12-15) B0A(12-15) B0B(12-15) B0E(12-15) B0F(12-15) B0E(12-15) B0F(12-15) 2210const __m512i rhs_mat_014589CD_02_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_02 , (_MM_PERM_ENUM )221 );//B00(20-23) B01(20-23) B00(20-23) B01(20-23) B04(20-23) B05(20-23) B04(20-23) B05(20-23) B08(20-23) B09(20-23) B08(20-23) B09(20-23) B0C(20-23) B0D(20-23) B0C(20-23) B0D(20-23) 2211const __m512i rhs_mat_2367ABEF_02_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_02 , (_MM_PERM_ENUM )221 );//B02(20-23) B03(20-23) B02(20-23) B03(20-23) B06(20-23) B07(20-23) B06(20-23) B07(20-23) B0A(20-23) B0B(20-23) B0A(20-23) B0B(20-23) B0E(20-23) B0F(20-23) B0E(20-23) B0F(20-23) 2212const __m512i rhs_mat_014589CD_03_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_03 , (_MM_PERM_ENUM )221 );//B00(28-31) B01(28-31) B00(28-31) B01(28-31) B04(28-31) B05(28-31) B04(28-31) B05(28-31) B08(28-31) B09(28-31) B08(28-31) B09(28-31) B0C(28-31) B0D(28-31) B0C(28-31) 0BD(28-31) 2213const __m512i rhs_mat_2367ABEF_03_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_03 , (_MM_PERM_ENUM )221 );//B02(28-31) B03(28-31) B02(28-31) B03(28-31) B06(28-31) B07(28-31) B06(28-31) B07(28-31) B0A(28-31) B0B(28-31) B0A(28-31) B0B(28-31) B0E(28-31) B0F(28-31) B0E(28-31) B0F(28-31) 2214 2215const __m512i rhs_mat_014589CD_10_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_10 , (_MM_PERM_ENUM )221 );//B10(4-7) B11(4-7) B10(4-7) B11(4-7) B14(4-7) B15(4-7) B14(4-7) B15(4-7) B18(4-7) B19(4-7) B18(4-7) B19(4-7) B1C(4-7) B1D(4-7) B1C(4-7) B1D(4-7) 2216const __m512i rhs_mat_2367ABEF_10_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_10 , (_MM_PERM_ENUM )221 );//B12(4-7) B13(4-7) B12(4-7) B13(4-7) B16(4-7) B17(4-7) B16(4-7) B17(4-7) B1A(4-7) B1B(4-7) B1A(4-7) B1B(4-7) B1E(4-7) B1F(4-7) B1E(4-7) B1F(4-7) 2217const __m512i rhs_mat_014589CD_11_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_11 , (_MM_PERM_ENUM )221 );//B10(12-15) B11(12-15) B10(12-15) B11(12-15) B14(12-15) B15(12-15) B14(12-15) B15(12-15) B18(12-15) B19(12-15) B18(12-15) B19(12-15) B1C(12-15) B1D(12-15) B1C(12-15) B1D(12-15) 2218const __m512i rhs_mat_2367ABEF_11_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_11 , (_MM_PERM_ENUM )221 );//B12(12-15) B13(12-15) B12(12-15) B13(12-15) B16(12-15) B17(12-15) B16(12-15) B17(12-15) B1A(12-15) B1B(12-15) B1A(12-15) B1B(12-15) B1E(12-15) B1F(12-15) B1E(12-15) B1F(12-15) 2219const __m512i rhs_mat_014589CD_12_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_12 , (_MM_PERM_ENUM )221 );//B10(20-23) B11(20-23) B10(20-23) B11(20-23) B14(20-23) B15(20-23) B14(20-23) B15(20-23) B18(20-23) B19(20-23) B18(20-23) B19(20-23) B1C(20-23) B1D(20-23) B1C(20-23) B1D(20-23) 2220const __m512i rhs_mat_2367ABEF_12_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_12 , (_MM_PERM_ENUM )221 );//B12(20-23) B13(20-23) B12(20-23) B13(20-23) B16(20-23) B17(20-23) B16(20-23) B17(20-23) B1A(20-23) B1B(20-23) B1A(20-23) B1B(20-23) B1E(20-23) B1F(20-23) B1E(20-23) B1F(20-23) 2221const __m512i rhs_mat_014589CD_13_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_13 , (_MM_PERM_ENUM )221 );//B10(28-31) B11(28-31) B10(28-31) B11(28-31) B14(28-31) B15(28-31) B14(28-31) B15(28-31) B18(28-31) B19(28-31) B18(28-31) B19(28-31) B1C(28-31) B1D(28-31) B1C(28-31) B1D(28-31) 2222const __m512i rhs_mat_2367ABEF_13_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_13 , (_MM_PERM_ENUM )221 );//B12(28-31) B13(28-31) B12(28-31) B13(28-31) B16(28-31) B17(28-31) B16(28-31) B17(28-31) B1A(28-31) B1B(28-31) B1A(28-31) B1B(28-31) B1E(28-31) B1F(28-31) B1E(28-31) B1F(28-31) 2223 2224uint32_t utmp_00 [4 ],utmp_01 [4 ],utmp_10 [4 ],utmp_11 [4 ]; 2225 2226// Scales and Mins of corresponding sub blocks from different Q4_K structures are stored together 2227// The below block is for eg to extract first sub block's scales and mins from different Q4_K structures for the sb loop 2228memcpy (utmp_00 ,b_ptr_0 [b ].scales + 24 * sb ,12 ); 2229utmp_00 [3 ]= ((utmp_00 [2 ] >>4 )& kmask2 ) | (((utmp_00 [1 ] >>6 )& kmask3 ) <<4 ); 2230const uint32_t uaux_00 = utmp_00 [1 ]& kmask1 ; 2231utmp_00 [1 ]= (utmp_00 [2 ]& kmask2 ) | (((utmp_00 [0 ] >>6 )& kmask3 ) <<4 ); 2232utmp_00 [2 ]= uaux_00 ; 2233utmp_00 [0 ] &=kmask1 ; 2234 2235// The below block is for eg to extract second sub block's scales and mins from different Q4_K structures for the sb loop 2236memcpy (utmp_01 ,b_ptr_0 [b ].scales + 12 + sb * 24 ,12 ); 2237utmp_01 [3 ]= ((utmp_01 [2 ] >>4 )& kmask2 ) | (((utmp_01 [1 ] >>6 )& kmask3 ) <<4 ); 2238const uint32_t uaux_01 = utmp_01 [1 ]& kmask1 ; 2239utmp_01 [1 ]= (utmp_01 [2 ]& kmask2 ) | (((utmp_01 [0 ] >>6 )& kmask3 ) <<4 ); 2240utmp_01 [2 ]= uaux_01 ; 2241utmp_01 [0 ] &=kmask1 ; 2242 2243memcpy (utmp_10 ,b_ptr_1 [b ].scales + sb * 24 ,12 ); 2244utmp_10 [3 ]= ((utmp_10 [2 ] >>4 )& kmask2 ) | (((utmp_10 [1 ] >>6 )& kmask3 ) <<4 ); 2245const uint32_t uaux_10 = utmp_10 [1 ]& kmask1 ; 2246utmp_10 [1 ]= (utmp_10 [2 ]& kmask2 ) | (((utmp_10 [0 ] >>6 )& kmask3 ) <<4 ); 2247utmp_10 [2 ]= uaux_10 ; 2248utmp_10 [0 ] &=kmask1 ; 2249 2250// The below block is for eg to extract second sub block's scales and mins from different Q4_K structures for the sb loop 2251memcpy (utmp_11 ,b_ptr_1 [b ].scales + 12 + sb * 24 ,12 ); 2252utmp_11 [3 ]= ((utmp_11 [2 ] >>4 )& kmask2 ) | (((utmp_11 [1 ] >>6 )& kmask3 ) <<4 ); 2253const uint32_t uaux_11 = utmp_11 [1 ]& kmask1 ; 2254utmp_11 [1 ]= (utmp_11 [2 ]& kmask2 ) | (((utmp_11 [0 ] >>6 )& kmask3 ) <<4 ); 2255utmp_11 [2 ]= uaux_11 ; 2256utmp_11 [0 ] &=kmask1 ; 2257 2258// Scales of first sub block in the sb loop 2259const __m256i mins_and_scales_0 = _mm256_set_epi32 (utmp_10 [3 ],utmp_10 [2 ],utmp_10 [1 ],utmp_10 [0 ],utmp_00 [3 ],utmp_00 [2 ],utmp_00 [1 ],utmp_00 [0 ]); 2260const __m512i scales_0 = _mm512_cvtepu8_epi16 (_mm256_unpacklo_epi8 (mins_and_scales_0 ,mins_and_scales_0 )); 2261 2262// Scales of second sub block in the sb loop 2263const __m256i mins_and_scales_1 = _mm256_set_epi32 (utmp_11 [3 ],utmp_11 [2 ],utmp_11 [1 ],utmp_11 [0 ],utmp_01 [3 ],utmp_01 [2 ],utmp_01 [1 ],utmp_01 [0 ]); 2264const __m512i scales_1 = _mm512_cvtepu8_epi16 (_mm256_unpacklo_epi8 (mins_and_scales_1 ,mins_and_scales_1 )); 2265 2266// Mins of first and second sub block of Q4_K block are arranged side by side 2267const __m512i mins_01 = _mm512_cvtepu8_epi16 (_mm256_unpacklo_epi8 (_mm256_shuffle_epi32 (mins_and_scales_0 ,78 ),_mm256_shuffle_epi32 (mins_and_scales_1 ,78 ))); 2268 2269const __m512i scale_014589CD_0 = _mm512_shuffle_epi32 (scales_0 , (_MM_PERM_ENUM )68 ); 2270const __m512i scale_2367ABEF_0 = _mm512_shuffle_epi32 (scales_0 , (_MM_PERM_ENUM )238 ); 2271 2272const __m512i scale_014589CD_1 = _mm512_shuffle_epi32 (scales_1 , (_MM_PERM_ENUM )68 ); 2273const __m512i scale_2367ABEF_1 = _mm512_shuffle_epi32 (scales_1 , (_MM_PERM_ENUM )238 ); 2274 2275for (int rp = 0 ;rp < 4 ;rp ++ ) { 2276 2277// Load the four block_q8_k quantized values interleaved with each other in chunks of eight bytes - A0,A1,A2,A3 2278// Loaded as set of 128 bit vectors and repeated and stored into a 256 bit vector before again repeating into 512 bit vector 2279__m256i lhs_mat_ymm_0123_00 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 256 * sb ))); 2280__m256i lhs_mat_ymm_01_00 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_00 ,lhs_mat_ymm_0123_00 ,0 ); 2281__m256i lhs_mat_ymm_23_00 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_00 ,lhs_mat_ymm_0123_00 ,17 ); 2282__m256i lhs_mat_ymm_0123_01 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 32 + 256 * sb ))); 2283__m256i lhs_mat_ymm_01_01 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_01 ,lhs_mat_ymm_0123_01 ,0 ); 2284__m256i lhs_mat_ymm_23_01 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_01 ,lhs_mat_ymm_0123_01 ,17 ); 2285__m256i lhs_mat_ymm_0123_02 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 64 + 256 * sb ))); 2286__m256i lhs_mat_ymm_01_02 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_02 ,lhs_mat_ymm_0123_02 ,0 ); 2287__m256i lhs_mat_ymm_23_02 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_02 ,lhs_mat_ymm_0123_02 ,17 ); 2288__m256i lhs_mat_ymm_0123_03 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 96 + 256 * sb ))); 2289__m256i lhs_mat_ymm_01_03 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_03 ,lhs_mat_ymm_0123_03 ,0 ); 2290__m256i lhs_mat_ymm_23_03 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_03 ,lhs_mat_ymm_0123_03 ,17 ); 2291__m256i lhs_mat_ymm_0123_10 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 128 + 256 * sb ))); 2292__m256i lhs_mat_ymm_01_10 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_10 ,lhs_mat_ymm_0123_10 ,0 ); 2293__m256i lhs_mat_ymm_23_10 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_10 ,lhs_mat_ymm_0123_10 ,17 ); 2294__m256i lhs_mat_ymm_0123_11 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 160 + 256 * sb ))); 2295__m256i lhs_mat_ymm_01_11 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_11 ,lhs_mat_ymm_0123_11 ,0 ); 2296__m256i lhs_mat_ymm_23_11 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_11 ,lhs_mat_ymm_0123_11 ,17 ); 2297__m256i lhs_mat_ymm_0123_12 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 192 + 256 * sb ))); 2298__m256i lhs_mat_ymm_01_12 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_12 ,lhs_mat_ymm_0123_12 ,0 ); 2299__m256i lhs_mat_ymm_23_12 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_12 ,lhs_mat_ymm_0123_12 ,17 ); 2300__m256i lhs_mat_ymm_0123_13 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 224 + 256 * sb ))); 2301__m256i lhs_mat_ymm_01_13 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_13 ,lhs_mat_ymm_0123_13 ,0 ); 2302__m256i lhs_mat_ymm_23_13 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_13 ,lhs_mat_ymm_0123_13 ,17 ); 2303 2304__m512i lhs_mat_01_00 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_00 ),lhs_mat_ymm_01_00 ,1 ); 2305__m512i lhs_mat_23_00 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_00 ),lhs_mat_ymm_23_00 ,1 ); 2306__m512i lhs_mat_01_01 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_01 ),lhs_mat_ymm_01_01 ,1 ); 2307__m512i lhs_mat_23_01 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_01 ),lhs_mat_ymm_23_01 ,1 ); 2308__m512i lhs_mat_01_02 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_02 ),lhs_mat_ymm_01_02 ,1 ); 2309__m512i lhs_mat_23_02 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_02 ),lhs_mat_ymm_23_02 ,1 ); 2310__m512i lhs_mat_01_03 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_03 ),lhs_mat_ymm_01_03 ,1 ); 2311__m512i lhs_mat_23_03 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_03 ),lhs_mat_ymm_23_03 ,1 ); 2312 2313__m512i lhs_mat_01_10 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_10 ),lhs_mat_ymm_01_10 ,1 ); 2314__m512i lhs_mat_23_10 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_10 ),lhs_mat_ymm_23_10 ,1 ); 2315__m512i lhs_mat_01_11 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_11 ),lhs_mat_ymm_01_11 ,1 ); 2316__m512i lhs_mat_23_11 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_11 ),lhs_mat_ymm_23_11 ,1 ); 2317__m512i lhs_mat_01_12 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_12 ),lhs_mat_ymm_01_12 ,1 ); 2318__m512i lhs_mat_23_12 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_12 ),lhs_mat_ymm_23_12 ,1 ); 2319__m512i lhs_mat_01_13 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_13 ),lhs_mat_ymm_01_13 ,1 ); 2320__m512i lhs_mat_23_13 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_13 ),lhs_mat_ymm_23_13 ,1 ); 2321 2322// Bsums are loaded - four bsums are loaded (for two sub blocks) for the different Q8_K blocks 2323__m256i lhs_bsums_0123_01 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].bsums + 16 * sb ))); 2324__m256i lhs_bsums_hsum_ymm_0123_01 = _mm256_castsi128_si256 (_mm_hadd_epi16 (_mm256_castsi256_si128 (lhs_bsums_0123_01 ),_mm256_extractf128_si256 (lhs_bsums_0123_01 ,1 ))); 2325lhs_bsums_hsum_ymm_0123_01 = _mm256_permute2x128_si256 (lhs_bsums_hsum_ymm_0123_01 ,lhs_bsums_hsum_ymm_0123_01 ,0 ); 2326__m512i lhs_bsums_hsum_0123_01 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_bsums_hsum_ymm_0123_01 ),lhs_bsums_hsum_ymm_0123_01 ,1 ); 2327 2328// Shuffle pattern one - left side input 2329const __m512i lhs_mat_01_00_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_00 , (_MM_PERM_ENUM )160 );//A00(0-3) A00(0-3) A01(0-3) A01(0-3) A00(0-3) A00(0-3) A01(0-3) A01(0-3) A00(0-3) A00(0-3) A01(0-3) A01(0-3) A00(0-3) A00(0-3) A01(0-3) A01(0-3) 2330const __m512i lhs_mat_23_00_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_00 , (_MM_PERM_ENUM )160 );//A02(0-3) A02(0-3) A03(0-3) A03(0-3) A02(0-3) A02(0-3) A03(0-3) A03(0-3) A02(0-3) A02(0-3) A03(0-3) A03(0-3) A02(0-3) A02(0-3) A03(0-3) A03(0-3) 2331const __m512i lhs_mat_01_01_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_01 , (_MM_PERM_ENUM )160 );//A00(8-11) A00(8-11) A01(8-11) A01(8-11) A00(8-11) A00(8-11) A01(8-11) A01(8-11) A00(8-11) A00(8-11) A01(8-11) A01(8-11) A00(8-11) A00(8-11) A01(8-11) A01(8-11) 2332const __m512i lhs_mat_23_01_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_01 , (_MM_PERM_ENUM )160 );//A02(8-11) A02(8-11) A03(8-11) A03(8-11) A02(8-11) A02(8-11) A03(8-11) A03(8-11) A02(8-11) A02(8-11) A03(8-11) A03(8-11) A02(8-11) A02(8-11) A03(8-11) A03(8-11) 2333const __m512i lhs_mat_01_02_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_02 , (_MM_PERM_ENUM )160 );//A00(16-19) A00(16-19) A01(16-19) A01(16-19) A00(16-19) A00(16-19) A01(16-19) A01(16-19) A00(16-19) A00(16-19) A01(16-19) A01(16-19) A00(16-19) A00(16-19) A01(16-19) A01(16-19) 2334const __m512i lhs_mat_23_02_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_02 , (_MM_PERM_ENUM )160 );//A02(16-19) A02(16-19) A03(16-19) A03(16-19) A02(16-19) A02(16-19) A03(16-19) A03(16-19) A02(16-19) A02(16-19) A03(16-19) A03(16-19) A02(16-19) A02(16-19) A03(16-19) A03(16-19) 2335const __m512i lhs_mat_01_03_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_03 , (_MM_PERM_ENUM )160 );//A00(24-27) A00(24-27) A01(24-27) A01(24-27) A00(24-27) A00(24-27) A01(24-27) A01(24-27) A00(24-27) A00(24-27) A01(24-27) A01(24-27) A00(24-27) A00(24-27) A01(24-27) A01(24-27) 2336const __m512i lhs_mat_23_03_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_03 , (_MM_PERM_ENUM )160 );//A02(24-27) A02(24-27) A03(24-27) A03(24-27) A02(24-27) A02(24-27) A03(24-27) A03(24-27) A02(24-27) A02(24-27) A03(24-27) A03(24-27) A02(24-27) A02(24-27) A03(24-27) A03(24-27) 2337 2338const __m512i lhs_mat_01_10_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_10 , (_MM_PERM_ENUM )160 );//A10(0-3) A10(0-3) A11(0-3) A11(0-3) A10(0-3) A10(0-3) A11(0-3) A11(0-3) A10(0-3) A10(0-3) A11(0-3) A11(0-3) A10(0-3) A10(0-3) A11(0-3) A11(0-3) 2339const __m512i lhs_mat_23_10_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_10 , (_MM_PERM_ENUM )160 );//A12(0-3) A12(0-3) A13(0-3) A13(0-3) A12(0-3) A12(0-3) A13(0-3) A13(0-3) A12(0-3) A12(0-3) A13(0-3) A13(0-3) A12(0-3) A12(0-3) A13(0-3) A13(0-3) 2340const __m512i lhs_mat_01_11_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_11 , (_MM_PERM_ENUM )160 );//A10(8-11) A10(8-11) A11(8-11) A11(8-11) A10(8-11) A10(8-11) A11(8-11) A11(8-11) A10(8-11) A10(8-11) A11(8-11) A11(8-11) A10(8-11) A10(8-11) A11(8-11) A11(8-11) 2341const __m512i lhs_mat_23_11_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_11 , (_MM_PERM_ENUM )160 );//A12(8-11) A12(8-11) A13(8-11) A13(8-11) A12(8-11) A12(8-11) A13(8-11) A13(8-11) A12(8-11) A12(8-11) A13(8-11) A13(8-11) A12(8-11) A12(8-11) A13(8-11) A13(8-11) 2342const __m512i lhs_mat_01_12_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_12 , (_MM_PERM_ENUM )160 );//A10(16-19) A10(16-19) A11(16-19) A11(16-19) A10(16-19) A10(16-19) A11(16-19) A11(16-19) A10(16-19) A10(16-19) A11(16-19) A11(16-19) A10(16-19) A10(16-19) A11(16-19) A11(16-19) 2343const __m512i lhs_mat_23_12_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_12 , (_MM_PERM_ENUM )160 );//A12(16-19) A12(16-19) A13(16-19) A13(16-19) A12(16-19) A12(16-19) A13(16-19) A13(16-19) A12(16-19) A12(16-19) A13(16-19) A13(16-19) A12(16-19) A12(16-19) A13(16-19) A13(16-19) 2344const __m512i lhs_mat_01_13_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_13 , (_MM_PERM_ENUM )160 );//A10(24-27) A10(24-27) A11(24-27) A11(24-27) A10(24-27) A10(24-27) A11(24-27) A11(24-27) A10(24-27) A10(24-27) A11(24-27) A11(24-27) A10(24-27) A10(24-27) A11(24-27) A11(24-27) 2345const __m512i lhs_mat_23_13_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_13 , (_MM_PERM_ENUM )160 );//A12(24-27) A12(24-27) A13(24-27) A13(24-27) A12(24-27) A12(24-27) A13(24-27) A13(24-27) A12(24-27) A12(24-27) A13(24-27) A13(24-27) A12(24-27) A12(24-27) A13(24-27) A13(24-27) 2346 2347const __m512i lhs_mat_01_00_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_00 , (_MM_PERM_ENUM )245 );//A00(4-7) A00(4-7) A01(4-7) A01(4-7) A00(4-7) A00(4-7) A01(4-7) A01(4-7) A00(4-7) A00(4-7) A01(4-7) A01(4-7) A00(4-7) A00(4-7) A01(4-7) A01(4-7) 2348const __m512i lhs_mat_23_00_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_00 , (_MM_PERM_ENUM )245 );//A02(4-7) A02(4-7) A03(4-7) A03(4-7) A02(4-7) A02(4-7) A03(4-7) A03(4-7) A02(4-7) A02(4-7) A03(4-7) A03(4-7) A02(4-7) A02(4-7) A03(4-7) A03(4-7) 2349const __m512i lhs_mat_01_01_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_01 , (_MM_PERM_ENUM )245 );//A00(12-15) A00(12-15) A01(12-15) A01(12-15) A00(12-15) A00(12-15) A01(12-15) A01(12-15) A00(12-15) A00(12-15) A01(12-15) A01(12-15) A00(12-15) A00(12-15) A01(12-15) A01(12-15) 2350const __m512i lhs_mat_23_01_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_01 , (_MM_PERM_ENUM )245 );//A02(12-15) A02(12-15) A03(12-15) A03(12-15) A02(12-15) A02(12-15) A03(12-15) A03(12-15) A02(12-15) A02(12-15) A03(12-15) A03(12-15) A02(12-15) A02(12-15) A03(12-15) A03(12-15) 2351const __m512i lhs_mat_01_02_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_02 , (_MM_PERM_ENUM )245 );//A00(20-23) A00(20-23) A01(20-23) A01(20-23) A00(20-23) A00(20-23) A01(20-23) A01(20-23) A00(20-23) A00(20-23) A01(20-23) A01(20-23) A00(20-23) A00(20-23) A01(20-23) A01(20-23) 2352const __m512i lhs_mat_23_02_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_02 , (_MM_PERM_ENUM )245 );//A02(20-23) A02(20-23) A03(20-23) A03(20-23) A02(20-23) A02(20-23) A03(20-23) A03(20-23) A02(20-23) A02(20-23) A03(20-23) A03(20-23) A02(20-23) A02(20-23) A03(20-23) A03(20-23) 2353const __m512i lhs_mat_01_03_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_03 , (_MM_PERM_ENUM )245 );//A00(28-31) A00(28-31) A01(28-31) A01(28-31) A00(28-31) A00(28-31) A01(28-31) A01(28-31) A00(28-31) A00(28-31) A01(28-31) A01(28-31) A00(28-31) A00(28-31) A01(28-31) A01(28-31) 2354const __m512i lhs_mat_23_03_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_03 , (_MM_PERM_ENUM )245 );//A02(28-31) A02(28-31) A03(28-31) A03(28-31) A02(28-31) A02(28-31) A03(28-31) A03(28-31) A02(28-31) A02(28-31) A03(28-31) A03(28-31) A02(28-31) A02(28-31) A03(28-31) A03(28-31) 2355 2356const __m512i lhs_mat_01_10_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_10 , (_MM_PERM_ENUM )245 );//A10(4-7) A10(4-7) A11(4-7) A11(4-7) A10(4-7) A10(4-7) A11(4-7) A11(4-7) A10(4-7) A10(4-7) A11(4-7) A11(4-7) A10(4-7) A10(4-7) A11(4-7) A11(4-7) 2357const __m512i lhs_mat_23_10_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_10 , (_MM_PERM_ENUM )245 );//A12(4-7) A12(4-7) A13(4-7) A13(4-7) A12(4-7) A12(4-7) A13(4-7) A13(4-7) A12(4-7) A12(4-7) A13(4-7) A13(4-7) A12(4-7) A12(4-7) A13(4-7) A13(4-7) 2358const __m512i lhs_mat_01_11_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_11 , (_MM_PERM_ENUM )245 );//A10(12-15) A10(12-15) A11(12-15) A11(12-15) A10(12-15) A10(12-15) A11(12-15) A11(12-15) A10(12-15) A10(12-15) A11(12-15) A11(12-15) A10(12-15) A10(12-15) A11(12-15) A11(12-15) 2359const __m512i lhs_mat_23_11_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_11 , (_MM_PERM_ENUM )245 );//A12(12-15) A12(12-15) A13(12-15) A13(12-15) A12(12-15) A12(12-15) A13(12-15) A13(12-15) A12(12-15) A12(12-15) A13(12-15) A13(12-15) A12(12-15) A12(12-15) A13(12-15) A13(12-15) 2360const __m512i lhs_mat_01_12_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_12 , (_MM_PERM_ENUM )245 );//A10(20-23) A10(20-23) A11(20-23) A11(20-23) A10(20-23) A10(20-23) A11(20-23) A11(20-23) A10(20-23) A10(20-23) A11(20-23) A11(20-23) A10(20-23) A10(20-23) A11(20-23) A11(20-23) 2361const __m512i lhs_mat_23_12_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_12 , (_MM_PERM_ENUM )245 );//A12(20-23) A12(20-23) A13(20-23) A13(20-23) A12(20-23) A12(20-23) A13(20-23) A13(20-23) A12(20-23) A12(20-23) A13(20-23) A13(20-23) A12(20-23) A12(20-23) A13(20-23) A13(20-23) 2362const __m512i lhs_mat_01_13_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_13 , (_MM_PERM_ENUM )245 );//A10(28-31) A10(28-31) A11(28-31) A11(28-31) A10(28-31) A10(28-31) A11(28-31) A11(28-31) A10(28-31) A10(28-31) A11(28-31) A11(28-31) A10(28-31) A10(28-31) A11(28-31) A11(28-31) 2363const __m512i lhs_mat_23_13_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_13 , (_MM_PERM_ENUM )245 );//A12(28-31) A12(28-31) A13(28-31) A13(28-31) A12(28-31) A12(28-31) A13(28-31) A13(28-31) A12(28-31) A12(28-31) A13(28-31) A13(28-31) A12(28-31) A12(28-31) A13(28-31) A13(28-31) 2364 2365// The values arranged in shuffle patterns are operated with dot product operation within 32 bit lane i.e corresponding bytes and multiplied and added into 32 bit integers within 32 bit lane 2366__m512i iacc_mat_00_0_sp1 = _mm512_add_epi16 (_mm512_add_epi16 (_mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_03_sp1 ,lhs_mat_01_03_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_02_sp1 ,lhs_mat_01_02_sp1 )),_mm512_maddubs_epi16 (rhs_mat_014589CD_01_sp1 ,lhs_mat_01_01_sp1 )),_mm512_maddubs_epi16 (rhs_mat_014589CD_00_sp1 ,lhs_mat_01_00_sp1 )); 2367__m512i iacc_mat_01_0_sp1 = _mm512_add_epi16 (_mm512_add_epi16 (_mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_03_sp1 ,lhs_mat_01_03_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_02_sp1 ,lhs_mat_01_02_sp1 )),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_01_sp1 ,lhs_mat_01_01_sp1 )),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_00_sp1 ,lhs_mat_01_00_sp1 )); 2368__m512i iacc_mat_10_0_sp1 = _mm512_add_epi16 (_mm512_add_epi16 (_mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_03_sp1 ,lhs_mat_23_03_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_02_sp1 ,lhs_mat_23_02_sp1 )),_mm512_maddubs_epi16 (rhs_mat_014589CD_01_sp1 ,lhs_mat_23_01_sp1 )),_mm512_maddubs_epi16 (rhs_mat_014589CD_00_sp1 ,lhs_mat_23_00_sp1 )); 2369__m512i iacc_mat_11_0_sp1 = _mm512_add_epi16 (_mm512_add_epi16 (_mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_03_sp1 ,lhs_mat_23_03_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_02_sp1 ,lhs_mat_23_02_sp1 )),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_01_sp1 ,lhs_mat_23_01_sp1 )),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_00_sp1 ,lhs_mat_23_00_sp1 )); 2370__m512i iacc_mat_00_1_sp1 = _mm512_add_epi16 (_mm512_add_epi16 (_mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_13_sp1 ,lhs_mat_01_13_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_12_sp1 ,lhs_mat_01_12_sp1 )),_mm512_maddubs_epi16 (rhs_mat_014589CD_11_sp1 ,lhs_mat_01_11_sp1 )),_mm512_maddubs_epi16 (rhs_mat_014589CD_10_sp1 ,lhs_mat_01_10_sp1 )); 2371__m512i iacc_mat_01_1_sp1 = _mm512_add_epi16 (_mm512_add_epi16 (_mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_13_sp1 ,lhs_mat_01_13_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_12_sp1 ,lhs_mat_01_12_sp1 )),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_11_sp1 ,lhs_mat_01_11_sp1 )),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_10_sp1 ,lhs_mat_01_10_sp1 )); 2372__m512i iacc_mat_10_1_sp1 = _mm512_add_epi16 (_mm512_add_epi16 (_mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_13_sp1 ,lhs_mat_23_13_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_12_sp1 ,lhs_mat_23_12_sp1 )),_mm512_maddubs_epi16 (rhs_mat_014589CD_11_sp1 ,lhs_mat_23_11_sp1 )),_mm512_maddubs_epi16 (rhs_mat_014589CD_10_sp1 ,lhs_mat_23_10_sp1 )); 2373__m512i iacc_mat_11_1_sp1 = _mm512_add_epi16 (_mm512_add_epi16 (_mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_13_sp1 ,lhs_mat_23_13_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_12_sp1 ,lhs_mat_23_12_sp1 )),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_11_sp1 ,lhs_mat_23_11_sp1 )),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_10_sp1 ,lhs_mat_23_10_sp1 )); 2374 2375__m512i iacc_mat_00_0_sp2 = _mm512_add_epi16 (_mm512_add_epi16 (_mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_03_sp2 ,lhs_mat_01_03_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_02_sp2 ,lhs_mat_01_02_sp2 )),_mm512_maddubs_epi16 (rhs_mat_014589CD_01_sp2 ,lhs_mat_01_01_sp2 )),_mm512_maddubs_epi16 (rhs_mat_014589CD_00_sp2 ,lhs_mat_01_00_sp2 )); 2376__m512i iacc_mat_01_0_sp2 = _mm512_add_epi16 (_mm512_add_epi16 (_mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_03_sp2 ,lhs_mat_01_03_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_02_sp2 ,lhs_mat_01_02_sp2 )),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_01_sp2 ,lhs_mat_01_01_sp2 )),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_00_sp2 ,lhs_mat_01_00_sp2 )); 2377__m512i iacc_mat_10_0_sp2 = _mm512_add_epi16 (_mm512_add_epi16 (_mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_03_sp2 ,lhs_mat_23_03_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_02_sp2 ,lhs_mat_23_02_sp2 )),_mm512_maddubs_epi16 (rhs_mat_014589CD_01_sp2 ,lhs_mat_23_01_sp2 )),_mm512_maddubs_epi16 (rhs_mat_014589CD_00_sp2 ,lhs_mat_23_00_sp2 )); 2378__m512i iacc_mat_11_0_sp2 = _mm512_add_epi16 (_mm512_add_epi16 (_mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_03_sp2 ,lhs_mat_23_03_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_02_sp2 ,lhs_mat_23_02_sp2 )),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_01_sp2 ,lhs_mat_23_01_sp2 )),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_00_sp2 ,lhs_mat_23_00_sp2 )); 2379__m512i iacc_mat_00_1_sp2 = _mm512_add_epi16 (_mm512_add_epi16 (_mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_13_sp2 ,lhs_mat_01_13_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_12_sp2 ,lhs_mat_01_12_sp2 )),_mm512_maddubs_epi16 (rhs_mat_014589CD_11_sp2 ,lhs_mat_01_11_sp2 )),_mm512_maddubs_epi16 (rhs_mat_014589CD_10_sp2 ,lhs_mat_01_10_sp2 )); 2380__m512i iacc_mat_01_1_sp2 = _mm512_add_epi16 (_mm512_add_epi16 (_mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_13_sp2 ,lhs_mat_01_13_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_12_sp2 ,lhs_mat_01_12_sp2 )),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_11_sp2 ,lhs_mat_01_11_sp2 )),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_10_sp2 ,lhs_mat_01_10_sp2 )); 2381__m512i iacc_mat_10_1_sp2 = _mm512_add_epi16 (_mm512_add_epi16 (_mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_13_sp2 ,lhs_mat_23_13_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_12_sp2 ,lhs_mat_23_12_sp2 )),_mm512_maddubs_epi16 (rhs_mat_014589CD_11_sp2 ,lhs_mat_23_11_sp2 )),_mm512_maddubs_epi16 (rhs_mat_014589CD_10_sp2 ,lhs_mat_23_10_sp2 )); 2382__m512i iacc_mat_11_1_sp2 = _mm512_add_epi16 (_mm512_add_epi16 (_mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_13_sp2 ,lhs_mat_23_13_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_12_sp2 ,lhs_mat_23_12_sp2 )),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_11_sp2 ,lhs_mat_23_11_sp2 )),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_10_sp2 ,lhs_mat_23_10_sp2 )); 2383 2384// Output of both shuffle patterns are added in order to sum dot product outputs of all 32 values in block 2385__m512i iacc_mat_00_0 = _mm512_add_epi16 (iacc_mat_00_0_sp1 ,iacc_mat_00_0_sp2 ); 2386__m512i iacc_mat_01_0 = _mm512_add_epi16 (iacc_mat_01_0_sp1 ,iacc_mat_01_0_sp2 ); 2387__m512i iacc_mat_10_0 = _mm512_add_epi16 (iacc_mat_10_0_sp1 ,iacc_mat_10_0_sp2 ); 2388__m512i iacc_mat_11_0 = _mm512_add_epi16 (iacc_mat_11_0_sp1 ,iacc_mat_11_0_sp2 ); 2389 2390__m512i iacc_mat_00_1 = _mm512_add_epi16 (iacc_mat_00_1_sp1 ,iacc_mat_00_1_sp2 ); 2391__m512i iacc_mat_01_1 = _mm512_add_epi16 (iacc_mat_01_1_sp1 ,iacc_mat_01_1_sp2 ); 2392__m512i iacc_mat_10_1 = _mm512_add_epi16 (iacc_mat_10_1_sp1 ,iacc_mat_10_1_sp2 ); 2393__m512i iacc_mat_11_1 = _mm512_add_epi16 (iacc_mat_11_1_sp1 ,iacc_mat_11_1_sp2 ); 2394 2395iacc_mat_00_0 = _mm512_madd_epi16 (iacc_mat_00_0 ,scale_014589CD_0 ); 2396iacc_mat_01_0 = _mm512_madd_epi16 (iacc_mat_01_0 ,scale_2367ABEF_0 ); 2397iacc_mat_10_0 = _mm512_madd_epi16 (iacc_mat_10_0 ,scale_014589CD_0 ); 2398iacc_mat_11_0 = _mm512_madd_epi16 (iacc_mat_11_0 ,scale_2367ABEF_0 ); 2399 2400iacc_mat_00_1 = _mm512_madd_epi16 (iacc_mat_00_1 ,scale_014589CD_1 ); 2401iacc_mat_01_1 = _mm512_madd_epi16 (iacc_mat_01_1 ,scale_2367ABEF_1 ); 2402iacc_mat_10_1 = _mm512_madd_epi16 (iacc_mat_10_1 ,scale_014589CD_1 ); 2403iacc_mat_11_1 = _mm512_madd_epi16 (iacc_mat_11_1 ,scale_2367ABEF_1 ); 2404 2405// Straighten out to make 4 row vectors (4 for each sub block which are accumulated together in the next step) 2406__m512i iacc_row_0_0 = _mm512_mask_blend_epi32 (0xCCCC ,iacc_mat_00_0 ,_mm512_shuffle_epi32 (iacc_mat_01_0 , (_MM_PERM_ENUM )78 )); 2407__m512i iacc_row_1_0 = _mm512_mask_blend_epi32 (0xCCCC ,_mm512_shuffle_epi32 (iacc_mat_00_0 , (_MM_PERM_ENUM )78 ),iacc_mat_01_0 ); 2408__m512i iacc_row_2_0 = _mm512_mask_blend_epi32 (0xCCCC ,iacc_mat_10_0 ,_mm512_shuffle_epi32 (iacc_mat_11_0 , (_MM_PERM_ENUM )78 )); 2409__m512i iacc_row_3_0 = _mm512_mask_blend_epi32 (0xCCCC ,_mm512_shuffle_epi32 (iacc_mat_10_0 , (_MM_PERM_ENUM )78 ),iacc_mat_11_0 ); 2410__m512i iacc_row_0_1 = _mm512_mask_blend_epi32 (0xCCCC ,iacc_mat_00_1 ,_mm512_shuffle_epi32 (iacc_mat_01_1 , (_MM_PERM_ENUM )78 )); 2411__m512i iacc_row_1_1 = _mm512_mask_blend_epi32 (0xCCCC ,_mm512_shuffle_epi32 (iacc_mat_00_1 , (_MM_PERM_ENUM )78 ),iacc_mat_01_1 ); 2412__m512i iacc_row_2_1 = _mm512_mask_blend_epi32 (0xCCCC ,iacc_mat_10_1 ,_mm512_shuffle_epi32 (iacc_mat_11_1 , (_MM_PERM_ENUM )78 )); 2413__m512i iacc_row_3_1 = _mm512_mask_blend_epi32 (0xCCCC ,_mm512_shuffle_epi32 (iacc_mat_10_1 , (_MM_PERM_ENUM )78 ),iacc_mat_11_1 ); 2414 2415__m512i iacc_row_0 = _mm512_add_epi32 (iacc_row_0_0 ,iacc_row_0_1 ); 2416__m512i iacc_row_1 = _mm512_add_epi32 (iacc_row_1_0 ,iacc_row_1_1 ); 2417__m512i iacc_row_2 = _mm512_add_epi32 (iacc_row_2_0 ,iacc_row_2_1 ); 2418__m512i iacc_row_3 = _mm512_add_epi32 (iacc_row_3_0 ,iacc_row_3_1 ); 2419 2420// Load the scale(d) values for all the 4 Q8_k blocks and repeat it across lanes 2421const __m128 row_scale_f32_sse = _mm_load_ps (a_ptrs [rp ][b ].d ); 2422const __m256 row_scale_f32_ymm = _mm256_set_m128 (row_scale_f32_sse ,row_scale_f32_sse ); 2423const __m512 row_scale_f32 = _mm512_insertf32x8 (_mm512_castps256_ps512 (row_scale_f32_ymm ),row_scale_f32_ymm ,1 ); 2424 2425// Multiply with appropriate scales and accumulate (for both d and dmin) below 2426acc_rows [rp * 4 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_0 ),_mm512_mul_ps (col_scale_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,0 )),acc_rows [rp * 4 ]); 2427acc_rows [rp * 4 + 1 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_1 ),_mm512_mul_ps (col_scale_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,85 )),acc_rows [rp * 4 + 1 ]); 2428acc_rows [rp * 4 + 2 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_2 ),_mm512_mul_ps (col_scale_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,170 )),acc_rows [rp * 4 + 2 ]); 2429acc_rows [rp * 4 + 3 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_3 ),_mm512_mul_ps (col_scale_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,255 )),acc_rows [rp * 4 + 3 ]); 2430 2431__m512i iacc_row_min_0 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_hsum_0123_01 , (_MM_PERM_ENUM )0 ),mins_01 ); 2432__m512i iacc_row_min_1 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_hsum_0123_01 , (_MM_PERM_ENUM )85 ),mins_01 ); 2433__m512i iacc_row_min_2 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_hsum_0123_01 , (_MM_PERM_ENUM )170 ),mins_01 ); 2434__m512i iacc_row_min_3 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_hsum_0123_01 , (_MM_PERM_ENUM )255 ),mins_01 ); 2435 2436acc_min_rows [rp * 4 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_min_0 ),_mm512_mul_ps (col_dmin_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,0 )),acc_min_rows [rp * 4 ]); 2437acc_min_rows [rp * 4 + 1 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_min_1 ),_mm512_mul_ps (col_dmin_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,85 )),acc_min_rows [rp * 4 + 1 ]); 2438acc_min_rows [rp * 4 + 2 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_min_2 ),_mm512_mul_ps (col_dmin_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,170 )),acc_min_rows [rp * 4 + 2 ]); 2439acc_min_rows [rp * 4 + 3 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_min_3 ),_mm512_mul_ps (col_dmin_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,255 )),acc_min_rows [rp * 4 + 3 ]); 2440 } 2441 } 2442 } 2443// Store the accumulated values 2444for (int i = 0 ;i < 16 ;i ++ ) { 2445_mm512_storeu_ps ((float * )(s + ((y * 4 + i )* bs + x * 8 )),_mm512_sub_ps (acc_rows [i ],acc_min_rows [i ])); 2446 } 2447 } 2448 } 2449 2450for (;y < nr /4 ;y ++ ) { 2451 2452const block_q8_Kx4 * a_ptr = a_ptr_start + (y * nb ); 2453 2454// Take group of eight block_q4_kx8 structures at each pass of the loop and perform dot product operation 2455for (int64_t x = 0 ;x < anc /8 ;x += 2 ) { 2456 2457const block_q4_Kx8 * b_ptr_0 = b_ptr_start + ((x )* b_nb ); 2458const block_q4_Kx8 * b_ptr_1 = b_ptr_start + ((x + 1 )* b_nb ); 2459 2460// Master FP accumulators 2461__m512 acc_rows [4 ]; 2462for (int i = 0 ;i < 4 ;i ++ ) { 2463acc_rows [i ]= _mm512_setzero_ps (); 2464 } 2465 2466__m512 acc_min_rows [4 ]; 2467for (int i = 0 ;i < 4 ;i ++ ) { 2468acc_min_rows [i ]= _mm512_setzero_ps (); 2469 } 2470 2471// For super block 2472for (int64_t b = 0 ;b < nb ;b ++ ) { 2473// Scale values - Load the sixteen scale values from two block_q4_kx8 structures 2474const __m512 col_scale_f32 = GGML_F32Cx8x2_LOAD (b_ptr_0 [b ].d ,b_ptr_1 [b ].d ); 2475 2476// dmin values - Load the sixteen dmin values from two block_q4_kx8 structures 2477const __m512 col_dmin_f32 = GGML_F32Cx8x2_LOAD (b_ptr_0 [b ].dmin ,b_ptr_1 [b ].dmin ); 2478 2479// Loop to iterate over the eight sub blocks of a super block - two sub blocks are processed per iteration 2480for (int sb = 0 ;sb < QK_K /64 ;sb ++ ) { 2481 2482const __m256i rhs_raw_mat_0123_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + sb * 256 )); 2483const __m256i rhs_raw_mat_4567_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + 32 + sb * 256 )); 2484const __m256i rhs_raw_mat_0123_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + 64 + sb * 256 )); 2485const __m256i rhs_raw_mat_4567_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + 96 + sb * 256 )); 2486const __m256i rhs_raw_mat_0123_2 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + 128 + sb * 256 )); 2487const __m256i rhs_raw_mat_4567_2 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + 160 + sb * 256 )); 2488const __m256i rhs_raw_mat_0123_3 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + 192 + sb * 256 )); 2489const __m256i rhs_raw_mat_4567_3 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + 224 + sb * 256 )); 2490 2491const __m256i rhs_raw_mat_89AB_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + sb * 256 )); 2492const __m256i rhs_raw_mat_CDEF_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + 32 + sb * 256 )); 2493const __m256i rhs_raw_mat_89AB_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + 64 + sb * 256 )); 2494const __m256i rhs_raw_mat_CDEF_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + 96 + sb * 256 )); 2495const __m256i rhs_raw_mat_89AB_2 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + 128 + sb * 256 )); 2496const __m256i rhs_raw_mat_CDEF_2 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + 160 + sb * 256 )); 2497const __m256i rhs_raw_mat_89AB_3 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + 192 + sb * 256 )); 2498const __m256i rhs_raw_mat_CDEF_3 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + 224 + sb * 256 )); 2499 2500const __m256i rhs_raw_mat_0145_0 = _mm256_blend_epi32 (rhs_raw_mat_0123_0 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_0 ,requiredOrder ),240 ); 2501const __m256i rhs_raw_mat_2367_0 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_0 ,requiredOrder ),rhs_raw_mat_4567_0 ,240 ); 2502const __m256i rhs_raw_mat_0145_1 = _mm256_blend_epi32 (rhs_raw_mat_0123_1 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_1 ,requiredOrder ),240 ); 2503const __m256i rhs_raw_mat_2367_1 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_1 ,requiredOrder ),rhs_raw_mat_4567_1 ,240 ); 2504const __m256i rhs_raw_mat_0145_2 = _mm256_blend_epi32 (rhs_raw_mat_0123_2 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_2 ,requiredOrder ),240 ); 2505const __m256i rhs_raw_mat_2367_2 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_2 ,requiredOrder ),rhs_raw_mat_4567_2 ,240 ); 2506const __m256i rhs_raw_mat_0145_3 = _mm256_blend_epi32 (rhs_raw_mat_0123_3 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_3 ,requiredOrder ),240 ); 2507const __m256i rhs_raw_mat_2367_3 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_3 ,requiredOrder ),rhs_raw_mat_4567_3 ,240 ); 2508 2509const __m256i rhs_raw_mat_89CD_0 = _mm256_blend_epi32 (rhs_raw_mat_89AB_0 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_CDEF_0 ,requiredOrder ),240 ); 2510const __m256i rhs_raw_mat_ABEF_0 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_89AB_0 ,requiredOrder ),rhs_raw_mat_CDEF_0 ,240 ); 2511const __m256i rhs_raw_mat_89CD_1 = _mm256_blend_epi32 (rhs_raw_mat_89AB_1 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_CDEF_1 ,requiredOrder ),240 ); 2512const __m256i rhs_raw_mat_ABEF_1 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_89AB_1 ,requiredOrder ),rhs_raw_mat_CDEF_1 ,240 ); 2513const __m256i rhs_raw_mat_89CD_2 = _mm256_blend_epi32 (rhs_raw_mat_89AB_2 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_CDEF_2 ,requiredOrder ),240 ); 2514const __m256i rhs_raw_mat_ABEF_2 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_89AB_2 ,requiredOrder ),rhs_raw_mat_CDEF_2 ,240 ); 2515const __m256i rhs_raw_mat_89CD_3 = _mm256_blend_epi32 (rhs_raw_mat_89AB_3 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_CDEF_3 ,requiredOrder ),240 ); 2516const __m256i rhs_raw_mat_ABEF_3 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_89AB_3 ,requiredOrder ),rhs_raw_mat_CDEF_3 ,240 ); 2517 2518const __m512i rhs_raw_mat_014589CD_0 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_0145_0 ),rhs_raw_mat_89CD_0 ,1 ); 2519const __m512i rhs_raw_mat_2367ABEF_0 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_2367_0 ),rhs_raw_mat_ABEF_0 ,1 ); 2520const __m512i rhs_raw_mat_014589CD_1 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_0145_1 ),rhs_raw_mat_89CD_1 ,1 ); 2521const __m512i rhs_raw_mat_2367ABEF_1 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_2367_1 ),rhs_raw_mat_ABEF_1 ,1 ); 2522 2523const __m512i rhs_raw_mat_014589CD_2 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_0145_2 ),rhs_raw_mat_89CD_2 ,1 ); 2524const __m512i rhs_raw_mat_2367ABEF_2 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_2367_2 ),rhs_raw_mat_ABEF_2 ,1 ); 2525const __m512i rhs_raw_mat_014589CD_3 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_0145_3 ),rhs_raw_mat_89CD_3 ,1 ); 2526const __m512i rhs_raw_mat_2367ABEF_3 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_2367_3 ),rhs_raw_mat_ABEF_3 ,1 ); 2527 2528//4-bit -> 8-bit 2529const __m512i rhs_mat_014589CD_00 = _mm512_and_si512 (rhs_raw_mat_014589CD_0 ,m4bexpanded );//B00(0-7) B01(0-7) B04(0-7) B05(0-7) B08(0-7) B09(0-7) B0C(0-7) B0D(0-7) 2530const __m512i rhs_mat_2367ABEF_00 = _mm512_and_si512 (rhs_raw_mat_2367ABEF_0 ,m4bexpanded );//B02(0-7) B03(0-7) B06(0-7) B07(0-7) B0A(0-7) B0B(0-7) B0E(0-7) B0F(0-7) 2531const __m512i rhs_mat_014589CD_01 = _mm512_and_si512 (rhs_raw_mat_014589CD_1 ,m4bexpanded );//B00(8-15) B01(8-15) B04(8-15) B05(8-15) B08(8-15) B09(8-15) B0C(8-15) B0D(8-15) 2532const __m512i rhs_mat_2367ABEF_01 = _mm512_and_si512 (rhs_raw_mat_2367ABEF_1 ,m4bexpanded );//B02(8-15) B03(8-15) B06(8-15) B07(8-15) B0A(8-15) B0B(8-15) B0E(8-15) B0F(8-15) 2533 2534const __m512i rhs_mat_014589CD_02 = _mm512_and_si512 (rhs_raw_mat_014589CD_2 ,m4bexpanded );//B00(16-23) B01(16-23) B04(16-23) B05(16-23) B08(16-23) B09(16-23) B0C(16-23) B0D(16-23) 2535const __m512i rhs_mat_2367ABEF_02 = _mm512_and_si512 (rhs_raw_mat_2367ABEF_2 ,m4bexpanded );//B02(16-23) B03(16-23) B06(16-23) B07(16-23) B0A(16-23) B0B(16-23) B0E(16-23) B0F(16-23) 2536const __m512i rhs_mat_014589CD_03 = _mm512_and_si512 (rhs_raw_mat_014589CD_3 ,m4bexpanded );//B00(24-31) B01(24-31) B04(24-31) B05(24-31) B08(24-31) B09(24-31) B0C(24-31) B0D(24-31) 2537const __m512i rhs_mat_2367ABEF_03 = _mm512_and_si512 (rhs_raw_mat_2367ABEF_3 ,m4bexpanded );//B02(24-31) B03(24-31) B06(24-31) B07(24-31) B0A(24-31) B0B(24-31) B0E(24-31) B0F(24-31) 2538 2539const __m512i rhs_mat_014589CD_10 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_014589CD_0 ,4 ),m4bexpanded );//B10(0-7) B11(0-7) B14(0-7) B15(0-7) B18(0-7) B19(0-7) B1C(0-7) B1D(0-7) 2540const __m512i rhs_mat_2367ABEF_10 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_2367ABEF_0 ,4 ),m4bexpanded );//B12(0-7) B13(0-7) B16(0-7) B17(0-7) B1A(0-7) B1B(0-7) B1E(0-7) B1F(0-7) 2541const __m512i rhs_mat_014589CD_11 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_014589CD_1 ,4 ),m4bexpanded );//B10(8-15) B11(8-15) B14(8-15) B15(8-15) B18(8-15) B19(8-15) B1C(8-15) B1D(8-15) 2542const __m512i rhs_mat_2367ABEF_11 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_2367ABEF_1 ,4 ),m4bexpanded );//B12(8-15) B13(8-15) B16(8-15) B17(8-15) B1A(8-15) B1B(8-15) B1E(8-15) B1F(8-15) 2543 2544const __m512i rhs_mat_014589CD_12 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_014589CD_2 ,4 ),m4bexpanded );//B10(16-23) B11(16-23) B14(16-23) B15(16-23) B18(16-23) B19(16-23) B1C(16-23) B1D(16-23) 2545const __m512i rhs_mat_2367ABEF_12 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_2367ABEF_2 ,4 ),m4bexpanded );//B12(16-23) B13(16-23) B16(16-23) B17(16-23) B1A(16-23) B1B(16-23) B1E(16-23) B1F(16-23) 2546const __m512i rhs_mat_014589CD_13 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_014589CD_3 ,4 ),m4bexpanded );//B10(24-31) B11(24-31) B14(24-31) B15(24-31) B18(24-31) B19(24-31) B1C(24-31) B1D(24-31) 2547const __m512i rhs_mat_2367ABEF_13 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_2367ABEF_3 ,4 ),m4bexpanded );//B12(24-31) B13(24-31) B16(24-31) B17(24-31) B1A(24-31) B1B(24-31) B1E(24-31) B1F(24-31) 2548 2549// Shuffle pattern one - right side input 2550const __m512i rhs_mat_014589CD_00_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_00 , (_MM_PERM_ENUM )136 );//B00(0-3) B01(0-3) B00(0-3) B01(0-3) B04(0-3) B05(0-3) B04(0-3) B05(0-3) B08(0-3) B09(0-3) B08(0-3) B09(0-3) B0C(0-3) B0D(0-3) B0C(0-3) B0D(0-3) 2551const __m512i rhs_mat_2367ABEF_00_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_00 , (_MM_PERM_ENUM )136 );//B02(0-3) B03(0-3) B02(0-3) B03(0-3) B06(0-3) B07(0-3) B06(0-3) B07(0-3) B0A(0-3) B0B(0-3) B0A(0-3) B0B(0-3) B0E(0-3) B0F(0-3) B0E(0-3) B0F(0-3) 2552const __m512i rhs_mat_014589CD_01_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_01 , (_MM_PERM_ENUM )136 );//B00(8-11) B01(8-11) B00(8-11) B01(8-11) B04(8-11) B05(8-11) B04(8-11) B05(8-11) B08(8-11) B09(8-11) B08(8-11) B09(8-11) B0C(8-11) B0D(8-11) B0C(8-11) B0D(8-11) 2553const __m512i rhs_mat_2367ABEF_01_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_01 , (_MM_PERM_ENUM )136 );//B02(8-11) B03(8-11) B02(8-11) B03(8-11) B06(8-11) B07(8-11) B06(8-11) B07(8-11) B0A(8-11) B0B(8-11) B0A(8-11) B0B(8-11) B0E(8-11) B0F(8-11) B0E(8-11) B0F(8-11) 2554const __m512i rhs_mat_014589CD_02_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_02 , (_MM_PERM_ENUM )136 );//B00(16-19) B01(16-19) B00(16-19) B01(16-19) B04(16-19) B05(16-19) B04(16-19) B05(16-19) B08(16-19) B09(16-19) B08(16-19) B09(16-19) B0C(16-19) B0D(16-19) B0C(16-19) B0D(16-19) 2555const __m512i rhs_mat_2367ABEF_02_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_02 , (_MM_PERM_ENUM )136 );//B02(16-19) B03(16-19) B02(16-19) B03(16-19) B06(16-19) B07(16-19) B06(16-19) B07(16-19) B0A(16-19) B0B(16-19) B0A(16-19) B0B(16-19) B0E(16-19) B0F(16-19) B0E(16-19) B0F(16-19) 2556const __m512i rhs_mat_014589CD_03_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_03 , (_MM_PERM_ENUM )136 );//B00(24-27) B01(24-27) B00(24-27) B01(24-27) B04(24-27) B05(24-27) B04(24-27) B05(24-27) B08(24-27) B09(24-27) B08(24-27) B09(24-27) B0C(24-27) B0D(24-27) B0C(24-27) B0D(24-27) 2557const __m512i rhs_mat_2367ABEF_03_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_03 , (_MM_PERM_ENUM )136 );//B02(24-27) B03(24-27) B02(24-27) B03(24-27) B06(24-27) B07(24-27) B06(24-27) B07(24-27) B0A(24-27) B0B(24-27) B0A(24-27) B0B(24-27) B0E(24-27) B0F(24-27) B0E(24-27) B0F(24-27) 2558 2559const __m512i rhs_mat_014589CD_10_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_10 , (_MM_PERM_ENUM )136 );//B10(0-3) B11(0-3) B10(0-3) B11(0-3) B14(0-3) B15(0-3) B14(0-3) B15(0-3) B18(0-3) B19(0-3) B18(0-3) B19(0-3) B1C(0-3) B1D(0-3) B1C(0-3) B1D(0-3) 2560const __m512i rhs_mat_2367ABEF_10_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_10 , (_MM_PERM_ENUM )136 );//B12(0-3) B13(0-3) B12(0-3) B13(0-3) B16(0-3) B17(0-3) B16(0-3) B17(0-3) B1A(0-3) B1B(0-3) B1A(0-3) B1B(0-3) B1E(0-3) B1F(0-3) B1E(0-3) B1F(0-3) 2561const __m512i rhs_mat_014589CD_11_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_11 , (_MM_PERM_ENUM )136 );//B10(8-11) B11(8-11) B10(8-11) B11(8-11) B14(8-11) B15(8-11) B14(8-11) B15(8-11) B18(8-11) B19(8-11) B18(8-11) B19(8-11) B1C(8-11) B1D(8-11) B1C(8-11) B1D(8-11) 2562const __m512i rhs_mat_2367ABEF_11_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_11 , (_MM_PERM_ENUM )136 );//B12(8-11) B13(8-11) B12(8-11) B13(8-11) B16(8-11) B17(8-11) B16(8-11) B17(8-11) B1A(8-11) B1B(8-11) B1A(8-11) B1B(8-11) B1E(8-11) B1F(8-11) B1E(8-11) B1F(8-11) 2563const __m512i rhs_mat_014589CD_12_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_12 , (_MM_PERM_ENUM )136 );//B10(16-19) B11(16-19) B10(16-19) B11(16-19) B14(16-19) B15(16-19) B14(16-19) B15(16-19) B18(16-19) B19(16-19) B18(16-19) B19(16-19) B1C(16-19) B1D(16-19) B1C(16-19) B1D(16-19) 2564const __m512i rhs_mat_2367ABEF_12_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_12 , (_MM_PERM_ENUM )136 );//B12(16-19) B13(16-19) B12(16-19) B13(16-19) B16(16-19) B17(16-19) B16(16-19) B17(16-19) B1A(16-19) B1B(16-19) B1A(16-19) B1B(16-19) B1E(16-19) B1F(16-19) B1E(16-19) B1F(16-19) 2565const __m512i rhs_mat_014589CD_13_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_13 , (_MM_PERM_ENUM )136 );//B10(24-27) B11(24-27) B10(24-27) B11(24-27) B14(24-27) B15(24-27) B14(24-27) B15(24-27) B18(24-27) B19(24-27) B18(24-27) B19(24-27) B1C(24-27) B1D(24-27) B1C(24-27) B1D(24-27) 2566const __m512i rhs_mat_2367ABEF_13_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_13 , (_MM_PERM_ENUM )136 );//B12(24-27) B13(24-27) B12(24-27) B13(24-27) B16(24-27) B17(24-27) B16(24-27) B17(24-27) B1A(24-27) B1B(24-27) B1A(24-27) B1B(24-27) B1E(24-27) B1F(24-27) B1E(24-27) B1F(24-27) 2567 2568// Shuffle pattern two - right side input 2569const __m512i rhs_mat_014589CD_00_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_00 , (_MM_PERM_ENUM )221 );//B00(4-7) B01(4-7) B00(4-7) B01(4-7) B04(4-7) B05(4-7) B04(4-7) B05(4-7) B08(4-7) B09(4-7) B08(4-7) B09(4-7) B0C(4-7) B0D(4-7) B0C(4-7) B0D(4-7) 2570const __m512i rhs_mat_2367ABEF_00_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_00 , (_MM_PERM_ENUM )221 );//B02(4-7) B03(4-7) B02(4-7) B03(4-7) B06(4-7) B07(4-7) B06(4-7) B07(4-7) B0A(4-7) B0B(4-7) B0A(4-7) B0B(4-7) B0E(4-7) B0F(4-7) B0E(4-7) B0F(4-7) 2571const __m512i rhs_mat_014589CD_01_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_01 , (_MM_PERM_ENUM )221 );//B00(12-15) B01(12-15) B00(12-15) B01(12-15) B04(12-15) B05(12-15) B04(12-15) B05(12-15) B08(12-15) B09(12-15) B08(12-15) B09(12-15) B0C(12-15) B0D(12-15) B0C(12-15) B0D(12-15) 2572const __m512i rhs_mat_2367ABEF_01_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_01 , (_MM_PERM_ENUM )221 );//B02(12-15) B03(12-15) B02(12-15) B03(12-15) B06(12-15) B07(12-15) B06(12-15) B07(12-15) B0A(12-15) B0B(12-15) B0A(12-15) B0B(12-15) B0E(12-15) B0F(12-15) B0E(12-15) B0F(12-15) 2573const __m512i rhs_mat_014589CD_02_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_02 , (_MM_PERM_ENUM )221 );//B00(20-23) B01(20-23) B00(20-23) B01(20-23) B04(20-23) B05(20-23) B04(20-23) B05(20-23) B08(20-23) B09(20-23) B08(20-23) B09(20-23) B0C(20-23) B0D(20-23) B0C(20-23) B0D(20-23) 2574const __m512i rhs_mat_2367ABEF_02_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_02 , (_MM_PERM_ENUM )221 );//B02(20-23) B03(20-23) B02(20-23) B03(20-23) B06(20-23) B07(20-23) B06(20-23) B07(20-23) B0A(20-23) B0B(20-23) B0A(20-23) B0B(20-23) B0E(20-23) B0F(20-23) B0E(20-23) B0F(20-23) 2575const __m512i rhs_mat_014589CD_03_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_03 , (_MM_PERM_ENUM )221 );//B00(28-31) B01(28-31) B00(28-31) B01(28-31) B04(28-31) B05(28-31) B04(28-31) B05(28-31) B08(28-31) B09(28-31) B08(28-31) B09(28-31) B0C(28-31) B0D(28-31) B0C(28-31) 0BD(28-31) 2576const __m512i rhs_mat_2367ABEF_03_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_03 , (_MM_PERM_ENUM )221 );//B02(28-31) B03(28-31) B02(28-31) B03(28-31) B06(28-31) B07(28-31) B06(28-31) B07(28-31) B0A(28-31) B0B(28-31) B0A(28-31) B0B(28-31) B0E(28-31) B0F(28-31) B0E(28-31) B0F(28-31) 2577 2578const __m512i rhs_mat_014589CD_10_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_10 , (_MM_PERM_ENUM )221 );//B10(4-7) B11(4-7) B10(4-7) B11(4-7) B14(4-7) B15(4-7) B14(4-7) B15(4-7) B18(4-7) B19(4-7) B18(4-7) B19(4-7) B1C(4-7) B1D(4-7) B1C(4-7) B1D(4-7) 2579const __m512i rhs_mat_2367ABEF_10_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_10 , (_MM_PERM_ENUM )221 );//B12(4-7) B13(4-7) B12(4-7) B13(4-7) B16(4-7) B17(4-7) B16(4-7) B17(4-7) B1A(4-7) B1B(4-7) B1A(4-7) B1B(4-7) B1E(4-7) B1F(4-7) B1E(4-7) B1F(4-7) 2580const __m512i rhs_mat_014589CD_11_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_11 , (_MM_PERM_ENUM )221 );//B10(12-15) B11(12-15) B10(12-15) B11(12-15) B14(12-15) B15(12-15) B14(12-15) B15(12-15) B18(12-15) B19(12-15) B18(12-15) B19(12-15) B1C(12-15) B1D(12-15) B1C(12-15) B1D(12-15) 2581const __m512i rhs_mat_2367ABEF_11_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_11 , (_MM_PERM_ENUM )221 );//B12(12-15) B13(12-15) B12(12-15) B13(12-15) B16(12-15) B17(12-15) B16(12-15) B17(12-15) B1A(12-15) B1B(12-15) B1A(12-15) B1B(12-15) B1E(12-15) B1F(12-15) B1E(12-15) B1F(12-15) 2582const __m512i rhs_mat_014589CD_12_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_12 , (_MM_PERM_ENUM )221 );//B10(20-23) B11(20-23) B10(20-23) B11(20-23) B14(20-23) B15(20-23) B14(20-23) B15(20-23) B18(20-23) B19(20-23) B18(20-23) B19(20-23) B1C(20-23) B1D(20-23) B1C(20-23) B1D(20-23) 2583const __m512i rhs_mat_2367ABEF_12_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_12 , (_MM_PERM_ENUM )221 );//B12(20-23) B13(20-23) B12(20-23) B13(20-23) B16(20-23) B17(20-23) B16(20-23) B17(20-23) B1A(20-23) B1B(20-23) B1A(20-23) B1B(20-23) B1E(20-23) B1F(20-23) B1E(20-23) B1F(20-23) 2584const __m512i rhs_mat_014589CD_13_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_13 , (_MM_PERM_ENUM )221 );//B10(28-31) B11(28-31) B10(28-31) B11(28-31) B14(28-31) B15(28-31) B14(28-31) B15(28-31) B18(28-31) B19(28-31) B18(28-31) B19(28-31) B1C(28-31) B1D(28-31) B1C(28-31) B1D(28-31) 2585const __m512i rhs_mat_2367ABEF_13_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_13 , (_MM_PERM_ENUM )221 );//B12(28-31) B13(28-31) B12(28-31) B13(28-31) B16(28-31) B17(28-31) B16(28-31) B17(28-31) B1A(28-31) B1B(28-31) B1A(28-31) B1B(28-31) B1E(28-31) B1F(28-31) B1E(28-31) B1F(28-31) 2586 2587uint32_t utmp_00 [4 ],utmp_01 [4 ],utmp_10 [4 ],utmp_11 [4 ]; 2588 2589// Scales and Mins of corresponding sub blocks from different Q4_K structures are stored together 2590// The below block is for eg to extract first sub block's scales and mins from different Q4_K structures for the sb loop 2591memcpy (utmp_00 ,b_ptr_0 [b ].scales + 24 * sb ,12 ); 2592utmp_00 [3 ]= ((utmp_00 [2 ] >>4 )& kmask2 ) | (((utmp_00 [1 ] >>6 )& kmask3 ) <<4 ); 2593const uint32_t uaux_00 = utmp_00 [1 ]& kmask1 ; 2594utmp_00 [1 ]= (utmp_00 [2 ]& kmask2 ) | (((utmp_00 [0 ] >>6 )& kmask3 ) <<4 ); 2595utmp_00 [2 ]= uaux_00 ; 2596utmp_00 [0 ] &=kmask1 ; 2597 2598// The below block is for eg to extract second sub block's scales and mins from different Q4_K structures for the sb loop 2599memcpy (utmp_01 ,b_ptr_0 [b ].scales + 12 + sb * 24 ,12 ); 2600utmp_01 [3 ]= ((utmp_01 [2 ] >>4 )& kmask2 ) | (((utmp_01 [1 ] >>6 )& kmask3 ) <<4 ); 2601const uint32_t uaux_01 = utmp_01 [1 ]& kmask1 ; 2602utmp_01 [1 ]= (utmp_01 [2 ]& kmask2 ) | (((utmp_01 [0 ] >>6 )& kmask3 ) <<4 ); 2603utmp_01 [2 ]= uaux_01 ; 2604utmp_01 [0 ] &=kmask1 ; 2605 2606// The below block is for eg to extract first sub block's scales and mins from different Q4_K structures for the sb loop 2607memcpy (utmp_10 ,b_ptr_1 [b ].scales + sb * 24 ,12 ); 2608utmp_10 [3 ]= ((utmp_10 [2 ] >>4 )& kmask2 ) | (((utmp_10 [1 ] >>6 )& kmask3 ) <<4 ); 2609const uint32_t uaux_10 = utmp_10 [1 ]& kmask1 ; 2610utmp_10 [1 ]= (utmp_10 [2 ]& kmask2 ) | (((utmp_10 [0 ] >>6 )& kmask3 ) <<4 ); 2611utmp_10 [2 ]= uaux_10 ; 2612utmp_10 [0 ] &=kmask1 ; 2613 2614// The below block is for eg to extract second sub block's scales and mins from different Q4_K structures for the sb loop 2615memcpy (utmp_11 ,b_ptr_1 [b ].scales + 12 + sb * 24 ,12 ); 2616utmp_11 [3 ]= ((utmp_11 [2 ] >>4 )& kmask2 ) | (((utmp_11 [1 ] >>6 )& kmask3 ) <<4 ); 2617const uint32_t uaux_11 = utmp_11 [1 ]& kmask1 ; 2618utmp_11 [1 ]= (utmp_11 [2 ]& kmask2 ) | (((utmp_11 [0 ] >>6 )& kmask3 ) <<4 ); 2619utmp_11 [2 ]= uaux_11 ; 2620utmp_11 [0 ] &=kmask1 ; 2621 2622// Scales of first sub block in the sb loop 2623const __m256i mins_and_scales_0 = _mm256_set_epi32 (utmp_10 [3 ],utmp_10 [2 ],utmp_10 [1 ],utmp_10 [0 ],utmp_00 [3 ],utmp_00 [2 ],utmp_00 [1 ],utmp_00 [0 ]); 2624const __m512i scales_0 = _mm512_cvtepu8_epi16 (_mm256_unpacklo_epi8 (mins_and_scales_0 ,mins_and_scales_0 )); 2625 2626// Scales of second sub block in the sb loop 2627const __m256i mins_and_scales_1 = _mm256_set_epi32 (utmp_11 [3 ],utmp_11 [2 ],utmp_11 [1 ],utmp_11 [0 ],utmp_01 [3 ],utmp_01 [2 ],utmp_01 [1 ],utmp_01 [0 ]); 2628const __m512i scales_1 = _mm512_cvtepu8_epi16 (_mm256_unpacklo_epi8 (mins_and_scales_1 ,mins_and_scales_1 )); 2629 2630// Mins of first and second sub block of Q4_K block are arranged side by side 2631const __m512i mins_01 = _mm512_cvtepu8_epi16 (_mm256_unpacklo_epi8 (_mm256_shuffle_epi32 (mins_and_scales_0 ,78 ),_mm256_shuffle_epi32 (mins_and_scales_1 ,78 ))); 2632 2633const __m512i scale_014589CD_0 = _mm512_shuffle_epi32 (scales_0 , (_MM_PERM_ENUM )68 ); 2634const __m512i scale_2367ABEF_0 = _mm512_shuffle_epi32 (scales_0 , (_MM_PERM_ENUM )238 ); 2635 2636const __m512i scale_014589CD_1 = _mm512_shuffle_epi32 (scales_1 , (_MM_PERM_ENUM )68 ); 2637const __m512i scale_2367ABEF_1 = _mm512_shuffle_epi32 (scales_1 , (_MM_PERM_ENUM )238 ); 2638 2639// Load the four block_q8_k quantized values interleaved with each other in chunks of eight bytes - A0,A1,A2,A3 2640// Loaded as set of 128 bit vectors and repeated into a 256 bit vector 2641__m256i lhs_mat_ymm_0123_00 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 256 * sb ))); 2642__m256i lhs_mat_ymm_01_00 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_00 ,lhs_mat_ymm_0123_00 ,0 ); 2643__m256i lhs_mat_ymm_23_00 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_00 ,lhs_mat_ymm_0123_00 ,17 ); 2644__m256i lhs_mat_ymm_0123_01 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 32 + 256 * sb ))); 2645__m256i lhs_mat_ymm_01_01 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_01 ,lhs_mat_ymm_0123_01 ,0 ); 2646__m256i lhs_mat_ymm_23_01 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_01 ,lhs_mat_ymm_0123_01 ,17 ); 2647__m256i lhs_mat_ymm_0123_02 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 64 + 256 * sb ))); 2648__m256i lhs_mat_ymm_01_02 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_02 ,lhs_mat_ymm_0123_02 ,0 ); 2649__m256i lhs_mat_ymm_23_02 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_02 ,lhs_mat_ymm_0123_02 ,17 ); 2650__m256i lhs_mat_ymm_0123_03 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 96 + 256 * sb ))); 2651__m256i lhs_mat_ymm_01_03 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_03 ,lhs_mat_ymm_0123_03 ,0 ); 2652__m256i lhs_mat_ymm_23_03 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_03 ,lhs_mat_ymm_0123_03 ,17 ); 2653__m256i lhs_mat_ymm_0123_10 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 128 + 256 * sb ))); 2654__m256i lhs_mat_ymm_01_10 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_10 ,lhs_mat_ymm_0123_10 ,0 ); 2655__m256i lhs_mat_ymm_23_10 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_10 ,lhs_mat_ymm_0123_10 ,17 ); 2656__m256i lhs_mat_ymm_0123_11 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 160 + 256 * sb ))); 2657__m256i lhs_mat_ymm_01_11 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_11 ,lhs_mat_ymm_0123_11 ,0 ); 2658__m256i lhs_mat_ymm_23_11 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_11 ,lhs_mat_ymm_0123_11 ,17 ); 2659__m256i lhs_mat_ymm_0123_12 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 192 + 256 * sb ))); 2660__m256i lhs_mat_ymm_01_12 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_12 ,lhs_mat_ymm_0123_12 ,0 ); 2661__m256i lhs_mat_ymm_23_12 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_12 ,lhs_mat_ymm_0123_12 ,17 ); 2662__m256i lhs_mat_ymm_0123_13 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 224 + 256 * sb ))); 2663__m256i lhs_mat_ymm_01_13 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_13 ,lhs_mat_ymm_0123_13 ,0 ); 2664__m256i lhs_mat_ymm_23_13 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_13 ,lhs_mat_ymm_0123_13 ,17 ); 2665 2666//Loaded as set of 128 bit vectors and repeated and stored into a 256 bit vector before again repeating into a 512 bit vector 2667__m512i lhs_mat_01_00 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_00 ),lhs_mat_ymm_01_00 ,1 ); 2668__m512i lhs_mat_23_00 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_00 ),lhs_mat_ymm_23_00 ,1 ); 2669__m512i lhs_mat_01_01 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_01 ),lhs_mat_ymm_01_01 ,1 ); 2670__m512i lhs_mat_23_01 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_01 ),lhs_mat_ymm_23_01 ,1 ); 2671__m512i lhs_mat_01_02 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_02 ),lhs_mat_ymm_01_02 ,1 ); 2672__m512i lhs_mat_23_02 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_02 ),lhs_mat_ymm_23_02 ,1 ); 2673__m512i lhs_mat_01_03 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_03 ),lhs_mat_ymm_01_03 ,1 ); 2674__m512i lhs_mat_23_03 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_03 ),lhs_mat_ymm_23_03 ,1 ); 2675 2676__m512i lhs_mat_01_10 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_10 ),lhs_mat_ymm_01_10 ,1 ); 2677__m512i lhs_mat_23_10 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_10 ),lhs_mat_ymm_23_10 ,1 ); 2678__m512i lhs_mat_01_11 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_11 ),lhs_mat_ymm_01_11 ,1 ); 2679__m512i lhs_mat_23_11 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_11 ),lhs_mat_ymm_23_11 ,1 ); 2680__m512i lhs_mat_01_12 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_12 ),lhs_mat_ymm_01_12 ,1 ); 2681__m512i lhs_mat_23_12 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_12 ),lhs_mat_ymm_23_12 ,1 ); 2682__m512i lhs_mat_01_13 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_13 ),lhs_mat_ymm_01_13 ,1 ); 2683__m512i lhs_mat_23_13 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_13 ),lhs_mat_ymm_23_13 ,1 ); 2684 2685// Bsums are loaded - four bsums are loaded (for two sub blocks) for the different Q8_K blocks 2686__m256i lhs_bsums_0123_01 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].bsums + 16 * sb ))); 2687__m256i lhs_bsums_hsum_ymm_0123_01 = _mm256_castsi128_si256 (_mm_hadd_epi16 (_mm256_castsi256_si128 (lhs_bsums_0123_01 ),_mm256_extractf128_si256 (lhs_bsums_0123_01 ,1 ))); 2688lhs_bsums_hsum_ymm_0123_01 = _mm256_permute2x128_si256 (lhs_bsums_hsum_ymm_0123_01 ,lhs_bsums_hsum_ymm_0123_01 ,0 ); 2689__m512i lhs_bsums_hsum_0123_01 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_bsums_hsum_ymm_0123_01 ),lhs_bsums_hsum_ymm_0123_01 ,1 ); 2690 2691// Shuffle pattern one - left side input 2692const __m512i lhs_mat_01_00_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_00 , (_MM_PERM_ENUM )160 );//A00(0-3) A00(0-3) A01(0-3) A01(0-3) A00(0-3) A00(0-3) A01(0-3) A01(0-3) A00(0-3) A00(0-3) A01(0-3) A01(0-3) A00(0-3) A00(0-3) A01(0-3) A01(0-3) 2693const __m512i lhs_mat_23_00_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_00 , (_MM_PERM_ENUM )160 );//A02(0-3) A02(0-3) A03(0-3) A03(0-3) A02(0-3) A02(0-3) A03(0-3) A03(0-3) A02(0-3) A02(0-3) A03(0-3) A03(0-3) A02(0-3) A02(0-3) A03(0-3) A03(0-3) 2694const __m512i lhs_mat_01_01_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_01 , (_MM_PERM_ENUM )160 );//A00(8-11) A00(8-11) A01(8-11) A01(8-11) A00(8-11) A00(8-11) A01(8-11) A01(8-11) A00(8-11) A00(8-11) A01(8-11) A01(8-11) A00(8-11) A00(8-11) A01(8-11) A01(8-11) 2695const __m512i lhs_mat_23_01_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_01 , (_MM_PERM_ENUM )160 );//A02(8-11) A02(8-11) A03(8-11) A03(8-11) A02(8-11) A02(8-11) A03(8-11) A03(8-11) A02(8-11) A02(8-11) A03(8-11) A03(8-11) A02(8-11) A02(8-11) A03(8-11) A03(8-11) 2696const __m512i lhs_mat_01_02_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_02 , (_MM_PERM_ENUM )160 );//A00(16-19) A00(16-19) A01(16-19) A01(16-19) A00(16-19) A00(16-19) A01(16-19) A01(16-19) A00(16-19) A00(16-19) A01(16-19) A01(16-19) A00(16-19) A00(16-19) A01(16-19) A01(16-19) 2697const __m512i lhs_mat_23_02_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_02 , (_MM_PERM_ENUM )160 );//A02(16-19) A02(16-19) A03(16-19) A03(16-19) A02(16-19) A02(16-19) A03(16-19) A03(16-19) A02(16-19) A02(16-19) A03(16-19) A03(16-19) A02(16-19) A02(16-19) A03(16-19) A03(16-19) 2698const __m512i lhs_mat_01_03_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_03 , (_MM_PERM_ENUM )160 );//A00(24-27) A00(24-27) A01(24-27) A01(24-27) A00(24-27) A00(24-27) A01(24-27) A01(24-27) A00(24-27) A00(24-27) A01(24-27) A01(24-27) A00(24-27) A00(24-27) A01(24-27) A01(24-27) 2699const __m512i lhs_mat_23_03_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_03 , (_MM_PERM_ENUM )160 );//A02(24-27) A02(24-27) A03(24-27) A03(24-27) A02(24-27) A02(24-27) A03(24-27) A03(24-27) A02(24-27) A02(24-27) A03(24-27) A03(24-27) A02(24-27) A02(24-27) A03(24-27) A03(24-27) 2700 2701const __m512i lhs_mat_01_10_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_10 , (_MM_PERM_ENUM )160 );//A10(0-3) A10(0-3) A11(0-3) A11(0-3) A10(0-3) A10(0-3) A11(0-3) A11(0-3) A10(0-3) A10(0-3) A11(0-3) A11(0-3) A10(0-3) A10(0-3) A11(0-3) A11(0-3) 2702const __m512i lhs_mat_23_10_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_10 , (_MM_PERM_ENUM )160 );//A12(0-3) A12(0-3) A13(0-3) A13(0-3) A12(0-3) A12(0-3) A13(0-3) A13(0-3) A12(0-3) A12(0-3) A13(0-3) A13(0-3) A12(0-3) A12(0-3) A13(0-3) A13(0-3) 2703const __m512i lhs_mat_01_11_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_11 , (_MM_PERM_ENUM )160 );//A10(8-11) A10(8-11) A11(8-11) A11(8-11) A10(8-11) A10(8-11) A11(8-11) A11(8-11) A10(8-11) A10(8-11) A11(8-11) A11(8-11) A10(8-11) A10(8-11) A11(8-11) A11(8-11) 2704const __m512i lhs_mat_23_11_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_11 , (_MM_PERM_ENUM )160 );//A12(8-11) A12(8-11) A13(8-11) A13(8-11) A12(8-11) A12(8-11) A13(8-11) A13(8-11) A12(8-11) A12(8-11) A13(8-11) A13(8-11) A12(8-11) A12(8-11) A13(8-11) A13(8-11) 2705const __m512i lhs_mat_01_12_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_12 , (_MM_PERM_ENUM )160 );//A10(16-19) A10(16-19) A11(16-19) A11(16-19) A10(16-19) A10(16-19) A11(16-19) A11(16-19) A10(16-19) A10(16-19) A11(16-19) A11(16-19) A10(16-19) A10(16-19) A11(16-19) A11(16-19) 2706const __m512i lhs_mat_23_12_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_12 , (_MM_PERM_ENUM )160 );//A12(16-19) A12(16-19) A13(16-19) A13(16-19) A12(16-19) A12(16-19) A13(16-19) A13(16-19) A12(16-19) A12(16-19) A13(16-19) A13(16-19) A12(16-19) A12(16-19) A13(16-19) A13(16-19) 2707const __m512i lhs_mat_01_13_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_13 , (_MM_PERM_ENUM )160 );//A10(24-27) A10(24-27) A11(24-27) A11(24-27) A10(24-27) A10(24-27) A11(24-27) A11(24-27) A10(24-27) A10(24-27) A11(24-27) A11(24-27) A10(24-27) A10(24-27) A11(24-27) A11(24-27) 2708const __m512i lhs_mat_23_13_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_13 , (_MM_PERM_ENUM )160 );//A12(24-27) A12(24-27) A13(24-27) A13(24-27) A12(24-27) A12(24-27) A13(24-27) A13(24-27) A12(24-27) A12(24-27) A13(24-27) A13(24-27) A12(24-27) A12(24-27) A13(24-27) A13(24-27) 2709 2710const __m512i lhs_mat_01_00_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_00 , (_MM_PERM_ENUM )245 );//A00(4-7) A00(4-7) A01(4-7) A01(4-7) A00(4-7) A00(4-7) A01(4-7) A01(4-7) A00(4-7) A00(4-7) A01(4-7) A01(4-7) A00(4-7) A00(4-7) A01(4-7) A01(4-7) 2711const __m512i lhs_mat_23_00_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_00 , (_MM_PERM_ENUM )245 );//A02(4-7) A02(4-7) A03(4-7) A03(4-7) A02(4-7) A02(4-7) A03(4-7) A03(4-7) A02(4-7) A02(4-7) A03(4-7) A03(4-7) A02(4-7) A02(4-7) A03(4-7) A03(4-7) 2712const __m512i lhs_mat_01_01_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_01 , (_MM_PERM_ENUM )245 );//A00(12-15) A00(12-15) A01(12-15) A01(12-15) A00(12-15) A00(12-15) A01(12-15) A01(12-15) A00(12-15) A00(12-15) A01(12-15) A01(12-15) A00(12-15) A00(12-15) A01(12-15) A01(12-15) 2713const __m512i lhs_mat_23_01_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_01 , (_MM_PERM_ENUM )245 );//A02(12-15) A02(12-15) A03(12-15) A03(12-15) A02(12-15) A02(12-15) A03(12-15) A03(12-15) A02(12-15) A02(12-15) A03(12-15) A03(12-15) A02(12-15) A02(12-15) A03(12-15) A03(12-15) 2714const __m512i lhs_mat_01_02_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_02 , (_MM_PERM_ENUM )245 );//A00(20-23) A00(20-23) A01(20-23) A01(20-23) A00(20-23) A00(20-23) A01(20-23) A01(20-23) A00(20-23) A00(20-23) A01(20-23) A01(20-23) A00(20-23) A00(20-23) A01(20-23) A01(20-23) 2715const __m512i lhs_mat_23_02_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_02 , (_MM_PERM_ENUM )245 );//A02(20-23) A02(20-23) A03(20-23) A03(20-23) A02(20-23) A02(20-23) A03(20-23) A03(20-23) A02(20-23) A02(20-23) A03(20-23) A03(20-23) A02(20-23) A02(20-23) A03(20-23) A03(20-23) 2716const __m512i lhs_mat_01_03_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_03 , (_MM_PERM_ENUM )245 );//A00(28-31) A00(28-31) A01(28-31) A01(28-31) A00(28-31) A00(28-31) A01(28-31) A01(28-31) A00(28-31) A00(28-31) A01(28-31) A01(28-31) A00(28-31) A00(28-31) A01(28-31) A01(28-31) 2717const __m512i lhs_mat_23_03_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_03 , (_MM_PERM_ENUM )245 );//A02(28-31) A02(28-31) A03(28-31) A03(28-31) A02(28-31) A02(28-31) A03(28-31) A03(28-31) A02(28-31) A02(28-31) A03(28-31) A03(28-31) A02(28-31) A02(28-31) A03(28-31) A03(28-31) 2718 2719const __m512i lhs_mat_01_10_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_10 , (_MM_PERM_ENUM )245 );//A10(4-7) A10(4-7) A11(4-7) A11(4-7) A10(4-7) A10(4-7) A11(4-7) A11(4-7) A10(4-7) A10(4-7) A11(4-7) A11(4-7) A10(4-7) A10(4-7) A11(4-7) A11(4-7) 2720const __m512i lhs_mat_23_10_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_10 , (_MM_PERM_ENUM )245 );//A12(4-7) A12(4-7) A13(4-7) A13(4-7) A12(4-7) A12(4-7) A13(4-7) A13(4-7) A12(4-7) A12(4-7) A13(4-7) A13(4-7) A12(4-7) A12(4-7) A13(4-7) A13(4-7) 2721const __m512i lhs_mat_01_11_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_11 , (_MM_PERM_ENUM )245 );//A10(12-15) A10(12-15) A11(12-15) A11(12-15) A10(12-15) A10(12-15) A11(12-15) A11(12-15) A10(12-15) A10(12-15) A11(12-15) A11(12-15) A10(12-15) A10(12-15) A11(12-15) A11(12-15) 2722const __m512i lhs_mat_23_11_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_11 , (_MM_PERM_ENUM )245 );//A12(12-15) A12(12-15) A13(12-15) A13(12-15) A12(12-15) A12(12-15) A13(12-15) A13(12-15) A12(12-15) A12(12-15) A13(12-15) A13(12-15) A12(12-15) A12(12-15) A13(12-15) A13(12-15) 2723const __m512i lhs_mat_01_12_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_12 , (_MM_PERM_ENUM )245 );//A10(20-23) A10(20-23) A11(20-23) A11(20-23) A10(20-23) A10(20-23) A11(20-23) A11(20-23) A10(20-23) A10(20-23) A11(20-23) A11(20-23) A10(20-23) A10(20-23) A11(20-23) A11(20-23) 2724const __m512i lhs_mat_23_12_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_12 , (_MM_PERM_ENUM )245 );//A12(20-23) A12(20-23) A13(20-23) A13(20-23) A12(20-23) A12(20-23) A13(20-23) A13(20-23) A12(20-23) A12(20-23) A13(20-23) A13(20-23) A12(20-23) A12(20-23) A13(20-23) A13(20-23) 2725const __m512i lhs_mat_01_13_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_13 , (_MM_PERM_ENUM )245 );//A10(28-31) A10(28-31) A11(28-31) A11(28-31) A10(28-31) A10(28-31) A11(28-31) A11(28-31) A10(28-31) A10(28-31) A11(28-31) A11(28-31) A10(28-31) A10(28-31) A11(28-31) A11(28-31) 2726const __m512i lhs_mat_23_13_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_13 , (_MM_PERM_ENUM )245 );//A12(28-31) A12(28-31) A13(28-31) A13(28-31) A12(28-31) A12(28-31) A13(28-31) A13(28-31) A12(28-31) A12(28-31) A13(28-31) A13(28-31) A12(28-31) A12(28-31) A13(28-31) A13(28-31) 2727 2728// The values arranged in shuffle patterns are operated with dot product operation within 32 bit lane i.e corresponding bytes and multiplied and added into 32 bit integers within 32 bit lane 2729__m512i iacc_mat_00_0_sp1 = _mm512_add_epi16 (_mm512_add_epi16 (_mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_03_sp1 ,lhs_mat_01_03_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_02_sp1 ,lhs_mat_01_02_sp1 )),_mm512_maddubs_epi16 (rhs_mat_014589CD_01_sp1 ,lhs_mat_01_01_sp1 )),_mm512_maddubs_epi16 (rhs_mat_014589CD_00_sp1 ,lhs_mat_01_00_sp1 )); 2730__m512i iacc_mat_01_0_sp1 = _mm512_add_epi16 (_mm512_add_epi16 (_mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_03_sp1 ,lhs_mat_01_03_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_02_sp1 ,lhs_mat_01_02_sp1 )),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_01_sp1 ,lhs_mat_01_01_sp1 )),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_00_sp1 ,lhs_mat_01_00_sp1 )); 2731__m512i iacc_mat_10_0_sp1 = _mm512_add_epi16 (_mm512_add_epi16 (_mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_03_sp1 ,lhs_mat_23_03_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_02_sp1 ,lhs_mat_23_02_sp1 )),_mm512_maddubs_epi16 (rhs_mat_014589CD_01_sp1 ,lhs_mat_23_01_sp1 )),_mm512_maddubs_epi16 (rhs_mat_014589CD_00_sp1 ,lhs_mat_23_00_sp1 )); 2732__m512i iacc_mat_11_0_sp1 = _mm512_add_epi16 (_mm512_add_epi16 (_mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_03_sp1 ,lhs_mat_23_03_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_02_sp1 ,lhs_mat_23_02_sp1 )),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_01_sp1 ,lhs_mat_23_01_sp1 )),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_00_sp1 ,lhs_mat_23_00_sp1 )); 2733__m512i iacc_mat_00_1_sp1 = _mm512_add_epi16 (_mm512_add_epi16 (_mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_13_sp1 ,lhs_mat_01_13_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_12_sp1 ,lhs_mat_01_12_sp1 )),_mm512_maddubs_epi16 (rhs_mat_014589CD_11_sp1 ,lhs_mat_01_11_sp1 )),_mm512_maddubs_epi16 (rhs_mat_014589CD_10_sp1 ,lhs_mat_01_10_sp1 )); 2734__m512i iacc_mat_01_1_sp1 = _mm512_add_epi16 (_mm512_add_epi16 (_mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_13_sp1 ,lhs_mat_01_13_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_12_sp1 ,lhs_mat_01_12_sp1 )),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_11_sp1 ,lhs_mat_01_11_sp1 )),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_10_sp1 ,lhs_mat_01_10_sp1 )); 2735__m512i iacc_mat_10_1_sp1 = _mm512_add_epi16 (_mm512_add_epi16 (_mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_13_sp1 ,lhs_mat_23_13_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_12_sp1 ,lhs_mat_23_12_sp1 )),_mm512_maddubs_epi16 (rhs_mat_014589CD_11_sp1 ,lhs_mat_23_11_sp1 )),_mm512_maddubs_epi16 (rhs_mat_014589CD_10_sp1 ,lhs_mat_23_10_sp1 )); 2736__m512i iacc_mat_11_1_sp1 = _mm512_add_epi16 (_mm512_add_epi16 (_mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_13_sp1 ,lhs_mat_23_13_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_12_sp1 ,lhs_mat_23_12_sp1 )),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_11_sp1 ,lhs_mat_23_11_sp1 )),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_10_sp1 ,lhs_mat_23_10_sp1 )); 2737 2738__m512i iacc_mat_00_0_sp2 = _mm512_add_epi16 (_mm512_add_epi16 (_mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_03_sp2 ,lhs_mat_01_03_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_02_sp2 ,lhs_mat_01_02_sp2 )),_mm512_maddubs_epi16 (rhs_mat_014589CD_01_sp2 ,lhs_mat_01_01_sp2 )),_mm512_maddubs_epi16 (rhs_mat_014589CD_00_sp2 ,lhs_mat_01_00_sp2 )); 2739__m512i iacc_mat_01_0_sp2 = _mm512_add_epi16 (_mm512_add_epi16 (_mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_03_sp2 ,lhs_mat_01_03_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_02_sp2 ,lhs_mat_01_02_sp2 )),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_01_sp2 ,lhs_mat_01_01_sp2 )),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_00_sp2 ,lhs_mat_01_00_sp2 )); 2740__m512i iacc_mat_10_0_sp2 = _mm512_add_epi16 (_mm512_add_epi16 (_mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_03_sp2 ,lhs_mat_23_03_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_02_sp2 ,lhs_mat_23_02_sp2 )),_mm512_maddubs_epi16 (rhs_mat_014589CD_01_sp2 ,lhs_mat_23_01_sp2 )),_mm512_maddubs_epi16 (rhs_mat_014589CD_00_sp2 ,lhs_mat_23_00_sp2 )); 2741__m512i iacc_mat_11_0_sp2 = _mm512_add_epi16 (_mm512_add_epi16 (_mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_03_sp2 ,lhs_mat_23_03_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_02_sp2 ,lhs_mat_23_02_sp2 )),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_01_sp2 ,lhs_mat_23_01_sp2 )),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_00_sp2 ,lhs_mat_23_00_sp2 )); 2742__m512i iacc_mat_00_1_sp2 = _mm512_add_epi16 (_mm512_add_epi16 (_mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_13_sp2 ,lhs_mat_01_13_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_12_sp2 ,lhs_mat_01_12_sp2 )),_mm512_maddubs_epi16 (rhs_mat_014589CD_11_sp2 ,lhs_mat_01_11_sp2 )),_mm512_maddubs_epi16 (rhs_mat_014589CD_10_sp2 ,lhs_mat_01_10_sp2 )); 2743__m512i iacc_mat_01_1_sp2 = _mm512_add_epi16 (_mm512_add_epi16 (_mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_13_sp2 ,lhs_mat_01_13_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_12_sp2 ,lhs_mat_01_12_sp2 )),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_11_sp2 ,lhs_mat_01_11_sp2 )),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_10_sp2 ,lhs_mat_01_10_sp2 )); 2744__m512i iacc_mat_10_1_sp2 = _mm512_add_epi16 (_mm512_add_epi16 (_mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_13_sp2 ,lhs_mat_23_13_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_12_sp2 ,lhs_mat_23_12_sp2 )),_mm512_maddubs_epi16 (rhs_mat_014589CD_11_sp2 ,lhs_mat_23_11_sp2 )),_mm512_maddubs_epi16 (rhs_mat_014589CD_10_sp2 ,lhs_mat_23_10_sp2 )); 2745__m512i iacc_mat_11_1_sp2 = _mm512_add_epi16 (_mm512_add_epi16 (_mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_13_sp2 ,lhs_mat_23_13_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_12_sp2 ,lhs_mat_23_12_sp2 )),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_11_sp2 ,lhs_mat_23_11_sp2 )),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_10_sp2 ,lhs_mat_23_10_sp2 )); 2746 2747// Output of both shuffle patterns are added in order to sum dot product outputs of all 32 values in block 2748__m512i iacc_mat_00_0 = _mm512_add_epi16 (iacc_mat_00_0_sp1 ,iacc_mat_00_0_sp2 ); 2749__m512i iacc_mat_01_0 = _mm512_add_epi16 (iacc_mat_01_0_sp1 ,iacc_mat_01_0_sp2 ); 2750__m512i iacc_mat_10_0 = _mm512_add_epi16 (iacc_mat_10_0_sp1 ,iacc_mat_10_0_sp2 ); 2751__m512i iacc_mat_11_0 = _mm512_add_epi16 (iacc_mat_11_0_sp1 ,iacc_mat_11_0_sp2 ); 2752 2753__m512i iacc_mat_00_1 = _mm512_add_epi16 (iacc_mat_00_1_sp1 ,iacc_mat_00_1_sp2 ); 2754__m512i iacc_mat_01_1 = _mm512_add_epi16 (iacc_mat_01_1_sp1 ,iacc_mat_01_1_sp2 ); 2755__m512i iacc_mat_10_1 = _mm512_add_epi16 (iacc_mat_10_1_sp1 ,iacc_mat_10_1_sp2 ); 2756__m512i iacc_mat_11_1 = _mm512_add_epi16 (iacc_mat_11_1_sp1 ,iacc_mat_11_1_sp2 ); 2757 2758iacc_mat_00_0 = _mm512_madd_epi16 (iacc_mat_00_0 ,scale_014589CD_0 ); 2759iacc_mat_01_0 = _mm512_madd_epi16 (iacc_mat_01_0 ,scale_2367ABEF_0 ); 2760iacc_mat_10_0 = _mm512_madd_epi16 (iacc_mat_10_0 ,scale_014589CD_0 ); 2761iacc_mat_11_0 = _mm512_madd_epi16 (iacc_mat_11_0 ,scale_2367ABEF_0 ); 2762 2763iacc_mat_00_1 = _mm512_madd_epi16 (iacc_mat_00_1 ,scale_014589CD_1 ); 2764iacc_mat_01_1 = _mm512_madd_epi16 (iacc_mat_01_1 ,scale_2367ABEF_1 ); 2765iacc_mat_10_1 = _mm512_madd_epi16 (iacc_mat_10_1 ,scale_014589CD_1 ); 2766iacc_mat_11_1 = _mm512_madd_epi16 (iacc_mat_11_1 ,scale_2367ABEF_1 ); 2767 2768// Straighten out to make 4 row vectors (4 for each sub block which are accumulated together in the next step) 2769__m512i iacc_row_0_0 = _mm512_mask_blend_epi32 (0xCCCC ,iacc_mat_00_0 ,_mm512_shuffle_epi32 (iacc_mat_01_0 , (_MM_PERM_ENUM )78 )); 2770__m512i iacc_row_1_0 = _mm512_mask_blend_epi32 (0xCCCC ,_mm512_shuffle_epi32 (iacc_mat_00_0 , (_MM_PERM_ENUM )78 ),iacc_mat_01_0 ); 2771__m512i iacc_row_2_0 = _mm512_mask_blend_epi32 (0xCCCC ,iacc_mat_10_0 ,_mm512_shuffle_epi32 (iacc_mat_11_0 , (_MM_PERM_ENUM )78 )); 2772__m512i iacc_row_3_0 = _mm512_mask_blend_epi32 (0xCCCC ,_mm512_shuffle_epi32 (iacc_mat_10_0 , (_MM_PERM_ENUM )78 ),iacc_mat_11_0 ); 2773__m512i iacc_row_0_1 = _mm512_mask_blend_epi32 (0xCCCC ,iacc_mat_00_1 ,_mm512_shuffle_epi32 (iacc_mat_01_1 , (_MM_PERM_ENUM )78 )); 2774__m512i iacc_row_1_1 = _mm512_mask_blend_epi32 (0xCCCC ,_mm512_shuffle_epi32 (iacc_mat_00_1 , (_MM_PERM_ENUM )78 ),iacc_mat_01_1 ); 2775__m512i iacc_row_2_1 = _mm512_mask_blend_epi32 (0xCCCC ,iacc_mat_10_1 ,_mm512_shuffle_epi32 (iacc_mat_11_1 , (_MM_PERM_ENUM )78 )); 2776__m512i iacc_row_3_1 = _mm512_mask_blend_epi32 (0xCCCC ,_mm512_shuffle_epi32 (iacc_mat_10_1 , (_MM_PERM_ENUM )78 ),iacc_mat_11_1 ); 2777 2778__m512i iacc_row_0 = _mm512_add_epi32 (iacc_row_0_0 ,iacc_row_0_1 ); 2779__m512i iacc_row_1 = _mm512_add_epi32 (iacc_row_1_0 ,iacc_row_1_1 ); 2780__m512i iacc_row_2 = _mm512_add_epi32 (iacc_row_2_0 ,iacc_row_2_1 ); 2781__m512i iacc_row_3 = _mm512_add_epi32 (iacc_row_3_0 ,iacc_row_3_1 ); 2782 2783// Load the scale(d) values for all the 4 Q8_k blocks and repeat it across lanes 2784const __m128 row_scale_f32_sse = _mm_load_ps (a_ptr [b ].d ); 2785const __m256 row_scale_f32_ymm = _mm256_set_m128 (row_scale_f32_sse ,row_scale_f32_sse ); 2786const __m512 row_scale_f32 = _mm512_insertf32x8 (_mm512_castps256_ps512 (row_scale_f32_ymm ),row_scale_f32_ymm ,1 ); 2787 2788// Multiply with appropriate scales and accumulate (for both d and dmin) below 2789acc_rows [0 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_0 ),_mm512_mul_ps (col_scale_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,0 )),acc_rows [0 ]); 2790acc_rows [1 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_1 ),_mm512_mul_ps (col_scale_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,85 )),acc_rows [1 ]); 2791acc_rows [2 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_2 ),_mm512_mul_ps (col_scale_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,170 )),acc_rows [2 ]); 2792acc_rows [3 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_3 ),_mm512_mul_ps (col_scale_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,255 )),acc_rows [3 ]); 2793 2794__m512i iacc_row_min_0 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_hsum_0123_01 , (_MM_PERM_ENUM )0 ),mins_01 ); 2795__m512i iacc_row_min_1 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_hsum_0123_01 , (_MM_PERM_ENUM )85 ),mins_01 ); 2796__m512i iacc_row_min_2 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_hsum_0123_01 , (_MM_PERM_ENUM )170 ),mins_01 ); 2797__m512i iacc_row_min_3 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_hsum_0123_01 , (_MM_PERM_ENUM )255 ),mins_01 ); 2798 2799acc_min_rows [0 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_min_0 ),_mm512_mul_ps (col_dmin_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,0 )),acc_min_rows [0 ]); 2800acc_min_rows [1 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_min_1 ),_mm512_mul_ps (col_dmin_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,85 )),acc_min_rows [1 ]); 2801acc_min_rows [2 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_min_2 ),_mm512_mul_ps (col_dmin_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,170 )),acc_min_rows [2 ]); 2802acc_min_rows [3 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_min_3 ),_mm512_mul_ps (col_dmin_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,255 )),acc_min_rows [3 ]); 2803 } 2804 } 2805// Store accumulated values 2806for (int i = 0 ;i < 4 ;i ++ ) { 2807_mm512_storeu_ps ((float * )(s + ((y * 4 + i )* bs + x * 8 )),_mm512_sub_ps (acc_rows [i ],acc_min_rows [i ])); 2808 } 2809 } 2810 } 2811if (anc != nc ) { 2812xstart = anc /8 ; 2813y = 0 ; 2814 } 2815#endif // __AVX512BW__ && __AVX512DQ__ 2816 2817// Take group of four block_q8_Kx4 structures at each pass of the loop and perform dot product operation 2818for (;y < anr /4 ;y += 4 ) { 2819 2820const block_q8_Kx4 * a_ptrs [4 ]; 2821 2822a_ptrs [0 ]= a_ptr_start + (y * nb ); 2823for (int i = 0 ;i < 3 ;++ i ) { 2824a_ptrs [i + 1 ]= a_ptrs [i ]+ nb ; 2825 } 2826 2827// Take group of eight block_q4_kx8 structures at each pass of the loop and perform dot product operation 2828for (int64_t x = xstart ;x < nc /8 ;x ++ ) { 2829 2830const block_q4_Kx8 * b_ptr = b_ptr_start + (x * b_nb ); 2831 2832// Master FP accumulators 2833__m256 acc_rows [16 ]; 2834for (int i = 0 ;i < 16 ;i ++ ) { 2835acc_rows [i ]= _mm256_setzero_ps (); 2836 } 2837 2838__m256 acc_min_rows [16 ]; 2839for (int i = 0 ;i < 16 ;i ++ ) { 2840acc_min_rows [i ]= _mm256_setzero_ps (); 2841 } 2842 2843// For super block 2844for (int64_t b = 0 ;b < nb ;b ++ ) { 2845 2846// Scale values - Load the eight scale values of block_q4_kx8 2847const __m256 col_scale_f32 = GGML_F32Cx8_LOAD (b_ptr [b ].d ); 2848 2849// dmin values - Load the eight dmin values of block_q4_kx8 2850const __m256 col_dmin_f32 = GGML_F32Cx8_LOAD (b_ptr [b ].dmin ); 2851 2852// Loop to iterate over the eight sub blocks of a super block - two sub blocks are processed per iteration 2853for (int sb = 0 ;sb < QK_K /64 ;sb ++ ) { 2854 2855// Load the eight block_q4_K for two sub blocks quantized values interleaved with each other in chunks of eight bytes - B0,B1 ....B6,B7 2856const __m256i rhs_raw_mat_0123_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + sb * 256 )); 2857const __m256i rhs_raw_mat_4567_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 32 + sb * 256 )); 2858const __m256i rhs_raw_mat_0123_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 64 + sb * 256 )); 2859const __m256i rhs_raw_mat_4567_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 96 + sb * 256 )); 2860const __m256i rhs_raw_mat_0123_2 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 128 + sb * 256 )); 2861const __m256i rhs_raw_mat_4567_2 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 160 + sb * 256 )); 2862const __m256i rhs_raw_mat_0123_3 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 192 + sb * 256 )); 2863const __m256i rhs_raw_mat_4567_3 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 224 + sb * 256 )); 2864 2865// Save the values in the following vectors in the formats B0B1B4B5, B2B3B6B7 for further processing and storing of values 2866const __m256i rhs_raw_mat_0145_0 = _mm256_blend_epi32 (rhs_raw_mat_0123_0 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_0 ,requiredOrder ),240 ); 2867const __m256i rhs_raw_mat_2367_0 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_0 ,requiredOrder ),rhs_raw_mat_4567_0 ,240 ); 2868const __m256i rhs_raw_mat_0145_1 = _mm256_blend_epi32 (rhs_raw_mat_0123_1 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_1 ,requiredOrder ),240 ); 2869const __m256i rhs_raw_mat_2367_1 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_1 ,requiredOrder ),rhs_raw_mat_4567_1 ,240 ); 2870const __m256i rhs_raw_mat_0145_2 = _mm256_blend_epi32 (rhs_raw_mat_0123_2 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_2 ,requiredOrder ),240 ); 2871const __m256i rhs_raw_mat_2367_2 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_2 ,requiredOrder ),rhs_raw_mat_4567_2 ,240 ); 2872const __m256i rhs_raw_mat_0145_3 = _mm256_blend_epi32 (rhs_raw_mat_0123_3 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_3 ,requiredOrder ),240 ); 2873const __m256i rhs_raw_mat_2367_3 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_3 ,requiredOrder ),rhs_raw_mat_4567_3 ,240 ); 2874 2875// 4-bit -> 8-bit 2876// First sub block of the two sub blocks processed in the iteration 2877const __m256i rhs_mat_0145_00 = _mm256_and_si256 (rhs_raw_mat_0145_0 ,m4b );//B00(0-7) B01(0-7) B04(0-7) B05(0-7) 2878const __m256i rhs_mat_2367_00 = _mm256_and_si256 (rhs_raw_mat_2367_0 ,m4b );//B02(0-7) B03(0-7) B06(0-7) B07(0-7) 2879 2880const __m256i rhs_mat_0145_01 = _mm256_and_si256 (rhs_raw_mat_0145_1 ,m4b );//B00(8-15) B01(8-15) B04(8-15) B05(8-15) 2881const __m256i rhs_mat_2367_01 = _mm256_and_si256 (rhs_raw_mat_2367_1 ,m4b );//B02(8-15) B03(8-15) B06(8-15) B07(8-15) 2882 2883const __m256i rhs_mat_0145_02 = _mm256_and_si256 (rhs_raw_mat_0145_2 ,m4b );//B00(16-23) B01(16-23) B04(16-23) B05(16-23) 2884const __m256i rhs_mat_2367_02 = _mm256_and_si256 (rhs_raw_mat_2367_2 ,m4b );//B02(16-23) B03(16-23) B06(16-23) B07(16-23) 2885 2886const __m256i rhs_mat_0145_03 = _mm256_and_si256 (rhs_raw_mat_0145_3 ,m4b );//B00(24-31) B01(24-31) B04(24-31) B05(24-31) 2887const __m256i rhs_mat_2367_03 = _mm256_and_si256 (rhs_raw_mat_2367_3 ,m4b );//B02(24-31) B03(24-31) B06(24-31) B07(24-31) 2888 2889// Second sub block of the two sub blocks processed in the iteration 2890const __m256i rhs_mat_0145_10 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_0145_0 ,4 ),m4b );//B10(0-7) B11(0-7) B14(0-7) B15(0-7) 2891const __m256i rhs_mat_2367_10 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_2367_0 ,4 ),m4b );//B12(0-7) B13(0-7) B16(0-7) B17(0-7) 2892 2893const __m256i rhs_mat_0145_11 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_0145_1 ,4 ),m4b );//B10(8-15) B11(8-15) B14(8-15) B15(8-15) 2894const __m256i rhs_mat_2367_11 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_2367_1 ,4 ),m4b );//B12(8-15) B13(8-15) B16(8-15) B17(8-15) 2895 2896const __m256i rhs_mat_0145_12 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_0145_2 ,4 ),m4b );//B10(16-23) B11(16-23) B14(16-23) B15(16-23) 2897const __m256i rhs_mat_2367_12 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_2367_2 ,4 ),m4b );//B12(16-23) B13(16-23) B16(16-23) B17(16-23) 2898 2899const __m256i rhs_mat_0145_13 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_0145_3 ,4 ),m4b );//B10(24-31) B11(24-31) B14(24-31) B15(24-31) 2900const __m256i rhs_mat_2367_13 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_2367_3 ,4 ),m4b );//B12(24-31) B13(24-31) B16(24-31) B17(24-31) 2901 2902// Shuffle pattern one - right side input 2903const __m256i rhs_mat_0145_00_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_00 ,136 );//B00(0-3) B01(0-3) B00(0-3) B01(0-3) B04(0-3) B05(0-3) B04(0-3) B05(0-3) 2904const __m256i rhs_mat_2367_00_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_00 ,136 );//B02(0-3) B03(0-3) B02(0-3) B03(0-3) B06(0-3) B07(0-3) B06(0-3) B07(0-3) 2905 2906const __m256i rhs_mat_0145_01_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_01 ,136 );//B00(8-11) B01(8-11) B00(8-11) B01(8-11) B04(8-11) B05(8-11) B04(8-11) B05(8-11) 2907const __m256i rhs_mat_2367_01_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_01 ,136 );//B02(8-11) B03(8-11) B02(8-11) B03(8-11) B06(8-11) B07(8-11) B06(8-11) B07(8-11) 2908 2909const __m256i rhs_mat_0145_02_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_02 ,136 );//B00(16-19) B01(16-19) B00(16-19) B01(16-19) B04(16-19) B05(16-19) B04(16-19) B05(16-19) 2910const __m256i rhs_mat_2367_02_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_02 ,136 );//B02(16-19) B03(16-19) B02(16-19) B03(16-19) B06(16-19) B07(16-19) B06(16-19) B07(16-19) 2911 2912const __m256i rhs_mat_0145_03_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_03 ,136 );//B00(24-27) B01(24-27) B00(24-27) B01(24-27) B04(24-27) B05(24-27) B04(24-27) B05(24-27) 2913const __m256i rhs_mat_2367_03_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_03 ,136 );//B02(24-27) B03(24-27) B02(24-27) B03(24-27) B06(24-27) B07(24-27) B06(24-27) B07(24-27) 2914 2915const __m256i rhs_mat_0145_10_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_10 ,136 );//B10(0-3) B11(0-3) B10(0-3) B11(0-3) B14(0-3) B15(0-3) B14(0-3) B15(0-3) 2916const __m256i rhs_mat_2367_10_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_10 ,136 );//B12(0-3) B13(0-3) B12(0-3) B13(0-3) B16(0-3) B17(0-3) B16(0-3) B17(0-3) 2917 2918const __m256i rhs_mat_0145_11_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_11 ,136 );//B10(8-11) B11(8-11) B10(8-11) B11(8-11) B14(8-11) B15(8-11) B14(8-11) B15(8-11) 2919const __m256i rhs_mat_2367_11_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_11 ,136 );//B12(8-11) B13(8-11) B12(8-11) B13(8-11) B16(8-11) B17(8-11) B16(8-11) B17(8-11) 2920 2921const __m256i rhs_mat_0145_12_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_12 ,136 );//B10(16-19) B11(16-19) B10(16-19) B11(16-19) B14(16-19) B15(16-19) B14(16-19) B15(16-19) 2922const __m256i rhs_mat_2367_12_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_12 ,136 );//B12(16-19) B13(16-19) B12(16-19) B13(16-19) B16(16-19) B17(16-19) B16(16-19) B17(16-19) 2923 2924const __m256i rhs_mat_0145_13_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_13 ,136 );//B10(24-27) B11(24-27) B10(24-27) B11(24-27) B14(24-27) B15(24-27) B14(24-27) B15(24-27) 2925const __m256i rhs_mat_2367_13_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_13 ,136 );//B12(24-27) B13(24-27) B12(24-27) B13(24-27) B16(24-27) B17(24-27) B16(24-27) B17(24-27) 2926 2927 2928// Shuffle pattern two - right side input 2929const __m256i rhs_mat_0145_00_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_00 ,221 );//B00(4-7) B01(4-7) B00(4-7) B01(4-7) B04(4-7) B05(4-7) B04(4-7) B05(4-7) 2930const __m256i rhs_mat_2367_00_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_00 ,221 );//B02(4-7) B03(4-7) B02(4-7) B03(4-7) B06(4-7) B07(4-7) B06(4-7) B07(4-7) 2931 2932const __m256i rhs_mat_0145_01_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_01 ,221 );//B00(12-15) B01(12-15) B00(12-15) B01(12-15) B04(12-15) B05(12-15) B04(12-15) B05(12-15) 2933const __m256i rhs_mat_2367_01_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_01 ,221 );//B02(12-15) B03(12-15) B02(12-15) B03(12-15) B06(12-15) B07(12-15) B06(12-15) B07(12-15) 2934 2935const __m256i rhs_mat_0145_02_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_02 ,221 );//B00(20-23) B01(20-23) B00(20-23) B01(20-23) B04(20-23) B05(20-23) B04(20-23) B05(20-23) 2936const __m256i rhs_mat_2367_02_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_02 ,221 );//B02(20-23) B03(20-23) B02(20-23) B03(20-23) B06(20-23) B07(20-23) B06(20-23) B07(20-23) 2937 2938const __m256i rhs_mat_0145_03_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_03 ,221 );//B00(28-31) B01(28-31) B00(28-31) B01(28-31) B04(28-31) B05(28-31) B04(28-31) B05(28-31) 2939const __m256i rhs_mat_2367_03_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_03 ,221 );//B02(28-31) B03(28-31) B02(28-31) B03(28-31) B06(28-31) B07(28-31) B06(28-31) B07(28-31) 2940 2941const __m256i rhs_mat_0145_10_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_10 ,221 );//B10(4-7) B11(4-7) B10(4-7) B11(4-7) B14(4-7) B15(4-7) B14(4-7) B15(4-7) 2942const __m256i rhs_mat_2367_10_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_10 ,221 );//B12(4-7) B13(4-7) B12(4-7) B13(4-7) B16(4-7) B17(4-7) B16(4-7) B17(4-7) 2943 2944const __m256i rhs_mat_0145_11_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_11 ,221 );//B10(12-15) B11(12-15) B10(12-15) B11(12-15) B14(12-15) B15(12-15) B14(12-15) B15(12-15) 2945const __m256i rhs_mat_2367_11_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_11 ,221 );//B12(12-15) B13(12-15) B12(12-15) B13(12-15) B16(12-15) B17(12-15) B16(12-15) B17(12-15) 2946 2947const __m256i rhs_mat_0145_12_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_12 ,221 );//B10(20-23) B11(20-23) B10(20-23) B11(20-23) B14(20-23) B15(20-23) B14(20-23) B15(20-23) 2948const __m256i rhs_mat_2367_12_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_12 ,221 );//B12(20-23) B13(20-23) B12(20-23) B13(20-23) B16(20-23) B17(20-23) B16(20-23) B17(20-23) 2949 2950const __m256i rhs_mat_0145_13_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_13 ,221 );//B10(28-31) B11(28-31) B10(28-31) B11(28-31) B14(28-31) B15(28-31) B14(28-31) B15(28-31) 2951const __m256i rhs_mat_2367_13_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_13 ,221 );//B12(28-31) B13(28-31) B12(28-31) B13(28-31) B16(28-31) B17(28-31) B16(28-31) B17(28-31) 2952 2953uint32_t utmp_0 [4 ],utmp_1 [4 ]; 2954 2955// Scales and Mins of corresponding sub blocks from different Q4_K structures are stored together 2956// The below block is for eg to extract first sub block's scales and mins from different Q4_K structures for the sb loop 2957memcpy (utmp_0 ,b_ptr [b ].scales + 24 * sb ,12 ); 2958utmp_0 [3 ]= ((utmp_0 [2 ] >>4 )& kmask2 ) | (((utmp_0 [1 ] >>6 )& kmask3 ) <<4 ); 2959const uint32_t uaux_0 = utmp_0 [1 ]& kmask1 ; 2960utmp_0 [1 ]= (utmp_0 [2 ]& kmask2 ) | (((utmp_0 [0 ] >>6 )& kmask3 ) <<4 ); 2961utmp_0 [2 ]= uaux_0 ; 2962utmp_0 [0 ] &=kmask1 ; 2963 2964// The below block is for eg to extract second sub block's scales and mins from different Q4_K structures for the sb loop 2965memcpy (utmp_1 ,b_ptr [b ].scales + 12 + sb * 24 ,12 ); 2966utmp_1 [3 ]= ((utmp_1 [2 ] >>4 )& kmask2 ) | (((utmp_1 [1 ] >>6 )& kmask3 ) <<4 ); 2967const uint32_t uaux_1 = utmp_1 [1 ]& kmask1 ; 2968utmp_1 [1 ]= (utmp_1 [2 ]& kmask2 ) | (((utmp_1 [0 ] >>6 )& kmask3 ) <<4 ); 2969utmp_1 [2 ]= uaux_1 ; 2970utmp_1 [0 ] &=kmask1 ; 2971 2972// Scales of first sub block in the sb loop 2973const __m128i mins_and_scales_0 = _mm_set_epi32 (utmp_0 [3 ],utmp_0 [2 ],utmp_0 [1 ],utmp_0 [0 ]); 2974const __m256i scales_0 = _mm256_cvtepu8_epi16 (_mm_unpacklo_epi8 (mins_and_scales_0 ,mins_and_scales_0 )); 2975 2976// Scales of second sub block in the sb loop 2977const __m128i mins_and_scales_1 = _mm_set_epi32 (utmp_1 [3 ],utmp_1 [2 ],utmp_1 [1 ],utmp_1 [0 ]); 2978const __m256i scales_1 = _mm256_cvtepu8_epi16 (_mm_unpacklo_epi8 (mins_and_scales_1 ,mins_and_scales_1 )); 2979 2980// Mins of first and second sub block of Q4_K block are arranged side by side 2981const __m256i mins_01 = _mm256_cvtepu8_epi16 (_mm_unpacklo_epi8 (_mm_shuffle_epi32 (mins_and_scales_0 ,78 ),_mm_shuffle_epi32 (mins_and_scales_1 ,78 ))); 2982 2983const __m256i scale_0145_0 = _mm256_shuffle_epi32 (scales_0 ,68 ); 2984const __m256i scale_2367_0 = _mm256_shuffle_epi32 (scales_0 ,238 ); 2985 2986const __m256i scale_0145_1 = _mm256_shuffle_epi32 (scales_1 ,68 ); 2987const __m256i scale_2367_1 = _mm256_shuffle_epi32 (scales_1 ,238 ); 2988 2989for (int rp = 0 ;rp < 4 ;rp ++ ) { 2990 2991// Load the four block_q8_k quantized values interleaved with each other in chunks of eight bytes - A0,A1,A2,A3 2992// Loaded as set of 128 bit vectors and repeated into a 256 bit vector 2993__m256i lhs_mat_0123_00 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 256 * sb ))); 2994__m256i lhs_mat_01_00 = _mm256_permute2f128_si256 (lhs_mat_0123_00 ,lhs_mat_0123_00 ,0 ); 2995__m256i lhs_mat_23_00 = _mm256_permute2f128_si256 (lhs_mat_0123_00 ,lhs_mat_0123_00 ,17 ); 2996__m256i lhs_mat_0123_01 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 32 + 256 * sb ))); 2997__m256i lhs_mat_01_01 = _mm256_permute2f128_si256 (lhs_mat_0123_01 ,lhs_mat_0123_01 ,0 ); 2998__m256i lhs_mat_23_01 = _mm256_permute2f128_si256 (lhs_mat_0123_01 ,lhs_mat_0123_01 ,17 ); 2999__m256i lhs_mat_0123_02 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 64 + 256 * sb ))); 3000__m256i lhs_mat_01_02 = _mm256_permute2f128_si256 (lhs_mat_0123_02 ,lhs_mat_0123_02 ,0 ); 3001__m256i lhs_mat_23_02 = _mm256_permute2f128_si256 (lhs_mat_0123_02 ,lhs_mat_0123_02 ,17 ); 3002__m256i lhs_mat_0123_03 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 96 + 256 * sb ))); 3003__m256i lhs_mat_01_03 = _mm256_permute2f128_si256 (lhs_mat_0123_03 ,lhs_mat_0123_03 ,0 ); 3004__m256i lhs_mat_23_03 = _mm256_permute2f128_si256 (lhs_mat_0123_03 ,lhs_mat_0123_03 ,17 ); 3005__m256i lhs_mat_0123_10 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 128 + 256 * sb ))); 3006__m256i lhs_mat_01_10 = _mm256_permute2f128_si256 (lhs_mat_0123_10 ,lhs_mat_0123_10 ,0 ); 3007__m256i lhs_mat_23_10 = _mm256_permute2f128_si256 (lhs_mat_0123_10 ,lhs_mat_0123_10 ,17 ); 3008__m256i lhs_mat_0123_11 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 160 + 256 * sb ))); 3009__m256i lhs_mat_01_11 = _mm256_permute2f128_si256 (lhs_mat_0123_11 ,lhs_mat_0123_11 ,0 ); 3010__m256i lhs_mat_23_11 = _mm256_permute2f128_si256 (lhs_mat_0123_11 ,lhs_mat_0123_11 ,17 ); 3011__m256i lhs_mat_0123_12 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 192 + 256 * sb ))); 3012__m256i lhs_mat_01_12 = _mm256_permute2f128_si256 (lhs_mat_0123_12 ,lhs_mat_0123_12 ,0 ); 3013__m256i lhs_mat_23_12 = _mm256_permute2f128_si256 (lhs_mat_0123_12 ,lhs_mat_0123_12 ,17 ); 3014__m256i lhs_mat_0123_13 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 224 + 256 * sb ))); 3015__m256i lhs_mat_01_13 = _mm256_permute2f128_si256 (lhs_mat_0123_13 ,lhs_mat_0123_13 ,0 ); 3016__m256i lhs_mat_23_13 = _mm256_permute2f128_si256 (lhs_mat_0123_13 ,lhs_mat_0123_13 ,17 ); 3017 3018// Bsums are loaded - four bsums are loaded (for two sub blocks) for the different Q8_K blocks 3019__m256i lhs_bsums_0123_01 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].bsums + 16 * sb ))); 3020__m256i lhs_bsums_hsum_0123_01 = _mm256_castsi128_si256 (_mm_hadd_epi16 (_mm256_castsi256_si128 (lhs_bsums_0123_01 ),_mm256_extractf128_si256 (lhs_bsums_0123_01 ,1 ))); 3021lhs_bsums_hsum_0123_01 = _mm256_permute2x128_si256 (lhs_bsums_hsum_0123_01 ,lhs_bsums_hsum_0123_01 ,0 ); 3022 3023// Shuffle pattern one - left side input 3024const __m256i lhs_mat_01_00_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_00 ,160 );//A00(0-3) A00(0-3) A01(0-3) A01(0-3) A00(0-3) A00(0-3) A01(0-3) A01(0-3) 3025const __m256i lhs_mat_23_00_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_00 ,160 );//A02(0-3) A03(0-3) A02(0-3) A03(0-3) A02(0-3) A03(0-3) A02(0-3) A03(0-3) 3026 3027const __m256i lhs_mat_01_01_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_01 ,160 );//A00(8-11) A00(8-11) A01(8-11) A01(8-11) A00(8-11) A00(8-11) A01(8-11) A01(8-11) 3028const __m256i lhs_mat_23_01_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_01 ,160 );//A02(8-11) A03(8-11) A02(8-11) A03(8-11) A02(8-11) A03(8-11) A02(8-11) A03(8-11) 3029 3030const __m256i lhs_mat_01_02_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_02 ,160 );//A00(16-19) A00(16-19) A01(16-19) A01(16-19) A00(16-19) A00(16-19) A01(16-19) A01(16-19) 3031const __m256i lhs_mat_23_02_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_02 ,160 );//A02(16-19) A03(16-19) A02(16-19) A03(16-19) A02(16-19) A03(16-19) A02(16-19) A03(16-19) 3032 3033const __m256i lhs_mat_01_03_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_03 ,160 );//A00(24-27) A00(24-27) A01(24-27) A01(24-27) A00(24-27) A00(24-27) A01(24-27) A01(24-27) 3034const __m256i lhs_mat_23_03_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_03 ,160 );//A02(24-27) A03(24-27) A02(24-27) A03(24-27) A02(24-27) A03(24-27) A02(24-27) A03(24-27) 3035 3036const __m256i lhs_mat_01_10_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_10 ,160 );//A10(0-3) A10(0-3) A11(0-3) A11(0-3) A10(0-3) A10(0-3) A11(0-3) A11(0-3) 3037const __m256i lhs_mat_23_10_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_10 ,160 );//A12(0-3) A13(0-3) A12(0-3) A13(0-3) A12(0-3) A13(0-3) A12(0-3) A13(0-3) 3038 3039const __m256i lhs_mat_01_11_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_11 ,160 );//A10(8-11) A10(8-11) A11(8-11) A11(8-11) A10(8-11) A10(8-11) A11(8-11) A11(8-11) 3040const __m256i lhs_mat_23_11_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_11 ,160 );//A12(8-11) A13(8-11) A12(8-11) A13(8-11) A12(8-11) A13(8-11) A12(8-11) A13(8-11) 3041 3042const __m256i lhs_mat_01_12_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_12 ,160 );//A10(16-19) A10(16-19) A11(16-19) A11(16-19) A10(16-19) A10(16-19) A11(16-19) A11(16-19) 3043const __m256i lhs_mat_23_12_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_12 ,160 );//A12(16-19) A13(16-19) A12(16-19) A13(16-19) A12(16-19) A13(16-19) A12(16-19) A13(16-19) 3044 3045const __m256i lhs_mat_01_13_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_13 ,160 );//A10(24-27) A10(24-27) A11(24-27) A11(24-27) A10(24-27) A10(24-27) A11(24-27) A11(24-27) 3046const __m256i lhs_mat_23_13_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_13 ,160 );//A12(24-27) A13(24-27) A12(24-27) A13(24-27) A12(24-27) A13(24-27) A12(24-27) A13(24-27) 3047 3048// Shuffle pattern two- left side input 3049const __m256i lhs_mat_01_00_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_00 ,245 );//A00(4-7) A00(4-7) A01(4-7) A01(4-7) A00(4-7) A00(4-7) A01(4-7) A01(4-7) 3050const __m256i lhs_mat_23_00_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_00 ,245 );//A02(4-7) A03(4-7) A02(4-7) A03(4-7) A02(4-7) A03(4-7) A02(4-7) A03(4-7) 3051 3052const __m256i lhs_mat_01_01_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_01 ,245 );//A00(12-15) A00(12-15) A01(12-15) A01(12-15) A00(12-15) A00(12-15) A01(12-15) A01(12-15) 3053const __m256i lhs_mat_23_01_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_01 ,245 );//A02(12-15) A03(12-15) A02(12-15) A03(12-15) A02(12-15) A03(12-15) A02(12-15) A03(12-15) 3054 3055const __m256i lhs_mat_01_02_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_02 ,245 );//A00(20-23) A00(20-23) A01(20-23) A01(20-23) A00(20-23) A00(20-23) A01(20-23) A01(20-23) 3056const __m256i lhs_mat_23_02_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_02 ,245 );//A02(20-23) A03(20-23) A02(20-23) A03(20-23) A02(20-23) A03(20-23) A02(20-23) A03(20-23) 3057 3058const __m256i lhs_mat_01_03_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_03 ,245 );//A00(28-31) A00(28-31) A01(28-31) A01(28-31) A00(28-31) A00(28-31) A01(28-31) A01(28-31) 3059const __m256i lhs_mat_23_03_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_03 ,245 );//A02(28-31) A03(28-31) A02(28-31) A03(28-31) A02(28-31) A03(28-31) A02(28-31) A03(28-31) 3060 3061const __m256i lhs_mat_01_10_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_10 ,245 );//A10(4-7) A10(4-7) A11(4-7) A11(4-7) A10(4-7) A10(4-7) A11(4-7) A11(4-7) 3062const __m256i lhs_mat_23_10_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_10 ,245 );//A12(4-7) A13(4-7) A12(4-7) A13(4-7) A12(4-7) A13(4-7) A12(4-7) A13(4-7) 3063 3064const __m256i lhs_mat_01_11_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_11 ,245 );//A10(12-15) A10(12-15) A11(12-15) A11(12-15) A10(12-15) A10(12-15) A11(12-15) A11(12-15) 3065const __m256i lhs_mat_23_11_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_11 ,245 );//A12(12-15) A13(12-15) A12(12-15) A13(12-15) A12(12-15) A13(12-15) A12(12-15) A13(12-15) 3066 3067const __m256i lhs_mat_01_12_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_12 ,245 );//A10(20-23) A10(20-23) A11(20-23) A11(20-23) A10(20-23) A10(20-23) A11(20-23) A11(20-23) 3068const __m256i lhs_mat_23_12_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_12 ,245 );//A12(20-23) A13(20-23) A12(20-23) A13(20-23) A12(20-23) A13(20-23) A12(20-23) A13(20-23) 3069 3070const __m256i lhs_mat_01_13_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_13 ,245 );//A10(28-31) A10(28-31) A11(28-31) A11(28-31) A10(28-31) A10(28-31) A11(28-31) A11(28-31) 3071const __m256i lhs_mat_23_13_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_13 ,245 );//A12(28-31) A13(28-31) A12(28-31) A13(28-31) A12(28-31) A13(28-31) A12(28-31) A13(28-31) 3072 3073// The values arranged in shuffle patterns are operated with dot product operation within 32 bit lane i.e corresponding bytes and multiplied and added into 32 bit integers within 32 bit lane 3074__m256i iacc_mat_00_0_sp1 = _mm256_add_epi16 (_mm256_add_epi16 (_mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_03_sp1 ,lhs_mat_01_03_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_02_sp1 ,lhs_mat_01_02_sp1 )),_mm256_maddubs_epi16 (rhs_mat_0145_01_sp1 ,lhs_mat_01_01_sp1 )),_mm256_maddubs_epi16 (rhs_mat_0145_00_sp1 ,lhs_mat_01_00_sp1 )); 3075__m256i iacc_mat_01_0_sp1 = _mm256_add_epi16 (_mm256_add_epi16 (_mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_03_sp1 ,lhs_mat_01_03_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_02_sp1 ,lhs_mat_01_02_sp1 )),_mm256_maddubs_epi16 (rhs_mat_2367_01_sp1 ,lhs_mat_01_01_sp1 )),_mm256_maddubs_epi16 (rhs_mat_2367_00_sp1 ,lhs_mat_01_00_sp1 )); 3076__m256i iacc_mat_10_0_sp1 = _mm256_add_epi16 (_mm256_add_epi16 (_mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_03_sp1 ,lhs_mat_23_03_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_02_sp1 ,lhs_mat_23_02_sp1 )),_mm256_maddubs_epi16 (rhs_mat_0145_01_sp1 ,lhs_mat_23_01_sp1 )),_mm256_maddubs_epi16 (rhs_mat_0145_00_sp1 ,lhs_mat_23_00_sp1 )); 3077__m256i iacc_mat_11_0_sp1 = _mm256_add_epi16 (_mm256_add_epi16 (_mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_03_sp1 ,lhs_mat_23_03_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_02_sp1 ,lhs_mat_23_02_sp1 )),_mm256_maddubs_epi16 (rhs_mat_2367_01_sp1 ,lhs_mat_23_01_sp1 )),_mm256_maddubs_epi16 (rhs_mat_2367_00_sp1 ,lhs_mat_23_00_sp1 )); 3078__m256i iacc_mat_00_1_sp1 = _mm256_add_epi16 (_mm256_add_epi16 (_mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_13_sp1 ,lhs_mat_01_13_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_12_sp1 ,lhs_mat_01_12_sp1 )),_mm256_maddubs_epi16 (rhs_mat_0145_11_sp1 ,lhs_mat_01_11_sp1 )),_mm256_maddubs_epi16 (rhs_mat_0145_10_sp1 ,lhs_mat_01_10_sp1 )); 3079__m256i iacc_mat_01_1_sp1 = _mm256_add_epi16 (_mm256_add_epi16 (_mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_13_sp1 ,lhs_mat_01_13_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_12_sp1 ,lhs_mat_01_12_sp1 )),_mm256_maddubs_epi16 (rhs_mat_2367_11_sp1 ,lhs_mat_01_11_sp1 )),_mm256_maddubs_epi16 (rhs_mat_2367_10_sp1 ,lhs_mat_01_10_sp1 )); 3080__m256i iacc_mat_10_1_sp1 = _mm256_add_epi16 (_mm256_add_epi16 (_mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_13_sp1 ,lhs_mat_23_13_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_12_sp1 ,lhs_mat_23_12_sp1 )),_mm256_maddubs_epi16 (rhs_mat_0145_11_sp1 ,lhs_mat_23_11_sp1 )),_mm256_maddubs_epi16 (rhs_mat_0145_10_sp1 ,lhs_mat_23_10_sp1 )); 3081__m256i iacc_mat_11_1_sp1 = _mm256_add_epi16 (_mm256_add_epi16 (_mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_13_sp1 ,lhs_mat_23_13_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_12_sp1 ,lhs_mat_23_12_sp1 )),_mm256_maddubs_epi16 (rhs_mat_2367_11_sp1 ,lhs_mat_23_11_sp1 )),_mm256_maddubs_epi16 (rhs_mat_2367_10_sp1 ,lhs_mat_23_10_sp1 )); 3082 3083__m256i iacc_mat_00_0_sp2 = _mm256_add_epi16 (_mm256_add_epi16 (_mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_03_sp2 ,lhs_mat_01_03_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_02_sp2 ,lhs_mat_01_02_sp2 )),_mm256_maddubs_epi16 (rhs_mat_0145_01_sp2 ,lhs_mat_01_01_sp2 )),_mm256_maddubs_epi16 (rhs_mat_0145_00_sp2 ,lhs_mat_01_00_sp2 )); 3084__m256i iacc_mat_01_0_sp2 = _mm256_add_epi16 (_mm256_add_epi16 (_mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_03_sp2 ,lhs_mat_01_03_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_02_sp2 ,lhs_mat_01_02_sp2 )),_mm256_maddubs_epi16 (rhs_mat_2367_01_sp2 ,lhs_mat_01_01_sp2 )),_mm256_maddubs_epi16 (rhs_mat_2367_00_sp2 ,lhs_mat_01_00_sp2 )); 3085__m256i iacc_mat_10_0_sp2 = _mm256_add_epi16 (_mm256_add_epi16 (_mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_03_sp2 ,lhs_mat_23_03_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_02_sp2 ,lhs_mat_23_02_sp2 )),_mm256_maddubs_epi16 (rhs_mat_0145_01_sp2 ,lhs_mat_23_01_sp2 )),_mm256_maddubs_epi16 (rhs_mat_0145_00_sp2 ,lhs_mat_23_00_sp2 )); 3086__m256i iacc_mat_11_0_sp2 = _mm256_add_epi16 (_mm256_add_epi16 (_mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_03_sp2 ,lhs_mat_23_03_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_02_sp2 ,lhs_mat_23_02_sp2 )),_mm256_maddubs_epi16 (rhs_mat_2367_01_sp2 ,lhs_mat_23_01_sp2 )),_mm256_maddubs_epi16 (rhs_mat_2367_00_sp2 ,lhs_mat_23_00_sp2 )); 3087__m256i iacc_mat_00_1_sp2 = _mm256_add_epi16 (_mm256_add_epi16 (_mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_13_sp2 ,lhs_mat_01_13_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_12_sp2 ,lhs_mat_01_12_sp2 )),_mm256_maddubs_epi16 (rhs_mat_0145_11_sp2 ,lhs_mat_01_11_sp2 )),_mm256_maddubs_epi16 (rhs_mat_0145_10_sp2 ,lhs_mat_01_10_sp2 )); 3088__m256i iacc_mat_01_1_sp2 = _mm256_add_epi16 (_mm256_add_epi16 (_mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_13_sp2 ,lhs_mat_01_13_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_12_sp2 ,lhs_mat_01_12_sp2 )),_mm256_maddubs_epi16 (rhs_mat_2367_11_sp2 ,lhs_mat_01_11_sp2 )),_mm256_maddubs_epi16 (rhs_mat_2367_10_sp2 ,lhs_mat_01_10_sp2 )); 3089__m256i iacc_mat_10_1_sp2 = _mm256_add_epi16 (_mm256_add_epi16 (_mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_13_sp2 ,lhs_mat_23_13_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_12_sp2 ,lhs_mat_23_12_sp2 )),_mm256_maddubs_epi16 (rhs_mat_0145_11_sp2 ,lhs_mat_23_11_sp2 )),_mm256_maddubs_epi16 (rhs_mat_0145_10_sp2 ,lhs_mat_23_10_sp2 )); 3090__m256i iacc_mat_11_1_sp2 = _mm256_add_epi16 (_mm256_add_epi16 (_mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_13_sp2 ,lhs_mat_23_13_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_12_sp2 ,lhs_mat_23_12_sp2 )),_mm256_maddubs_epi16 (rhs_mat_2367_11_sp2 ,lhs_mat_23_11_sp2 )),_mm256_maddubs_epi16 (rhs_mat_2367_10_sp2 ,lhs_mat_23_10_sp2 )); 3091 3092// Output of both shuffle patterns are added in order to sum dot product outputs of all 32 values in block 3093__m256i iacc_mat_00_0 = _mm256_add_epi16 (iacc_mat_00_0_sp1 ,iacc_mat_00_0_sp2 ); 3094__m256i iacc_mat_01_0 = _mm256_add_epi16 (iacc_mat_01_0_sp1 ,iacc_mat_01_0_sp2 ); 3095__m256i iacc_mat_10_0 = _mm256_add_epi16 (iacc_mat_10_0_sp1 ,iacc_mat_10_0_sp2 ); 3096__m256i iacc_mat_11_0 = _mm256_add_epi16 (iacc_mat_11_0_sp1 ,iacc_mat_11_0_sp2 ); 3097 3098__m256i iacc_mat_00_1 = _mm256_add_epi16 (iacc_mat_00_1_sp1 ,iacc_mat_00_1_sp2 ); 3099__m256i iacc_mat_01_1 = _mm256_add_epi16 (iacc_mat_01_1_sp1 ,iacc_mat_01_1_sp2 ); 3100__m256i iacc_mat_10_1 = _mm256_add_epi16 (iacc_mat_10_1_sp1 ,iacc_mat_10_1_sp2 ); 3101__m256i iacc_mat_11_1 = _mm256_add_epi16 (iacc_mat_11_1_sp1 ,iacc_mat_11_1_sp2 ); 3102 3103// Output of both shuffle patterns are added in order to sum dot product outputs of all 32 values in block 3104iacc_mat_00_0 = _mm256_madd_epi16 (iacc_mat_00_0 ,scale_0145_0 ); 3105iacc_mat_01_0 = _mm256_madd_epi16 (iacc_mat_01_0 ,scale_2367_0 ); 3106iacc_mat_10_0 = _mm256_madd_epi16 (iacc_mat_10_0 ,scale_0145_0 ); 3107iacc_mat_11_0 = _mm256_madd_epi16 (iacc_mat_11_0 ,scale_2367_0 ); 3108 3109iacc_mat_00_1 = _mm256_madd_epi16 (iacc_mat_00_1 ,scale_0145_1 ); 3110iacc_mat_01_1 = _mm256_madd_epi16 (iacc_mat_01_1 ,scale_2367_1 ); 3111iacc_mat_10_1 = _mm256_madd_epi16 (iacc_mat_10_1 ,scale_0145_1 ); 3112iacc_mat_11_1 = _mm256_madd_epi16 (iacc_mat_11_1 ,scale_2367_1 ); 3113 3114// Straighten out to make 4 row vectors (4 for each sub block which are accumulated together in the next step) 3115__m256i iacc_row_0_0 = _mm256_blend_epi32 (iacc_mat_00_0 ,_mm256_shuffle_epi32 (iacc_mat_01_0 ,78 ),204 ); 3116__m256i iacc_row_1_0 = _mm256_blend_epi32 (_mm256_shuffle_epi32 (iacc_mat_00_0 ,78 ),iacc_mat_01_0 ,204 ); 3117__m256i iacc_row_2_0 = _mm256_blend_epi32 (iacc_mat_10_0 ,_mm256_shuffle_epi32 (iacc_mat_11_0 ,78 ),204 ); 3118__m256i iacc_row_3_0 = _mm256_blend_epi32 (_mm256_shuffle_epi32 (iacc_mat_10_0 ,78 ),iacc_mat_11_0 ,204 ); 3119__m256i iacc_row_0_1 = _mm256_blend_epi32 (iacc_mat_00_1 ,_mm256_shuffle_epi32 (iacc_mat_01_1 ,78 ),204 ); 3120__m256i iacc_row_1_1 = _mm256_blend_epi32 (_mm256_shuffle_epi32 (iacc_mat_00_1 ,78 ),iacc_mat_01_1 ,204 ); 3121__m256i iacc_row_2_1 = _mm256_blend_epi32 (iacc_mat_10_1 ,_mm256_shuffle_epi32 (iacc_mat_11_1 ,78 ),204 ); 3122__m256i iacc_row_3_1 = _mm256_blend_epi32 (_mm256_shuffle_epi32 (iacc_mat_10_1 ,78 ),iacc_mat_11_1 ,204 ); 3123 3124__m256i iacc_row_0 = _mm256_add_epi32 (iacc_row_0_0 ,iacc_row_0_1 ); 3125__m256i iacc_row_1 = _mm256_add_epi32 (iacc_row_1_0 ,iacc_row_1_1 ); 3126__m256i iacc_row_2 = _mm256_add_epi32 (iacc_row_2_0 ,iacc_row_2_1 ); 3127__m256i iacc_row_3 = _mm256_add_epi32 (iacc_row_3_0 ,iacc_row_3_1 ); 3128 3129// Load the scale(d) values for all the 4 Q8_k blocks and repeat it across lanes 3130const __m128 row_scale_f32_sse = _mm_load_ps (a_ptrs [rp ][b ].d ); 3131const __m256 row_scale_f32 = _mm256_set_m128 (row_scale_f32_sse ,row_scale_f32_sse );//GGML_F32Cx8_REPEAT_LOAD(a_ptrs[rp][b].d, loadMask); 3132 3133// Multiply with appropriate scales and accumulate (for both d and dmin) below 3134acc_rows [rp * 4 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_0 ),_mm256_mul_ps (col_scale_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,0 )),acc_rows [rp * 4 ]); 3135acc_rows [rp * 4 + 1 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_1 ),_mm256_mul_ps (col_scale_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,85 )),acc_rows [rp * 4 + 1 ]); 3136acc_rows [rp * 4 + 2 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_2 ),_mm256_mul_ps (col_scale_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,170 )),acc_rows [rp * 4 + 2 ]); 3137acc_rows [rp * 4 + 3 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_3 ),_mm256_mul_ps (col_scale_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,255 )),acc_rows [rp * 4 + 3 ]); 3138 3139__m256i iacc_row_min_0 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_hsum_0123_01 ,0 ),mins_01 ); 3140__m256i iacc_row_min_1 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_hsum_0123_01 ,85 ),mins_01 ); 3141__m256i iacc_row_min_2 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_hsum_0123_01 ,170 ),mins_01 ); 3142__m256i iacc_row_min_3 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_hsum_0123_01 ,255 ),mins_01 ); 3143 3144acc_min_rows [rp * 4 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_min_0 ),_mm256_mul_ps (col_dmin_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,0 )),acc_min_rows [rp * 4 ]); 3145acc_min_rows [rp * 4 + 1 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_min_1 ),_mm256_mul_ps (col_dmin_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,85 )),acc_min_rows [rp * 4 + 1 ]); 3146acc_min_rows [rp * 4 + 2 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_min_2 ),_mm256_mul_ps (col_dmin_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,170 )),acc_min_rows [rp * 4 + 2 ]); 3147acc_min_rows [rp * 4 + 3 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_min_3 ),_mm256_mul_ps (col_dmin_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,255 )),acc_min_rows [rp * 4 + 3 ]); 3148 3149 } 3150 } 3151 } 3152// Store the accumulated values 3153for (int i = 0 ;i < 16 ;i ++ ) { 3154_mm256_storeu_ps ((float * )(s + ((y * 4 + i )* bs + x * 8 )),_mm256_sub_ps (acc_rows [i ],acc_min_rows [i ])); 3155 } 3156 } 3157 } 3158for (;y < nr /4 ;y ++ ) { 3159 3160const block_q8_Kx4 * a_ptr = a_ptr_start + (y * nb ); 3161 3162for (int64_t x = xstart ;x < nc /8 ;x ++ ) { 3163 3164const block_q4_Kx8 * b_ptr = b_ptr_start + (x * b_nb ); 3165 3166// Master FP accumulators 3167__m256 acc_rows [4 ]; 3168for (int i = 0 ;i < 4 ;i ++ ) { 3169acc_rows [i ]= _mm256_setzero_ps (); 3170 } 3171 3172__m256 acc_min_rows [4 ]; 3173for (int i = 0 ;i < 4 ;i ++ ) { 3174acc_min_rows [i ]= _mm256_setzero_ps (); 3175 } 3176 3177for (int64_t b = 0 ;b < nb ;b ++ ) { 3178 3179// Scale values - Load the eight scale values of block_q4_Kx8 3180const __m256 col_scale_f32 = GGML_F32Cx8_LOAD (b_ptr [b ].d ); 3181 3182// dmin values - Load the eight dmin values of block_q4_Kx8 3183const __m256 col_dmin_f32 = GGML_F32Cx8_LOAD (b_ptr [b ].dmin ); 3184 3185// Loop to iterate over the eight sub blocks of a super block - two sub blocks are processed per iteration 3186for (int sb = 0 ;sb < QK_K /64 ;sb ++ ) { 3187 3188// Load the eight block_q4_k for two sub blocks quantized values interleaved with each other in chunks of eight bytes - B0,B1 ....B6,B7 3189const __m256i rhs_raw_mat_0123_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + sb * 256 )); 3190const __m256i rhs_raw_mat_4567_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 32 + sb * 256 )); 3191const __m256i rhs_raw_mat_0123_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 64 + sb * 256 )); 3192const __m256i rhs_raw_mat_4567_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 96 + sb * 256 )); 3193const __m256i rhs_raw_mat_0123_2 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 128 + sb * 256 )); 3194const __m256i rhs_raw_mat_4567_2 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 160 + sb * 256 )); 3195const __m256i rhs_raw_mat_0123_3 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 192 + sb * 256 )); 3196const __m256i rhs_raw_mat_4567_3 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 224 + sb * 256 )); 3197 3198// Save the values in the following vectors in the formats B0B1B4B5, B2B3B6B7 for further processing and storing of values 3199const __m256i rhs_raw_mat_0145_0 = _mm256_blend_epi32 (rhs_raw_mat_0123_0 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_0 ,requiredOrder ),240 ); 3200const __m256i rhs_raw_mat_2367_0 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_0 ,requiredOrder ),rhs_raw_mat_4567_0 ,240 ); 3201const __m256i rhs_raw_mat_0145_1 = _mm256_blend_epi32 (rhs_raw_mat_0123_1 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_1 ,requiredOrder ),240 ); 3202const __m256i rhs_raw_mat_2367_1 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_1 ,requiredOrder ),rhs_raw_mat_4567_1 ,240 ); 3203const __m256i rhs_raw_mat_0145_2 = _mm256_blend_epi32 (rhs_raw_mat_0123_2 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_2 ,requiredOrder ),240 ); 3204const __m256i rhs_raw_mat_2367_2 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_2 ,requiredOrder ),rhs_raw_mat_4567_2 ,240 ); 3205const __m256i rhs_raw_mat_0145_3 = _mm256_blend_epi32 (rhs_raw_mat_0123_3 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_3 ,requiredOrder ),240 ); 3206const __m256i rhs_raw_mat_2367_3 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_3 ,requiredOrder ),rhs_raw_mat_4567_3 ,240 ); 3207 3208// 4-bit -> 8-bit 3209// First sub block of the two sub blocks processed in the iteration 3210const __m256i rhs_mat_0145_00 = _mm256_and_si256 (rhs_raw_mat_0145_0 ,m4b );//B00(0-7) B01(0-7) B04(0-7) B05(0-7) 3211const __m256i rhs_mat_2367_00 = _mm256_and_si256 (rhs_raw_mat_2367_0 ,m4b );//B02(0-7) B03(0-7) B06(0-7) B07(0-7) 3212 3213const __m256i rhs_mat_0145_01 = _mm256_and_si256 (rhs_raw_mat_0145_1 ,m4b );//B00(8-15) B01(8-15) B04(8-15) B05(8-15) 3214const __m256i rhs_mat_2367_01 = _mm256_and_si256 (rhs_raw_mat_2367_1 ,m4b );//B02(8-15) B03(8-15) B06(8-15) B07(8-15) 3215 3216const __m256i rhs_mat_0145_02 = _mm256_and_si256 (rhs_raw_mat_0145_2 ,m4b );//B00(16-23) B01(16-23) B04(16-23) B05(16-23) 3217const __m256i rhs_mat_2367_02 = _mm256_and_si256 (rhs_raw_mat_2367_2 ,m4b );//B02(16-23) B03(16-23) B06(16-23) B07(16-23) 3218 3219const __m256i rhs_mat_0145_03 = _mm256_and_si256 (rhs_raw_mat_0145_3 ,m4b );//B00(24-31) B01(24-31) B04(24-31) B05(24-31) 3220const __m256i rhs_mat_2367_03 = _mm256_and_si256 (rhs_raw_mat_2367_3 ,m4b );//B02(24-31) B03(24-31) B06(24-31) B07(24-31) 3221 3222// Second sub block of the two sub blocks processed in the iteration 3223const __m256i rhs_mat_0145_10 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_0145_0 ,4 ),m4b );//B10(0-7) B11(0-7) B14(0-7) B15(0-7) 3224const __m256i rhs_mat_2367_10 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_2367_0 ,4 ),m4b );//B12(0-7) B13(0-7) B16(0-7) B17(0-7) 3225 3226const __m256i rhs_mat_0145_11 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_0145_1 ,4 ),m4b );//B10(8-15) B11(8-15) B14(8-15) B15(8-15) 3227const __m256i rhs_mat_2367_11 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_2367_1 ,4 ),m4b );//B12(8-15) B13(8-15) B16(8-15) B17(8-15) 3228 3229const __m256i rhs_mat_0145_12 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_0145_2 ,4 ),m4b );//B10(16-23) B11(16-23) B14(16-23) B15(16-23) 3230const __m256i rhs_mat_2367_12 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_2367_2 ,4 ),m4b );//B12(16-23) B13(16-23) B16(16-23) B17(16-23) 3231 3232const __m256i rhs_mat_0145_13 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_0145_3 ,4 ),m4b );//B10(24-31) B11(24-31) B14(24-31) B15(24-31) 3233const __m256i rhs_mat_2367_13 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_2367_3 ,4 ),m4b );//B12(24-31) B13(24-31) B16(24-31) B17(24-31) 3234 3235// Shuffle pattern one - right side input 3236const __m256i rhs_mat_0145_00_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_00 ,136 );//B00(0-3) B01(0-3) B00(0-3) B01(0-3) B04(0-3) B05(0-3) B04(0-3) B05(0-3) 3237const __m256i rhs_mat_2367_00_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_00 ,136 );//B02(0-3) B03(0-3) B02(0-3) B03(0-3) B06(0-3) B07(0-3) B06(0-3) B07(0-3) 3238 3239const __m256i rhs_mat_0145_01_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_01 ,136 );//B00(8-11) B01(8-11) B00(8-11) B01(8-11) B04(8-11) B05(8-11) B04(8-11) B05(8-11) 3240const __m256i rhs_mat_2367_01_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_01 ,136 );//B02(8-11) B03(8-11) B02(8-11) B03(8-11) B06(8-11) B07(8-11) B06(8-11) B07(8-11) 3241 3242const __m256i rhs_mat_0145_02_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_02 ,136 );//B00(16-19) B01(16-19) B00(16-19) B01(16-19) B04(16-19) B05(16-19) B04(16-19) B05(16-19) 3243const __m256i rhs_mat_2367_02_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_02 ,136 );//B02(16-19) B03(16-19) B02(16-19) B03(16-19) B06(16-19) B07(16-19) B06(16-19) B07(16-19) 3244 3245const __m256i rhs_mat_0145_03_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_03 ,136 );//B00(24-27) B01(24-27) B00(24-27) B01(24-27) B04(24-27) B05(24-27) B04(24-27) B05(24-27) 3246const __m256i rhs_mat_2367_03_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_03 ,136 );//B02(24-27) B03(24-27) B02(24-27) B03(24-27) B06(24-27) B07(24-27) B06(24-27) B07(24-27) 3247 3248const __m256i rhs_mat_0145_10_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_10 ,136 );//B10(0-3) B11(0-3) B10(0-3) B11(0-3) B14(0-3) B15(0-3) B14(0-3) B15(0-3) 3249const __m256i rhs_mat_2367_10_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_10 ,136 );//B12(0-3) B13(0-3) B12(0-3) B13(0-3) B16(0-3) B17(0-3) B16(0-3) B17(0-3) 3250 3251const __m256i rhs_mat_0145_11_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_11 ,136 );//B10(8-11) B11(8-11) B10(8-11) B11(8-11) B14(8-11) B15(8-11) B14(8-11) B15(8-11) 3252const __m256i rhs_mat_2367_11_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_11 ,136 );//B12(8-11) B13(8-11) B12(8-11) B13(8-11) B16(8-11) B17(8-11) B16(8-11) B17(8-11) 3253 3254const __m256i rhs_mat_0145_12_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_12 ,136 );//B10(16-19) B11(16-19) B10(16-19) B11(16-19) B14(16-19) B15(16-19) B14(16-19) B15(16-19) 3255const __m256i rhs_mat_2367_12_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_12 ,136 );//B12(16-19) B13(16-19) B12(16-19) B13(16-19) B16(16-19) B17(16-19) B16(16-19) B17(16-19) 3256 3257const __m256i rhs_mat_0145_13_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_13 ,136 );//B10(24-27) B11(24-27) B10(24-27) B11(24-27) B14(24-27) B15(24-27) B14(24-27) B15(24-27) 3258const __m256i rhs_mat_2367_13_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_13 ,136 );//B12(24-27) B13(24-27) B12(24-27) B13(24-27) B16(24-27) B17(24-27) B16(24-27) B17(24-27) 3259 3260// Shuffle pattern two - right side input 3261const __m256i rhs_mat_0145_00_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_00 ,221 );//B00(4-7) B01(4-7) B00(4-7) B01(4-7) B04(4-7) B05(4-7) B04(4-7) B05(4-7) 3262const __m256i rhs_mat_2367_00_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_00 ,221 );//B02(4-7) B03(4-7) B02(4-7) B03(4-7) B06(4-7) B07(4-7) B06(4-7) B07(4-7) 3263 3264const __m256i rhs_mat_0145_01_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_01 ,221 );//B00(12-15) B01(12-15) B00(12-15) B01(12-15) B04(12-15) B05(12-15) B04(12-15) B05(12-15) 3265const __m256i rhs_mat_2367_01_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_01 ,221 );//B02(12-15) B03(12-15) B02(12-15) B03(12-15) B06(12-15) B07(12-15) B06(12-15) B07(12-15) 3266 3267const __m256i rhs_mat_0145_02_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_02 ,221 );//B00(20-23) B01(20-23) B00(20-23) B01(20-23) B04(20-23) B05(20-23) B04(20-23) B05(20-23) 3268const __m256i rhs_mat_2367_02_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_02 ,221 );//B02(20-23) B03(20-23) B02(20-23) B03(20-23) B06(20-23) B07(20-23) B06(20-23) B07(20-23) 3269 3270const __m256i rhs_mat_0145_03_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_03 ,221 );//B00(28-31) B01(28-31) B00(28-31) B01(28-31) B04(28-31) B05(28-31) B04(28-31) B05(28-31) 3271const __m256i rhs_mat_2367_03_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_03 ,221 );//B02(28-31) B03(28-31) B02(28-31) B03(28-31) B06(28-31) B07(28-31) B06(28-31) B07(28-31) 3272 3273const __m256i rhs_mat_0145_10_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_10 ,221 );//B10(4-7) B11(4-7) B10(4-7) B11(4-7) B14(4-7) B15(4-7) B14(4-7) B15(4-7) 3274const __m256i rhs_mat_2367_10_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_10 ,221 );//B12(4-7) B13(4-7) B12(4-7) B13(4-7) B16(4-7) B17(4-7) B16(4-7) B17(4-7) 3275 3276const __m256i rhs_mat_0145_11_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_11 ,221 );//B10(12-15) B11(12-15) B10(12-15) B11(12-15) B14(12-15) B15(12-15) B14(12-15) B15(12-15) 3277const __m256i rhs_mat_2367_11_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_11 ,221 );//B12(12-15) B13(12-15) B12(12-15) B13(12-15) B16(12-15) B17(12-15) B16(12-15) B17(12-15) 3278 3279const __m256i rhs_mat_0145_12_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_12 ,221 );//B10(20-23) B11(20-23) B10(20-23) B11(20-23) B14(20-23) B15(20-23) B14(20-23) B15(20-23) 3280const __m256i rhs_mat_2367_12_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_12 ,221 );//B12(20-23) B13(20-23) B12(20-23) B13(20-23) B16(20-23) B17(20-23) B16(20-23) B17(20-23) 3281 3282const __m256i rhs_mat_0145_13_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_13 ,221 );//B10(28-31) B11(28-31) B10(28-31) B11(28-31) B14(28-31) B15(28-31) B14(28-31) B15(28-31) 3283const __m256i rhs_mat_2367_13_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_13 ,221 );//B12(28-31) B13(28-31) B12(28-31) B13(28-31) B16(28-31) B17(28-31) B16(28-31) B17(28-31) 3284 3285uint32_t utmp_0 [4 ],utmp_1 [4 ]; 3286 3287// Scales and Mins of corresponding sub blocks from different Q4_K structures are stored together 3288// The below block is for eg to extract first sub block's scales and mins from different Q4_K structures for the sb loop 3289memcpy (utmp_0 ,b_ptr [b ].scales + 24 * sb ,12 ); 3290utmp_0 [3 ]= ((utmp_0 [2 ] >>4 )& kmask2 ) | (((utmp_0 [1 ] >>6 )& kmask3 ) <<4 ); 3291const uint32_t uaux_0 = utmp_0 [1 ]& kmask1 ; 3292utmp_0 [1 ]= (utmp_0 [2 ]& kmask2 ) | (((utmp_0 [0 ] >>6 )& kmask3 ) <<4 ); 3293utmp_0 [2 ]= uaux_0 ; 3294utmp_0 [0 ] &=kmask1 ; 3295 3296// The below block is for eg to extract second sub block's scales and mins from different Q4_K structures when sb = 1 3297memcpy (utmp_1 ,b_ptr [b ].scales + 12 + sb * 24 ,12 ); 3298utmp_1 [3 ]= ((utmp_1 [2 ] >>4 )& kmask2 ) | (((utmp_1 [1 ] >>6 )& kmask3 ) <<4 ); 3299const uint32_t uaux_1 = utmp_1 [1 ]& kmask1 ; 3300utmp_1 [1 ]= (utmp_1 [2 ]& kmask2 ) | (((utmp_1 [0 ] >>6 )& kmask3 ) <<4 ); 3301utmp_1 [2 ]= uaux_1 ; 3302utmp_1 [0 ] &=kmask1 ; 3303 3304// Scales of first sub block in the sb loop 3305const __m128i mins_and_scales_0 = _mm_set_epi32 (utmp_0 [3 ],utmp_0 [2 ],utmp_0 [1 ],utmp_0 [0 ]); 3306const __m256i scales_0 = _mm256_cvtepu8_epi16 (_mm_unpacklo_epi8 (mins_and_scales_0 ,mins_and_scales_0 )); 3307 3308// Scales of second sub block in the sb loop 3309const __m128i mins_and_scales_1 = _mm_set_epi32 (utmp_1 [3 ],utmp_1 [2 ],utmp_1 [1 ],utmp_1 [0 ]); 3310const __m256i scales_1 = _mm256_cvtepu8_epi16 (_mm_unpacklo_epi8 (mins_and_scales_1 ,mins_and_scales_1 )); 3311 3312// Mins of first and second sub block of Q4_K block are arranged side by side 3313const __m256i mins_01 = _mm256_cvtepu8_epi16 (_mm_unpacklo_epi8 (_mm_shuffle_epi32 (mins_and_scales_0 ,78 ),_mm_shuffle_epi32 (mins_and_scales_1 ,78 ))); 3314 3315const __m256i scale_0145_0 = _mm256_shuffle_epi32 (scales_0 ,68 ); 3316const __m256i scale_2367_0 = _mm256_shuffle_epi32 (scales_0 ,238 ); 3317 3318const __m256i scale_0145_1 = _mm256_shuffle_epi32 (scales_1 ,68 ); 3319const __m256i scale_2367_1 = _mm256_shuffle_epi32 (scales_1 ,238 ); 3320 3321// Load the four block_q8_k quantized values interleaved with each other in chunks of eight bytes - A0,A1,A2,A3 3322// Loaded as set of 128 bit vectors and repeated into a 256 bit vector 3323__m256i lhs_mat_0123_00 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 256 * sb ))); 3324__m256i lhs_mat_01_00 = _mm256_permute2f128_si256 (lhs_mat_0123_00 ,lhs_mat_0123_00 ,0 ); 3325__m256i lhs_mat_23_00 = _mm256_permute2f128_si256 (lhs_mat_0123_00 ,lhs_mat_0123_00 ,17 ); 3326__m256i lhs_mat_0123_01 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 32 + 256 * sb ))); 3327__m256i lhs_mat_01_01 = _mm256_permute2f128_si256 (lhs_mat_0123_01 ,lhs_mat_0123_01 ,0 ); 3328__m256i lhs_mat_23_01 = _mm256_permute2f128_si256 (lhs_mat_0123_01 ,lhs_mat_0123_01 ,17 ); 3329__m256i lhs_mat_0123_02 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 64 + 256 * sb ))); 3330__m256i lhs_mat_01_02 = _mm256_permute2f128_si256 (lhs_mat_0123_02 ,lhs_mat_0123_02 ,0 ); 3331__m256i lhs_mat_23_02 = _mm256_permute2f128_si256 (lhs_mat_0123_02 ,lhs_mat_0123_02 ,17 ); 3332__m256i lhs_mat_0123_03 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 96 + 256 * sb ))); 3333__m256i lhs_mat_01_03 = _mm256_permute2f128_si256 (lhs_mat_0123_03 ,lhs_mat_0123_03 ,0 ); 3334__m256i lhs_mat_23_03 = _mm256_permute2f128_si256 (lhs_mat_0123_03 ,lhs_mat_0123_03 ,17 ); 3335__m256i lhs_mat_0123_10 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 128 + 256 * sb ))); 3336__m256i lhs_mat_01_10 = _mm256_permute2f128_si256 (lhs_mat_0123_10 ,lhs_mat_0123_10 ,0 ); 3337__m256i lhs_mat_23_10 = _mm256_permute2f128_si256 (lhs_mat_0123_10 ,lhs_mat_0123_10 ,17 ); 3338__m256i lhs_mat_0123_11 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 160 + 256 * sb ))); 3339__m256i lhs_mat_01_11 = _mm256_permute2f128_si256 (lhs_mat_0123_11 ,lhs_mat_0123_11 ,0 ); 3340__m256i lhs_mat_23_11 = _mm256_permute2f128_si256 (lhs_mat_0123_11 ,lhs_mat_0123_11 ,17 ); 3341__m256i lhs_mat_0123_12 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 192 + 256 * sb ))); 3342__m256i lhs_mat_01_12 = _mm256_permute2f128_si256 (lhs_mat_0123_12 ,lhs_mat_0123_12 ,0 ); 3343__m256i lhs_mat_23_12 = _mm256_permute2f128_si256 (lhs_mat_0123_12 ,lhs_mat_0123_12 ,17 ); 3344__m256i lhs_mat_0123_13 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 224 + 256 * sb ))); 3345__m256i lhs_mat_01_13 = _mm256_permute2f128_si256 (lhs_mat_0123_13 ,lhs_mat_0123_13 ,0 ); 3346__m256i lhs_mat_23_13 = _mm256_permute2f128_si256 (lhs_mat_0123_13 ,lhs_mat_0123_13 ,17 ); 3347 3348// Bsums are loaded - four bsums are loaded (for two sub blocks) for the different Q8_K blocks 3349__m256i lhs_bsums_0123_01 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].bsums + 16 * sb ))); 3350__m256i lhs_bsums_hsum_0123_01 = _mm256_castsi128_si256 (_mm_hadd_epi16 (_mm256_castsi256_si128 (lhs_bsums_0123_01 ),_mm256_extractf128_si256 (lhs_bsums_0123_01 ,1 ))); 3351lhs_bsums_hsum_0123_01 = _mm256_permute2x128_si256 (lhs_bsums_hsum_0123_01 ,lhs_bsums_hsum_0123_01 ,0 ); 3352 3353// Shuffle pattern one - left side input 3354const __m256i lhs_mat_01_00_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_00 ,160 );//A00(0-3) A00(0-3) A01(0-3) A01(0-3) A00(0-3) A00(0-3) A01(0-3) A01(0-3) 3355const __m256i lhs_mat_23_00_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_00 ,160 );//A02(0-3) A03(0-3) A02(0-3) A03(0-3) A02(0-3) A03(0-3) A02(0-3) A03(0-3) 3356 3357const __m256i lhs_mat_01_01_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_01 ,160 );//A00(8-11) A00(8-11) A01(8-11) A01(8-11) A00(8-11) A00(8-11) A01(8-11) A01(8-11) 3358const __m256i lhs_mat_23_01_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_01 ,160 );//A02(8-11) A03(8-11) A02(8-11) A03(8-11) A02(8-11) A03(8-11) A02(8-11) A03(8-11) 3359 3360const __m256i lhs_mat_01_02_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_02 ,160 );//A00(16-19) A00(16-19) A01(16-19) A01(16-19) A00(16-19) A00(16-19) A01(16-19) A01(16-19) 3361const __m256i lhs_mat_23_02_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_02 ,160 );//A02(16-19) A03(16-19) A02(16-19) A03(16-19) A02(16-19) A03(16-19) A02(16-19) A03(16-19) 3362 3363const __m256i lhs_mat_01_03_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_03 ,160 );//A00(24-27) A00(24-27) A01(24-27) A01(24-27) A00(24-27) A00(24-27) A01(24-27) A01(24-27) 3364const __m256i lhs_mat_23_03_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_03 ,160 );//A02(24-27) A03(24-27) A02(24-27) A03(24-27) A02(24-27) A03(24-27) A02(24-27) A03(24-27) 3365 3366const __m256i lhs_mat_01_10_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_10 ,160 );//A10(0-3) A10(0-3) A11(0-3) A11(0-3) A10(0-3) A10(0-3) A11(0-3) A11(0-3) 3367const __m256i lhs_mat_23_10_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_10 ,160 );//A12(0-3) A13(0-3) A12(0-3) A13(0-3) A12(0-3) A13(0-3) A12(0-3) A13(0-3) 3368 3369const __m256i lhs_mat_01_11_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_11 ,160 );//A10(8-11) A10(8-11) A11(8-11) A11(8-11) A10(8-11) A10(8-11) A11(8-11) A11(8-11) 3370const __m256i lhs_mat_23_11_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_11 ,160 );//A12(8-11) A13(8-11) A12(8-11) A13(8-11) A12(8-11) A13(8-11) A12(8-11) A13(8-11) 3371 3372const __m256i lhs_mat_01_12_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_12 ,160 );//A10(16-19) A10(16-19) A11(16-19) A11(16-19) A10(16-19) A10(16-19) A11(16-19) A11(16-19) 3373const __m256i lhs_mat_23_12_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_12 ,160 );//A12(16-19) A13(16-19) A12(16-19) A13(16-19) A12(16-19) A13(16-19) A12(16-19) A13(16-19) 3374 3375const __m256i lhs_mat_01_13_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_13 ,160 );//A10(24-27) A10(24-27) A11(24-27) A11(24-27) A10(24-27) A10(24-27) A11(24-27) A11(24-27) 3376const __m256i lhs_mat_23_13_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_13 ,160 );//A12(24-27) A13(24-27) A12(24-27) A13(24-27) A12(24-27) A13(24-27) A12(24-27) A13(24-27) 3377 3378// Shuffle pattern two- left side input 3379const __m256i lhs_mat_01_00_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_00 ,245 );//A00(4-7) A00(4-7) A01(4-7) A01(4-7) A00(4-7) A00(4-7) A01(4-7) A01(4-7) 3380const __m256i lhs_mat_23_00_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_00 ,245 );//A02(4-7) A03(4-7) A02(4-7) A03(4-7) A02(4-7) A03(4-7) A02(4-7) A03(4-7) 3381 3382const __m256i lhs_mat_01_01_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_01 ,245 );//A00(12-15) A00(12-15) A01(12-15) A01(12-15) A00(12-15) A00(12-15) A01(12-15) A01(12-15) 3383const __m256i lhs_mat_23_01_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_01 ,245 );//A02(12-15) A03(12-15) A02(12-15) A03(12-15) A02(12-15) A03(12-15) A02(12-15) A03(12-15) 3384 3385const __m256i lhs_mat_01_02_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_02 ,245 );//A00(20-23) A00(20-23) A01(20-23) A01(20-23) A00(20-23) A00(20-23) A01(20-23) A01(20-23) 3386const __m256i lhs_mat_23_02_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_02 ,245 );//A02(20-23) A03(20-23) A02(20-23) A03(20-23) A02(20-23) A03(20-23) A02(20-23) A03(20-23) 3387 3388const __m256i lhs_mat_01_03_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_03 ,245 );//A00(28-31) A00(28-31) A01(28-31) A01(28-31) A00(28-31) A00(28-31) A01(28-31) A01(28-31) 3389const __m256i lhs_mat_23_03_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_03 ,245 );//A02(28-31) A03(28-31) A02(28-31) A03(28-31) A02(28-31) A03(28-31) A02(28-31) A03(28-31) 3390 3391const __m256i lhs_mat_01_10_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_10 ,245 );//A10(4-7) A10(4-7) A11(4-7) A11(4-7) A10(4-7) A10(4-7) A11(4-7) A11(4-7) 3392const __m256i lhs_mat_23_10_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_10 ,245 );//A12(4-7) A13(4-7) A12(4-7) A13(4-7) A12(4-7) A13(4-7) A12(4-7) A13(4-7) 3393 3394const __m256i lhs_mat_01_11_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_11 ,245 );//A10(12-15) A10(12-15) A11(12-15) A11(12-15) A10(12-15) A10(12-15) A11(12-15) A11(12-15) 3395const __m256i lhs_mat_23_11_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_11 ,245 );//A12(12-15) A13(12-15) A12(12-15) A13(12-15) A12(12-15) A13(12-15) A12(12-15) A13(12-15) 3396 3397const __m256i lhs_mat_01_12_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_12 ,245 );//A10(20-23) A10(20-23) A11(20-23) A11(20-23) A10(20-23) A10(20-23) A11(20-23) A11(20-23) 3398const __m256i lhs_mat_23_12_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_12 ,245 );//A12(20-23) A13(20-23) A12(20-23) A13(20-23) A12(20-23) A13(20-23) A12(20-23) A13(20-23) 3399 3400const __m256i lhs_mat_01_13_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_13 ,245 );//A10(28-31) A10(28-31) A11(28-31) A11(28-31) A10(28-31) A10(28-31) A11(28-31) A11(28-31) 3401const __m256i lhs_mat_23_13_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_13 ,245 );//A12(28-31) A13(28-31) A12(28-31) A13(28-31) A12(28-31) A13(28-31) A12(28-31) A13(28-31) 3402 3403// The values arranged in shuffle patterns are operated with dot product operation within 32 bit lane i.e corresponding bytes and multiplied and added into 32 bit integers within 32 bit lane 3404__m256i iacc_mat_00_0_sp1 = _mm256_add_epi16 (_mm256_add_epi16 (_mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_03_sp1 ,lhs_mat_01_03_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_02_sp1 ,lhs_mat_01_02_sp1 )),_mm256_maddubs_epi16 (rhs_mat_0145_01_sp1 ,lhs_mat_01_01_sp1 )),_mm256_maddubs_epi16 (rhs_mat_0145_00_sp1 ,lhs_mat_01_00_sp1 )); 3405__m256i iacc_mat_01_0_sp1 = _mm256_add_epi16 (_mm256_add_epi16 (_mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_03_sp1 ,lhs_mat_01_03_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_02_sp1 ,lhs_mat_01_02_sp1 )),_mm256_maddubs_epi16 (rhs_mat_2367_01_sp1 ,lhs_mat_01_01_sp1 )),_mm256_maddubs_epi16 (rhs_mat_2367_00_sp1 ,lhs_mat_01_00_sp1 )); 3406__m256i iacc_mat_10_0_sp1 = _mm256_add_epi16 (_mm256_add_epi16 (_mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_03_sp1 ,lhs_mat_23_03_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_02_sp1 ,lhs_mat_23_02_sp1 )),_mm256_maddubs_epi16 (rhs_mat_0145_01_sp1 ,lhs_mat_23_01_sp1 )),_mm256_maddubs_epi16 (rhs_mat_0145_00_sp1 ,lhs_mat_23_00_sp1 )); 3407__m256i iacc_mat_11_0_sp1 = _mm256_add_epi16 (_mm256_add_epi16 (_mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_03_sp1 ,lhs_mat_23_03_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_02_sp1 ,lhs_mat_23_02_sp1 )),_mm256_maddubs_epi16 (rhs_mat_2367_01_sp1 ,lhs_mat_23_01_sp1 )),_mm256_maddubs_epi16 (rhs_mat_2367_00_sp1 ,lhs_mat_23_00_sp1 )); 3408__m256i iacc_mat_00_1_sp1 = _mm256_add_epi16 (_mm256_add_epi16 (_mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_13_sp1 ,lhs_mat_01_13_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_12_sp1 ,lhs_mat_01_12_sp1 )),_mm256_maddubs_epi16 (rhs_mat_0145_11_sp1 ,lhs_mat_01_11_sp1 )),_mm256_maddubs_epi16 (rhs_mat_0145_10_sp1 ,lhs_mat_01_10_sp1 )); 3409__m256i iacc_mat_01_1_sp1 = _mm256_add_epi16 (_mm256_add_epi16 (_mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_13_sp1 ,lhs_mat_01_13_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_12_sp1 ,lhs_mat_01_12_sp1 )),_mm256_maddubs_epi16 (rhs_mat_2367_11_sp1 ,lhs_mat_01_11_sp1 )),_mm256_maddubs_epi16 (rhs_mat_2367_10_sp1 ,lhs_mat_01_10_sp1 )); 3410__m256i iacc_mat_10_1_sp1 = _mm256_add_epi16 (_mm256_add_epi16 (_mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_13_sp1 ,lhs_mat_23_13_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_12_sp1 ,lhs_mat_23_12_sp1 )),_mm256_maddubs_epi16 (rhs_mat_0145_11_sp1 ,lhs_mat_23_11_sp1 )),_mm256_maddubs_epi16 (rhs_mat_0145_10_sp1 ,lhs_mat_23_10_sp1 )); 3411__m256i iacc_mat_11_1_sp1 = _mm256_add_epi16 (_mm256_add_epi16 (_mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_13_sp1 ,lhs_mat_23_13_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_12_sp1 ,lhs_mat_23_12_sp1 )),_mm256_maddubs_epi16 (rhs_mat_2367_11_sp1 ,lhs_mat_23_11_sp1 )),_mm256_maddubs_epi16 (rhs_mat_2367_10_sp1 ,lhs_mat_23_10_sp1 )); 3412 3413__m256i iacc_mat_00_0_sp2 = _mm256_add_epi16 (_mm256_add_epi16 (_mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_03_sp2 ,lhs_mat_01_03_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_02_sp2 ,lhs_mat_01_02_sp2 )),_mm256_maddubs_epi16 (rhs_mat_0145_01_sp2 ,lhs_mat_01_01_sp2 )),_mm256_maddubs_epi16 (rhs_mat_0145_00_sp2 ,lhs_mat_01_00_sp2 )); 3414__m256i iacc_mat_01_0_sp2 = _mm256_add_epi16 (_mm256_add_epi16 (_mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_03_sp2 ,lhs_mat_01_03_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_02_sp2 ,lhs_mat_01_02_sp2 )),_mm256_maddubs_epi16 (rhs_mat_2367_01_sp2 ,lhs_mat_01_01_sp2 )),_mm256_maddubs_epi16 (rhs_mat_2367_00_sp2 ,lhs_mat_01_00_sp2 )); 3415__m256i iacc_mat_10_0_sp2 = _mm256_add_epi16 (_mm256_add_epi16 (_mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_03_sp2 ,lhs_mat_23_03_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_02_sp2 ,lhs_mat_23_02_sp2 )),_mm256_maddubs_epi16 (rhs_mat_0145_01_sp2 ,lhs_mat_23_01_sp2 )),_mm256_maddubs_epi16 (rhs_mat_0145_00_sp2 ,lhs_mat_23_00_sp2 )); 3416__m256i iacc_mat_11_0_sp2 = _mm256_add_epi16 (_mm256_add_epi16 (_mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_03_sp2 ,lhs_mat_23_03_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_02_sp2 ,lhs_mat_23_02_sp2 )),_mm256_maddubs_epi16 (rhs_mat_2367_01_sp2 ,lhs_mat_23_01_sp2 )),_mm256_maddubs_epi16 (rhs_mat_2367_00_sp2 ,lhs_mat_23_00_sp2 )); 3417__m256i iacc_mat_00_1_sp2 = _mm256_add_epi16 (_mm256_add_epi16 (_mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_13_sp2 ,lhs_mat_01_13_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_12_sp2 ,lhs_mat_01_12_sp2 )),_mm256_maddubs_epi16 (rhs_mat_0145_11_sp2 ,lhs_mat_01_11_sp2 )),_mm256_maddubs_epi16 (rhs_mat_0145_10_sp2 ,lhs_mat_01_10_sp2 )); 3418__m256i iacc_mat_01_1_sp2 = _mm256_add_epi16 (_mm256_add_epi16 (_mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_13_sp2 ,lhs_mat_01_13_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_12_sp2 ,lhs_mat_01_12_sp2 )),_mm256_maddubs_epi16 (rhs_mat_2367_11_sp2 ,lhs_mat_01_11_sp2 )),_mm256_maddubs_epi16 (rhs_mat_2367_10_sp2 ,lhs_mat_01_10_sp2 )); 3419__m256i iacc_mat_10_1_sp2 = _mm256_add_epi16 (_mm256_add_epi16 (_mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_13_sp2 ,lhs_mat_23_13_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_12_sp2 ,lhs_mat_23_12_sp2 )),_mm256_maddubs_epi16 (rhs_mat_0145_11_sp2 ,lhs_mat_23_11_sp2 )),_mm256_maddubs_epi16 (rhs_mat_0145_10_sp2 ,lhs_mat_23_10_sp2 )); 3420__m256i iacc_mat_11_1_sp2 = _mm256_add_epi16 (_mm256_add_epi16 (_mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_13_sp2 ,lhs_mat_23_13_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_12_sp2 ,lhs_mat_23_12_sp2 )),_mm256_maddubs_epi16 (rhs_mat_2367_11_sp2 ,lhs_mat_23_11_sp2 )),_mm256_maddubs_epi16 (rhs_mat_2367_10_sp2 ,lhs_mat_23_10_sp2 )); 3421 3422// Output of both shuffle patterns are added in order to sum dot product outputs of all 32 values in block 3423__m256i iacc_mat_00_0 = _mm256_add_epi16 (iacc_mat_00_0_sp1 ,iacc_mat_00_0_sp2 ); 3424__m256i iacc_mat_01_0 = _mm256_add_epi16 (iacc_mat_01_0_sp1 ,iacc_mat_01_0_sp2 ); 3425__m256i iacc_mat_10_0 = _mm256_add_epi16 (iacc_mat_10_0_sp1 ,iacc_mat_10_0_sp2 ); 3426__m256i iacc_mat_11_0 = _mm256_add_epi16 (iacc_mat_11_0_sp1 ,iacc_mat_11_0_sp2 ); 3427 3428__m256i iacc_mat_00_1 = _mm256_add_epi16 (iacc_mat_00_1_sp1 ,iacc_mat_00_1_sp2 ); 3429__m256i iacc_mat_01_1 = _mm256_add_epi16 (iacc_mat_01_1_sp1 ,iacc_mat_01_1_sp2 ); 3430__m256i iacc_mat_10_1 = _mm256_add_epi16 (iacc_mat_10_1_sp1 ,iacc_mat_10_1_sp2 ); 3431__m256i iacc_mat_11_1 = _mm256_add_epi16 (iacc_mat_11_1_sp1 ,iacc_mat_11_1_sp2 ); 3432 3433// Output of both shuffle patterns are added in order to sum dot product outputs of all 32 values in block 3434iacc_mat_00_0 = _mm256_madd_epi16 (iacc_mat_00_0 ,scale_0145_0 ); 3435iacc_mat_01_0 = _mm256_madd_epi16 (iacc_mat_01_0 ,scale_2367_0 ); 3436iacc_mat_10_0 = _mm256_madd_epi16 (iacc_mat_10_0 ,scale_0145_0 ); 3437iacc_mat_11_0 = _mm256_madd_epi16 (iacc_mat_11_0 ,scale_2367_0 ); 3438 3439iacc_mat_00_1 = _mm256_madd_epi16 (iacc_mat_00_1 ,scale_0145_1 ); 3440iacc_mat_01_1 = _mm256_madd_epi16 (iacc_mat_01_1 ,scale_2367_1 ); 3441iacc_mat_10_1 = _mm256_madd_epi16 (iacc_mat_10_1 ,scale_0145_1 ); 3442iacc_mat_11_1 = _mm256_madd_epi16 (iacc_mat_11_1 ,scale_2367_1 ); 3443 3444// Straighten out to make 4 row vectors (4 for each sub block which are accumulated together in the next step) 3445__m256i iacc_row_0_0 = _mm256_blend_epi32 (iacc_mat_00_0 ,_mm256_shuffle_epi32 (iacc_mat_01_0 ,78 ),204 ); 3446__m256i iacc_row_1_0 = _mm256_blend_epi32 (_mm256_shuffle_epi32 (iacc_mat_00_0 ,78 ),iacc_mat_01_0 ,204 ); 3447__m256i iacc_row_2_0 = _mm256_blend_epi32 (iacc_mat_10_0 ,_mm256_shuffle_epi32 (iacc_mat_11_0 ,78 ),204 ); 3448__m256i iacc_row_3_0 = _mm256_blend_epi32 (_mm256_shuffle_epi32 (iacc_mat_10_0 ,78 ),iacc_mat_11_0 ,204 ); 3449__m256i iacc_row_0_1 = _mm256_blend_epi32 (iacc_mat_00_1 ,_mm256_shuffle_epi32 (iacc_mat_01_1 ,78 ),204 ); 3450__m256i iacc_row_1_1 = _mm256_blend_epi32 (_mm256_shuffle_epi32 (iacc_mat_00_1 ,78 ),iacc_mat_01_1 ,204 ); 3451__m256i iacc_row_2_1 = _mm256_blend_epi32 (iacc_mat_10_1 ,_mm256_shuffle_epi32 (iacc_mat_11_1 ,78 ),204 ); 3452__m256i iacc_row_3_1 = _mm256_blend_epi32 (_mm256_shuffle_epi32 (iacc_mat_10_1 ,78 ),iacc_mat_11_1 ,204 ); 3453 3454__m256i iacc_row_0 = _mm256_add_epi32 (iacc_row_0_0 ,iacc_row_0_1 ); 3455__m256i iacc_row_1 = _mm256_add_epi32 (iacc_row_1_0 ,iacc_row_1_1 ); 3456__m256i iacc_row_2 = _mm256_add_epi32 (iacc_row_2_0 ,iacc_row_2_1 ); 3457__m256i iacc_row_3 = _mm256_add_epi32 (iacc_row_3_0 ,iacc_row_3_1 ); 3458 3459// Load the scale(d) values for all the 4 Q8_k blocks and repeat it across lanes 3460const __m128 row_scale_f32_sse = _mm_load_ps (a_ptr [b ].d ); 3461const __m256 row_scale_f32 = _mm256_set_m128 (row_scale_f32_sse ,row_scale_f32_sse );//GGML_F32Cx8_REPEAT_LOAD(a_ptrs[rp][b].d, loadMask); 3462 3463// Multiply with appropriate scales and accumulate (for both d and dmin) below 3464acc_rows [0 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_0 ),_mm256_mul_ps (col_scale_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,0 )),acc_rows [0 ]); 3465acc_rows [1 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_1 ),_mm256_mul_ps (col_scale_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,85 )),acc_rows [1 ]); 3466acc_rows [2 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_2 ),_mm256_mul_ps (col_scale_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,170 )),acc_rows [2 ]); 3467acc_rows [3 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_3 ),_mm256_mul_ps (col_scale_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,255 )),acc_rows [3 ]); 3468 3469__m256i iacc_row_min_0 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_hsum_0123_01 ,0 ),mins_01 ); 3470__m256i iacc_row_min_1 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_hsum_0123_01 ,85 ),mins_01 ); 3471__m256i iacc_row_min_2 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_hsum_0123_01 ,170 ),mins_01 ); 3472__m256i iacc_row_min_3 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_hsum_0123_01 ,255 ),mins_01 ); 3473 3474acc_min_rows [0 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_min_0 ),_mm256_mul_ps (col_dmin_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,0 )),acc_min_rows [0 ]); 3475acc_min_rows [1 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_min_1 ),_mm256_mul_ps (col_dmin_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,85 )),acc_min_rows [1 ]); 3476acc_min_rows [2 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_min_2 ),_mm256_mul_ps (col_dmin_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,170 )),acc_min_rows [2 ]); 3477acc_min_rows [3 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_min_3 ),_mm256_mul_ps (col_dmin_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,255 )),acc_min_rows [3 ]); 3478 } 3479 } 3480 3481// Store the accumulated values 3482for (int i = 0 ;i < 4 ;i ++ ) { 3483_mm256_storeu_ps ((float * )(s + ((y * 4 + i )* bs + x * 8 )),_mm256_sub_ps (acc_rows [i ],acc_min_rows [i ])); 3484 } 3485 } 3486 } 3487 3488#else 3489UNUSED (kmask1 ); 3490UNUSED (kmask2 ); 3491UNUSED (kmask3 ); 3492ggml_gemm_q4_K_8x8_q8_K_generic (n ,s ,bs ,vx ,vy ,nr ,nc ); 3493#endif 3494} 3495 3496void ggml_gemm_iq4_nl_8x8_q8_0 (int n ,float * GGML_RESTRICT s ,size_t bs ,const void * GGML_RESTRICT vx ,const void * GGML_RESTRICT vy ,int nr ,int nc ) { 3497#if defined(__AVX2__ )|| defined(__AVX512F__ ) 3498 { 3499__m256i signextendlut = _mm256_castsi128_si256 (_mm_loadu_si128 ((const __m128i * )kvalues_iq4nl )); 3500signextendlut = _mm256_permute2f128_si256 (signextendlut ,signextendlut ,0 ); 3501 3502gemm_q4_b32_8x8_q8_0_lut_avx < block_iq4_nlx8 > (n ,s ,bs ,vx ,vy ,nr ,nc ,signextendlut ); 3503 3504return ; 3505 } 3506#endif // defined(__AVX2__) || defined(__AVX512F__) 3507 3508ggml_gemm_iq4_nl_4x4_q8_0 (n ,s ,bs ,vx ,vy ,nr ,nc ); 3509} 3510 3511void ggml_gemm_mxfp4_8x8_q8_0 (int n ,float * GGML_RESTRICT s ,size_t bs ,const void * GGML_RESTRICT vx ,const void * GGML_RESTRICT vy ,int nr ,int nc ) { 3512#if defined(__AVX2__ )|| defined(__AVX512F__ ) 3513 { 3514__m256i signextendlut = _mm256_castsi128_si256 (_mm_loadu_si128 ((const __m128i * )kvalues_mxfp4 )); 3515signextendlut = _mm256_permute2f128_si256 (signextendlut ,signextendlut ,0 ); 3516 3517gemm_q4_b32_8x8_q8_0_lut_avx < block_mxfp4x8 > (n ,s ,bs ,vx ,vy ,nr ,nc ,signextendlut ); 3518 3519return ; 3520 } 3521#endif // defined(__AVX2__) || defined(__AVX512F__) 3522 3523ggml_gemm_mxfp4_8x8_q8_0_generic (n ,s ,bs ,vx ,vy ,nr ,nc ); 3524} 3525 3526void ggml_gemm_q2_K_8x8_q8_K (int n ,float * GGML_RESTRICT s ,size_t bs ,const void * GGML_RESTRICT vx ,const void * GGML_RESTRICT vy ,int nr ,int nc ) { 3527const int qk = QK_K ; 3528const int nb = n /qk ; 3529const int ncols_interleaved = 8 ; 3530const int blocklen = 8 ; 3531 3532assert (n %qk == 0 ); 3533assert (nr %4 == 0 ); 3534assert (nc %ncols_interleaved == 0 ); 3535 3536UNUSED (s ); 3537UNUSED (bs ); 3538UNUSED (vx ); 3539UNUSED (vy ); 3540UNUSED (nr ); 3541UNUSED (nc ); 3542UNUSED (nb ); 3543UNUSED (ncols_interleaved ); 3544UNUSED (blocklen ); 3545 3546#if defined(__AVX2__ )|| defined(__AVX512F__ ) 3547const block_q2_Kx8 * b_ptr_start = (const block_q2_Kx8 * )vx ; 3548const block_q8_Kx4 * a_ptr_start = (const block_q8_Kx4 * )vy ; 3549int64_t b_nb = n /QK_K ; 3550int64_t y = 0 ; 3551 3552// Permute mask used for easier vector processing at later stages 3553__m256i requiredOrder = _mm256_set_epi32 (3 ,2 ,1 ,0 ,7 ,6 ,5 ,4 ); 3554int64_t xstart = 0 ; 3555int anr = nr - nr %16 ;// Used to align nr with boundary of 16 3556 3557// Mask to convert 2 bit and 4 bit values into a bytes 3558const __m256i m3b = _mm256_set1_epi8 (3 ); 3559const __m128i m4b_sse = _mm_set1_epi8 (0xF ); 3560 3561//Mask to get appropriate scales 3562__m128i scalesmask1_sse = _mm_set_epi8 (14 ,14 ,12 ,12 ,10 ,10 ,8 ,8 ,6 ,6 ,4 ,4 ,2 ,2 ,0 ,0 ); 3563__m128i scalesmask2_sse = _mm_set_epi8 (15 ,15 ,13 ,13 ,11 ,11 ,9 ,9 ,7 ,7 ,5 ,5 ,3 ,3 ,1 ,1 ); 3564 3565__m256i scalesmask1 = _mm256_castsi128_si256 (scalesmask1_sse ); 3566scalesmask1 = _mm256_permute2f128_si256 (scalesmask1 ,scalesmask1 ,0 ); 3567__m256i scalesmask2 = _mm256_castsi128_si256 (scalesmask2_sse ); 3568scalesmask2 = _mm256_permute2f128_si256 (scalesmask2 ,scalesmask2 ,0 ); 3569 3570#if defined(__AVX512BW__ )&& defined(__AVX512DQ__ ) 3571 3572int anc = nc - nc %16 ;// Used to align nc with boundary of 16 3573 3574// Mask to mask out nibbles from packed bytes 3575const __m256i m4b = _mm256_set1_epi8 (0x0F ); 3576// Mask to mask out nibbles from packed bytes expanded to 512 bit length 3577const __m512i m3bexpanded = _mm512_set1_epi8 (3 ); 3578//Take group of four block_q8_Kx4 structures at each pass of the loop and perform dot product operation 3579for (;y < anr /4 ;y += 4 ) { 3580 3581const block_q8_Kx4 * a_ptrs [4 ]; 3582 3583a_ptrs [0 ]= a_ptr_start + (y * nb ); 3584for (int i = 0 ;i < 3 ;++ i ) { 3585a_ptrs [i + 1 ]= a_ptrs [i ]+ nb ; 3586 } 3587 3588// Take group of eight block_q2_kx8 structures at each pass of the loop and perform dot product operation 3589for (int64_t x = 0 ;x < anc /8 ;x += 2 ) { 3590 3591const block_q2_Kx8 * b_ptr_0 = b_ptr_start + ((x )* b_nb ); 3592const block_q2_Kx8 * b_ptr_1 = b_ptr_start + ((x + 1 )* b_nb ); 3593 3594// Master FP accumulators 3595__m512 acc_rows [16 ]; 3596for (int i = 0 ;i < 16 ;i ++ ) { 3597acc_rows [i ]= _mm512_setzero_ps (); 3598 } 3599 3600__m512 acc_min_rows [16 ]; 3601for (int i = 0 ;i < 16 ;i ++ ) { 3602acc_min_rows [i ]= _mm512_setzero_ps (); 3603 } 3604// For super block 3605for (int64_t b = 0 ;b < nb ;b ++ ) { 3606// Delta values - Load the sixteen scale values from two block_q2_kx8 structures 3607const __m512 col_scale_f32 = GGML_F32Cx8x2_LOAD (b_ptr_0 [b ].d ,b_ptr_1 [b ].d ); 3608 3609// dmin values - Load the sixteen dmin values from two block_q2_kx8 structures 3610const __m512 col_dmin_f32 = GGML_F32Cx8x2_LOAD (b_ptr_0 [b ].dmin ,b_ptr_1 [b ].dmin ); 3611 3612// Loop to iterate over the sixteen sub blocks of a super block - eight sub blocks are processed per iteration 3613for (int sb = 0 ;sb < QK_K /128 ;sb ++ ) { 3614 3615// Load the eight block_q2_k for eight sub blocks quantized values interleaved with each other in chunks of eight bytes - B0,B1 ....B6,B7 3616const __m256i rhs_raw_mat_0123_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + sb * 256 )); 3617const __m256i rhs_raw_mat_4567_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + 32 + sb * 256 )); 3618const __m256i rhs_raw_mat_0123_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + 64 + sb * 256 )); 3619const __m256i rhs_raw_mat_4567_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + 96 + sb * 256 )); 3620const __m256i rhs_raw_mat_0123_2 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + 128 + sb * 256 )); 3621const __m256i rhs_raw_mat_4567_2 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + 160 + sb * 256 )); 3622const __m256i rhs_raw_mat_0123_3 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + 192 + sb * 256 )); 3623const __m256i rhs_raw_mat_4567_3 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + 224 + sb * 256 )); 3624 3625const __m256i rhs_raw_mat_89AB_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + sb * 256 )); 3626const __m256i rhs_raw_mat_CDEF_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + 32 + sb * 256 )); 3627const __m256i rhs_raw_mat_89AB_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + 64 + sb * 256 )); 3628const __m256i rhs_raw_mat_CDEF_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + 96 + sb * 256 )); 3629const __m256i rhs_raw_mat_89AB_2 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + 128 + sb * 256 )); 3630const __m256i rhs_raw_mat_CDEF_2 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + 160 + sb * 256 )); 3631const __m256i rhs_raw_mat_89AB_3 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + 192 + sb * 256 )); 3632const __m256i rhs_raw_mat_CDEF_3 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + 224 + sb * 256 )); 3633 3634const __m256i rhs_raw_mat_0145_0 = _mm256_blend_epi32 (rhs_raw_mat_0123_0 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_0 ,requiredOrder ),240 ); 3635const __m256i rhs_raw_mat_2367_0 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_0 ,requiredOrder ),rhs_raw_mat_4567_0 ,240 ); 3636const __m256i rhs_raw_mat_0145_1 = _mm256_blend_epi32 (rhs_raw_mat_0123_1 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_1 ,requiredOrder ),240 ); 3637const __m256i rhs_raw_mat_2367_1 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_1 ,requiredOrder ),rhs_raw_mat_4567_1 ,240 ); 3638const __m256i rhs_raw_mat_0145_2 = _mm256_blend_epi32 (rhs_raw_mat_0123_2 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_2 ,requiredOrder ),240 ); 3639const __m256i rhs_raw_mat_2367_2 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_2 ,requiredOrder ),rhs_raw_mat_4567_2 ,240 ); 3640const __m256i rhs_raw_mat_0145_3 = _mm256_blend_epi32 (rhs_raw_mat_0123_3 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_3 ,requiredOrder ),240 ); 3641const __m256i rhs_raw_mat_2367_3 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_3 ,requiredOrder ),rhs_raw_mat_4567_3 ,240 ); 3642 3643const __m256i rhs_raw_mat_89CD_0 = _mm256_blend_epi32 (rhs_raw_mat_89AB_0 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_CDEF_0 ,requiredOrder ),240 ); 3644const __m256i rhs_raw_mat_ABEF_0 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_89AB_0 ,requiredOrder ),rhs_raw_mat_CDEF_0 ,240 ); 3645const __m256i rhs_raw_mat_89CD_1 = _mm256_blend_epi32 (rhs_raw_mat_89AB_1 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_CDEF_1 ,requiredOrder ),240 ); 3646const __m256i rhs_raw_mat_ABEF_1 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_89AB_1 ,requiredOrder ),rhs_raw_mat_CDEF_1 ,240 ); 3647const __m256i rhs_raw_mat_89CD_2 = _mm256_blend_epi32 (rhs_raw_mat_89AB_2 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_CDEF_2 ,requiredOrder ),240 ); 3648const __m256i rhs_raw_mat_ABEF_2 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_89AB_2 ,requiredOrder ),rhs_raw_mat_CDEF_2 ,240 ); 3649const __m256i rhs_raw_mat_89CD_3 = _mm256_blend_epi32 (rhs_raw_mat_89AB_3 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_CDEF_3 ,requiredOrder ),240 ); 3650const __m256i rhs_raw_mat_ABEF_3 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_89AB_3 ,requiredOrder ),rhs_raw_mat_CDEF_3 ,240 ); 3651 3652const __m512i rhs_raw_mat_014589CD_0 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_0145_0 ),rhs_raw_mat_89CD_0 ,1 ); 3653const __m512i rhs_raw_mat_2367ABEF_0 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_2367_0 ),rhs_raw_mat_ABEF_0 ,1 ); 3654const __m512i rhs_raw_mat_014589CD_1 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_0145_1 ),rhs_raw_mat_89CD_1 ,1 ); 3655const __m512i rhs_raw_mat_2367ABEF_1 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_2367_1 ),rhs_raw_mat_ABEF_1 ,1 ); 3656 3657const __m512i rhs_raw_mat_014589CD_2 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_0145_2 ),rhs_raw_mat_89CD_2 ,1 ); 3658const __m512i rhs_raw_mat_2367ABEF_2 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_2367_2 ),rhs_raw_mat_ABEF_2 ,1 ); 3659const __m512i rhs_raw_mat_014589CD_3 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_0145_3 ),rhs_raw_mat_89CD_3 ,1 ); 3660const __m512i rhs_raw_mat_2367ABEF_3 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_2367_3 ),rhs_raw_mat_ABEF_3 ,1 ); 3661 3662//2-bit -> 8-bit 3663const __m512i rhs_mat_014589CD_00 = _mm512_and_si512 (rhs_raw_mat_014589CD_0 ,m3bexpanded );//B00(0-7) B01(0-7) B04(0-7) B05(0-7) B08(0-7) B09(0-7) B0C(0-7) B0D(0-7) 3664const __m512i rhs_mat_2367ABEF_00 = _mm512_and_si512 (rhs_raw_mat_2367ABEF_0 ,m3bexpanded );//B02(0-7) B03(0-7) B06(0-7) B07(0-7) B0A(0-7) B0B(0-7) B0E(0-7) B0F(0-7) 3665const __m512i rhs_mat_014589CD_01 = _mm512_and_si512 (rhs_raw_mat_014589CD_1 ,m3bexpanded );//B00(8-15) B01(8-15) B04(8-15) B05(8-15) B08(8-15) B09(8-15) B0C(8-15) B0D(8-15) 3666const __m512i rhs_mat_2367ABEF_01 = _mm512_and_si512 (rhs_raw_mat_2367ABEF_1 ,m3bexpanded );//B02(8-15) B03(8-15) B06(8-15) B07(8-15) B0A(8-15) B0B(8-15) B0E(8-15) B0F(8-15) 3667const __m512i rhs_mat_014589CD_10 = _mm512_and_si512 (rhs_raw_mat_014589CD_2 ,m3bexpanded );//B10(0-7) B11(0-7) B14(0-7) B15(0-7) B18(0-7) B19(0-7) B1C(0-7) B1D(0-7) 3668const __m512i rhs_mat_2367ABEF_10 = _mm512_and_si512 (rhs_raw_mat_2367ABEF_2 ,m3bexpanded );//B12(0-7) B13(0-7) B16(0-7) B17(0-7) B1A(0-7) B1B(0-7) B1E(0-7) B1F(0-7) 3669const __m512i rhs_mat_014589CD_11 = _mm512_and_si512 (rhs_raw_mat_014589CD_3 ,m3bexpanded );//B10(8-15) B11(8-15) B14(8-15) B15(8-15) B18(8-15) B19(8-15) B1C(8-15) B1D(8-15) 3670const __m512i rhs_mat_2367ABEF_11 = _mm512_and_si512 (rhs_raw_mat_2367ABEF_3 ,m3bexpanded );//B12(8-15) B13(8-15) B16(8-15) B17(8-15) B1A(8-15) B1B(8-15) B1E(8-15) B1F(8-15) 3671 3672const __m512i rhs_mat_014589CD_20 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_014589CD_0 ,2 ),m3bexpanded );//B20(0-7) B21(0-7) B24(0-7) B25(0-7) B28(0-7) B29(0-7) B2C(0-7) B2D(0-7) 3673const __m512i rhs_mat_2367ABEF_20 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_2367ABEF_0 ,2 ),m3bexpanded );//B22(0-7) B23(0-7) B26(0-7) B27(0-7) B2A(0-7) B2B(0-7) B2E(0-7) B2F(0-7) 3674 3675const __m512i rhs_mat_014589CD_21 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_014589CD_1 ,2 ),m3bexpanded );//B20(8-15) B21(8-15) B24(8-15) B25(8-15) B28(8-15) B29(8-15) B2C(8-15) B2D(8-15) 3676const __m512i rhs_mat_2367ABEF_21 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_2367ABEF_1 ,2 ),m3bexpanded );//B22(8-15) B23(8-15) B26(8-15) B27(8-15) B2A(8-15) B2B(8-15) B2E(8-15) B2F(8-15) 3677 3678const __m512i rhs_mat_014589CD_30 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_014589CD_2 ,2 ),m3bexpanded );//B30(0-7) B31(0-7) B34(0-7) B35(0-7) B38(0-7) B39(0-7) B3C(0-7) B3D(0-7) 3679const __m512i rhs_mat_2367ABEF_30 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_2367ABEF_2 ,2 ),m3bexpanded );//B32(0-7) B33(0-7) B36(0-7) B37(0-7) B3A(0-7) B3B(0-7) B3E(0-7) B3F(0-7) 3680 3681const __m512i rhs_mat_014589CD_31 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_014589CD_3 ,2 ),m3bexpanded );//B30(8-15) B31(8-15) B34(8-15) B35(8-15) B38(8-15) B39(8-15) B3C(8-15) B3D(8-15) 3682const __m512i rhs_mat_2367ABEF_31 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_2367ABEF_3 ,2 ),m3bexpanded );//B32(8-15) B33(8-15) B36(8-15) B37(8-15) B3A(8-15) B3B(8-15) B3E(8-15) B3F(8-15) 3683 3684const __m512i rhs_mat_014589CD_40 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_014589CD_0 ,4 ),m3bexpanded );//B40(0-7) B41(0-7) B44(0-7) B45(0-7) B48(0-7) B49(0-7) B4C(0-7) B4D(0-7) 3685const __m512i rhs_mat_2367ABEF_40 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_2367ABEF_0 ,4 ),m3bexpanded );//B42(0-7) B43(0-7) B46(0-7) B47(0-7) B4A(0-7) B4B(0-7) B4E(0-7) B4F(0-7) 3686 3687const __m512i rhs_mat_014589CD_41 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_014589CD_1 ,4 ),m3bexpanded );//B40(8-15) B41(8-15) B44(8-15) B45(8-15) B48(8-15) B49(8-15) B4C(8-15) B4D(8-15) 3688const __m512i rhs_mat_2367ABEF_41 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_2367ABEF_1 ,4 ),m3bexpanded );//B42(8-15) B43(8-15) B46(8-15) B47(8-15) B4A(8-15) B4B(8-15) B4E(8-15) B4F(8-15) 3689 3690const __m512i rhs_mat_014589CD_50 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_014589CD_2 ,4 ),m3bexpanded );//B50(0-7) B51(0-7) B54(0-7) B55(0-7) B58(0-7) B59(0-7) B5C(0-7) B5D(0-7) 3691const __m512i rhs_mat_2367ABEF_50 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_2367ABEF_2 ,4 ),m3bexpanded );//B52(0-7) B53(0-7) B56(0-7) B57(0-7) B5A(0-7) B5B(0-7) B5E(0-7) B5F(0-7) 3692 3693const __m512i rhs_mat_014589CD_51 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_014589CD_3 ,4 ),m3bexpanded );//B50(8-15) B51(8-15) B54(8-15) B55(8-15) B58(8-15) B59(8-15) B5C(8-15) B5D(8-15) 3694const __m512i rhs_mat_2367ABEF_51 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_2367ABEF_3 ,4 ),m3bexpanded );//B52(8-15) B53(8-15) B56(8-15) B57(8-15) B5A(8-15) B5B(8-15) B5E(8-15) B5F(8-15) 3695 3696const __m512i rhs_mat_014589CD_60 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_014589CD_0 ,6 ),m3bexpanded );//B60(0-7) B61(0-7) B64(0-7) B65(0-7) B68(0-7) B69(0-7) B6C(0-7) B6D(0-7) 3697const __m512i rhs_mat_2367ABEF_60 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_2367ABEF_0 ,6 ),m3bexpanded );//B62(0-7) B63(0-7) B66(0-7) B67(0-7) B6A(0-7) B6B(0-7) B6E(0-7) B6F(0-7) 3698 3699const __m512i rhs_mat_014589CD_61 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_014589CD_1 ,6 ),m3bexpanded );//B60(8-15) B61(8-15) B64(8-15) B65(8-15) B68(8-15) B69(8-15) B6C(8-15) B6D(8-15) 3700const __m512i rhs_mat_2367ABEF_61 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_2367ABEF_1 ,6 ),m3bexpanded );//B62(8-15) B63(8-15) B66(8-15) B67(8-15) B6A(8-15) B6B(8-15) B6E(8-15) B6F(8-15) 3701 3702const __m512i rhs_mat_014589CD_70 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_014589CD_2 ,6 ),m3bexpanded );//B70(0-7) B71(0-7) B74(0-7) B75(0-7) B78(0-7) B79(0-7) B7C(0-7) B7D(0-7) 3703const __m512i rhs_mat_2367ABEF_70 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_2367ABEF_2 ,6 ),m3bexpanded );//B72(0-7) B73(0-7) B76(0-7) B77(0-7) B7A(0-7) B7B(0-7) B7E(0-7) B7F(0-7) 3704 3705const __m512i rhs_mat_014589CD_71 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_014589CD_3 ,6 ),m3bexpanded );//B70(8-15) B71(8-15) B74(8-15) B75(8-15) B78(8-15) B79(8-15) B7C(8-15) B7D(8-15) 3706const __m512i rhs_mat_2367ABEF_71 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_2367ABEF_3 ,6 ),m3bexpanded );//B72(8-15) B73(8-15) B76(8-15) B77(8-15) B7A(8-15) B7B(8-15) B7E(8-15) B7F(8-15) 3707 3708const __m512i rhs_mat_014589CD_00_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_00 , (_MM_PERM_ENUM )136 );//B00(0-3) B01(0-3) B00(0-3) B01(0-3) B04(0-3) B05(0-3) B04(0-3) B05(0-3) B08(0-3) B09(0-3) B08(0-3) B09(0-3) B0C(0-3) B0D(0-3) B0C(0-3) B0D(0-3) 3709const __m512i rhs_mat_2367ABEF_00_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_00 , (_MM_PERM_ENUM )136 );//B02(0-3) B03(0-3) B02(0-3) B03(0-3) B06(0-3) B07(0-3) B06(0-3) B07(0-3) B0A(0-3) B0B(0-3) B0A(0-3) B0B(0-3) B0E(0-3) B0F(0-3) B0E(0-3) B0F(0-3) 3710 3711const __m512i rhs_mat_014589CD_01_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_01 , (_MM_PERM_ENUM )136 );//B00(8-11) B01(8-11) B00(8-11) B01(8-11) B04(8-11) B05(8-11) B04(8-11) B05(8-11) B08(8-11) B09(8-11) B08(8-11) B09(8-11) B0C(8-11) B0D(8-11) B0C(8-11) B0D(8-11) 3712const __m512i rhs_mat_2367ABEF_01_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_01 , (_MM_PERM_ENUM )136 );//B02(8-11) B03(8-11) B02(8-11) B03(8-11) B06(8-11) B07(8-11) B06(8-11) B07(8-11) B0A(8-11) B0B(8-11) B0A(8-11) B0B(8-11) B0E(8-11) B0F(8-11) B0E(8-11) B0F(8-11) 3713 3714const __m512i rhs_mat_014589CD_10_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_10 , (_MM_PERM_ENUM )136 );//B10(0-3) B11(0-3) B10(0-3) B11(0-3) B14(0-3) B15(0-3) B14(0-3) B15(0-3) B18(0-3) B19(0-3) B18(0-3) B19(0-3) B1C(0-3) B1D(0-3) B1C(0-3) B1D(0-3) 3715const __m512i rhs_mat_2367ABEF_10_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_10 , (_MM_PERM_ENUM )136 );//B12(0-3) B13(0-3) B12(0-3) B13(0-3) B16(0-3) B17(0-3) B16(0-3) B17(0-3) B1A(0-3) B1B(0-3) B1A(0-3) B1B(0-3) B1E(0-3) B1F(0-3) B1E(0-3) B1F(0-3) 3716 3717const __m512i rhs_mat_014589CD_11_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_11 , (_MM_PERM_ENUM )136 );//B10(8-11) B11(8-11) B10(8-11) B11(8-11) B14(8-11) B15(8-11) B14(8-11) B15(8-11) B18(8-11) B19(8-11) B18(8-11) B19(8-11) B1C(8-11) B1D(8-11) B1C(8-11) B1D(8-11) 3718const __m512i rhs_mat_2367ABEF_11_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_11 , (_MM_PERM_ENUM )136 );//B12(8-11) B13(8-11) B12(8-11) B13(8-11) B16(8-11) B17(8-11) B16(8-11) B17(8-11) B1A(8-11) B1B(8-11) B1A(8-11) B1B(8-11) B1E(8-11) B1F(8-11) B1E(8-11) B1F(8-11) 3719 3720const __m512i rhs_mat_014589CD_20_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_20 , (_MM_PERM_ENUM )136 );//B20(0-3) B21(0-3) B20(0-3) B21(0-3) B24(0-3) B25(0-3) B24(0-3) B25(0-3) B28(0-3) B29(0-3) B28(0-3) B29(0-3) B2C(0-3) B2D(0-3) B2C(0-3) B2D(0-3) 3721const __m512i rhs_mat_2367ABEF_20_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_20 , (_MM_PERM_ENUM )136 );//B22(0-3) B23(0-3) B22(0-3) B23(0-3) B26(0-3) B27(0-3) B26(0-3) B27(0-3) B2A(0-3) B2B(0-3) B2A(0-3) B2B(0-3) B2E(0-3) B2F(0-3) B2E(0-3) B2F(0-3) 3722 3723const __m512i rhs_mat_014589CD_21_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_21 , (_MM_PERM_ENUM )136 );//B20(8-11) B21(8-11) B20(8-11) B21(8-11) B24(8-11) B25(8-11) B24(8-11) B25(8-11) B28(8-11) B29(8-11) B28(8-11) B29(8-11) B2C(8-11) B2D(8-11) B2C(8-11) B2D(8-11) 3724const __m512i rhs_mat_2367ABEF_21_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_21 , (_MM_PERM_ENUM )136 );//B22(8-11) B23(8-11) B22(8-11) B23(8-11) B26(8-11) B27(8-11) B26(8-11) B27(8-11) B2A(8-11) B2B(8-11) B2A(8-11) B2B(8-11) B2E(8-11) B2F(8-11) B2E(8-11) B2F(8-11) 3725 3726const __m512i rhs_mat_014589CD_30_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_30 , (_MM_PERM_ENUM )136 );///B30(0-3) B31(0-3) B30(0-3) B31(0-3) B34(0-3) B35(0-3) B34(0-3) B35(0-3) B38(0-3) B39(0-3) B38(0-3) B39(0-3) B3C(0-3) B3D(0-3) B3C(0-3) B3D(0-3) 3727const __m512i rhs_mat_2367ABEF_30_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_30 , (_MM_PERM_ENUM )136 );//B32(0-3) B33(0-3) B32(0-3) B33(0-3) B36(0-3) B37(0-3) B36(0-3) B37(0-3) B3A(0-3) B3B(0-3) B3A(0-3) B3B(0-3) B3E(0-3) B3F(0-3) B3E(0-3) B3F(0-3) 3728 3729const __m512i rhs_mat_014589CD_31_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_31 , (_MM_PERM_ENUM )136 );//B30(8-11) B31(8-11) B30(8-11) B31(8-11) B34(8-11) B35(8-11) B34(8-11) B35(8-11) B38(8-11) B39(8-11) B38(8-11) B39(8-11) B3C(8-11) B3D(8-11) B3C(8-11) B3D(8-11) 3730const __m512i rhs_mat_2367ABEF_31_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_31 , (_MM_PERM_ENUM )136 );//B32(8-11) B33(8-11) B32(8-11) B33(8-11) B36(8-11) B37(8-11) B36(8-11) B37(8-11) B3A(8-11) B3B(8-11) B3A(8-11) B3B(8-11) B3E(8-11) B3F(8-11) B3E(8-11) B3F(8-11) 3731 3732const __m512i rhs_mat_014589CD_40_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_40 , (_MM_PERM_ENUM )136 );//B40(0-3) B41(0-3) B40(0-3) B41(0-3) B44(0-3) B45(0-3) B44(0-3) B45(0-3) B48(0-3) B49(0-3) B48(0-3) B49(0-3) B4C(0-3) B4D(0-3) B4C(0-3) B4D(0-3) 3733const __m512i rhs_mat_2367ABEF_40_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_40 , (_MM_PERM_ENUM )136 );//B42(0-3) B43(0-3) B42(0-3) B43(0-3) B46(0-3) B47(0-3) B46(0-3) B47(0-3) B4A(0-3) B4B(0-3) B4A(0-3) B4B(0-3) B4E(0-3) B4F(0-3) B4E(0-3) B4F(0-3) 3734 3735const __m512i rhs_mat_014589CD_41_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_41 , (_MM_PERM_ENUM )136 );//B40(8-11) B41(8-11) B40(8-11) B41(8-11) B44(8-11) B45(8-11) B44(8-11) B45(8-11) B48(8-11) B49(8-11) B48(8-11) B49(8-11) B4C(8-11) B4D(8-11) B4C(8-11) B4D(8-11) 3736const __m512i rhs_mat_2367ABEF_41_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_41 , (_MM_PERM_ENUM )136 );//B42(8-11) B43(8-11) B42(8-11) B43(8-11) B46(8-11) B47(8-11) B46(8-11) B47(8-11) B4A(8-11) B4B(8-11) B4A(8-11) B4B(8-11) B4E(8-11) B4F(8-11) B4E(8-11) B4F(8-11) 3737 3738const __m512i rhs_mat_014589CD_50_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_50 , (_MM_PERM_ENUM )136 );//B50(0-3) B51(0-3) B50(0-3) B51(0-3) B54(0-3) B55(0-3) B54(0-3) B55(0-3) B58(0-3) B59(0-3) B58(0-3) B59(0-3) B5C(0-3) B5D(0-3) B5C(0-3) B5D(0-3) 3739const __m512i rhs_mat_2367ABEF_50_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_50 , (_MM_PERM_ENUM )136 );//B52(0-3) B53(0-3) B52(0-3) B53(0-3) B56(0-3) B57(0-3) B56(0-3) B57(0-3) B5A(0-3) B5B(0-3) B5A(0-3) B5B(0-3) B5E(0-3) B5F(0-3) B5E(0-3) B5F(0-3) 3740 3741const __m512i rhs_mat_014589CD_51_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_51 , (_MM_PERM_ENUM )136 );//B50(8-11) B51(8-11) B50(8-11) B51(8-11) B54(8-11) B55(8-11) B54(8-11) B55(8-11) B58(8-11) B59(8-11) B58(8-11) B59(8-11) B5C(8-11) B5D(8-11) B5C(8-11) B5D(8-11) 3742const __m512i rhs_mat_2367ABEF_51_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_51 , (_MM_PERM_ENUM )136 );//B52(8-11) B53(8-11) B52(8-11) B53(8-11) B56(8-11) B57(8-11) B56(8-11) B57(8-11) B5A(8-11) B5B(8-11) B5A(8-11) B5B(8-11) B5E(8-11) B5F(8-11) B5E(8-11) B5F(8-11) 3743 3744const __m512i rhs_mat_014589CD_60_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_60 , (_MM_PERM_ENUM )136 );//B60(0-3) B61(0-3) B60(0-3) B61(0-3) B64(0-3) B65(0-3) B64(0-3) B65(0-3) B68(0-3) B69(0-3) B68(0-3) B69(0-3) B6C(0-3) B6D(0-3) B6C(0-3) B6D(0-3) 3745const __m512i rhs_mat_2367ABEF_60_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_60 , (_MM_PERM_ENUM )136 );//B62(0-3) B63(0-3) B62(0-3) B63(0-3) B66(0-3) B67(0-3) B66(0-3) B67(0-3) B6A(0-3) B6B(0-3) B6A(0-3) B6B(0-3) B6E(0-3) B6F(0-3) B6E(0-3) B6F(0-3) 3746 3747const __m512i rhs_mat_014589CD_61_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_61 , (_MM_PERM_ENUM )136 );//B60(8-11) B61(8-11) B60(8-11) B61(8-11) B64(8-11) B65(8-11) B64(8-11) B65(8-11) B68(8-11) B69(8-11) B68(8-11) B69(8-11) B6C(8-11) B6D(8-11) B6C(8-11) B6D(8-11) 3748const __m512i rhs_mat_2367ABEF_61_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_61 , (_MM_PERM_ENUM )136 );//B62(8-11) B63(8-11) B62(8-11) B63(8-11) B66(8-11) B67(8-11) B66(8-11) B67(8-11) B6A(8-11) B6B(8-11) B6A(8-11) B6B(8-11) B6E(8-11) B6F(8-11) B6E(8-11) B6F(8-11) 3749 3750const __m512i rhs_mat_014589CD_70_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_70 , (_MM_PERM_ENUM )136 );//B70(0-3) B71(0-3) B70(0-3) B71(0-3) B74(0-3) B75(0-3) B74(0-3) B75(0-3) B78(0-3) B79(0-3) B78(0-3) B79(0-3) B7C(0-3) B7D(0-3) B7C(0-3) B7D(0-3) 3751const __m512i rhs_mat_2367ABEF_70_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_70 , (_MM_PERM_ENUM )136 );//B72(0-3) B73(0-3) B72(0-3) B73(0-3) B76(0-3) B77(0-3) B76(0-3) B77(0-3) B7A(0-3) B7B(0-3) B7A(0-3) B7B(0-3) B7E(0-3) B7F(0-3) B7E(0-3) B7F(0-3) 3752 3753const __m512i rhs_mat_014589CD_71_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_71 , (_MM_PERM_ENUM )136 );//B00(8-11) B01(8-11) B00(8-11) B01(8-11) B04(8-11) B05(8-11) B04(8-11) B05(8-11) B08(8-11) B09(8-11) B08(8-11) B09(8-11) B0C(8-11) B0D(8-11) B0C(8-11) B0D(8-11) 3754const __m512i rhs_mat_2367ABEF_71_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_71 , (_MM_PERM_ENUM )136 );//B72(8-11) B73(8-11) B72(8-11) B73(8-11) B76(8-11) B77(8-11) B76(8-11) B77(8-11) B7A(8-11) B7B(8-11) B7A(8-11) B7B(8-11) B7E(8-11) B7F(8-11) B7E(8-11) B7F(8-11) 3755 3756const __m512i rhs_mat_014589CD_00_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_00 , (_MM_PERM_ENUM )221 );//B00(4-7) B01(4-7) B00(4-7) B01(4-7) B04(4-7) B05(4-7) B04(4-7) B05(4-7) B08(4-7) B09(4-7) B08(4-7) B09(4-7) B0C(4-7) B0D(4-7) B0C(4-7) B0D(4-7) 3757const __m512i rhs_mat_2367ABEF_00_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_00 , (_MM_PERM_ENUM )221 );//B02(4-7) B03(4-7) B02(4-7) B03(4-7) B06(4-7) B07(4-7) B06(4-7) B07(4-7) B0A(4-7) B0B(4-7) B0A(4-7) B0B(4-7) B0E(4-7) B0F(4-7) B0E(4-7) B0F(4-7) 3758 3759const __m512i rhs_mat_014589CD_01_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_01 , (_MM_PERM_ENUM )221 );//B00(12-15) B01(12-15) B00(12-15) B01(12-15) B04(12-15) B05(12-15) B04(12-15) B05(12-15) B08(12-15) B09(12-15) B08(12-15) B09(12-15) B0C(12-15) B0D(12-15) B0C(12-15) B0D(12-15) 3760const __m512i rhs_mat_2367ABEF_01_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_01 , (_MM_PERM_ENUM )221 );//B02(12-15) B03(12-15) B02(12-15) B03(12-15) B06(12-15) B07(12-15) B06(12-15) B07(12-15) B0A(12-15) B0B(12-15) B0A(12-15) B0B(12-15) B0E(12-15) B0F(12-15) B0E(12-15) B0F(12-15) 3761 3762const __m512i rhs_mat_014589CD_10_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_10 , (_MM_PERM_ENUM )221 );//B10(4-7) B11(4-7) B10(4-7) B11(4-7) B14(4-7) B15(4-7) B14(4-7) B15(4-7) B18(4-7) B19(4-7) B18(4-7) B19(4-7) B1C(4-7) B1D(4-7) B1C(4-7) B1D(4-7) 3763const __m512i rhs_mat_2367ABEF_10_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_10 , (_MM_PERM_ENUM )221 );//B12(4-7) B13(4-7) B12(4-7) B13(4-7) B16(4-7) B17(4-7) B16(4-7) B17(4-7) B1A(4-7) B1B(4-7) B1A(4-7) B1B(4-7) B1E(4-7) B1F(4-7) B1E(4-7) B1F(4-7) 3764 3765const __m512i rhs_mat_014589CD_11_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_11 , (_MM_PERM_ENUM )221 );//B10(12-15) B11(12-15) B10(12-15) B11(12-15) B14(12-15) B15(12-15) B14(12-15) B15(12-15) B18(12-15) B19(12-15) B18(12-15) B19(12-15) B1C(12-15) B1D(12-15) B1C(12-15) B1D(12-15) 3766const __m512i rhs_mat_2367ABEF_11_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_11 , (_MM_PERM_ENUM )221 );//B12(12-15) B13(12-15) B12(12-15) B13(12-15) B16(12-15) B17(12-15) B16(12-15) B17(12-15) B1A(12-15) B1B(12-15) B1A(12-15) B1B(12-15) B1E(12-15) B1F(12-15) B1E(12-15) B1F(12-15) 3767 3768const __m512i rhs_mat_014589CD_20_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_20 , (_MM_PERM_ENUM )221 );//B20(4-7) B21(4-7) B20(4-7) B21(4-7) B24(4-7) B25(4-7) B24(4-7) B25(4-7) B28(4-7) B29(4-7) B28(4-7) B29(4-7) B2C(4-7) B2D(4-7) B2C(4-7) B2D(4-7) 3769const __m512i rhs_mat_2367ABEF_20_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_20 , (_MM_PERM_ENUM )221 );//B22(4-7) B23(4-7) B22(4-7) B23(4-7) B26(4-7) B27(4-7) B26(4-7) B27(4-7) B2A(4-7) B2B(4-7) B2A(4-7) B2B(4-7) B2E(4-7) B2F(4-7) B2E(4-7) B2F(4-7) 3770 3771const __m512i rhs_mat_014589CD_21_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_21 , (_MM_PERM_ENUM )221 );//B20(12-15) B21(12-15) B20(12-15) B21(12-15) B24(12-15) B25(12-15) B24(12-15) B25(12-15) B28(12-15) B29(12-15) B28(12-15) B29(12-15) B2C(12-15) B2D(12-15) B2C(12-15) B2D(12-15) 3772const __m512i rhs_mat_2367ABEF_21_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_21 , (_MM_PERM_ENUM )221 );//B22(12-15) B23(12-15) B22(12-15) B23(12-15) B26(12-15) B27(12-15) B26(12-15) B27(12-15) B2A(12-15) B2B(12-15) B2A(12-15) B2B(12-15) B2E(12-15) B2F(12-15) B2E(12-15) B2F(12-15) 3773 3774const __m512i rhs_mat_014589CD_30_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_30 , (_MM_PERM_ENUM )221 );//B30(4-7) B31(4-7) B30(4-7) B31(4-7) B34(4-7) B35(4-7) B34(4-7) B35(4-7) B38(4-7) B39(4-7) B38(4-7) B39(4-7) B3C(4-7) B3D(4-7) B3C(4-7) B3D(4-7) 3775const __m512i rhs_mat_2367ABEF_30_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_30 , (_MM_PERM_ENUM )221 );//B32(4-7) B33(4-7) B32(4-7) B33(4-7) B36(4-7) B37(4-7) B36(4-7) B37(4-7) B3A(4-7) B3B(4-7) B3A(4-7) B3B(4-7) B3E(4-7) B3F(4-7) B3E(4-7) B3F(4-7) 3776 3777const __m512i rhs_mat_014589CD_31_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_31 , (_MM_PERM_ENUM )221 );//B30(12-15) B31(12-15) B30(12-15) B31(12-15) B34(12-15) B35(12-15) B34(12-15) B35(12-15) B38(12-15) B39(12-15) B38(12-15) B39(12-15) B3C(12-15) B3D(12-15) B3C(12-15) B3D(12-15) 3778const __m512i rhs_mat_2367ABEF_31_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_31 , (_MM_PERM_ENUM )221 );//B32(12-15) B33(12-15) B32(12-15) B33(12-15) B36(12-15) B37(12-15) B36(12-15) B37(12-15) B3A(12-15) B3B(12-15) B3A(12-15) B3B(12-15) B3E(12-15) B3F(12-15) B3E(12-15) B3F(12-15) 3779 3780const __m512i rhs_mat_014589CD_40_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_40 , (_MM_PERM_ENUM )221 );//B40(4-7) B41(4-7) B40(4-7) B41(4-7) B44(4-7) B45(4-7) B44(4-7) B45(4-7) B48(4-7) B49(4-7) B48(4-7) B49(4-7) B4C(4-7) B4D(4-7) B4C(4-7) B4D(4-7) 3781const __m512i rhs_mat_2367ABEF_40_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_40 , (_MM_PERM_ENUM )221 );//B42(4-7) B43(4-7) B42(4-7) B43(4-7) B46(4-7) B47(4-7) B46(4-7) B47(4-7) B4A(4-7) B4B(4-7) B4A(4-7) B4B(4-7) B4E(4-7) B4F(4-7) B4E(4-7) B4F(4-7) 3782 3783const __m512i rhs_mat_014589CD_41_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_41 , (_MM_PERM_ENUM )221 );//B40(12-15) B41(12-15) B40(12-15) B41(12-15) B44(12-15) B45(12-15) B44(12-15) B45(12-15) B48(12-15) B49(12-15) B48(12-15) B49(12-15) B4C(12-15) B4D(12-15) B4C(12-15) B4D(12-15) 3784const __m512i rhs_mat_2367ABEF_41_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_41 , (_MM_PERM_ENUM )221 );//B42(12-15) B43(12-15) B42(12-15) B43(12-15) B46(12-15) B47(12-15) B46(12-15) B47(12-15) B4A(12-15) B4B(12-15) B4A(12-15) B4B(12-15) B4E(12-15) B4F(12-15) B4E(12-15) B4F(12-15) 3785 3786const __m512i rhs_mat_014589CD_50_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_50 , (_MM_PERM_ENUM )221 );//B50(4-7) B51(4-7) B50(4-7) B51(4-7) B54(4-7) B55(4-7) B54(4-7) B55(4-7) B58(4-7) B59(4-7) B58(4-7) B59(4-7) B5C(4-7) B5D(4-7) B5C(4-7) B5D(4-7) 3787const __m512i rhs_mat_2367ABEF_50_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_50 , (_MM_PERM_ENUM )221 );//B52(4-7) B53(4-7) B52(4-7) B53(4-7) B56(4-7) B57(4-7) B56(4-7) B57(4-7) B5A(4-7) B5B(4-7) B5A(4-7) B5B(4-7) B5E(4-7) B5F(4-7) B5E(4-7) B5F(4-7) 3788 3789const __m512i rhs_mat_014589CD_51_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_51 , (_MM_PERM_ENUM )221 );//B50(12-15) B51(12-15) B50(12-15) B51(12-15) B54(12-15) B55(12-15) B54(12-15) B55(12-15) B58(12-15) B59(12-15) B58(12-15) B59(12-15) B5C(12-15) B5D(12-15) B5C(12-15) B5D(12-15) 3790const __m512i rhs_mat_2367ABEF_51_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_51 , (_MM_PERM_ENUM )221 );//B52(12-15) B53(12-15) B52(12-15) B53(12-15) B56(12-15) B57(12-15) B56(12-15) B57(12-15) B5A(12-15) B5B(12-15) B5A(12-15) B5B(12-15) B5E(12-15) B5F(12-15) B5E(12-15) B5F(12-15) 3791 3792const __m512i rhs_mat_014589CD_60_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_60 , (_MM_PERM_ENUM )221 );//B60(4-7) B61(4-7) B60(4-7) B61(4-7) B64(4-7) B65(4-7) B64(4-7) B65(4-7) B68(4-7) B69(4-7) B68(4-7) B69(4-7) B6C(4-7) B6D(4-7) B6C(4-7) B6D(4-7) 3793const __m512i rhs_mat_2367ABEF_60_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_60 , (_MM_PERM_ENUM )221 );//B62(4-7) B63(4-7) B62(4-7) B63(4-7) B66(4-7) B67(4-7) B66(4-7) B67(4-7) B6A(4-7) B6B(4-7) B6A(4-7) B6B(4-7) B6E(4-7) B6F(4-7) B6E(4-7) B6F(4-7) 3794 3795const __m512i rhs_mat_014589CD_61_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_61 , (_MM_PERM_ENUM )221 );//B60(12-15) B61(12-15) B60(12-15) B61(12-15) B64(12-15) B65(12-15) B64(12-15) B65(12-15) B68(12-15) B69(12-15) B68(12-15) B69(12-15) B6C(12-15) B6D(12-15) B6C(12-15) B6D(12-15) 3796const __m512i rhs_mat_2367ABEF_61_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_61 , (_MM_PERM_ENUM )221 );//B62(12-15) B63(12-15) B62(12-15) B63(12-15) B66(12-15) B67(12-15) B66(12-15) B67(12-15) B6A(12-15) B6B(12-15) B6A(12-15) B6B(12-15) B6E(12-15) B6F(12-15) B6E(12-15) B6F(12-15) 3797 3798const __m512i rhs_mat_014589CD_70_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_70 , (_MM_PERM_ENUM )221 );//B70(4-7) B71(4-7) B70(4-7) B71(4-7) B74(4-7) B75(4-7) B74(4-7) B75(4-7) B78(4-7) B79(4-7) B78(4-7) B79(4-7) B7C(4-7) B7D(4-7) B7C(4-7) B7D(4-7) 3799const __m512i rhs_mat_2367ABEF_70_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_70 , (_MM_PERM_ENUM )221 );//B72(4-7) B73(4-7) B72(4-7) B73(4-7) B76(4-7) B77(4-7) B76(4-7) B77(4-7) B7A(4-7) B7B(4-7) B7A(4-7) B7B(4-7) B7E(4-7) B7F(4-7) B7E(4-7) B7F(4-7) 3800 3801const __m512i rhs_mat_014589CD_71_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_71 , (_MM_PERM_ENUM )221 );//B70(12-15) B71(12-15) B70(12-15) B71(12-15) B74(12-15) B75(12-15) B74(12-15) B75(12-15) B78(12-15) B79(12-15) B78(12-15) B79(12-15) B7C(12-15) B7D(12-15) B7C(12-15) B7D(12-15) 3802const __m512i rhs_mat_2367ABEF_71_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_71 , (_MM_PERM_ENUM )221 );//B72(12-15) B73(12-15) B72(12-15) B73(12-15) B76(12-15) B77(12-15) B76(12-15) B77(12-15) B7A(12-15) B7B(12-15) B7A(12-15) B7B(12-15) B7E(12-15) B7F(12-15) B7E(12-15) B7F(12-15) 3803 3804//notation:superblock subblock 3805//s00 m00 s01 m01 s10 m10 s11 m11 s20 m20 s21 m21 s30 m30 s31 m31 s40 m40 s41 m41 s50 m50 s51 m51 s60 m60 s61 m61 s70 m70 s71 m71 3806 3807const __m128i mins_and_scales_01_0 = _mm_loadu_si128 ((const __m128i * )(b_ptr_0 [b ].scales + sb * 64 )); 3808const __m128i mins_and_scales_23_0 = _mm_loadu_si128 ((const __m128i * )(b_ptr_0 [b ].scales + 16 + sb * 64 )); 3809const __m128i mins_and_scales_45_0 = _mm_loadu_si128 ((const __m128i * )(b_ptr_0 [b ].scales + 32 + sb * 64 )); 3810const __m128i mins_and_scales_67_0 = _mm_loadu_si128 ((const __m128i * )(b_ptr_0 [b ].scales + 48 + sb * 64 )); 3811 3812const __m128i mins_and_scales_01_1 = _mm_loadu_si128 ((const __m128i * )(b_ptr_1 [b ].scales + sb * 64 )); 3813const __m128i mins_and_scales_23_1 = _mm_loadu_si128 ((const __m128i * )(b_ptr_1 [b ].scales + 16 + sb * 64 )); 3814const __m128i mins_and_scales_45_1 = _mm_loadu_si128 ((const __m128i * )(b_ptr_1 [b ].scales + 32 + sb * 64 )); 3815const __m128i mins_and_scales_67_1 = _mm_loadu_si128 ((const __m128i * )(b_ptr_1 [b ].scales + 48 + sb * 64 )); 3816 3817// Combine mins and scales for sub-blocks: 0-1, 2-3, 4-5, 6-7 in the sb loop 3818const __m256i mins_and_scales_01 = _mm256_insertf128_si256 (_mm256_castsi128_si256 (mins_and_scales_01_0 ),mins_and_scales_01_1 ,1 ); 3819const __m256i mins_and_scales_23 = _mm256_insertf128_si256 (_mm256_castsi128_si256 (mins_and_scales_23_0 ),mins_and_scales_23_1 ,1 ); 3820const __m256i mins_and_scales_45 = _mm256_insertf128_si256 (_mm256_castsi128_si256 (mins_and_scales_45_0 ),mins_and_scales_45_1 ,1 ); 3821const __m256i mins_and_scales_67 = _mm256_insertf128_si256 (_mm256_castsi128_si256 (mins_and_scales_67_0 ),mins_and_scales_67_1 ,1 ); 3822 3823// Extract scales which is lower half from mins_and_scales 3824const __m256i scales_01 = _mm256_and_si256 (mins_and_scales_01 ,m4b ); 3825const __m256i scales_23 = _mm256_and_si256 (mins_and_scales_23 ,m4b ); 3826const __m256i scales_45 = _mm256_and_si256 (mins_and_scales_45 ,m4b ); 3827const __m256i scales_67 = _mm256_and_si256 (mins_and_scales_67 ,m4b ); 3828 3829// Extract mins which is upper half from mins_and_scales 3830const __m512i mins_01 = _mm512_cvtepu8_epi16 (_mm256_and_si256 (_mm256_srli_epi16 (mins_and_scales_01 ,4 ),m4b )); 3831const __m512i mins_23 = _mm512_cvtepu8_epi16 (_mm256_and_si256 (_mm256_srli_epi16 (mins_and_scales_23 ,4 ),m4b )); 3832const __m512i mins_45 = _mm512_cvtepu8_epi16 (_mm256_and_si256 (_mm256_srli_epi16 (mins_and_scales_45 ,4 ),m4b )); 3833const __m512i mins_67 = _mm512_cvtepu8_epi16 (_mm256_and_si256 (_mm256_srli_epi16 (mins_and_scales_67 ,4 ),m4b )); 3834 3835const __m512i scales_0 = _mm512_cvtepu8_epi16 (_mm256_shuffle_epi8 (scales_01 ,scalesmask1 )); 3836const __m512i scales_1 = _mm512_cvtepu8_epi16 (_mm256_shuffle_epi8 (scales_01 ,scalesmask2 )); 3837const __m512i scales_2 = _mm512_cvtepu8_epi16 (_mm256_shuffle_epi8 (scales_23 ,scalesmask1 )); 3838const __m512i scales_3 = _mm512_cvtepu8_epi16 (_mm256_shuffle_epi8 (scales_23 ,scalesmask2 )); 3839const __m512i scales_4 = _mm512_cvtepu8_epi16 (_mm256_shuffle_epi8 (scales_45 ,scalesmask1 )); 3840const __m512i scales_5 = _mm512_cvtepu8_epi16 (_mm256_shuffle_epi8 (scales_45 ,scalesmask2 )); 3841const __m512i scales_6 = _mm512_cvtepu8_epi16 (_mm256_shuffle_epi8 (scales_67 ,scalesmask1 )); 3842const __m512i scales_7 = _mm512_cvtepu8_epi16 (_mm256_shuffle_epi8 (scales_67 ,scalesmask2 )); 3843 3844const __m512i scale_014589CD_0 = _mm512_shuffle_epi32 (scales_0 , (_MM_PERM_ENUM )68 ); 3845const __m512i scale_2367ABEF_0 = _mm512_shuffle_epi32 (scales_0 , (_MM_PERM_ENUM )238 ); 3846 3847const __m512i scale_014589CD_1 = _mm512_shuffle_epi32 (scales_1 , (_MM_PERM_ENUM )68 ); 3848const __m512i scale_2367ABEF_1 = _mm512_shuffle_epi32 (scales_1 , (_MM_PERM_ENUM )238 ); 3849 3850const __m512i scale_014589CD_2 = _mm512_shuffle_epi32 (scales_2 , (_MM_PERM_ENUM )68 ); 3851const __m512i scale_2367ABEF_2 = _mm512_shuffle_epi32 (scales_2 , (_MM_PERM_ENUM )238 ); 3852 3853const __m512i scale_014589CD_3 = _mm512_shuffle_epi32 (scales_3 , (_MM_PERM_ENUM )68 ); 3854const __m512i scale_2367ABEF_3 = _mm512_shuffle_epi32 (scales_3 , (_MM_PERM_ENUM )238 ); 3855 3856const __m512i scale_014589CD_4 = _mm512_shuffle_epi32 (scales_4 , (_MM_PERM_ENUM )68 ); 3857const __m512i scale_2367ABEF_4 = _mm512_shuffle_epi32 (scales_4 , (_MM_PERM_ENUM )238 ); 3858 3859const __m512i scale_014589CD_5 = _mm512_shuffle_epi32 (scales_5 , (_MM_PERM_ENUM )68 ); 3860const __m512i scale_2367ABEF_5 = _mm512_shuffle_epi32 (scales_5 , (_MM_PERM_ENUM )238 ); 3861 3862const __m512i scale_014589CD_6 = _mm512_shuffle_epi32 (scales_6 , (_MM_PERM_ENUM )68 ); 3863const __m512i scale_2367ABEF_6 = _mm512_shuffle_epi32 (scales_6 , (_MM_PERM_ENUM )238 ); 3864 3865const __m512i scale_014589CD_7 = _mm512_shuffle_epi32 (scales_7 , (_MM_PERM_ENUM )68 ); 3866const __m512i scale_2367ABEF_7 = _mm512_shuffle_epi32 (scales_7 , (_MM_PERM_ENUM )238 ); 3867 3868 3869for (int rp = 0 ;rp < 4 ;rp ++ ) { 3870 3871// Load the four block_q8_k quantized values interleaved with each other in chunks of eight bytes - A0,A1,A2,A3 3872// Loaded as set of 128 bit vectors and repeated and stored into a 256 bit vector before again repeating into 512 bit vector 3873__m256i lhs_mat_ymm_0123_00 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 512 * sb ))); 3874__m256i lhs_mat_ymm_01_00 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_00 ,lhs_mat_ymm_0123_00 ,0 ); 3875__m256i lhs_mat_ymm_23_00 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_00 ,lhs_mat_ymm_0123_00 ,17 ); 3876__m256i lhs_mat_ymm_0123_01 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 32 + 512 * sb ))); 3877__m256i lhs_mat_ymm_01_01 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_01 ,lhs_mat_ymm_0123_01 ,0 ); 3878__m256i lhs_mat_ymm_23_01 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_01 ,lhs_mat_ymm_0123_01 ,17 ); 3879__m256i lhs_mat_ymm_0123_10 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 64 + 512 * sb ))); 3880__m256i lhs_mat_ymm_01_10 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_10 ,lhs_mat_ymm_0123_10 ,0 ); 3881__m256i lhs_mat_ymm_23_10 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_10 ,lhs_mat_ymm_0123_10 ,17 ); 3882__m256i lhs_mat_ymm_0123_11 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 96 + 512 * sb ))); 3883__m256i lhs_mat_ymm_01_11 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_11 ,lhs_mat_ymm_0123_11 ,0 ); 3884__m256i lhs_mat_ymm_23_11 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_11 ,lhs_mat_ymm_0123_11 ,17 ); 3885__m256i lhs_mat_ymm_0123_20 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 128 + 512 * sb ))); 3886__m256i lhs_mat_ymm_01_20 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_20 ,lhs_mat_ymm_0123_20 ,0 ); 3887__m256i lhs_mat_ymm_23_20 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_20 ,lhs_mat_ymm_0123_20 ,17 ); 3888__m256i lhs_mat_ymm_0123_21 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 160 + 512 * sb ))); 3889__m256i lhs_mat_ymm_01_21 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_21 ,lhs_mat_ymm_0123_21 ,0 ); 3890__m256i lhs_mat_ymm_23_21 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_21 ,lhs_mat_ymm_0123_21 ,17 ); 3891__m256i lhs_mat_ymm_0123_30 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 192 + 512 * sb ))); 3892__m256i lhs_mat_ymm_01_30 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_30 ,lhs_mat_ymm_0123_30 ,0 ); 3893__m256i lhs_mat_ymm_23_30 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_30 ,lhs_mat_ymm_0123_30 ,17 ); 3894__m256i lhs_mat_ymm_0123_31 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 224 + 512 * sb ))); 3895__m256i lhs_mat_ymm_01_31 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_31 ,lhs_mat_ymm_0123_31 ,0 ); 3896__m256i lhs_mat_ymm_23_31 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_31 ,lhs_mat_ymm_0123_31 ,17 ); 3897 3898__m256i lhs_mat_ymm_0123_40 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 256 + 512 * sb ))); 3899__m256i lhs_mat_ymm_01_40 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_40 ,lhs_mat_ymm_0123_40 ,0 ); 3900__m256i lhs_mat_ymm_23_40 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_40 ,lhs_mat_ymm_0123_40 ,17 ); 3901__m256i lhs_mat_ymm_0123_41 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 288 + 512 * sb ))); 3902__m256i lhs_mat_ymm_01_41 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_41 ,lhs_mat_ymm_0123_41 ,0 ); 3903__m256i lhs_mat_ymm_23_41 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_41 ,lhs_mat_ymm_0123_41 ,17 ); 3904__m256i lhs_mat_ymm_0123_50 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 320 + 512 * sb ))); 3905__m256i lhs_mat_ymm_01_50 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_50 ,lhs_mat_ymm_0123_50 ,0 ); 3906__m256i lhs_mat_ymm_23_50 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_50 ,lhs_mat_ymm_0123_50 ,17 ); 3907__m256i lhs_mat_ymm_0123_51 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 352 + 512 * sb ))); 3908__m256i lhs_mat_ymm_01_51 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_51 ,lhs_mat_ymm_0123_51 ,0 ); 3909__m256i lhs_mat_ymm_23_51 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_51 ,lhs_mat_ymm_0123_51 ,17 ); 3910__m256i lhs_mat_ymm_0123_60 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 384 + 512 * sb ))); 3911__m256i lhs_mat_ymm_01_60 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_60 ,lhs_mat_ymm_0123_60 ,0 ); 3912__m256i lhs_mat_ymm_23_60 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_60 ,lhs_mat_ymm_0123_60 ,17 ); 3913__m256i lhs_mat_ymm_0123_61 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 416 + 512 * sb ))); 3914__m256i lhs_mat_ymm_01_61 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_61 ,lhs_mat_ymm_0123_61 ,0 ); 3915__m256i lhs_mat_ymm_23_61 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_61 ,lhs_mat_ymm_0123_61 ,17 ); 3916__m256i lhs_mat_ymm_0123_70 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 448 + 512 * sb ))); 3917__m256i lhs_mat_ymm_01_70 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_70 ,lhs_mat_ymm_0123_70 ,0 ); 3918__m256i lhs_mat_ymm_23_70 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_70 ,lhs_mat_ymm_0123_70 ,17 ); 3919__m256i lhs_mat_ymm_0123_71 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 480 + 512 * sb ))); 3920__m256i lhs_mat_ymm_01_71 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_71 ,lhs_mat_ymm_0123_71 ,0 ); 3921__m256i lhs_mat_ymm_23_71 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_71 ,lhs_mat_ymm_0123_71 ,17 ); 3922 3923 3924__m512i lhs_mat_01_00 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_00 ),lhs_mat_ymm_01_00 ,1 ); 3925__m512i lhs_mat_23_00 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_00 ),lhs_mat_ymm_23_00 ,1 ); 3926__m512i lhs_mat_01_01 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_01 ),lhs_mat_ymm_01_01 ,1 ); 3927__m512i lhs_mat_23_01 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_01 ),lhs_mat_ymm_23_01 ,1 ); 3928 3929__m512i lhs_mat_01_10 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_10 ),lhs_mat_ymm_01_10 ,1 ); 3930__m512i lhs_mat_23_10 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_10 ),lhs_mat_ymm_23_10 ,1 ); 3931__m512i lhs_mat_01_11 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_11 ),lhs_mat_ymm_01_11 ,1 ); 3932__m512i lhs_mat_23_11 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_11 ),lhs_mat_ymm_23_11 ,1 ); 3933 3934__m512i lhs_mat_01_20 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_20 ),lhs_mat_ymm_01_20 ,1 ); 3935__m512i lhs_mat_23_20 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_20 ),lhs_mat_ymm_23_20 ,1 ); 3936__m512i lhs_mat_01_21 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_21 ),lhs_mat_ymm_01_21 ,1 ); 3937__m512i lhs_mat_23_21 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_21 ),lhs_mat_ymm_23_21 ,1 ); 3938 3939__m512i lhs_mat_01_30 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_30 ),lhs_mat_ymm_01_30 ,1 ); 3940__m512i lhs_mat_23_30 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_30 ),lhs_mat_ymm_23_30 ,1 ); 3941__m512i lhs_mat_01_31 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_31 ),lhs_mat_ymm_01_31 ,1 ); 3942__m512i lhs_mat_23_31 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_31 ),lhs_mat_ymm_23_31 ,1 ); 3943 3944__m512i lhs_mat_01_40 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_40 ),lhs_mat_ymm_01_40 ,1 ); 3945__m512i lhs_mat_23_40 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_40 ),lhs_mat_ymm_23_40 ,1 ); 3946__m512i lhs_mat_01_41 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_41 ),lhs_mat_ymm_01_41 ,1 ); 3947__m512i lhs_mat_23_41 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_41 ),lhs_mat_ymm_23_41 ,1 ); 3948 3949__m512i lhs_mat_01_50 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_50 ),lhs_mat_ymm_01_50 ,1 ); 3950__m512i lhs_mat_23_50 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_50 ),lhs_mat_ymm_23_50 ,1 ); 3951__m512i lhs_mat_01_51 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_51 ),lhs_mat_ymm_01_51 ,1 ); 3952__m512i lhs_mat_23_51 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_51 ),lhs_mat_ymm_23_51 ,1 ); 3953 3954__m512i lhs_mat_01_60 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_60 ),lhs_mat_ymm_01_60 ,1 ); 3955__m512i lhs_mat_23_60 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_60 ),lhs_mat_ymm_23_60 ,1 ); 3956__m512i lhs_mat_01_61 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_61 ),lhs_mat_ymm_01_61 ,1 ); 3957__m512i lhs_mat_23_61 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_61 ),lhs_mat_ymm_23_61 ,1 ); 3958 3959__m512i lhs_mat_01_70 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_70 ),lhs_mat_ymm_01_70 ,1 ); 3960__m512i lhs_mat_23_70 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_70 ),lhs_mat_ymm_23_70 ,1 ); 3961__m512i lhs_mat_01_71 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_71 ),lhs_mat_ymm_01_71 ,1 ); 3962__m512i lhs_mat_23_71 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_71 ),lhs_mat_ymm_23_71 ,1 ); 3963 3964// Bsums are loaded for the different Q8_K blocks 3965__m128i lhs_raw_bsums_01_0123 = _mm_loadu_si128 ((const __m128i * )((a_ptrs [rp ][b ].bsums + 32 * sb ))); 3966__m128i lhs_raw_bsums_23_0123 = _mm_loadu_si128 ((const __m128i * )(a_ptrs [rp ][b ].bsums + 8 + 32 * sb )); 3967__m128i lhs_raw_bsums_01_4567 = _mm_loadu_si128 ((const __m128i * )((a_ptrs [rp ][b ].bsums + 16 + 32 * sb ))); 3968__m128i lhs_raw_bsums_23_4567 = _mm_loadu_si128 ((const __m128i * )(a_ptrs [rp ][b ].bsums + 24 + 32 * sb )); 3969 3970__m256i lhs_bsums_ymm_01_0123 = _mm256_inserti128_si256 (_mm256_castsi128_si256 (lhs_raw_bsums_01_0123 ),lhs_raw_bsums_01_0123 ,1 ); 3971__m512i lhs_bsums_01_0123 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_bsums_ymm_01_0123 ),lhs_bsums_ymm_01_0123 ,1 ); 3972__m256i lhs_bsums_ymm_23_0123 = _mm256_inserti128_si256 (_mm256_castsi128_si256 (lhs_raw_bsums_23_0123 ),lhs_raw_bsums_23_0123 ,1 ); 3973__m512i lhs_bsums_23_0123 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_bsums_ymm_23_0123 ),lhs_bsums_ymm_23_0123 ,1 );__m256i lhs_bsums_ymm_01_4567 = _mm256_inserti128_si256 (_mm256_castsi128_si256 (lhs_raw_bsums_01_4567 ),lhs_raw_bsums_01_4567 ,1 ); 3974__m512i lhs_bsums_01_4567 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_bsums_ymm_01_4567 ),lhs_bsums_ymm_01_4567 ,1 ); 3975__m256i lhs_bsums_ymm_23_4567 = _mm256_inserti128_si256 (_mm256_castsi128_si256 (lhs_raw_bsums_23_4567 ),lhs_raw_bsums_23_4567 ,1 ); 3976__m512i lhs_bsums_23_4567 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_bsums_ymm_23_4567 ),lhs_bsums_ymm_23_4567 ,1 ); 3977 3978// Shuffle pattern one - left side input 3979const __m512i lhs_mat_01_00_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_00 , (_MM_PERM_ENUM )160 );//A00(0-3) A00(0-3) A01(0-3) A01(0-3) A00(0-3) A00(0-3) A01(0-3) A01(0-3) A00(0-3) A00(0-3) A01(0-3) A01(0-3) A00(0-3) A00(0-3) A01(0-3) A01(0-3) 3980const __m512i lhs_mat_23_00_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_00 , (_MM_PERM_ENUM )160 );//A02(0-3) A02(0-3) A03(0-3) A03(0-3) A02(0-3) A02(0-3) A03(0-3) A03(0-3) A02(0-3) A02(0-3) A03(0-3) A03(0-3) A02(0-3) A02(0-3) A03(0-3) A03(0-3) 3981 3982const __m512i lhs_mat_01_01_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_01 , (_MM_PERM_ENUM )160 );//A00(8-11) A00(8-11) A01(8-11) A01(8-11) A00(8-11) A00(8-11) A01(8-11) A01(8-11) A00(8-11) A00(8-11) A01(8-11) A01(8-11) A00(8-11) A00(8-11) A01(8-11) A01(8-11) 3983const __m512i lhs_mat_23_01_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_01 , (_MM_PERM_ENUM )160 );//A02(8-11) A02(8-11) A03(8-11) A03(8-11) A02(8-11) A02(8-11) A03(8-11) A03(8-11) A02(8-11) A02(8-11) A03(8-11) A03(8-11) A02(8-11) A02(8-11) A03(8-11) A03(8-11) 3984 3985const __m512i lhs_mat_01_10_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_10 , (_MM_PERM_ENUM )160 );//A10(0-3) A10(0-3) A11(0-3) A11(0-3) A10(0-3) A10(0-3) A11(0-3) A11(0-3) A10(0-3) A10(0-3) A11(0-3) A11(0-3) A10(0-3) A10(0-3) A11(0-3) A11(0-3) 3986const __m512i lhs_mat_23_10_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_10 , (_MM_PERM_ENUM )160 );//A12(0-3) A12(0-3) A13(0-3) A13(0-3) A12(0-3) A12(0-3) A13(0-3) A13(0-3) A12(0-3) A12(0-3) A13(0-3) A13(0-3) A12(0-3) A12(0-3) A13(0-3) A13(0-3) 3987 3988const __m512i lhs_mat_01_11_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_11 , (_MM_PERM_ENUM )160 );//A10(8-11) A10(8-11) A11(8-11) A11(8-11) A10(8-11) A10(8-11) A11(8-11) A11(8-11) A10(8-11) A10(8-11) A11(8-11) A11(8-11) A10(8-11) A10(8-11) A11(8-11) A11(8-11) 3989const __m512i lhs_mat_23_11_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_11 , (_MM_PERM_ENUM )160 );//A12(8-11) A12(8-11) A13(8-11) A13(8-11) A12(8-11) A12(8-11) A13(8-11) A13(8-11) A12(8-11) A12(8-11) A13(8-11) A13(8-11) A12(8-11) A12(8-11) A13(8-11) A13(8-11) 3990 3991const __m512i lhs_mat_01_20_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_20 , (_MM_PERM_ENUM )160 );//A20(0-3) A20(0-3) A21(0-3) A21(0-3) A20(0-3) A20(0-3) A21(0-3) A21(0-3) A20(0-3) A20(0-3) A21(0-3) A21(0-3) A20(0-3) A20(0-3) A21(0-3) A21(0-3) 3992const __m512i lhs_mat_23_20_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_20 , (_MM_PERM_ENUM )160 );//A22(0-3) A22(0-3) A23(0-3) A23(0-3) A22(0-3) A22(0-3) A23(0-3) A23(0-3) A22(0-3) A22(0-3) A23(0-3) A23(0-3) A22(0-3) A22(0-3) A23(0-3) A23(0-3) 3993 3994const __m512i lhs_mat_01_21_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_21 , (_MM_PERM_ENUM )160 );//A20(8-11) A20(8-11) A21(8-11) A21(8-11) A20(8-11) A20(8-11) A21(8-11) A21(8-11) A20(8-11) A20(8-11) A21(8-11) A21(8-11) A20(8-11) A20(8-11) A21(8-11) A21(8-11) 3995const __m512i lhs_mat_23_21_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_21 , (_MM_PERM_ENUM )160 );//A22(8-11) A22(8-11) A23(8-11) A23(8-11) A22(8-11) A22(8-11) A23(8-11) A23(8-11) A22(8-11) A22(8-11) A23(8-11) A23(8-11) A22(8-11) A22(8-11) A23(8-11) A23(8-11) 3996 3997const __m512i lhs_mat_01_30_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_30 , (_MM_PERM_ENUM )160 );//A30(0-3) A30(0-3) A31(0-3) A31(0-3) A30(0-3) A30(0-3) A31(0-3) A31(0-3) A30(0-3) A30(0-3) A31(0-3) A31(0-3) A30(0-3) A30(0-3) A31(0-3) A31(0-3) 3998const __m512i lhs_mat_23_30_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_30 , (_MM_PERM_ENUM )160 );//A32(0-3) A32(0-3) A33(0-3) A33(0-3) A32(0-3) A32(0-3) A33(0-3) A33(0-3) A32(0-3) A32(0-3) A33(0-3) A33(0-3) A32(0-3) A32(0-3) A33(0-3) A33(0-3) 3999 4000const __m512i lhs_mat_01_31_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_31 , (_MM_PERM_ENUM )160 );//A30(8-11) A30(8-11) A31(8-11) A31(8-11) A30(8-11) A30(8-11) A31(8-11) A31(8-11) A30(8-11) A30(8-11) A31(8-11) A31(8-11) A30(8-11) A30(8-11) A31(8-11) A31(8-11) 4001const __m512i lhs_mat_23_31_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_31 , (_MM_PERM_ENUM )160 );//A32(8-11) A32(8-11) A33(8-11) A33(8-11) A32(8-11) A32(8-11) A33(8-11) A33(8-11) A32(8-11) A32(8-11) A33(8-11) A33(8-11) A32(8-11) A32(8-11) A33(8-11) A33(8-11) 4002 4003const __m512i lhs_mat_01_40_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_40 , (_MM_PERM_ENUM )160 );//A40(0-3) A40(0-3) A41(0-3) A41(0-3) A40(0-3) A40(0-3) A41(0-3) A41(0-3) A40(0-3) A40(0-3) A41(0-3) A41(0-3) A40(0-3) A40(0-3) A41(0-3) A41(0-3) 4004const __m512i lhs_mat_23_40_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_40 , (_MM_PERM_ENUM )160 );//A42(0-3) A42(0-3) A43(0-3) A43(0-3) A42(0-3) A42(0-3) A43(0-3) A43(0-3) A42(0-3) A42(0-3) A43(0-3) A43(0-3) A42(0-3) A42(0-3) A43(0-3) A43(0-3) 4005 4006const __m512i lhs_mat_01_41_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_41 , (_MM_PERM_ENUM )160 );//A40(8-11) A40(8-11) A41(8-11) A41(8-11) A40(8-11) A40(8-11) A41(8-11) A41(8-11) A40(8-11) A40(8-11) A41(8-11) A41(8-11) A40(8-11) A40(8-11) A41(8-11) A41(8-11) 4007const __m512i lhs_mat_23_41_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_41 , (_MM_PERM_ENUM )160 );//A42(8-11) A42(8-11) A43(8-11) A43(8-11) A42(8-11) A42(8-11) A43(8-11) A43(8-11) A42(8-11) A42(8-11) A43(8-11) A43(8-11) A42(8-11) A42(8-11) A43(8-11) A43(8-11) 4008 4009const __m512i lhs_mat_01_50_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_50 , (_MM_PERM_ENUM )160 );//A50(0-3) A50(0-3) A51(0-3) A51(0-3) A50(0-3) A50(0-3) A51(0-3) A51(0-3) A50(0-3) A50(0-3) A51(0-3) A51(0-3) A50(0-3) A50(0-3) A51(0-3) A51(0-3) 4010const __m512i lhs_mat_23_50_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_50 , (_MM_PERM_ENUM )160 );//A52(0-3) A52(0-3) A53(0-3) A53(0-3) A52(0-3) A52(0-3) A53(0-3) A53(0-3) A52(0-3) A52(0-3) A53(0-3) A53(0-3) A52(0-3) A52(0-3) A53(0-3) A53(0-3) 4011 4012const __m512i lhs_mat_01_51_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_51 , (_MM_PERM_ENUM )160 );//A50(8-11) A50(8-11) A51(8-11) A51(8-11) A50(8-11) A50(8-11) A51(8-11) A51(8-11) A50(8-11) A50(8-11) A51(8-11) A51(8-11) A50(8-11) A50(8-11) A51(8-11) A51(8-11) 4013const __m512i lhs_mat_23_51_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_51 , (_MM_PERM_ENUM )160 );//A52(8-11) A52(8-11) A53(8-11) A53(8-11) A52(8-11) A52(8-11) A53(8-11) A53(8-11) A52(8-11) A52(8-11) A53(8-11) A53(8-11) A52(8-11) A52(8-11) A53(8-11) A53(8-11) 4014 4015const __m512i lhs_mat_01_60_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_60 , (_MM_PERM_ENUM )160 );//A60(0-3) A60(0-3) A61(0-3) A61(0-3) A60(0-3) A60(0-3) A61(0-3) A61(0-3) A60(0-3) A60(0-3) A61(0-3) A61(0-3) A60(0-3) A60(0-3) A61(0-3) A61(0-3) 4016const __m512i lhs_mat_23_60_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_60 , (_MM_PERM_ENUM )160 );//A62(0-3) A62(0-3) A63(0-3) A63(0-3) A62(0-3) A62(0-3) A63(0-3) A63(0-3) A62(0-3) A62(0-3) A63(0-3) A63(0-3) A62(0-3) A62(0-3) A63(0-3) A63(0-3) 4017 4018const __m512i lhs_mat_01_61_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_61 , (_MM_PERM_ENUM )160 );//A60(8-11) A60(8-11) A61(8-11) A61(8-11) A60(8-11) A60(8-11) A61(8-11) A61(8-11) A60(8-11) A60(8-11) A61(8-11) A61(8-11) A60(8-11) A60(8-11) A61(8-11) A61(8-11) 4019const __m512i lhs_mat_23_61_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_61 , (_MM_PERM_ENUM )160 );//A62(8-11) A62(8-11) A63(8-11) A63(8-11) A62(8-11) A62(8-11) A63(8-11) A63(8-11) A62(8-11) A62(8-11) A63(8-11) A63(8-11) A62(8-11) A62(8-11) A63(8-11) A63(8-11) 4020 4021const __m512i lhs_mat_01_70_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_70 , (_MM_PERM_ENUM )160 );//A70(0-3) A70(0-3) A71(0-3) A71(0-3) A70(0-3) A70(0-3) A71(0-3) A71(0-3) A70(0-3) A70(0-3) A71(0-3) A71(0-3) A70(0-3) A70(0-3) A71(0-3) A71(0-3) 4022const __m512i lhs_mat_23_70_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_70 , (_MM_PERM_ENUM )160 );//A72(0-3) A72(0-3) A73(0-3) A73(0-3) A72(0-3) A72(0-3) A73(0-3) A73(0-3) A72(0-3) A72(0-3) A73(0-3) A73(0-3) A72(0-3) A72(0-3) A73(0-3) A73(0-3) 4023 4024const __m512i lhs_mat_01_71_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_71 , (_MM_PERM_ENUM )160 );//A70(8-11) A70(8-11) A71(8-11) A71(8-11) A70(8-11) A70(8-11) A71(8-11) A71(8-11) A70(8-11) A70(8-11) A71(8-11) A71(8-11) A70(8-11) A70(8-11) A71(8-11) A71(8-11) 4025const __m512i lhs_mat_23_71_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_71 , (_MM_PERM_ENUM )160 );//A72(8-11) A72(8-11) A73(8-11) A73(8-11) A72(8-11) A72(8-11) A73(8-11) A73(8-11) A72(8-11) A72(8-11) A73(8-11) A73(8-11) A72(8-11) A72(8-11) A73(8-11) A73(8-11) 4026 4027const __m512i lhs_mat_01_00_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_00 , (_MM_PERM_ENUM )245 );//A00(4-7) A00(4-7) A01(4-7) A01(4-7) A00(4-7) A00(4-7) A01(4-7) A01(4-7) A00(4-7) A00(4-7) A01(4-7) A01(4-7) A00(4-7) A00(4-7) A01(4-7) A01(4-7) 4028const __m512i lhs_mat_23_00_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_00 , (_MM_PERM_ENUM )245 );//A02(4-7) A02(4-7) A03(4-7) A03(4-7) A02(4-7) A02(4-7) A03(4-7) A03(4-7) A02(4-7) A02(4-7) A03(4-7) A03(4-7) A02(4-7) A02(4-7) A03(4-7) A03(4-7) 4029 4030const __m512i lhs_mat_01_01_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_01 , (_MM_PERM_ENUM )245 );//A00(12-15) A00(12-15) A01(12-15) A01(12-15) A00(12-15) A00(12-15) A01(12-15) A01(12-15) A00(12-15) A00(12-15) A01(12-15) A01(12-15) A00(12-15) A00(12-15) A01(12-15) A01(12-15) 4031const __m512i lhs_mat_23_01_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_01 , (_MM_PERM_ENUM )245 );//A02(12-15) A02(12-15) A03(12-15) A03(12-15) A02(12-15) A02(12-15) A03(12-15) A03(12-15) A02(12-15) A02(12-15) A03(12-15) A03(12-15) A02(12-15) A02(12-15) A03(12-15) A03(12-15) 4032 4033const __m512i lhs_mat_01_10_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_10 , (_MM_PERM_ENUM )245 );//A10(4-7) A10(4-7) A11(4-7) A11(4-7) A10(4-7) A10(4-7) A11(4-7) A11(4-7) A10(4-7) A10(4-7) A11(4-7) A11(4-7) A10(4-7) A10(4-7) A11(4-7) A11(4-7) 4034const __m512i lhs_mat_23_10_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_10 , (_MM_PERM_ENUM )245 );//A12(4-7) A12(4-7) A13(4-7) A13(4-7) A12(4-7) A12(4-7) A13(4-7) A13(4-7) A12(4-7) A12(4-7) A13(4-7) A13(4-7) A12(4-7) A12(4-7) A13(4-7) A13(4-7) 4035 4036const __m512i lhs_mat_01_11_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_11 , (_MM_PERM_ENUM )245 );//A10(12-15) A10(12-15) A11(12-15) A11(12-15) A10(12-15) A10(12-15) A11(12-15) A11(12-15) A10(12-15) A10(12-15) A11(12-15) A11(12-15) A10(12-15) A10(12-15) A11(12-15) A11(12-15) 4037const __m512i lhs_mat_23_11_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_11 , (_MM_PERM_ENUM )245 );//A12(12-15) A12(12-15) A13(12-15) A13(12-15) A12(12-15) A12(12-15) A13(12-15) A13(12-15) A12(12-15) A12(12-15) A13(12-15) A13(12-15) A12(12-15) A12(12-15) A13(12-15) A13(12-15) 4038 4039const __m512i lhs_mat_01_20_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_20 , (_MM_PERM_ENUM )245 );//A20(4-7) A20(4-7) A21(4-7) A21(4-7) A20(4-7) A20(4-7) A21(4-7) A21(4-7) A20(4-7) A20(4-7) A21(4-7) A21(4-7) A20(4-7) A20(4-7) A21(4-7) A21(4-7) 4040const __m512i lhs_mat_23_20_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_20 , (_MM_PERM_ENUM )245 );//A22(4-7) A22(4-7) A23(4-7) A23(4-7) A22(4-7) A22(4-7) A23(4-7) A23(4-7) A22(4-7) A22(4-7) A23(4-7) A23(4-7) A22(4-7) A22(4-7) A23(4-7) A23(4-7) 4041 4042const __m512i lhs_mat_01_21_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_21 , (_MM_PERM_ENUM )245 );//A20(12-15) A20(12-15) A21(12-15) A21(12-15) A20(12-15) A20(12-15) A21(12-15) A21(12-15) A20(12-15) A20(12-15) A21(12-15) A21(12-15) A20(12-15) A20(12-15) A21(12-15) A21(12-15) 4043const __m512i lhs_mat_23_21_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_21 , (_MM_PERM_ENUM )245 );//A22(12-15) A22(12-15) A23(12-15) A23(12-15) A22(12-15) A22(12-15) A23(12-15) A23(12-15) A22(12-15) A22(12-15) A23(12-15) A23(12-15) A22(12-15) A22(12-15) A23(12-15) A23(12-15) 4044 4045const __m512i lhs_mat_01_30_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_30 , (_MM_PERM_ENUM )245 );//A30(4-7) A30(4-7) A31(4-7) A31(4-7) A30(4-7) A30(4-7) A31(4-7) A31(4-7) A30(4-7) A30(4-7) A31(4-7) A31(4-7) A30(4-7) A30(4-7) A31(4-7) A31(4-7) 4046const __m512i lhs_mat_23_30_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_30 , (_MM_PERM_ENUM )245 );//A32(4-7) A32(4-7) A33(4-7) A33(4-7) A32(4-7) A32(4-7) A33(4-7) A33(4-7) A32(4-7) A32(4-7) A33(4-7) A33(4-7) A32(4-7) A32(4-7) A33(4-7) A33(4-7) 4047 4048const __m512i lhs_mat_01_31_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_31 , (_MM_PERM_ENUM )245 );//A30(12-15) A30(12-15) A31(12-15) A31(12-15) A30(12-15) A30(12-15) A31(12-15) A31(12-15) A30(12-15) A30(12-15) A31(12-15) A31(12-15) A30(12-15) A30(12-15) A31(12-15) A31(12-15) 4049const __m512i lhs_mat_23_31_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_31 , (_MM_PERM_ENUM )245 );//A32(12-15) A32(12-15) A33(12-15) A33(12-15) A32(12-15) A32(12-15) A33(12-15) A33(12-15) A32(12-15) A32(12-15) A33(12-15) A33(12-15) A32(12-15) A32(12-15) A33(12-15) A33(12-15) 4050 4051const __m512i lhs_mat_01_40_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_40 , (_MM_PERM_ENUM )245 );//A40(4-7) A40(4-7) A41(4-7) A41(4-7) A40(4-7) A40(4-7) A41(4-7) A41(4-7) A40(4-7) A40(4-7) A41(4-7) A41(4-7) A40(4-7) A40(4-7) A41(4-7) A41(4-7) 4052const __m512i lhs_mat_23_40_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_40 , (_MM_PERM_ENUM )245 );//A42(4-7) A42(4-7) A43(4-7) A43(4-7) A42(4-7) A42(4-7) A43(4-7) A43(4-7) A42(4-7) A42(4-7) A43(4-7) A43(4-7) A42(4-7) A42(4-7) A43(4-7) A43(4-7) 4053 4054const __m512i lhs_mat_01_41_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_41 , (_MM_PERM_ENUM )245 );//A40(12-15) A40(12-15) A41(12-15) A41(12-15) A40(12-15) A40(12-15) A41(12-15) A41(12-15) A40(12-15) A40(12-15) A41(12-15) A41(12-15) A40(12-15) A40(12-15) A41(12-15) A41(12-15) 4055const __m512i lhs_mat_23_41_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_41 , (_MM_PERM_ENUM )245 );//A42(12-15) A42(12-15) A43(12-15) A43(12-15) A42(12-15) A42(12-15) A43(12-15) A43(12-15) A42(12-15) A42(12-15) A43(12-15) A43(12-15) A42(12-15) A42(12-15) A43(12-15) A43(12-15) 4056 4057const __m512i lhs_mat_01_50_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_50 , (_MM_PERM_ENUM )245 );//A50(4-7) A50(4-7) A51(4-7) A51(4-7) A50(4-7) A50(4-7) A51(4-7) A51(4-7) A50(4-7) A50(4-7) A51(4-7) A51(4-7) A50(4-7) A50(4-7) A51(4-7) A51(4-7) 4058const __m512i lhs_mat_23_50_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_50 , (_MM_PERM_ENUM )245 );//A52(4-7) A52(4-7) A53(4-7) A53(4-7) A52(4-7) A52(4-7) A53(4-7) A53(4-7) A52(4-7) A52(4-7) A53(4-7) A53(4-7) A52(4-7) A52(4-7) A53(4-7) A53(4-7) 4059 4060const __m512i lhs_mat_01_51_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_51 , (_MM_PERM_ENUM )245 );//A50(12-15) A50(12-15) A51(12-15) A51(12-15) A50(12-15) A50(12-15) A51(12-15) A51(12-15) A50(12-15) A50(12-15) A51(12-15) A51(12-15) A50(12-15) A50(12-15) A51(12-15) A51(12-15) 4061const __m512i lhs_mat_23_51_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_51 , (_MM_PERM_ENUM )245 );//A52(12-15) A52(12-15) A53(12-15) A53(12-15) A52(12-15) A52(12-15) A53(12-15) A53(12-15) A52(12-15) A52(12-15) A53(12-15) A53(12-15) A52(12-15) A52(12-15) A53(12-15) A53(12-15) 4062 4063const __m512i lhs_mat_01_60_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_60 , (_MM_PERM_ENUM )245 );//A60(4-7) A60(4-7) A61(4-7) A61(4-7) A60(4-7) A60(4-7) A61(4-7) A61(4-7) A60(4-7) A60(4-7) A61(4-7) A61(4-7) A60(4-7) A60(4-7) A61(4-7) A61(4-7) 4064const __m512i lhs_mat_23_60_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_60 , (_MM_PERM_ENUM )245 );//A62(4-7) A62(4-7) A63(4-7) A63(4-7) A62(4-7) A62(4-7) A63(4-7) A63(4-7) A62(4-7) A62(4-7) A63(4-7) A63(4-7) A62(4-7) A62(4-7) A63(4-7) A63(4-7) 4065 4066const __m512i lhs_mat_01_61_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_61 , (_MM_PERM_ENUM )245 );//A60(12-15) A60(12-15) A61(12-15) A61(12-15) A60(12-15) A60(12-15) A61(12-15) A61(12-15) A60(12-15) A60(12-15) A61(12-15) A61(12-15) A60(12-15) A60(12-15) A61(12-15) A61(12-15) 4067const __m512i lhs_mat_23_61_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_61 , (_MM_PERM_ENUM )245 );//A62(12-15) A62(12-15) A63(12-15) A63(12-15) A62(12-15) A62(12-15) A63(12-15) A63(12-15) A62(12-15) A62(12-15) A63(12-15) A63(12-15) A62(12-15) A62(12-15) A63(12-15) A63(12-15) 4068 4069const __m512i lhs_mat_01_70_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_70 , (_MM_PERM_ENUM )245 );//A70(4-7) A70(4-7) A71(4-7) A71(4-7) A70(4-7) A70(4-7) A71(4-7) A71(4-7) A70(4-7) A70(4-7) A71(4-7) A71(4-7) A70(4-7) A70(4-7) A71(4-7) A71(4-7) 4070const __m512i lhs_mat_23_70_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_70 , (_MM_PERM_ENUM )245 );//A72(4-7) A72(4-7) A73(4-7) A73(4-7) A72(4-7) A72(4-7) A73(4-7) A73(4-7) A72(4-7) A72(4-7) A73(4-7) A73(4-7) A72(4-7) A72(4-7) A73(4-7) A73(4-7) 4071 4072const __m512i lhs_mat_01_71_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_71 , (_MM_PERM_ENUM )245 );//A70(12-15) A70(12-15) A71(12-15) A71(12-15) A70(12-15) A70(12-15) A71(12-15) A71(12-15) A70(12-15) A70(12-15) A71(12-15) A71(12-15) A70(12-15) A70(12-15) A71(12-15) A71(12-15) 4073const __m512i lhs_mat_23_71_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_71 , (_MM_PERM_ENUM )245 );//A72(12-15) A72(12-15) A73(12-15) A73(12-15) A72(12-15) A72(12-15) A73(12-15) A73(12-15) A72(12-15) A72(12-15) A73(12-15) A73(12-15) A72(12-15) A72(12-15) A73(12-15) A73(12-15) 4074 4075// The values arranged in shuffle patterns are operated with dot product operation within 32 bit lane i.e corresponding bytes and multiplied and added into 32 bit integers within 32 bit lane 4076__m512i iacc_mat_00_0_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_00_sp1 ,lhs_mat_01_00_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_01_sp1 ,lhs_mat_01_01_sp1 )); 4077__m512i iacc_mat_01_0_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_00_sp1 ,lhs_mat_01_00_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_01_sp1 ,lhs_mat_01_01_sp1 )); 4078 4079__m512i iacc_mat_10_0_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_00_sp1 ,lhs_mat_23_00_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_01_sp1 ,lhs_mat_23_01_sp1 )); 4080__m512i iacc_mat_11_0_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_00_sp1 ,lhs_mat_23_00_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_01_sp1 ,lhs_mat_23_01_sp1 )); 4081 4082__m512i iacc_mat_00_1_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_10_sp1 ,lhs_mat_01_10_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_11_sp1 ,lhs_mat_01_11_sp1 )); 4083__m512i iacc_mat_01_1_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_10_sp1 ,lhs_mat_01_10_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_11_sp1 ,lhs_mat_01_11_sp1 )); 4084 4085__m512i iacc_mat_10_1_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_10_sp1 ,lhs_mat_23_10_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_11_sp1 ,lhs_mat_23_11_sp1 )); 4086__m512i iacc_mat_11_1_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_10_sp1 ,lhs_mat_23_10_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_11_sp1 ,lhs_mat_23_11_sp1 )); 4087 4088__m512i iacc_mat_00_2_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_20_sp1 ,lhs_mat_01_20_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_21_sp1 ,lhs_mat_01_21_sp1 )); 4089__m512i iacc_mat_01_2_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_20_sp1 ,lhs_mat_01_20_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_21_sp1 ,lhs_mat_01_21_sp1 )); 4090 4091__m512i iacc_mat_10_2_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_20_sp1 ,lhs_mat_23_20_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_21_sp1 ,lhs_mat_23_21_sp1 )); 4092__m512i iacc_mat_11_2_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_20_sp1 ,lhs_mat_23_20_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_21_sp1 ,lhs_mat_23_21_sp1 )); 4093 4094__m512i iacc_mat_00_3_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_30_sp1 ,lhs_mat_01_30_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_31_sp1 ,lhs_mat_01_31_sp1 )); 4095__m512i iacc_mat_01_3_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_30_sp1 ,lhs_mat_01_30_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_31_sp1 ,lhs_mat_01_31_sp1 )); 4096 4097__m512i iacc_mat_10_3_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_30_sp1 ,lhs_mat_23_30_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_31_sp1 ,lhs_mat_23_31_sp1 )); 4098__m512i iacc_mat_11_3_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_30_sp1 ,lhs_mat_23_30_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_31_sp1 ,lhs_mat_23_31_sp1 )); 4099 4100__m512i iacc_mat_00_4_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_40_sp1 ,lhs_mat_01_40_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_41_sp1 ,lhs_mat_01_41_sp1 )); 4101__m512i iacc_mat_01_4_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_40_sp1 ,lhs_mat_01_40_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_41_sp1 ,lhs_mat_01_41_sp1 )); 4102 4103__m512i iacc_mat_10_4_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_40_sp1 ,lhs_mat_23_40_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_41_sp1 ,lhs_mat_23_41_sp1 )); 4104__m512i iacc_mat_11_4_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_40_sp1 ,lhs_mat_23_40_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_41_sp1 ,lhs_mat_23_41_sp1 )); 4105 4106__m512i iacc_mat_00_5_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_50_sp1 ,lhs_mat_01_50_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_51_sp1 ,lhs_mat_01_51_sp1 )); 4107__m512i iacc_mat_01_5_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_50_sp1 ,lhs_mat_01_50_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_51_sp1 ,lhs_mat_01_51_sp1 )); 4108 4109__m512i iacc_mat_10_5_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_50_sp1 ,lhs_mat_23_50_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_51_sp1 ,lhs_mat_23_51_sp1 )); 4110__m512i iacc_mat_11_5_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_50_sp1 ,lhs_mat_23_50_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_51_sp1 ,lhs_mat_23_51_sp1 )); 4111 4112__m512i iacc_mat_00_6_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_60_sp1 ,lhs_mat_01_60_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_61_sp1 ,lhs_mat_01_61_sp1 )); 4113__m512i iacc_mat_01_6_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_60_sp1 ,lhs_mat_01_60_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_61_sp1 ,lhs_mat_01_61_sp1 )); 4114 4115__m512i iacc_mat_10_6_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_60_sp1 ,lhs_mat_23_60_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_61_sp1 ,lhs_mat_23_61_sp1 )); 4116__m512i iacc_mat_11_6_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_60_sp1 ,lhs_mat_23_60_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_61_sp1 ,lhs_mat_23_61_sp1 )); 4117 4118__m512i iacc_mat_00_7_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_70_sp1 ,lhs_mat_01_70_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_71_sp1 ,lhs_mat_01_71_sp1 )); 4119__m512i iacc_mat_01_7_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_70_sp1 ,lhs_mat_01_70_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_71_sp1 ,lhs_mat_01_71_sp1 )); 4120 4121__m512i iacc_mat_10_7_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_70_sp1 ,lhs_mat_23_70_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_71_sp1 ,lhs_mat_23_71_sp1 )); 4122__m512i iacc_mat_11_7_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_70_sp1 ,lhs_mat_23_70_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_71_sp1 ,lhs_mat_23_71_sp1 )); 4123 4124 4125__m512i iacc_mat_00_0_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_00_sp2 ,lhs_mat_01_00_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_01_sp2 ,lhs_mat_01_01_sp2 )); 4126__m512i iacc_mat_01_0_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_00_sp2 ,lhs_mat_01_00_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_01_sp2 ,lhs_mat_01_01_sp2 )); 4127 4128__m512i iacc_mat_10_0_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_00_sp2 ,lhs_mat_23_00_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_01_sp2 ,lhs_mat_23_01_sp2 )); 4129__m512i iacc_mat_11_0_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_00_sp2 ,lhs_mat_23_00_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_01_sp2 ,lhs_mat_23_01_sp2 )); 4130 4131__m512i iacc_mat_00_1_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_10_sp2 ,lhs_mat_01_10_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_11_sp2 ,lhs_mat_01_11_sp2 )); 4132__m512i iacc_mat_01_1_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_10_sp2 ,lhs_mat_01_10_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_11_sp2 ,lhs_mat_01_11_sp2 )); 4133 4134__m512i iacc_mat_10_1_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_10_sp2 ,lhs_mat_23_10_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_11_sp2 ,lhs_mat_23_11_sp2 )); 4135__m512i iacc_mat_11_1_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_10_sp2 ,lhs_mat_23_10_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_11_sp2 ,lhs_mat_23_11_sp2 )); 4136 4137__m512i iacc_mat_00_2_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_20_sp2 ,lhs_mat_01_20_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_21_sp2 ,lhs_mat_01_21_sp2 )); 4138__m512i iacc_mat_01_2_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_20_sp2 ,lhs_mat_01_20_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_21_sp2 ,lhs_mat_01_21_sp2 )); 4139 4140__m512i iacc_mat_10_2_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_20_sp2 ,lhs_mat_23_20_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_21_sp2 ,lhs_mat_23_21_sp2 )); 4141__m512i iacc_mat_11_2_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_20_sp2 ,lhs_mat_23_20_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_21_sp2 ,lhs_mat_23_21_sp2 )); 4142 4143__m512i iacc_mat_00_3_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_30_sp2 ,lhs_mat_01_30_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_31_sp2 ,lhs_mat_01_31_sp2 )); 4144__m512i iacc_mat_01_3_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_30_sp2 ,lhs_mat_01_30_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_31_sp2 ,lhs_mat_01_31_sp2 )); 4145 4146__m512i iacc_mat_10_3_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_30_sp2 ,lhs_mat_23_30_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_31_sp2 ,lhs_mat_23_31_sp2 )); 4147__m512i iacc_mat_11_3_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_30_sp2 ,lhs_mat_23_30_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_31_sp2 ,lhs_mat_23_31_sp2 )); 4148 4149__m512i iacc_mat_00_4_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_40_sp2 ,lhs_mat_01_40_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_41_sp2 ,lhs_mat_01_41_sp2 )); 4150__m512i iacc_mat_01_4_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_40_sp2 ,lhs_mat_01_40_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_41_sp2 ,lhs_mat_01_41_sp2 )); 4151 4152__m512i iacc_mat_10_4_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_40_sp2 ,lhs_mat_23_40_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_41_sp2 ,lhs_mat_23_41_sp2 )); 4153__m512i iacc_mat_11_4_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_40_sp2 ,lhs_mat_23_40_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_41_sp2 ,lhs_mat_23_41_sp2 )); 4154 4155__m512i iacc_mat_00_5_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_50_sp2 ,lhs_mat_01_50_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_51_sp2 ,lhs_mat_01_51_sp2 )); 4156__m512i iacc_mat_01_5_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_50_sp2 ,lhs_mat_01_50_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_51_sp2 ,lhs_mat_01_51_sp2 )); 4157 4158__m512i iacc_mat_10_5_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_50_sp2 ,lhs_mat_23_50_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_51_sp2 ,lhs_mat_23_51_sp2 )); 4159__m512i iacc_mat_11_5_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_50_sp2 ,lhs_mat_23_50_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_51_sp2 ,lhs_mat_23_51_sp2 )); 4160 4161__m512i iacc_mat_00_6_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_60_sp2 ,lhs_mat_01_60_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_61_sp2 ,lhs_mat_01_61_sp2 )); 4162__m512i iacc_mat_01_6_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_60_sp2 ,lhs_mat_01_60_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_61_sp2 ,lhs_mat_01_61_sp2 )); 4163 4164__m512i iacc_mat_10_6_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_60_sp2 ,lhs_mat_23_60_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_61_sp2 ,lhs_mat_23_61_sp2 )); 4165__m512i iacc_mat_11_6_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_60_sp2 ,lhs_mat_23_60_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_61_sp2 ,lhs_mat_23_61_sp2 )); 4166 4167__m512i iacc_mat_00_7_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_70_sp2 ,lhs_mat_01_70_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_71_sp2 ,lhs_mat_01_71_sp2 )); 4168__m512i iacc_mat_01_7_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_70_sp2 ,lhs_mat_01_70_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_71_sp2 ,lhs_mat_01_71_sp2 )); 4169 4170__m512i iacc_mat_10_7_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_70_sp2 ,lhs_mat_23_70_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_71_sp2 ,lhs_mat_23_71_sp2 )); 4171__m512i iacc_mat_11_7_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_70_sp2 ,lhs_mat_23_70_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_71_sp2 ,lhs_mat_23_71_sp2 )); 4172 4173// Combine results from both shuffle patterns for each output block 4174__m512i iacc_mat_00_0 = _mm512_add_epi16 (iacc_mat_00_0_sp1 ,iacc_mat_00_0_sp2 ); 4175__m512i iacc_mat_01_0 = _mm512_add_epi16 (iacc_mat_01_0_sp1 ,iacc_mat_01_0_sp2 ); 4176__m512i iacc_mat_10_0 = _mm512_add_epi16 (iacc_mat_10_0_sp1 ,iacc_mat_10_0_sp2 ); 4177__m512i iacc_mat_11_0 = _mm512_add_epi16 (iacc_mat_11_0_sp1 ,iacc_mat_11_0_sp2 ); 4178 4179__m512i iacc_mat_00_1 = _mm512_add_epi16 (iacc_mat_00_1_sp1 ,iacc_mat_00_1_sp2 ); 4180__m512i iacc_mat_01_1 = _mm512_add_epi16 (iacc_mat_01_1_sp1 ,iacc_mat_01_1_sp2 ); 4181__m512i iacc_mat_10_1 = _mm512_add_epi16 (iacc_mat_10_1_sp1 ,iacc_mat_10_1_sp2 ); 4182__m512i iacc_mat_11_1 = _mm512_add_epi16 (iacc_mat_11_1_sp1 ,iacc_mat_11_1_sp2 ); 4183 4184__m512i iacc_mat_00_2 = _mm512_add_epi16 (iacc_mat_00_2_sp1 ,iacc_mat_00_2_sp2 ); 4185__m512i iacc_mat_01_2 = _mm512_add_epi16 (iacc_mat_01_2_sp1 ,iacc_mat_01_2_sp2 ); 4186__m512i iacc_mat_10_2 = _mm512_add_epi16 (iacc_mat_10_2_sp1 ,iacc_mat_10_2_sp2 ); 4187__m512i iacc_mat_11_2 = _mm512_add_epi16 (iacc_mat_11_2_sp1 ,iacc_mat_11_2_sp2 ); 4188 4189__m512i iacc_mat_00_3 = _mm512_add_epi16 (iacc_mat_00_3_sp1 ,iacc_mat_00_3_sp2 ); 4190__m512i iacc_mat_01_3 = _mm512_add_epi16 (iacc_mat_01_3_sp1 ,iacc_mat_01_3_sp2 ); 4191__m512i iacc_mat_10_3 = _mm512_add_epi16 (iacc_mat_10_3_sp1 ,iacc_mat_10_3_sp2 ); 4192__m512i iacc_mat_11_3 = _mm512_add_epi16 (iacc_mat_11_3_sp1 ,iacc_mat_11_3_sp2 ); 4193 4194__m512i iacc_mat_00_4 = _mm512_add_epi16 (iacc_mat_00_4_sp1 ,iacc_mat_00_4_sp2 ); 4195__m512i iacc_mat_01_4 = _mm512_add_epi16 (iacc_mat_01_4_sp1 ,iacc_mat_01_4_sp2 ); 4196__m512i iacc_mat_10_4 = _mm512_add_epi16 (iacc_mat_10_4_sp1 ,iacc_mat_10_4_sp2 ); 4197__m512i iacc_mat_11_4 = _mm512_add_epi16 (iacc_mat_11_4_sp1 ,iacc_mat_11_4_sp2 ); 4198 4199__m512i iacc_mat_00_5 = _mm512_add_epi16 (iacc_mat_00_5_sp1 ,iacc_mat_00_5_sp2 ); 4200__m512i iacc_mat_01_5 = _mm512_add_epi16 (iacc_mat_01_5_sp1 ,iacc_mat_01_5_sp2 ); 4201__m512i iacc_mat_10_5 = _mm512_add_epi16 (iacc_mat_10_5_sp1 ,iacc_mat_10_5_sp2 ); 4202__m512i iacc_mat_11_5 = _mm512_add_epi16 (iacc_mat_11_5_sp1 ,iacc_mat_11_5_sp2 ); 4203 4204__m512i iacc_mat_00_6 = _mm512_add_epi16 (iacc_mat_00_6_sp1 ,iacc_mat_00_6_sp2 ); 4205__m512i iacc_mat_01_6 = _mm512_add_epi16 (iacc_mat_01_6_sp1 ,iacc_mat_01_6_sp2 ); 4206__m512i iacc_mat_10_6 = _mm512_add_epi16 (iacc_mat_10_6_sp1 ,iacc_mat_10_6_sp2 ); 4207__m512i iacc_mat_11_6 = _mm512_add_epi16 (iacc_mat_11_6_sp1 ,iacc_mat_11_6_sp2 ); 4208 4209__m512i iacc_mat_00_7 = _mm512_add_epi16 (iacc_mat_00_7_sp1 ,iacc_mat_00_7_sp2 ); 4210__m512i iacc_mat_01_7 = _mm512_add_epi16 (iacc_mat_01_7_sp1 ,iacc_mat_01_7_sp2 ); 4211__m512i iacc_mat_10_7 = _mm512_add_epi16 (iacc_mat_10_7_sp1 ,iacc_mat_10_7_sp2 ); 4212__m512i iacc_mat_11_7 = _mm512_add_epi16 (iacc_mat_11_7_sp1 ,iacc_mat_11_7_sp2 ); 4213 4214// Output of both shuffle patterns are added in order to sum dot product outputs of all 32 values in block 4215iacc_mat_00_0 = _mm512_madd_epi16 (iacc_mat_00_0 ,scale_014589CD_0 ); 4216iacc_mat_01_0 = _mm512_madd_epi16 (iacc_mat_01_0 ,scale_2367ABEF_0 ); 4217iacc_mat_10_0 = _mm512_madd_epi16 (iacc_mat_10_0 ,scale_014589CD_0 ); 4218iacc_mat_11_0 = _mm512_madd_epi16 (iacc_mat_11_0 ,scale_2367ABEF_0 ); 4219 4220iacc_mat_00_1 = _mm512_madd_epi16 (iacc_mat_00_1 ,scale_014589CD_1 ); 4221iacc_mat_01_1 = _mm512_madd_epi16 (iacc_mat_01_1 ,scale_2367ABEF_1 ); 4222iacc_mat_10_1 = _mm512_madd_epi16 (iacc_mat_10_1 ,scale_014589CD_1 ); 4223iacc_mat_11_1 = _mm512_madd_epi16 (iacc_mat_11_1 ,scale_2367ABEF_1 ); 4224 4225iacc_mat_00_2 = _mm512_madd_epi16 (iacc_mat_00_2 ,scale_014589CD_2 ); 4226iacc_mat_01_2 = _mm512_madd_epi16 (iacc_mat_01_2 ,scale_2367ABEF_2 ); 4227iacc_mat_10_2 = _mm512_madd_epi16 (iacc_mat_10_2 ,scale_014589CD_2 ); 4228iacc_mat_11_2 = _mm512_madd_epi16 (iacc_mat_11_2 ,scale_2367ABEF_2 ); 4229 4230iacc_mat_00_3 = _mm512_madd_epi16 (iacc_mat_00_3 ,scale_014589CD_3 ); 4231iacc_mat_01_3 = _mm512_madd_epi16 (iacc_mat_01_3 ,scale_2367ABEF_3 ); 4232iacc_mat_10_3 = _mm512_madd_epi16 (iacc_mat_10_3 ,scale_014589CD_3 ); 4233iacc_mat_11_3 = _mm512_madd_epi16 (iacc_mat_11_3 ,scale_2367ABEF_3 ); 4234 4235iacc_mat_00_4 = _mm512_madd_epi16 (iacc_mat_00_4 ,scale_014589CD_4 ); 4236iacc_mat_01_4 = _mm512_madd_epi16 (iacc_mat_01_4 ,scale_2367ABEF_4 ); 4237iacc_mat_10_4 = _mm512_madd_epi16 (iacc_mat_10_4 ,scale_014589CD_4 ); 4238iacc_mat_11_4 = _mm512_madd_epi16 (iacc_mat_11_4 ,scale_2367ABEF_4 ); 4239 4240iacc_mat_00_5 = _mm512_madd_epi16 (iacc_mat_00_5 ,scale_014589CD_5 ); 4241iacc_mat_01_5 = _mm512_madd_epi16 (iacc_mat_01_5 ,scale_2367ABEF_5 ); 4242iacc_mat_10_5 = _mm512_madd_epi16 (iacc_mat_10_5 ,scale_014589CD_5 ); 4243iacc_mat_11_5 = _mm512_madd_epi16 (iacc_mat_11_5 ,scale_2367ABEF_5 ); 4244 4245iacc_mat_00_6 = _mm512_madd_epi16 (iacc_mat_00_6 ,scale_014589CD_6 ); 4246iacc_mat_01_6 = _mm512_madd_epi16 (iacc_mat_01_6 ,scale_2367ABEF_6 ); 4247iacc_mat_10_6 = _mm512_madd_epi16 (iacc_mat_10_6 ,scale_014589CD_6 ); 4248iacc_mat_11_6 = _mm512_madd_epi16 (iacc_mat_11_6 ,scale_2367ABEF_6 ); 4249 4250iacc_mat_00_7 = _mm512_madd_epi16 (iacc_mat_00_7 ,scale_014589CD_7 ); 4251iacc_mat_01_7 = _mm512_madd_epi16 (iacc_mat_01_7 ,scale_2367ABEF_7 ); 4252iacc_mat_10_7 = _mm512_madd_epi16 (iacc_mat_10_7 ,scale_014589CD_7 ); 4253iacc_mat_11_7 = _mm512_madd_epi16 (iacc_mat_11_7 ,scale_2367ABEF_7 ); 4254 4255__m512i iacc_mat_00 = _mm512_add_epi32 (_mm512_add_epi32 (_mm512_add_epi32 (iacc_mat_00_0 ,iacc_mat_00_1 ),_mm512_add_epi32 (iacc_mat_00_2 ,iacc_mat_00_3 )),_mm512_add_epi32 (_mm512_add_epi32 (iacc_mat_00_4 ,iacc_mat_00_5 ),_mm512_add_epi32 (iacc_mat_00_6 ,iacc_mat_00_7 ))); 4256__m512i iacc_mat_01 = _mm512_add_epi32 (_mm512_add_epi32 (_mm512_add_epi32 (iacc_mat_01_0 ,iacc_mat_01_1 ),_mm512_add_epi32 (iacc_mat_01_2 ,iacc_mat_01_3 )),_mm512_add_epi32 (_mm512_add_epi32 (iacc_mat_01_4 ,iacc_mat_01_5 ),_mm512_add_epi32 (iacc_mat_01_6 ,iacc_mat_01_7 ))); 4257__m512i iacc_mat_10 = _mm512_add_epi32 (_mm512_add_epi32 (_mm512_add_epi32 (iacc_mat_10_0 ,iacc_mat_10_1 ),_mm512_add_epi32 (iacc_mat_10_2 ,iacc_mat_10_3 )),_mm512_add_epi32 (_mm512_add_epi32 (iacc_mat_10_4 ,iacc_mat_10_5 ),_mm512_add_epi32 (iacc_mat_10_6 ,iacc_mat_10_7 ))); 4258__m512i iacc_mat_11 = _mm512_add_epi32 (_mm512_add_epi32 (_mm512_add_epi32 (iacc_mat_11_0 ,iacc_mat_11_1 ),_mm512_add_epi32 (iacc_mat_11_2 ,iacc_mat_11_3 )),_mm512_add_epi32 (_mm512_add_epi32 (iacc_mat_11_4 ,iacc_mat_11_5 ),_mm512_add_epi32 (iacc_mat_11_6 ,iacc_mat_11_7 ))); 4259 4260// Straighten out to make 4 row vectors 4261__m512i iacc_row_0 = _mm512_mask_blend_epi32 (0xCCCC ,iacc_mat_00 ,_mm512_shuffle_epi32 (iacc_mat_01 , (_MM_PERM_ENUM )78 )); 4262__m512i iacc_row_1 = _mm512_mask_blend_epi32 (0xCCCC ,_mm512_shuffle_epi32 (iacc_mat_00 , (_MM_PERM_ENUM )78 ),iacc_mat_01 ); 4263__m512i iacc_row_2 = _mm512_mask_blend_epi32 (0xCCCC ,iacc_mat_10 ,_mm512_shuffle_epi32 (iacc_mat_11 , (_MM_PERM_ENUM )78 )); 4264__m512i iacc_row_3 = _mm512_mask_blend_epi32 (0xCCCC ,_mm512_shuffle_epi32 (iacc_mat_10 , (_MM_PERM_ENUM )78 ),iacc_mat_11 ); 4265 4266// Load the scale(d) values for all the 4 Q8_k blocks and repeat it across lanes 4267const __m128 row_scale_f32_sse = _mm_load_ps (a_ptrs [rp ][b ].d ); 4268const __m256 row_scale_f32_ymm = _mm256_set_m128 (row_scale_f32_sse ,row_scale_f32_sse ); 4269const __m512 row_scale_f32 = _mm512_insertf32x8 (_mm512_castps256_ps512 (row_scale_f32_ymm ),row_scale_f32_ymm ,1 ); 4270 4271// Multiply with appropriate scales and accumulate (for both d and dmin) below 4272acc_rows [rp * 4 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_0 ),_mm512_mul_ps (col_scale_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,0 )),acc_rows [rp * 4 ]); 4273acc_rows [rp * 4 + 1 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_1 ),_mm512_mul_ps (col_scale_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,85 )),acc_rows [rp * 4 + 1 ]); 4274acc_rows [rp * 4 + 2 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_2 ),_mm512_mul_ps (col_scale_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,170 )),acc_rows [rp * 4 + 2 ]); 4275acc_rows [rp * 4 + 3 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_3 ),_mm512_mul_ps (col_scale_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,255 )),acc_rows [rp * 4 + 3 ]); 4276 4277// Take two bsums from two Q8_Ks at a time and multiply with corresponding mins values from each Q2_K 4278__m512i iacc_row_min_0_01 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_01_0123 , (_MM_PERM_ENUM )0 ),mins_01 ); 4279__m512i iacc_row_min_1_01 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_01_0123 , (_MM_PERM_ENUM )170 ),mins_01 ); 4280__m512i iacc_row_min_2_01 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_23_0123 , (_MM_PERM_ENUM )0 ),mins_01 ); 4281__m512i iacc_row_min_3_01 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_23_0123 , (_MM_PERM_ENUM )170 ),mins_01 ); 4282 4283__m512i iacc_row_min_0_23 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_01_0123 , (_MM_PERM_ENUM )85 ),mins_23 ); 4284__m512i iacc_row_min_1_23 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_01_0123 , (_MM_PERM_ENUM )255 ),mins_23 ); 4285__m512i iacc_row_min_2_23 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_23_0123 , (_MM_PERM_ENUM )85 ),mins_23 ); 4286__m512i iacc_row_min_3_23 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_23_0123 , (_MM_PERM_ENUM )255 ),mins_23 ); 4287 4288__m512i iacc_row_min_0_45 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_01_4567 , (_MM_PERM_ENUM )0 ),mins_45 ); 4289__m512i iacc_row_min_1_45 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_01_4567 , (_MM_PERM_ENUM )170 ),mins_45 ); 4290__m512i iacc_row_min_2_45 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_23_4567 , (_MM_PERM_ENUM )0 ),mins_45 ); 4291__m512i iacc_row_min_3_45 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_23_4567 , (_MM_PERM_ENUM )170 ),mins_45 ); 4292 4293__m512i iacc_row_min_0_67 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_01_4567 , (_MM_PERM_ENUM )85 ),mins_67 ); 4294__m512i iacc_row_min_1_67 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_01_4567 , (_MM_PERM_ENUM )255 ),mins_67 ); 4295__m512i iacc_row_min_2_67 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_23_4567 , (_MM_PERM_ENUM )85 ),mins_67 ); 4296__m512i iacc_row_min_3_67 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_23_4567 , (_MM_PERM_ENUM )255 ),mins_67 ); 4297 4298__m512i iacc_row_min_0 = _mm512_add_epi32 (_mm512_add_epi32 (iacc_row_min_0_01 ,iacc_row_min_0_23 ),_mm512_add_epi32 (iacc_row_min_0_45 ,iacc_row_min_0_67 )); 4299__m512i iacc_row_min_1 = _mm512_add_epi32 (_mm512_add_epi32 (iacc_row_min_1_01 ,iacc_row_min_1_23 ),_mm512_add_epi32 (iacc_row_min_1_45 ,iacc_row_min_1_67 )); 4300__m512i iacc_row_min_2 = _mm512_add_epi32 (_mm512_add_epi32 (iacc_row_min_2_01 ,iacc_row_min_2_23 ),_mm512_add_epi32 (iacc_row_min_2_45 ,iacc_row_min_2_67 )); 4301__m512i iacc_row_min_3 = _mm512_add_epi32 (_mm512_add_epi32 (iacc_row_min_3_01 ,iacc_row_min_3_23 ),_mm512_add_epi32 (iacc_row_min_3_45 ,iacc_row_min_3_67 )); 4302 4303acc_min_rows [rp * 4 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_min_0 ),_mm512_mul_ps (col_dmin_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,0 )),acc_min_rows [rp * 4 ]); 4304acc_min_rows [rp * 4 + 1 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_min_1 ),_mm512_mul_ps (col_dmin_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,85 )),acc_min_rows [rp * 4 + 1 ]); 4305acc_min_rows [rp * 4 + 2 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_min_2 ),_mm512_mul_ps (col_dmin_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,170 )),acc_min_rows [rp * 4 + 2 ]); 4306acc_min_rows [rp * 4 + 3 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_min_3 ),_mm512_mul_ps (col_dmin_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,255 )),acc_min_rows [rp * 4 + 3 ]); 4307 } 4308 } 4309 } 4310// Store the accumulated values 4311for (int i = 0 ;i < 16 ;i ++ ) { 4312_mm512_storeu_ps ((float * )(s + ((y * 4 + i )* bs + x * 8 )),_mm512_sub_ps (acc_rows [i ],acc_min_rows [i ])); 4313 } 4314 } 4315 } 4316 4317for (;y < nr /4 ;y ++ ) { 4318 4319const block_q8_Kx4 * a_ptr = a_ptr_start + (y * nb ); 4320 4321// Take group of eight block_q2_kx8 structures at each pass of the loop and perform dot product operation 4322for (int64_t x = 0 ;x < anc /8 ;x += 2 ) { 4323 4324const block_q2_Kx8 * b_ptr_0 = b_ptr_start + ((x )* b_nb ); 4325const block_q2_Kx8 * b_ptr_1 = b_ptr_start + ((x + 1 )* b_nb ); 4326 4327// Master FP accumulators 4328__m512 acc_rows [4 ]; 4329for (int i = 0 ;i < 4 ;i ++ ) { 4330acc_rows [i ]= _mm512_setzero_ps (); 4331 } 4332 4333__m512 acc_min_rows [4 ]; 4334for (int i = 0 ;i < 4 ;i ++ ) { 4335acc_min_rows [i ]= _mm512_setzero_ps (); 4336 } 4337// For super block 4338for (int64_t b = 0 ;b < nb ;b ++ ) { 4339// Delta values - Load the sixteen scale values from two block_q2_kx8 structures 4340const __m512 col_scale_f32 = GGML_F32Cx8x2_LOAD (b_ptr_0 [b ].d ,b_ptr_1 [b ].d ); 4341 4342// dmin values - Load the sixteen dmin values from two block_q2_kx8 structures 4343const __m512 col_dmin_f32 = GGML_F32Cx8x2_LOAD (b_ptr_0 [b ].dmin ,b_ptr_1 [b ].dmin ); 4344 4345// Loop to iterate over the sixteen sub blocks of a super block - eight sub blocks are processed per iteration 4346for (int sb = 0 ;sb < QK_K /128 ;sb ++ ) { 4347 4348// Load the eight block_q2_k for eight sub blocks quantized values interleaved with each other in chunks of eight bytes - B0,B1 ....B6,B7 4349const __m256i rhs_raw_mat_0123_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + sb * 256 )); 4350const __m256i rhs_raw_mat_4567_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + 32 + sb * 256 )); 4351const __m256i rhs_raw_mat_0123_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + 64 + sb * 256 )); 4352const __m256i rhs_raw_mat_4567_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + 96 + sb * 256 )); 4353const __m256i rhs_raw_mat_0123_2 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + 128 + sb * 256 )); 4354const __m256i rhs_raw_mat_4567_2 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + 160 + sb * 256 )); 4355const __m256i rhs_raw_mat_0123_3 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + 192 + sb * 256 )); 4356const __m256i rhs_raw_mat_4567_3 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_0 [b ].qs + 224 + sb * 256 )); 4357 4358const __m256i rhs_raw_mat_89AB_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + sb * 256 )); 4359const __m256i rhs_raw_mat_CDEF_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + 32 + sb * 256 )); 4360const __m256i rhs_raw_mat_89AB_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + 64 + sb * 256 )); 4361const __m256i rhs_raw_mat_CDEF_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + 96 + sb * 256 )); 4362const __m256i rhs_raw_mat_89AB_2 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + 128 + sb * 256 )); 4363const __m256i rhs_raw_mat_CDEF_2 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + 160 + sb * 256 )); 4364const __m256i rhs_raw_mat_89AB_3 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + 192 + sb * 256 )); 4365const __m256i rhs_raw_mat_CDEF_3 = _mm256_loadu_si256 ((const __m256i * )(b_ptr_1 [b ].qs + 224 + sb * 256 )); 4366 4367const __m256i rhs_raw_mat_0145_0 = _mm256_blend_epi32 (rhs_raw_mat_0123_0 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_0 ,requiredOrder ),240 ); 4368const __m256i rhs_raw_mat_2367_0 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_0 ,requiredOrder ),rhs_raw_mat_4567_0 ,240 ); 4369const __m256i rhs_raw_mat_0145_1 = _mm256_blend_epi32 (rhs_raw_mat_0123_1 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_1 ,requiredOrder ),240 ); 4370const __m256i rhs_raw_mat_2367_1 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_1 ,requiredOrder ),rhs_raw_mat_4567_1 ,240 ); 4371const __m256i rhs_raw_mat_0145_2 = _mm256_blend_epi32 (rhs_raw_mat_0123_2 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_2 ,requiredOrder ),240 ); 4372const __m256i rhs_raw_mat_2367_2 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_2 ,requiredOrder ),rhs_raw_mat_4567_2 ,240 ); 4373const __m256i rhs_raw_mat_0145_3 = _mm256_blend_epi32 (rhs_raw_mat_0123_3 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_3 ,requiredOrder ),240 ); 4374const __m256i rhs_raw_mat_2367_3 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_3 ,requiredOrder ),rhs_raw_mat_4567_3 ,240 ); 4375 4376const __m256i rhs_raw_mat_89CD_0 = _mm256_blend_epi32 (rhs_raw_mat_89AB_0 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_CDEF_0 ,requiredOrder ),240 ); 4377const __m256i rhs_raw_mat_ABEF_0 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_89AB_0 ,requiredOrder ),rhs_raw_mat_CDEF_0 ,240 ); 4378const __m256i rhs_raw_mat_89CD_1 = _mm256_blend_epi32 (rhs_raw_mat_89AB_1 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_CDEF_1 ,requiredOrder ),240 ); 4379const __m256i rhs_raw_mat_ABEF_1 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_89AB_1 ,requiredOrder ),rhs_raw_mat_CDEF_1 ,240 ); 4380const __m256i rhs_raw_mat_89CD_2 = _mm256_blend_epi32 (rhs_raw_mat_89AB_2 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_CDEF_2 ,requiredOrder ),240 ); 4381const __m256i rhs_raw_mat_ABEF_2 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_89AB_2 ,requiredOrder ),rhs_raw_mat_CDEF_2 ,240 ); 4382const __m256i rhs_raw_mat_89CD_3 = _mm256_blend_epi32 (rhs_raw_mat_89AB_3 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_CDEF_3 ,requiredOrder ),240 ); 4383const __m256i rhs_raw_mat_ABEF_3 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_89AB_3 ,requiredOrder ),rhs_raw_mat_CDEF_3 ,240 ); 4384 4385const __m512i rhs_raw_mat_014589CD_0 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_0145_0 ),rhs_raw_mat_89CD_0 ,1 ); 4386const __m512i rhs_raw_mat_2367ABEF_0 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_2367_0 ),rhs_raw_mat_ABEF_0 ,1 ); 4387const __m512i rhs_raw_mat_014589CD_1 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_0145_1 ),rhs_raw_mat_89CD_1 ,1 ); 4388const __m512i rhs_raw_mat_2367ABEF_1 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_2367_1 ),rhs_raw_mat_ABEF_1 ,1 ); 4389 4390const __m512i rhs_raw_mat_014589CD_2 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_0145_2 ),rhs_raw_mat_89CD_2 ,1 ); 4391const __m512i rhs_raw_mat_2367ABEF_2 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_2367_2 ),rhs_raw_mat_ABEF_2 ,1 ); 4392const __m512i rhs_raw_mat_014589CD_3 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_0145_3 ),rhs_raw_mat_89CD_3 ,1 ); 4393const __m512i rhs_raw_mat_2367ABEF_3 = _mm512_inserti32x8 (_mm512_castsi256_si512 (rhs_raw_mat_2367_3 ),rhs_raw_mat_ABEF_3 ,1 ); 4394 4395//2-bit -> 8-bit 4396const __m512i rhs_mat_014589CD_00 = _mm512_and_si512 (rhs_raw_mat_014589CD_0 ,m3bexpanded );//B00(0-7) B01(0-7) B04(0-7) B05(0-7) B08(0-7) B09(0-7) B0C(0-7) B0D(0-7) 4397const __m512i rhs_mat_2367ABEF_00 = _mm512_and_si512 (rhs_raw_mat_2367ABEF_0 ,m3bexpanded );//B02(0-7) B03(0-7) B06(0-7) B07(0-7) B0A(0-7) B0B(0-7) B0E(0-7) B0F(0-7) 4398const __m512i rhs_mat_014589CD_01 = _mm512_and_si512 (rhs_raw_mat_014589CD_1 ,m3bexpanded );//B00(8-15) B01(8-15) B04(8-15) B05(8-15) B08(8-15) B09(8-15) B0C(8-15) B0D(8-15) 4399const __m512i rhs_mat_2367ABEF_01 = _mm512_and_si512 (rhs_raw_mat_2367ABEF_1 ,m3bexpanded );//B02(8-15) B03(8-15) B06(8-15) B07(8-15) B0A(8-15) B0B(8-15) B0E(8-15) B0F(8-15) 4400const __m512i rhs_mat_014589CD_10 = _mm512_and_si512 (rhs_raw_mat_014589CD_2 ,m3bexpanded );//B10(0-7) B11(0-7) B14(0-7) B15(0-7) B18(0-7) B19(0-7) B1C(0-7) B1D(0-7) 4401const __m512i rhs_mat_2367ABEF_10 = _mm512_and_si512 (rhs_raw_mat_2367ABEF_2 ,m3bexpanded );//B12(0-7) B13(0-7) B16(0-7) B17(0-7) B1A(0-7) B1B(0-7) B1E(0-7) B1F(0-7) 4402const __m512i rhs_mat_014589CD_11 = _mm512_and_si512 (rhs_raw_mat_014589CD_3 ,m3bexpanded );//B10(8-15) B11(8-15) B14(8-15) B15(8-15) B18(8-15) B19(8-15) B1C(8-15) B1D(8-15) 4403const __m512i rhs_mat_2367ABEF_11 = _mm512_and_si512 (rhs_raw_mat_2367ABEF_3 ,m3bexpanded );//B12(8-15) B13(8-15) B16(8-15) B17(8-15) B1A(8-15) B1B(8-15) B1E(8-15) B1F(8-15) 4404 4405const __m512i rhs_mat_014589CD_20 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_014589CD_0 ,2 ),m3bexpanded );//B20(0-7) B21(0-7) B24(0-7) B25(0-7) B28(0-7) B29(0-7) B2C(0-7) B2D(0-7) 4406const __m512i rhs_mat_2367ABEF_20 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_2367ABEF_0 ,2 ),m3bexpanded );//B22(0-7) B23(0-7) B26(0-7) B27(0-7) B2A(0-7) B2B(0-7) B2E(0-7) B2F(0-7) 4407 4408const __m512i rhs_mat_014589CD_21 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_014589CD_1 ,2 ),m3bexpanded );//B20(8-15) B21(8-15) B24(8-15) B25(8-15) B28(8-15) B29(8-15) B2C(8-15) B2D(8-15) 4409const __m512i rhs_mat_2367ABEF_21 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_2367ABEF_1 ,2 ),m3bexpanded );//B22(8-15) B23(8-15) B26(8-15) B27(8-15) B2A(8-15) B2B(8-15) B2E(8-15) B2F(8-15) 4410 4411const __m512i rhs_mat_014589CD_30 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_014589CD_2 ,2 ),m3bexpanded );//B30(0-7) B31(0-7) B34(0-7) B35(0-7) B38(0-7) B39(0-7) B3C(0-7) B3D(0-7) 4412const __m512i rhs_mat_2367ABEF_30 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_2367ABEF_2 ,2 ),m3bexpanded );//B32(0-7) B33(0-7) B36(0-7) B37(0-7) B3A(0-7) B3B(0-7) B3E(0-7) B3F(0-7) 4413 4414const __m512i rhs_mat_014589CD_31 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_014589CD_3 ,2 ),m3bexpanded );//B30(8-15) B31(8-15) B34(8-15) B35(8-15) B38(8-15) B39(8-15) B3C(8-15) B3D(8-15) 4415const __m512i rhs_mat_2367ABEF_31 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_2367ABEF_3 ,2 ),m3bexpanded );//B32(8-15) B33(8-15) B36(8-15) B37(8-15) B3A(8-15) B3B(8-15) B3E(8-15) B3F(8-15) 4416 4417const __m512i rhs_mat_014589CD_40 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_014589CD_0 ,4 ),m3bexpanded );//B40(0-7) B41(0-7) B44(0-7) B45(0-7) B48(0-7) B49(0-7) B4C(0-7) B4D(0-7) 4418const __m512i rhs_mat_2367ABEF_40 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_2367ABEF_0 ,4 ),m3bexpanded );//B42(0-7) B43(0-7) B46(0-7) B47(0-7) B4A(0-7) B4B(0-7) B4E(0-7) B4F(0-7) 4419 4420const __m512i rhs_mat_014589CD_41 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_014589CD_1 ,4 ),m3bexpanded );//B40(8-15) B41(8-15) B44(8-15) B45(8-15) B48(8-15) B49(8-15) B4C(8-15) B4D(8-15) 4421const __m512i rhs_mat_2367ABEF_41 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_2367ABEF_1 ,4 ),m3bexpanded );//B42(8-15) B43(8-15) B46(8-15) B47(8-15) B4A(8-15) B4B(8-15) B4E(8-15) B4F(8-15) 4422 4423const __m512i rhs_mat_014589CD_50 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_014589CD_2 ,4 ),m3bexpanded );//B50(0-7) B51(0-7) B54(0-7) B55(0-7) B58(0-7) B59(0-7) B5C(0-7) B5D(0-7) 4424const __m512i rhs_mat_2367ABEF_50 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_2367ABEF_2 ,4 ),m3bexpanded );//B52(0-7) B53(0-7) B56(0-7) B57(0-7) B5A(0-7) B5B(0-7) B5E(0-7) B5F(0-7) 4425 4426const __m512i rhs_mat_014589CD_51 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_014589CD_3 ,4 ),m3bexpanded );//B50(8-15) B51(8-15) B54(8-15) B55(8-15) B58(8-15) B59(8-15) B5C(8-15) B5D(8-15) 4427const __m512i rhs_mat_2367ABEF_51 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_2367ABEF_3 ,4 ),m3bexpanded );//B52(8-15) B53(8-15) B56(8-15) B57(8-15) B5A(8-15) B5B(8-15) B5E(8-15) B5F(8-15) 4428 4429const __m512i rhs_mat_014589CD_60 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_014589CD_0 ,6 ),m3bexpanded );//B60(0-7) B61(0-7) B64(0-7) B65(0-7) B68(0-7) B69(0-7) B6C(0-7) B6D(0-7) 4430const __m512i rhs_mat_2367ABEF_60 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_2367ABEF_0 ,6 ),m3bexpanded );//B62(0-7) B63(0-7) B66(0-7) B67(0-7) B6A(0-7) B6B(0-7) B6E(0-7) B6F(0-7) 4431 4432const __m512i rhs_mat_014589CD_61 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_014589CD_1 ,6 ),m3bexpanded );//B60(8-15) B61(8-15) B64(8-15) B65(8-15) B68(8-15) B69(8-15) B6C(8-15) B6D(8-15) 4433const __m512i rhs_mat_2367ABEF_61 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_2367ABEF_1 ,6 ),m3bexpanded );//B62(8-15) B63(8-15) B66(8-15) B67(8-15) B6A(8-15) B6B(8-15) B6E(8-15) B6F(8-15) 4434 4435const __m512i rhs_mat_014589CD_70 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_014589CD_2 ,6 ),m3bexpanded );//B70(0-7) B71(0-7) B74(0-7) B75(0-7) B78(0-7) B79(0-7) B7C(0-7) B7D(0-7) 4436const __m512i rhs_mat_2367ABEF_70 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_2367ABEF_2 ,6 ),m3bexpanded );//B72(0-7) B73(0-7) B76(0-7) B77(0-7) B7A(0-7) B7B(0-7) B7E(0-7) B7F(0-7) 4437 4438const __m512i rhs_mat_014589CD_71 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_014589CD_3 ,6 ),m3bexpanded );//B70(8-15) B71(8-15) B74(8-15) B75(8-15) B78(8-15) B79(8-15) B7C(8-15) B7D(8-15) 4439const __m512i rhs_mat_2367ABEF_71 = _mm512_and_si512 (_mm512_srli_epi16 (rhs_raw_mat_2367ABEF_3 ,6 ),m3bexpanded );//B72(8-15) B73(8-15) B76(8-15) B77(8-15) B7A(8-15) B7B(8-15) B7E(8-15) B7F(8-15) 4440 4441const __m512i rhs_mat_014589CD_00_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_00 , (_MM_PERM_ENUM )136 );//B00(0-3) B01(0-3) B00(0-3) B01(0-3) B04(0-3) B05(0-3) B04(0-3) B05(0-3) B08(0-3) B09(0-3) B08(0-3) B09(0-3) B0C(0-3) B0D(0-3) B0C(0-3) B0D(0-3) 4442const __m512i rhs_mat_2367ABEF_00_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_00 , (_MM_PERM_ENUM )136 );//B02(0-3) B03(0-3) B02(0-3) B03(0-3) B06(0-3) B07(0-3) B06(0-3) B07(0-3) B0A(0-3) B0B(0-3) B0A(0-3) B0B(0-3) B0E(0-3) B0F(0-3) B0E(0-3) B0F(0-3) 4443 4444const __m512i rhs_mat_014589CD_01_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_01 , (_MM_PERM_ENUM )136 );//B00(8-11) B01(8-11) B00(8-11) B01(8-11) B04(8-11) B05(8-11) B04(8-11) B05(8-11) B08(8-11) B09(8-11) B08(8-11) B09(8-11) B0C(8-11) B0D(8-11) B0C(8-11) B0D(8-11) 4445const __m512i rhs_mat_2367ABEF_01_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_01 , (_MM_PERM_ENUM )136 );//B02(8-11) B03(8-11) B02(8-11) B03(8-11) B06(8-11) B07(8-11) B06(8-11) B07(8-11) B0A(8-11) B0B(8-11) B0A(8-11) B0B(8-11) B0E(8-11) B0F(8-11) B0E(8-11) B0F(8-11) 4446 4447const __m512i rhs_mat_014589CD_10_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_10 , (_MM_PERM_ENUM )136 );//B10(0-3) B11(0-3) B10(0-3) B11(0-3) B14(0-3) B15(0-3) B14(0-3) B15(0-3) B18(0-3) B19(0-3) B18(0-3) B19(0-3) B1C(0-3) B1D(0-3) B1C(0-3) B1D(0-3) 4448const __m512i rhs_mat_2367ABEF_10_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_10 , (_MM_PERM_ENUM )136 );//B12(0-3) B13(0-3) B12(0-3) B13(0-3) B16(0-3) B17(0-3) B16(0-3) B17(0-3) B1A(0-3) B1B(0-3) B1A(0-3) B1B(0-3) B1E(0-3) B1F(0-3) B1E(0-3) B1F(0-3) 4449 4450const __m512i rhs_mat_014589CD_11_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_11 , (_MM_PERM_ENUM )136 );//B10(8-11) B11(8-11) B10(8-11) B11(8-11) B14(8-11) B15(8-11) B14(8-11) B15(8-11) B18(8-11) B19(8-11) B18(8-11) B19(8-11) B1C(8-11) B1D(8-11) B1C(8-11) B1D(8-11) 4451const __m512i rhs_mat_2367ABEF_11_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_11 , (_MM_PERM_ENUM )136 );//B12(8-11) B13(8-11) B12(8-11) B13(8-11) B16(8-11) B17(8-11) B16(8-11) B17(8-11) B1A(8-11) B1B(8-11) B1A(8-11) B1B(8-11) B1E(8-11) B1F(8-11) B1E(8-11) B1F(8-11) 4452 4453const __m512i rhs_mat_014589CD_20_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_20 , (_MM_PERM_ENUM )136 );//B20(0-3) B21(0-3) B20(0-3) B21(0-3) B24(0-3) B25(0-3) B24(0-3) B25(0-3) B28(0-3) B29(0-3) B28(0-3) B29(0-3) B2C(0-3) B2D(0-3) B2C(0-3) B2D(0-3) 4454const __m512i rhs_mat_2367ABEF_20_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_20 , (_MM_PERM_ENUM )136 );//B22(0-3) B23(0-3) B22(0-3) B23(0-3) B26(0-3) B27(0-3) B26(0-3) B27(0-3) B2A(0-3) B2B(0-3) B2A(0-3) B2B(0-3) B2E(0-3) B2F(0-3) B2E(0-3) B2F(0-3) 4455 4456const __m512i rhs_mat_014589CD_21_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_21 , (_MM_PERM_ENUM )136 );//B20(8-11) B21(8-11) B20(8-11) B21(8-11) B24(8-11) B25(8-11) B24(8-11) B25(8-11) B28(8-11) B29(8-11) B28(8-11) B29(8-11) B2C(8-11) B2D(8-11) B2C(8-11) B2D(8-11) 4457const __m512i rhs_mat_2367ABEF_21_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_21 , (_MM_PERM_ENUM )136 );//B22(8-11) B23(8-11) B22(8-11) B23(8-11) B26(8-11) B27(8-11) B26(8-11) B27(8-11) B2A(8-11) B2B(8-11) B2A(8-11) B2B(8-11) B2E(8-11) B2F(8-11) B2E(8-11) B2F(8-11) 4458const __m512i rhs_mat_014589CD_30_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_30 , (_MM_PERM_ENUM )136 );///B30(0-3) B31(0-3) B30(0-3) B31(0-3) B34(0-3) B35(0-3) B34(0-3) B35(0-3) B38(0-3) B39(0-3) B38(0-3) B39(0-3) B3C(0-3) B3D(0-3) B3C(0-3) B3D(0-3) 4459const __m512i rhs_mat_2367ABEF_30_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_30 , (_MM_PERM_ENUM )136 );//B32(0-3) B33(0-3) B32(0-3) B33(0-3) B36(0-3) B37(0-3) B36(0-3) B37(0-3) B3A(0-3) B3B(0-3) B3A(0-3) B3B(0-3) B3E(0-3) B3F(0-3) B3E(0-3) B3F(0-3) 4460 4461const __m512i rhs_mat_014589CD_31_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_31 , (_MM_PERM_ENUM )136 );//B30(8-11) B31(8-11) B30(8-11) B31(8-11) B34(8-11) B35(8-11) B34(8-11) B35(8-11) B38(8-11) B39(8-11) B38(8-11) B39(8-11) B3C(8-11) B3D(8-11) B3C(8-11) B3D(8-11) 4462const __m512i rhs_mat_2367ABEF_31_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_31 , (_MM_PERM_ENUM )136 );//B32(8-11) B33(8-11) B32(8-11) B33(8-11) B36(8-11) B37(8-11) B36(8-11) B37(8-11) B3A(8-11) B3B(8-11) B3A(8-11) B3B(8-11) B3E(8-11) B3F(8-11) B3E(8-11) B3F(8-11) 4463 4464const __m512i rhs_mat_014589CD_40_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_40 , (_MM_PERM_ENUM )136 );//B40(0-3) B41(0-3) B40(0-3) B41(0-3) B44(0-3) B45(0-3) B44(0-3) B45(0-3) B48(0-3) B49(0-3) B48(0-3) B49(0-3) B4C(0-3) B4D(0-3) B4C(0-3) B4D(0-3) 4465const __m512i rhs_mat_2367ABEF_40_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_40 , (_MM_PERM_ENUM )136 );//B42(0-3) B43(0-3) B42(0-3) B43(0-3) B46(0-3) B47(0-3) B46(0-3) B47(0-3) B4A(0-3) B4B(0-3) B4A(0-3) B4B(0-3) B4E(0-3) B4F(0-3) B4E(0-3) B4F(0-3) 4466 4467const __m512i rhs_mat_014589CD_41_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_41 , (_MM_PERM_ENUM )136 );//B40(8-11) B41(8-11) B40(8-11) B41(8-11) B44(8-11) B45(8-11) B44(8-11) B45(8-11) B48(8-11) B49(8-11) B48(8-11) B49(8-11) B4C(8-11) B4D(8-11) B4C(8-11) B4D(8-11) 4468const __m512i rhs_mat_2367ABEF_41_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_41 , (_MM_PERM_ENUM )136 );//B42(8-11) B43(8-11) B42(8-11) B43(8-11) B46(8-11) B47(8-11) B46(8-11) B47(8-11) B4A(8-11) B4B(8-11) B4A(8-11) B4B(8-11) B4E(8-11) B4F(8-11) B4E(8-11) B4F(8-11) 4469 4470const __m512i rhs_mat_014589CD_50_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_50 , (_MM_PERM_ENUM )136 );//B50(0-3) B51(0-3) B50(0-3) B51(0-3) B54(0-3) B55(0-3) B54(0-3) B55(0-3) B58(0-3) B59(0-3) B58(0-3) B59(0-3) B5C(0-3) B5D(0-3) B5C(0-3) B5D(0-3) 4471const __m512i rhs_mat_2367ABEF_50_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_50 , (_MM_PERM_ENUM )136 );//B52(0-3) B53(0-3) B52(0-3) B53(0-3) B56(0-3) B57(0-3) B56(0-3) B57(0-3) B5A(0-3) B5B(0-3) B5A(0-3) B5B(0-3) B5E(0-3) B5F(0-3) B5E(0-3) B5F(0-3) 4472 4473const __m512i rhs_mat_014589CD_51_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_51 , (_MM_PERM_ENUM )136 );//B50(8-11) B51(8-11) B50(8-11) B51(8-11) B54(8-11) B55(8-11) B54(8-11) B55(8-11) B58(8-11) B59(8-11) B58(8-11) B59(8-11) B5C(8-11) B5D(8-11) B5C(8-11) B5D(8-11) 4474const __m512i rhs_mat_2367ABEF_51_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_51 , (_MM_PERM_ENUM )136 );//B52(8-11) B53(8-11) B52(8-11) B53(8-11) B56(8-11) B57(8-11) B56(8-11) B57(8-11) B5A(8-11) B5B(8-11) B5A(8-11) B5B(8-11) B5E(8-11) B5F(8-11) B5E(8-11) B5F(8-11) 4475 4476const __m512i rhs_mat_014589CD_60_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_60 , (_MM_PERM_ENUM )136 );//B60(0-3) B61(0-3) B60(0-3) B61(0-3) B64(0-3) B65(0-3) B64(0-3) B65(0-3) B68(0-3) B69(0-3) B68(0-3) B69(0-3) B6C(0-3) B6D(0-3) B6C(0-3) B6D(0-3) 4477const __m512i rhs_mat_2367ABEF_60_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_60 , (_MM_PERM_ENUM )136 );//B62(0-3) B63(0-3) B62(0-3) B63(0-3) B66(0-3) B67(0-3) B66(0-3) B67(0-3) B6A(0-3) B6B(0-3) B6A(0-3) B6B(0-3) B6E(0-3) B6F(0-3) B6E(0-3) B6F(0-3) 4478 4479const __m512i rhs_mat_014589CD_61_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_61 , (_MM_PERM_ENUM )136 );//B60(8-11) B61(8-11) B60(8-11) B61(8-11) B64(8-11) B65(8-11) B64(8-11) B65(8-11) B68(8-11) B69(8-11) B68(8-11) B69(8-11) B6C(8-11) B6D(8-11) B6C(8-11) B6D(8-11) 4480const __m512i rhs_mat_2367ABEF_61_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_61 , (_MM_PERM_ENUM )136 );//B62(8-11) B63(8-11) B62(8-11) B63(8-11) B66(8-11) B67(8-11) B66(8-11) B67(8-11) B6A(8-11) B6B(8-11) B6A(8-11) B6B(8-11) B6E(8-11) B6F(8-11) B6E(8-11) B6F(8-11) 4481 4482const __m512i rhs_mat_014589CD_70_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_70 , (_MM_PERM_ENUM )136 );//B70(0-3) B71(0-3) B70(0-3) B71(0-3) B74(0-3) B75(0-3) B74(0-3) B75(0-3) B78(0-3) B79(0-3) B78(0-3) B79(0-3) B7C(0-3) B7D(0-3) B7C(0-3) B7D(0-3) 4483const __m512i rhs_mat_2367ABEF_70_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_70 , (_MM_PERM_ENUM )136 );//B72(0-3) B73(0-3) B72(0-3) B73(0-3) B76(0-3) B77(0-3) B76(0-3) B77(0-3) B7A(0-3) B7B(0-3) B7A(0-3) B7B(0-3) B7E(0-3) B7F(0-3) B7E(0-3) B7F(0-3) 4484 4485const __m512i rhs_mat_014589CD_71_sp1 = _mm512_shuffle_epi32 (rhs_mat_014589CD_71 , (_MM_PERM_ENUM )136 );//B00(8-11) B01(8-11) B00(8-11) B01(8-11) B04(8-11) B05(8-11) B04(8-11) B05(8-11) B08(8-11) B09(8-11) B08(8-11) B09(8-11) B0C(8-11) B0D(8-11) B0C(8-11) B0D(8-11) 4486const __m512i rhs_mat_2367ABEF_71_sp1 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_71 , (_MM_PERM_ENUM )136 );//B72(8-11) B73(8-11) B72(8-11) B73(8-11) B76(8-11) B77(8-11) B76(8-11) B77(8-11) B7A(8-11) B7B(8-11) B7A(8-11) B7B(8-11) B7E(8-11) B7F(8-11) B7E(8-11) B7F(8-11) 4487 4488const __m512i rhs_mat_014589CD_00_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_00 , (_MM_PERM_ENUM )221 );//B00(4-7) B01(4-7) B00(4-7) B01(4-7) B04(4-7) B05(4-7) B04(4-7) B05(4-7) B08(4-7) B09(4-7) B08(4-7) B09(4-7) B0C(4-7) B0D(4-7) B0C(4-7) B0D(4-7) 4489const __m512i rhs_mat_2367ABEF_00_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_00 , (_MM_PERM_ENUM )221 );//B02(4-7) B03(4-7) B02(4-7) B03(4-7) B06(4-7) B07(4-7) B06(4-7) B07(4-7) B0A(4-7) B0B(4-7) B0A(4-7) B0B(4-7) B0E(4-7) B0F(4-7) B0E(4-7) B0F(4-7) 4490 4491const __m512i rhs_mat_014589CD_01_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_01 , (_MM_PERM_ENUM )221 );//B00(12-15) B01(12-15) B00(12-15) B01(12-15) B04(12-15) B05(12-15) B04(12-15) B05(12-15) B08(12-15) B09(12-15) B08(12-15) B09(12-15) B0C(12-15) B0D(12-15) B0C(12-15) B0D(12-15) 4492const __m512i rhs_mat_2367ABEF_01_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_01 , (_MM_PERM_ENUM )221 );//B02(12-15) B03(12-15) B02(12-15) B03(12-15) B06(12-15) B07(12-15) B06(12-15) B07(12-15) B0A(12-15) B0B(12-15) B0A(12-15) B0B(12-15) B0E(12-15) B0F(12-15) B0E(12-15) B0F(12-15) 4493 4494const __m512i rhs_mat_014589CD_10_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_10 , (_MM_PERM_ENUM )221 );//B10(4-7) B11(4-7) B10(4-7) B11(4-7) B14(4-7) B15(4-7) B14(4-7) B15(4-7) B18(4-7) B19(4-7) B18(4-7) B19(4-7) B1C(4-7) B1D(4-7) B1C(4-7) B1D(4-7) 4495const __m512i rhs_mat_2367ABEF_10_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_10 , (_MM_PERM_ENUM )221 );//B12(4-7) B13(4-7) B12(4-7) B13(4-7) B16(4-7) B17(4-7) B16(4-7) B17(4-7) B1A(4-7) B1B(4-7) B1A(4-7) B1B(4-7) B1E(4-7) B1F(4-7) B1E(4-7) B1F(4-7) 4496 4497const __m512i rhs_mat_014589CD_11_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_11 , (_MM_PERM_ENUM )221 );//B10(12-15) B11(12-15) B10(12-15) B11(12-15) B14(12-15) B15(12-15) B14(12-15) B15(12-15) B18(12-15) B19(12-15) B18(12-15) B19(12-15) B1C(12-15) B1D(12-15) B1C(12-15) B1D(12-15) 4498const __m512i rhs_mat_2367ABEF_11_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_11 , (_MM_PERM_ENUM )221 );//B12(12-15) B13(12-15) B12(12-15) B13(12-15) B16(12-15) B17(12-15) B16(12-15) B17(12-15) B1A(12-15) B1B(12-15) B1A(12-15) B1B(12-15) B1E(12-15) B1F(12-15) B1E(12-15) B1F(12-15) 4499 4500const __m512i rhs_mat_014589CD_20_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_20 , (_MM_PERM_ENUM )221 );//B20(4-7) B21(4-7) B20(4-7) B21(4-7) B24(4-7) B25(4-7) B24(4-7) B25(4-7) B28(4-7) B29(4-7) B28(4-7) B29(4-7) B2C(4-7) B2D(4-7) B2C(4-7) B2D(4-7) 4501const __m512i rhs_mat_2367ABEF_20_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_20 , (_MM_PERM_ENUM )221 );//B22(4-7) B23(4-7) B22(4-7) B23(4-7) B26(4-7) B27(4-7) B26(4-7) B27(4-7) B2A(4-7) B2B(4-7) B2A(4-7) B2B(4-7) B2E(4-7) B2F(4-7) B2E(4-7) B2F(4-7) 4502 4503const __m512i rhs_mat_014589CD_21_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_21 , (_MM_PERM_ENUM )221 );//B20(12-15) B21(12-15) B20(12-15) B21(12-15) B24(12-15) B25(12-15) B24(12-15) B25(12-15) B28(12-15) B29(12-15) B28(12-15) B29(12-15) B2C(12-15) B2D(12-15) B2C(12-15) B2D(12-15) 4504const __m512i rhs_mat_2367ABEF_21_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_21 , (_MM_PERM_ENUM )221 );//B22(12-15) B23(12-15) B22(12-15) B23(12-15) B26(12-15) B27(12-15) B26(12-15) B27(12-15) B2A(12-15) B2B(12-15) B2A(12-15) B2B(12-15) B2E(12-15) B2F(12-15) B2E(12-15) B2F(12-15) 4505 4506const __m512i rhs_mat_014589CD_30_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_30 , (_MM_PERM_ENUM )221 );//B30(4-7) B31(4-7) B30(4-7) B31(4-7) B34(4-7) B35(4-7) B34(4-7) B35(4-7) B38(4-7) B39(4-7) B38(4-7) B39(4-7) B3C(4-7) B3D(4-7) B3C(4-7) B3D(4-7) 4507const __m512i rhs_mat_2367ABEF_30_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_30 , (_MM_PERM_ENUM )221 );//B32(4-7) B33(4-7) B32(4-7) B33(4-7) B36(4-7) B37(4-7) B36(4-7) B37(4-7) B3A(4-7) B3B(4-7) B3A(4-7) B3B(4-7) B3E(4-7) B3F(4-7) B3E(4-7) B3F(4-7) 4508 4509const __m512i rhs_mat_014589CD_31_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_31 , (_MM_PERM_ENUM )221 );//B30(12-15) B31(12-15) B30(12-15) B31(12-15) B34(12-15) B35(12-15) B34(12-15) B35(12-15) B38(12-15) B39(12-15) B38(12-15) B39(12-15) B3C(12-15) B3D(12-15) B3C(12-15) B3D(12-15) 4510const __m512i rhs_mat_2367ABEF_31_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_31 , (_MM_PERM_ENUM )221 );//B32(12-15) B33(12-15) B32(12-15) B33(12-15) B36(12-15) B37(12-15) B36(12-15) B37(12-15) B3A(12-15) B3B(12-15) B3A(12-15) B3B(12-15) B3E(12-15) B3F(12-15) B3E(12-15) B3F(12-15) 4511 4512const __m512i rhs_mat_014589CD_40_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_40 , (_MM_PERM_ENUM )221 );//B40(4-7) B41(4-7) B40(4-7) B41(4-7) B44(4-7) B45(4-7) B44(4-7) B45(4-7) B48(4-7) B49(4-7) B48(4-7) B49(4-7) B4C(4-7) B4D(4-7) B4C(4-7) B4D(4-7) 4513const __m512i rhs_mat_2367ABEF_40_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_40 , (_MM_PERM_ENUM )221 );//B42(4-7) B43(4-7) B42(4-7) B43(4-7) B46(4-7) B47(4-7) B46(4-7) B47(4-7) B4A(4-7) B4B(4-7) B4A(4-7) B4B(4-7) B4E(4-7) B4F(4-7) B4E(4-7) B4F(4-7) 4514 4515const __m512i rhs_mat_014589CD_41_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_41 , (_MM_PERM_ENUM )221 );//B40(12-15) B41(12-15) B40(12-15) B41(12-15) B44(12-15) B45(12-15) B44(12-15) B45(12-15) B48(12-15) B49(12-15) B48(12-15) B49(12-15) B4C(12-15) B4D(12-15) B4C(12-15) B4D(12-15) 4516const __m512i rhs_mat_2367ABEF_41_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_41 , (_MM_PERM_ENUM )221 );//B42(12-15) B43(12-15) B42(12-15) B43(12-15) B46(12-15) B47(12-15) B46(12-15) B47(12-15) B4A(12-15) B4B(12-15) B4A(12-15) B4B(12-15) B4E(12-15) B4F(12-15) B4E(12-15) B4F(12-15) 4517 4518const __m512i rhs_mat_014589CD_50_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_50 , (_MM_PERM_ENUM )221 );//B50(4-7) B51(4-7) B50(4-7) B51(4-7) B54(4-7) B55(4-7) B54(4-7) B55(4-7) B58(4-7) B59(4-7) B58(4-7) B59(4-7) B5C(4-7) B5D(4-7) B5C(4-7) B5D(4-7) 4519const __m512i rhs_mat_2367ABEF_50_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_50 , (_MM_PERM_ENUM )221 );//B52(4-7) B53(4-7) B52(4-7) B53(4-7) B56(4-7) B57(4-7) B56(4-7) B57(4-7) B5A(4-7) B5B(4-7) B5A(4-7) B5B(4-7) B5E(4-7) B5F(4-7) B5E(4-7) B5F(4-7) 4520 4521const __m512i rhs_mat_014589CD_51_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_51 , (_MM_PERM_ENUM )221 );//B50(12-15) B51(12-15) B50(12-15) B51(12-15) B54(12-15) B55(12-15) B54(12-15) B55(12-15) B58(12-15) B59(12-15) B58(12-15) B59(12-15) B5C(12-15) B5D(12-15) B5C(12-15) B5D(12-15) 4522const __m512i rhs_mat_2367ABEF_51_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_51 , (_MM_PERM_ENUM )221 );//B52(12-15) B53(12-15) B52(12-15) B53(12-15) B56(12-15) B57(12-15) B56(12-15) B57(12-15) B5A(12-15) B5B(12-15) B5A(12-15) B5B(12-15) B5E(12-15) B5F(12-15) B5E(12-15) B5F(12-15) 4523 4524const __m512i rhs_mat_014589CD_60_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_60 , (_MM_PERM_ENUM )221 );//B60(4-7) B61(4-7) B60(4-7) B61(4-7) B64(4-7) B65(4-7) B64(4-7) B65(4-7) B68(4-7) B69(4-7) B68(4-7) B69(4-7) B6C(4-7) B6D(4-7) B6C(4-7) B6D(4-7) 4525const __m512i rhs_mat_2367ABEF_60_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_60 , (_MM_PERM_ENUM )221 );//B62(4-7) B63(4-7) B62(4-7) B63(4-7) B66(4-7) B67(4-7) B66(4-7) B67(4-7) B6A(4-7) B6B(4-7) B6A(4-7) B6B(4-7) B6E(4-7) B6F(4-7) B6E(4-7) B6F(4-7) 4526 4527const __m512i rhs_mat_014589CD_61_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_61 , (_MM_PERM_ENUM )221 );//B60(12-15) B61(12-15) B60(12-15) B61(12-15) B64(12-15) B65(12-15) B64(12-15) B65(12-15) B68(12-15) B69(12-15) B68(12-15) B69(12-15) B6C(12-15) B6D(12-15) B6C(12-15) B6D(12-15) 4528const __m512i rhs_mat_2367ABEF_61_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_61 , (_MM_PERM_ENUM )221 );//B62(12-15) B63(12-15) B62(12-15) B63(12-15) B66(12-15) B67(12-15) B66(12-15) B67(12-15) B6A(12-15) B6B(12-15) B6A(12-15) B6B(12-15) B6E(12-15) B6F(12-15) B6E(12-15) B6F(12-15) 4529 4530const __m512i rhs_mat_014589CD_70_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_70 , (_MM_PERM_ENUM )221 );//B70(4-7) B71(4-7) B70(4-7) B71(4-7) B74(4-7) B75(4-7) B74(4-7) B75(4-7) B78(4-7) B79(4-7) B78(4-7) B79(4-7) B7C(4-7) B7D(4-7) B7C(4-7) B7D(4-7) 4531const __m512i rhs_mat_2367ABEF_70_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_70 , (_MM_PERM_ENUM )221 );//B72(4-7) B73(4-7) B72(4-7) B73(4-7) B76(4-7) B77(4-7) B76(4-7) B77(4-7) B7A(4-7) B7B(4-7) B7A(4-7) B7B(4-7) B7E(4-7) B7F(4-7) B7E(4-7) B7F(4-7) 4532 4533const __m512i rhs_mat_014589CD_71_sp2 = _mm512_shuffle_epi32 (rhs_mat_014589CD_71 , (_MM_PERM_ENUM )221 );//B70(12-15) B71(12-15) B70(12-15) B71(12-15) B74(12-15) B75(12-15) B74(12-15) B75(12-15) B78(12-15) B79(12-15) B78(12-15) B79(12-15) B7C(12-15) B7D(12-15) B7C(12-15) B7D(12-15) 4534const __m512i rhs_mat_2367ABEF_71_sp2 = _mm512_shuffle_epi32 (rhs_mat_2367ABEF_71 , (_MM_PERM_ENUM )221 );//B72(12-15) B73(12-15) B72(12-15) B73(12-15) B76(12-15) B77(12-15) B76(12-15) B77(12-15) B7A(12-15) B7B(12-15) B7A(12-15) B7B(12-15) B7E(12-15) B7F(12-15) B7E(12-15) B7F(12-15) 4535 4536//notation:superblock subblock 4537//s00 m00 s01 m01 s10 m10 s11 m11 s20 m20 s21 m21 s30 m30 s31 m31 s40 m40 s41 m41 s50 m50 s51 m51 s60 m60 s61 m61 s70 m70 s71 m71 4538 4539const __m128i mins_and_scales_01_0 = _mm_loadu_si128 ((const __m128i * )(b_ptr_0 [b ].scales + sb * 64 )); 4540const __m128i mins_and_scales_23_0 = _mm_loadu_si128 ((const __m128i * )(b_ptr_0 [b ].scales + 16 + sb * 64 )); 4541const __m128i mins_and_scales_45_0 = _mm_loadu_si128 ((const __m128i * )(b_ptr_0 [b ].scales + 32 + sb * 64 )); 4542const __m128i mins_and_scales_67_0 = _mm_loadu_si128 ((const __m128i * )(b_ptr_0 [b ].scales + 48 + sb * 64 )); 4543 4544const __m128i mins_and_scales_01_1 = _mm_loadu_si128 ((const __m128i * )(b_ptr_1 [b ].scales + sb * 64 )); 4545const __m128i mins_and_scales_23_1 = _mm_loadu_si128 ((const __m128i * )(b_ptr_1 [b ].scales + 16 + sb * 64 )); 4546const __m128i mins_and_scales_45_1 = _mm_loadu_si128 ((const __m128i * )(b_ptr_1 [b ].scales + 32 + sb * 64 )); 4547const __m128i mins_and_scales_67_1 = _mm_loadu_si128 ((const __m128i * )(b_ptr_1 [b ].scales + 48 + sb * 64 )); 4548 4549// Combine mins and scales for sub-blocks: 0-1, 2-3, 4-5, 6-7 in the sb loop 4550const __m256i mins_and_scales_01 = _mm256_insertf128_si256 (_mm256_castsi128_si256 (mins_and_scales_01_0 ),mins_and_scales_01_1 ,1 ); 4551const __m256i mins_and_scales_23 = _mm256_insertf128_si256 (_mm256_castsi128_si256 (mins_and_scales_23_0 ),mins_and_scales_23_1 ,1 ); 4552const __m256i mins_and_scales_45 = _mm256_insertf128_si256 (_mm256_castsi128_si256 (mins_and_scales_45_0 ),mins_and_scales_45_1 ,1 ); 4553const __m256i mins_and_scales_67 = _mm256_insertf128_si256 (_mm256_castsi128_si256 (mins_and_scales_67_0 ),mins_and_scales_67_1 ,1 ); 4554 4555// Extract scales which is lower half from mins_and_scales 4556const __m256i scales_01 = _mm256_and_si256 (mins_and_scales_01 ,m4b ); 4557const __m256i scales_23 = _mm256_and_si256 (mins_and_scales_23 ,m4b ); 4558const __m256i scales_45 = _mm256_and_si256 (mins_and_scales_45 ,m4b ); 4559const __m256i scales_67 = _mm256_and_si256 (mins_and_scales_67 ,m4b ); 4560 4561// Extract mins which is upper half from mins_and_scales 4562const __m512i mins_01 = _mm512_cvtepu8_epi16 (_mm256_and_si256 (_mm256_srli_epi16 (mins_and_scales_01 ,4 ),m4b )); 4563const __m512i mins_23 = _mm512_cvtepu8_epi16 (_mm256_and_si256 (_mm256_srli_epi16 (mins_and_scales_23 ,4 ),m4b )); 4564const __m512i mins_45 = _mm512_cvtepu8_epi16 (_mm256_and_si256 (_mm256_srli_epi16 (mins_and_scales_45 ,4 ),m4b )); 4565const __m512i mins_67 = _mm512_cvtepu8_epi16 (_mm256_and_si256 (_mm256_srli_epi16 (mins_and_scales_67 ,4 ),m4b )); 4566 4567const __m512i scales_0 = _mm512_cvtepu8_epi16 (_mm256_shuffle_epi8 (scales_01 ,scalesmask1 )); 4568const __m512i scales_1 = _mm512_cvtepu8_epi16 (_mm256_shuffle_epi8 (scales_01 ,scalesmask2 )); 4569const __m512i scales_2 = _mm512_cvtepu8_epi16 (_mm256_shuffle_epi8 (scales_23 ,scalesmask1 )); 4570const __m512i scales_3 = _mm512_cvtepu8_epi16 (_mm256_shuffle_epi8 (scales_23 ,scalesmask2 )); 4571const __m512i scales_4 = _mm512_cvtepu8_epi16 (_mm256_shuffle_epi8 (scales_45 ,scalesmask1 )); 4572const __m512i scales_5 = _mm512_cvtepu8_epi16 (_mm256_shuffle_epi8 (scales_45 ,scalesmask2 )); 4573const __m512i scales_6 = _mm512_cvtepu8_epi16 (_mm256_shuffle_epi8 (scales_67 ,scalesmask1 )); 4574const __m512i scales_7 = _mm512_cvtepu8_epi16 (_mm256_shuffle_epi8 (scales_67 ,scalesmask2 )); 4575 4576const __m512i scale_014589CD_0 = _mm512_shuffle_epi32 (scales_0 , (_MM_PERM_ENUM )68 ); 4577const __m512i scale_2367ABEF_0 = _mm512_shuffle_epi32 (scales_0 , (_MM_PERM_ENUM )238 ); 4578 4579const __m512i scale_014589CD_1 = _mm512_shuffle_epi32 (scales_1 , (_MM_PERM_ENUM )68 ); 4580const __m512i scale_2367ABEF_1 = _mm512_shuffle_epi32 (scales_1 , (_MM_PERM_ENUM )238 ); 4581 4582const __m512i scale_014589CD_2 = _mm512_shuffle_epi32 (scales_2 , (_MM_PERM_ENUM )68 ); 4583const __m512i scale_2367ABEF_2 = _mm512_shuffle_epi32 (scales_2 , (_MM_PERM_ENUM )238 ); 4584 4585const __m512i scale_014589CD_3 = _mm512_shuffle_epi32 (scales_3 , (_MM_PERM_ENUM )68 ); 4586const __m512i scale_2367ABEF_3 = _mm512_shuffle_epi32 (scales_3 , (_MM_PERM_ENUM )238 ); 4587 4588const __m512i scale_014589CD_4 = _mm512_shuffle_epi32 (scales_4 , (_MM_PERM_ENUM )68 ); 4589const __m512i scale_2367ABEF_4 = _mm512_shuffle_epi32 (scales_4 , (_MM_PERM_ENUM )238 ); 4590 4591const __m512i scale_014589CD_5 = _mm512_shuffle_epi32 (scales_5 , (_MM_PERM_ENUM )68 ); 4592const __m512i scale_2367ABEF_5 = _mm512_shuffle_epi32 (scales_5 , (_MM_PERM_ENUM )238 ); 4593 4594const __m512i scale_014589CD_6 = _mm512_shuffle_epi32 (scales_6 , (_MM_PERM_ENUM )68 ); 4595const __m512i scale_2367ABEF_6 = _mm512_shuffle_epi32 (scales_6 , (_MM_PERM_ENUM )238 ); 4596 4597const __m512i scale_014589CD_7 = _mm512_shuffle_epi32 (scales_7 , (_MM_PERM_ENUM )68 ); 4598const __m512i scale_2367ABEF_7 = _mm512_shuffle_epi32 (scales_7 , (_MM_PERM_ENUM )238 ); 4599 4600// Load the four block_q8_k quantized values interleaved with each other in chunks of eight bytes - A0,A1,A2,A3 4601// Loaded as set of 128 bit vectors and repeated into a 256 bit vector 4602__m256i lhs_mat_ymm_0123_00 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 512 * sb ))); 4603__m256i lhs_mat_ymm_01_00 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_00 ,lhs_mat_ymm_0123_00 ,0 ); 4604__m256i lhs_mat_ymm_23_00 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_00 ,lhs_mat_ymm_0123_00 ,17 ); 4605__m256i lhs_mat_ymm_0123_01 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 32 + 512 * sb ))); 4606__m256i lhs_mat_ymm_01_01 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_01 ,lhs_mat_ymm_0123_01 ,0 ); 4607__m256i lhs_mat_ymm_23_01 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_01 ,lhs_mat_ymm_0123_01 ,17 ); 4608__m256i lhs_mat_ymm_0123_10 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 64 + 512 * sb ))); 4609__m256i lhs_mat_ymm_01_10 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_10 ,lhs_mat_ymm_0123_10 ,0 ); 4610__m256i lhs_mat_ymm_23_10 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_10 ,lhs_mat_ymm_0123_10 ,17 ); 4611__m256i lhs_mat_ymm_0123_11 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 96 + 512 * sb ))); 4612__m256i lhs_mat_ymm_01_11 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_11 ,lhs_mat_ymm_0123_11 ,0 ); 4613__m256i lhs_mat_ymm_23_11 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_11 ,lhs_mat_ymm_0123_11 ,17 ); 4614__m256i lhs_mat_ymm_0123_20 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 128 + 512 * sb ))); 4615__m256i lhs_mat_ymm_01_20 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_20 ,lhs_mat_ymm_0123_20 ,0 ); 4616__m256i lhs_mat_ymm_23_20 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_20 ,lhs_mat_ymm_0123_20 ,17 ); 4617__m256i lhs_mat_ymm_0123_21 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 160 + 512 * sb ))); 4618__m256i lhs_mat_ymm_01_21 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_21 ,lhs_mat_ymm_0123_21 ,0 ); 4619__m256i lhs_mat_ymm_23_21 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_21 ,lhs_mat_ymm_0123_21 ,17 ); 4620__m256i lhs_mat_ymm_0123_30 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 192 + 512 * sb ))); 4621__m256i lhs_mat_ymm_01_30 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_30 ,lhs_mat_ymm_0123_30 ,0 ); 4622__m256i lhs_mat_ymm_23_30 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_30 ,lhs_mat_ymm_0123_30 ,17 ); 4623__m256i lhs_mat_ymm_0123_31 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 224 + 512 * sb ))); 4624__m256i lhs_mat_ymm_01_31 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_31 ,lhs_mat_ymm_0123_31 ,0 ); 4625__m256i lhs_mat_ymm_23_31 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_31 ,lhs_mat_ymm_0123_31 ,17 ); 4626 4627__m256i lhs_mat_ymm_0123_40 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 256 + 512 * sb ))); 4628__m256i lhs_mat_ymm_01_40 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_40 ,lhs_mat_ymm_0123_40 ,0 ); 4629__m256i lhs_mat_ymm_23_40 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_40 ,lhs_mat_ymm_0123_40 ,17 ); 4630__m256i lhs_mat_ymm_0123_41 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 288 + 512 * sb ))); 4631__m256i lhs_mat_ymm_01_41 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_41 ,lhs_mat_ymm_0123_41 ,0 ); 4632__m256i lhs_mat_ymm_23_41 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_41 ,lhs_mat_ymm_0123_41 ,17 ); 4633__m256i lhs_mat_ymm_0123_50 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 320 + 512 * sb ))); 4634__m256i lhs_mat_ymm_01_50 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_50 ,lhs_mat_ymm_0123_50 ,0 ); 4635__m256i lhs_mat_ymm_23_50 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_50 ,lhs_mat_ymm_0123_50 ,17 ); 4636__m256i lhs_mat_ymm_0123_51 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 352 + 512 * sb ))); 4637__m256i lhs_mat_ymm_01_51 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_51 ,lhs_mat_ymm_0123_51 ,0 ); 4638__m256i lhs_mat_ymm_23_51 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_51 ,lhs_mat_ymm_0123_51 ,17 ); 4639__m256i lhs_mat_ymm_0123_60 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 384 + 512 * sb ))); 4640__m256i lhs_mat_ymm_01_60 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_60 ,lhs_mat_ymm_0123_60 ,0 ); 4641__m256i lhs_mat_ymm_23_60 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_60 ,lhs_mat_ymm_0123_60 ,17 ); 4642__m256i lhs_mat_ymm_0123_61 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 416 + 512 * sb ))); 4643__m256i lhs_mat_ymm_01_61 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_61 ,lhs_mat_ymm_0123_61 ,0 ); 4644__m256i lhs_mat_ymm_23_61 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_61 ,lhs_mat_ymm_0123_61 ,17 ); 4645__m256i lhs_mat_ymm_0123_70 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 448 + 512 * sb ))); 4646__m256i lhs_mat_ymm_01_70 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_70 ,lhs_mat_ymm_0123_70 ,0 ); 4647__m256i lhs_mat_ymm_23_70 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_70 ,lhs_mat_ymm_0123_70 ,17 ); 4648__m256i lhs_mat_ymm_0123_71 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 480 + 512 * sb ))); 4649__m256i lhs_mat_ymm_01_71 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_71 ,lhs_mat_ymm_0123_71 ,0 ); 4650__m256i lhs_mat_ymm_23_71 = _mm256_permute2f128_si256 (lhs_mat_ymm_0123_71 ,lhs_mat_ymm_0123_71 ,17 ); 4651 4652__m512i lhs_mat_01_00 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_00 ),lhs_mat_ymm_01_00 ,1 ); 4653__m512i lhs_mat_23_00 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_00 ),lhs_mat_ymm_23_00 ,1 ); 4654__m512i lhs_mat_01_01 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_01 ),lhs_mat_ymm_01_01 ,1 ); 4655__m512i lhs_mat_23_01 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_01 ),lhs_mat_ymm_23_01 ,1 ); 4656 4657__m512i lhs_mat_01_10 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_10 ),lhs_mat_ymm_01_10 ,1 ); 4658__m512i lhs_mat_23_10 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_10 ),lhs_mat_ymm_23_10 ,1 ); 4659__m512i lhs_mat_01_11 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_11 ),lhs_mat_ymm_01_11 ,1 ); 4660__m512i lhs_mat_23_11 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_11 ),lhs_mat_ymm_23_11 ,1 ); 4661 4662__m512i lhs_mat_01_20 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_20 ),lhs_mat_ymm_01_20 ,1 ); 4663__m512i lhs_mat_23_20 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_20 ),lhs_mat_ymm_23_20 ,1 ); 4664__m512i lhs_mat_01_21 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_21 ),lhs_mat_ymm_01_21 ,1 ); 4665__m512i lhs_mat_23_21 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_21 ),lhs_mat_ymm_23_21 ,1 ); 4666 4667__m512i lhs_mat_01_30 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_30 ),lhs_mat_ymm_01_30 ,1 ); 4668__m512i lhs_mat_23_30 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_30 ),lhs_mat_ymm_23_30 ,1 ); 4669__m512i lhs_mat_01_31 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_31 ),lhs_mat_ymm_01_31 ,1 ); 4670__m512i lhs_mat_23_31 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_31 ),lhs_mat_ymm_23_31 ,1 ); 4671 4672__m512i lhs_mat_01_40 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_40 ),lhs_mat_ymm_01_40 ,1 ); 4673__m512i lhs_mat_23_40 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_40 ),lhs_mat_ymm_23_40 ,1 ); 4674__m512i lhs_mat_01_41 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_41 ),lhs_mat_ymm_01_41 ,1 ); 4675__m512i lhs_mat_23_41 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_41 ),lhs_mat_ymm_23_41 ,1 ); 4676 4677__m512i lhs_mat_01_50 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_50 ),lhs_mat_ymm_01_50 ,1 ); 4678__m512i lhs_mat_23_50 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_50 ),lhs_mat_ymm_23_50 ,1 ); 4679__m512i lhs_mat_01_51 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_51 ),lhs_mat_ymm_01_51 ,1 ); 4680__m512i lhs_mat_23_51 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_51 ),lhs_mat_ymm_23_51 ,1 ); 4681 4682__m512i lhs_mat_01_60 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_60 ),lhs_mat_ymm_01_60 ,1 ); 4683__m512i lhs_mat_23_60 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_60 ),lhs_mat_ymm_23_60 ,1 ); 4684__m512i lhs_mat_01_61 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_61 ),lhs_mat_ymm_01_61 ,1 ); 4685__m512i lhs_mat_23_61 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_61 ),lhs_mat_ymm_23_61 ,1 ); 4686 4687__m512i lhs_mat_01_70 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_70 ),lhs_mat_ymm_01_70 ,1 ); 4688__m512i lhs_mat_23_70 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_70 ),lhs_mat_ymm_23_70 ,1 ); 4689__m512i lhs_mat_01_71 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_01_71 ),lhs_mat_ymm_01_71 ,1 ); 4690__m512i lhs_mat_23_71 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_mat_ymm_23_71 ),lhs_mat_ymm_23_71 ,1 ); 4691 4692// Bsums are loaded for the different Q8_K blocks 4693__m128i lhs_raw_bsums_01_0123 = _mm_loadu_si128 ((const __m128i * )((a_ptr [b ].bsums + 32 * sb ))); 4694__m128i lhs_raw_bsums_23_0123 = _mm_loadu_si128 ((const __m128i * )(a_ptr [b ].bsums + 8 + 32 * sb )); 4695__m128i lhs_raw_bsums_01_4567 = _mm_loadu_si128 ((const __m128i * )((a_ptr [b ].bsums + 16 + 32 * sb ))); 4696__m128i lhs_raw_bsums_23_4567 = _mm_loadu_si128 ((const __m128i * )(a_ptr [b ].bsums + 24 + 32 * sb )); 4697 4698__m256i lhs_bsums_ymm_01_0123 = _mm256_inserti128_si256 (_mm256_castsi128_si256 (lhs_raw_bsums_01_0123 ),lhs_raw_bsums_01_0123 ,1 ); 4699__m512i lhs_bsums_01_0123 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_bsums_ymm_01_0123 ),lhs_bsums_ymm_01_0123 ,1 ); 4700__m256i lhs_bsums_ymm_23_0123 = _mm256_inserti128_si256 (_mm256_castsi128_si256 (lhs_raw_bsums_23_0123 ),lhs_raw_bsums_23_0123 ,1 ); 4701__m512i lhs_bsums_23_0123 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_bsums_ymm_23_0123 ),lhs_bsums_ymm_23_0123 ,1 ); 4702__m256i lhs_bsums_ymm_01_4567 = _mm256_inserti128_si256 (_mm256_castsi128_si256 (lhs_raw_bsums_01_4567 ),lhs_raw_bsums_01_4567 ,1 ); 4703__m512i lhs_bsums_01_4567 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_bsums_ymm_01_4567 ),lhs_bsums_ymm_01_4567 ,1 ); 4704__m256i lhs_bsums_ymm_23_4567 = _mm256_inserti128_si256 (_mm256_castsi128_si256 (lhs_raw_bsums_23_4567 ),lhs_raw_bsums_23_4567 ,1 ); 4705__m512i lhs_bsums_23_4567 = _mm512_inserti32x8 (_mm512_castsi256_si512 (lhs_bsums_ymm_23_4567 ),lhs_bsums_ymm_23_4567 ,1 ); 4706 4707// Shuffle pattern one - left side input 4708const __m512i lhs_mat_01_00_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_00 , (_MM_PERM_ENUM )160 );//A00(0-3) A00(0-3) A01(0-3) A01(0-3) A00(0-3) A00(0-3) A01(0-3) A01(0-3) A00(0-3) A00(0-3) A01(0-3) A01(0-3) A00(0-3) A00(0-3) A01(0-3) A01(0-3) 4709const __m512i lhs_mat_23_00_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_00 , (_MM_PERM_ENUM )160 );//A02(0-3) A02(0-3) A03(0-3) A03(0-3) A02(0-3) A02(0-3) A03(0-3) A03(0-3) A02(0-3) A02(0-3) A03(0-3) A03(0-3) A02(0-3) A02(0-3) A03(0-3) A03(0-3) 4710 4711const __m512i lhs_mat_01_01_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_01 , (_MM_PERM_ENUM )160 );//A00(8-11) A00(8-11) A01(8-11) A01(8-11) A00(8-11) A00(8-11) A01(8-11) A01(8-11) A00(8-11) A00(8-11) A01(8-11) A01(8-11) A00(8-11) A00(8-11) A01(8-11) A01(8-11) 4712const __m512i lhs_mat_23_01_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_01 , (_MM_PERM_ENUM )160 );//A02(8-11) A02(8-11) A03(8-11) A03(8-11) A02(8-11) A02(8-11) A03(8-11) A03(8-11) A02(8-11) A02(8-11) A03(8-11) A03(8-11) A02(8-11) A02(8-11) A03(8-11) A03(8-11) 4713 4714const __m512i lhs_mat_01_10_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_10 , (_MM_PERM_ENUM )160 );//A10(0-3) A10(0-3) A11(0-3) A11(0-3) A10(0-3) A10(0-3) A11(0-3) A11(0-3) A10(0-3) A10(0-3) A11(0-3) A11(0-3) A10(0-3) A10(0-3) A11(0-3) A11(0-3) 4715const __m512i lhs_mat_23_10_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_10 , (_MM_PERM_ENUM )160 );//A12(0-3) A12(0-3) A13(0-3) A13(0-3) A12(0-3) A12(0-3) A13(0-3) A13(0-3) A12(0-3) A12(0-3) A13(0-3) A13(0-3) A12(0-3) A12(0-3) A13(0-3) A13(0-3) 4716 4717const __m512i lhs_mat_01_11_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_11 , (_MM_PERM_ENUM )160 );//A10(8-11) A10(8-11) A11(8-11) A11(8-11) A10(8-11) A10(8-11) A11(8-11) A11(8-11) A10(8-11) A10(8-11) A11(8-11) A11(8-11) A10(8-11) A10(8-11) A11(8-11) A11(8-11) 4718const __m512i lhs_mat_23_11_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_11 , (_MM_PERM_ENUM )160 );//A12(8-11) A12(8-11) A13(8-11) A13(8-11) A12(8-11) A12(8-11) A13(8-11) A13(8-11) A12(8-11) A12(8-11) A13(8-11) A13(8-11) A12(8-11) A12(8-11) A13(8-11) A13(8-11) 4719 4720const __m512i lhs_mat_01_20_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_20 , (_MM_PERM_ENUM )160 );//A20(0-3) A20(0-3) A21(0-3) A21(0-3) A20(0-3) A20(0-3) A21(0-3) A21(0-3) A20(0-3) A20(0-3) A21(0-3) A21(0-3) A20(0-3) A20(0-3) A21(0-3) A21(0-3) 4721const __m512i lhs_mat_23_20_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_20 , (_MM_PERM_ENUM )160 );//A22(0-3) A22(0-3) A23(0-3) A23(0-3) A22(0-3) A22(0-3) A23(0-3) A23(0-3) A22(0-3) A22(0-3) A23(0-3) A23(0-3) A22(0-3) A22(0-3) A23(0-3) A23(0-3) 4722 4723const __m512i lhs_mat_01_21_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_21 , (_MM_PERM_ENUM )160 );//A20(8-11) A20(8-11) A21(8-11) A21(8-11) A20(8-11) A20(8-11) A21(8-11) A21(8-11) A20(8-11) A20(8-11) A21(8-11) A21(8-11) A20(8-11) A20(8-11) A21(8-11) A21(8-11) 4724const __m512i lhs_mat_23_21_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_21 , (_MM_PERM_ENUM )160 );//A22(8-11) A22(8-11) A23(8-11) A23(8-11) A22(8-11) A22(8-11) A23(8-11) A23(8-11) A22(8-11) A22(8-11) A23(8-11) A23(8-11) A22(8-11) A22(8-11) A23(8-11) A23(8-11) 4725 4726const __m512i lhs_mat_01_30_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_30 , (_MM_PERM_ENUM )160 );//A30(0-3) A30(0-3) A31(0-3) A31(0-3) A30(0-3) A30(0-3) A31(0-3) A31(0-3) A30(0-3) A30(0-3) A31(0-3) A31(0-3) A30(0-3) A30(0-3) A31(0-3) A31(0-3) 4727const __m512i lhs_mat_23_30_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_30 , (_MM_PERM_ENUM )160 );//A32(0-3) A32(0-3) A33(0-3) A33(0-3) A32(0-3) A32(0-3) A33(0-3) A33(0-3) A32(0-3) A32(0-3) A33(0-3) A33(0-3) A32(0-3) A32(0-3) A33(0-3) A33(0-3) 4728 4729const __m512i lhs_mat_01_31_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_31 , (_MM_PERM_ENUM )160 );//A30(8-11) A30(8-11) A31(8-11) A31(8-11) A30(8-11) A30(8-11) A31(8-11) A31(8-11) A30(8-11) A30(8-11) A31(8-11) A31(8-11) A30(8-11) A30(8-11) A31(8-11) A31(8-11) 4730const __m512i lhs_mat_23_31_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_31 , (_MM_PERM_ENUM )160 );//A32(8-11) A32(8-11) A33(8-11) A33(8-11) A32(8-11) A32(8-11) A33(8-11) A33(8-11) A32(8-11) A32(8-11) A33(8-11) A33(8-11) A32(8-11) A32(8-11) A33(8-11) A33(8-11) 4731 4732const __m512i lhs_mat_01_40_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_40 , (_MM_PERM_ENUM )160 );//A40(0-3) A40(0-3) A41(0-3) A41(0-3) A40(0-3) A40(0-3) A41(0-3) A41(0-3) A40(0-3) A40(0-3) A41(0-3) A41(0-3) A40(0-3) A40(0-3) A41(0-3) A41(0-3) 4733const __m512i lhs_mat_23_40_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_40 , (_MM_PERM_ENUM )160 );//A42(0-3) A42(0-3) A43(0-3) A43(0-3) A42(0-3) A42(0-3) A43(0-3) A43(0-3) A42(0-3) A42(0-3) A43(0-3) A43(0-3) A42(0-3) A42(0-3) A43(0-3) A43(0-3) 4734 4735const __m512i lhs_mat_01_41_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_41 , (_MM_PERM_ENUM )160 );//A40(8-11) A40(8-11) A41(8-11) A41(8-11) A40(8-11) A40(8-11) A41(8-11) A41(8-11) A40(8-11) A40(8-11) A41(8-11) A41(8-11) A40(8-11) A40(8-11) A41(8-11) A41(8-11) 4736const __m512i lhs_mat_23_41_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_41 , (_MM_PERM_ENUM )160 );//A42(8-11) A42(8-11) A43(8-11) A43(8-11) A42(8-11) A42(8-11) A43(8-11) A43(8-11) A42(8-11) A42(8-11) A43(8-11) A43(8-11) A42(8-11) A42(8-11) A43(8-11) A43(8-11) 4737 4738const __m512i lhs_mat_01_50_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_50 , (_MM_PERM_ENUM )160 );//A50(0-3) A50(0-3) A51(0-3) A51(0-3) A50(0-3) A50(0-3) A51(0-3) A51(0-3) A50(0-3) A50(0-3) A51(0-3) A51(0-3) A50(0-3) A50(0-3) A51(0-3) A51(0-3) 4739const __m512i lhs_mat_23_50_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_50 , (_MM_PERM_ENUM )160 );//A52(0-3) A52(0-3) A53(0-3) A53(0-3) A52(0-3) A52(0-3) A53(0-3) A53(0-3) A52(0-3) A52(0-3) A53(0-3) A53(0-3) A52(0-3) A52(0-3) A53(0-3) A53(0-3) 4740 4741const __m512i lhs_mat_01_51_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_51 , (_MM_PERM_ENUM )160 );//A50(8-11) A50(8-11) A51(8-11) A51(8-11) A50(8-11) A50(8-11) A51(8-11) A51(8-11) A50(8-11) A50(8-11) A51(8-11) A51(8-11) A50(8-11) A50(8-11) A51(8-11) A51(8-11) 4742const __m512i lhs_mat_23_51_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_51 , (_MM_PERM_ENUM )160 );//A52(8-11) A52(8-11) A53(8-11) A53(8-11) A52(8-11) A52(8-11) A53(8-11) A53(8-11) A52(8-11) A52(8-11) A53(8-11) A53(8-11) A52(8-11) A52(8-11) A53(8-11) A53(8-11) 4743 4744const __m512i lhs_mat_01_60_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_60 , (_MM_PERM_ENUM )160 );//A60(0-3) A60(0-3) A61(0-3) A61(0-3) A60(0-3) A60(0-3) A61(0-3) A61(0-3) A60(0-3) A60(0-3) A61(0-3) A61(0-3) A60(0-3) A60(0-3) A61(0-3) A61(0-3) 4745const __m512i lhs_mat_23_60_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_60 , (_MM_PERM_ENUM )160 );//A62(0-3) A62(0-3) A63(0-3) A63(0-3) A62(0-3) A62(0-3) A63(0-3) A63(0-3) A62(0-3) A62(0-3) A63(0-3) A63(0-3) A62(0-3) A62(0-3) A63(0-3) A63(0-3) 4746 4747const __m512i lhs_mat_01_61_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_61 , (_MM_PERM_ENUM )160 );//A60(8-11) A60(8-11) A61(8-11) A61(8-11) A60(8-11) A60(8-11) A61(8-11) A61(8-11) A60(8-11) A60(8-11) A61(8-11) A61(8-11) A60(8-11) A60(8-11) A61(8-11) A61(8-11) 4748const __m512i lhs_mat_23_61_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_61 , (_MM_PERM_ENUM )160 );//A62(8-11) A62(8-11) A63(8-11) A63(8-11) A62(8-11) A62(8-11) A63(8-11) A63(8-11) A62(8-11) A62(8-11) A63(8-11) A63(8-11) A62(8-11) A62(8-11) A63(8-11) A63(8-11) 4749 4750const __m512i lhs_mat_01_70_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_70 , (_MM_PERM_ENUM )160 );//A70(0-3) A70(0-3) A71(0-3) A71(0-3) A70(0-3) A70(0-3) A71(0-3) A71(0-3) A70(0-3) A70(0-3) A71(0-3) A71(0-3) A70(0-3) A70(0-3) A71(0-3) A71(0-3) 4751const __m512i lhs_mat_23_70_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_70 , (_MM_PERM_ENUM )160 );//A72(0-3) A72(0-3) A73(0-3) A73(0-3) A72(0-3) A72(0-3) A73(0-3) A73(0-3) A72(0-3) A72(0-3) A73(0-3) A73(0-3) A72(0-3) A72(0-3) A73(0-3) A73(0-3) 4752 4753const __m512i lhs_mat_01_71_sp1 = _mm512_shuffle_epi32 (lhs_mat_01_71 , (_MM_PERM_ENUM )160 );//A70(8-11) A70(8-11) A71(8-11) A71(8-11) A70(8-11) A70(8-11) A71(8-11) A71(8-11) A70(8-11) A70(8-11) A71(8-11) A71(8-11) A70(8-11) A70(8-11) A71(8-11) A71(8-11) 4754const __m512i lhs_mat_23_71_sp1 = _mm512_shuffle_epi32 (lhs_mat_23_71 , (_MM_PERM_ENUM )160 );//A72(8-11) A72(8-11) A73(8-11) A73(8-11) A72(8-11) A72(8-11) A73(8-11) A73(8-11) A72(8-11) A72(8-11) A73(8-11) A73(8-11) A72(8-11) A72(8-11) A73(8-11) A73(8-11) 4755 4756const __m512i lhs_mat_01_00_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_00 , (_MM_PERM_ENUM )245 );//A00(4-7) A00(4-7) A01(4-7) A01(4-7) A00(4-7) A00(4-7) A01(4-7) A01(4-7) A00(4-7) A00(4-7) A01(4-7) A01(4-7) A00(4-7) A00(4-7) A01(4-7) A01(4-7) 4757const __m512i lhs_mat_23_00_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_00 , (_MM_PERM_ENUM )245 );//A02(4-7) A02(4-7) A03(4-7) A03(4-7) A02(4-7) A02(4-7) A03(4-7) A03(4-7) A02(4-7) A02(4-7) A03(4-7) A03(4-7) A02(4-7) A02(4-7) A03(4-7) A03(4-7) 4758 4759const __m512i lhs_mat_01_01_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_01 , (_MM_PERM_ENUM )245 );//A00(12-15) A00(12-15) A01(12-15) A01(12-15) A00(12-15) A00(12-15) A01(12-15) A01(12-15) A00(12-15) A00(12-15) A01(12-15) A01(12-15) A00(12-15) A00(12-15) A01(12-15) A01(12-15) 4760const __m512i lhs_mat_23_01_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_01 , (_MM_PERM_ENUM )245 );//A02(12-15) A02(12-15) A03(12-15) A03(12-15) A02(12-15) A02(12-15) A03(12-15) A03(12-15) A02(12-15) A02(12-15) A03(12-15) A03(12-15) A02(12-15) A02(12-15) A03(12-15) A03(12-15) 4761 4762const __m512i lhs_mat_01_10_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_10 , (_MM_PERM_ENUM )245 );//A10(4-7) A10(4-7) A11(4-7) A11(4-7) A10(4-7) A10(4-7) A11(4-7) A11(4-7) A10(4-7) A10(4-7) A11(4-7) A11(4-7) A10(4-7) A10(4-7) A11(4-7) A11(4-7) 4763const __m512i lhs_mat_23_10_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_10 , (_MM_PERM_ENUM )245 );//A12(4-7) A12(4-7) A13(4-7) A13(4-7) A12(4-7) A12(4-7) A13(4-7) A13(4-7) A12(4-7) A12(4-7) A13(4-7) A13(4-7) A12(4-7) A12(4-7) A13(4-7) A13(4-7) 4764 4765const __m512i lhs_mat_01_11_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_11 , (_MM_PERM_ENUM )245 );//A10(12-15) A10(12-15) A11(12-15) A11(12-15) A10(12-15) A10(12-15) A11(12-15) A11(12-15) A10(12-15) A10(12-15) A11(12-15) A11(12-15) A10(12-15) A10(12-15) A11(12-15) A11(12-15) 4766const __m512i lhs_mat_23_11_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_11 , (_MM_PERM_ENUM )245 );//A12(12-15) A12(12-15) A13(12-15) A13(12-15) A12(12-15) A12(12-15) A13(12-15) A13(12-15) A12(12-15) A12(12-15) A13(12-15) A13(12-15) A12(12-15) A12(12-15) A13(12-15) A13(12-15) 4767 4768const __m512i lhs_mat_01_20_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_20 , (_MM_PERM_ENUM )245 );//A20(4-7) A20(4-7) A21(4-7) A21(4-7) A20(4-7) A20(4-7) A21(4-7) A21(4-7) A20(4-7) A20(4-7) A21(4-7) A21(4-7) A20(4-7) A20(4-7) A21(4-7) A21(4-7) 4769const __m512i lhs_mat_23_20_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_20 , (_MM_PERM_ENUM )245 );//A22(4-7) A22(4-7) A23(4-7) A23(4-7) A22(4-7) A22(4-7) A23(4-7) A23(4-7) A22(4-7) A22(4-7) A23(4-7) A23(4-7) A22(4-7) A22(4-7) A23(4-7) A23(4-7) 4770 4771const __m512i lhs_mat_01_21_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_21 , (_MM_PERM_ENUM )245 );//A20(12-15) A20(12-15) A21(12-15) A21(12-15) A20(12-15) A20(12-15) A21(12-15) A21(12-15) A20(12-15) A20(12-15) A21(12-15) A21(12-15) A20(12-15) A20(12-15) A21(12-15) A21(12-15) 4772const __m512i lhs_mat_23_21_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_21 , (_MM_PERM_ENUM )245 );//A22(12-15) A22(12-15) A23(12-15) A23(12-15) A22(12-15) A22(12-15) A23(12-15) A23(12-15) A22(12-15) A22(12-15) A23(12-15) A23(12-15) A22(12-15) A22(12-15) A23(12-15) A23(12-15) 4773 4774const __m512i lhs_mat_01_30_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_30 , (_MM_PERM_ENUM )245 );//A30(4-7) A30(4-7) A31(4-7) A31(4-7) A30(4-7) A30(4-7) A31(4-7) A31(4-7) A30(4-7) A30(4-7) A31(4-7) A31(4-7) A30(4-7) A30(4-7) A31(4-7) A31(4-7) 4775const __m512i lhs_mat_23_30_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_30 , (_MM_PERM_ENUM )245 );//A32(4-7) A32(4-7) A33(4-7) A33(4-7) A32(4-7) A32(4-7) A33(4-7) A33(4-7) A32(4-7) A32(4-7) A33(4-7) A33(4-7) A32(4-7) A32(4-7) A33(4-7) A33(4-7) 4776 4777const __m512i lhs_mat_01_31_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_31 , (_MM_PERM_ENUM )245 );//A30(12-15) A30(12-15) A31(12-15) A31(12-15) A30(12-15) A30(12-15) A31(12-15) A31(12-15) A30(12-15) A30(12-15) A31(12-15) A31(12-15) A30(12-15) A30(12-15) A31(12-15) A31(12-15) 4778const __m512i lhs_mat_23_31_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_31 , (_MM_PERM_ENUM )245 );//A32(12-15) A32(12-15) A33(12-15) A33(12-15) A32(12-15) A32(12-15) A33(12-15) A33(12-15) A32(12-15) A32(12-15) A33(12-15) A33(12-15) A32(12-15) A32(12-15) A33(12-15) A33(12-15) 4779 4780const __m512i lhs_mat_01_40_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_40 , (_MM_PERM_ENUM )245 );//A40(4-7) A40(4-7) A41(4-7) A41(4-7) A40(4-7) A40(4-7) A41(4-7) A41(4-7) A40(4-7) A40(4-7) A41(4-7) A41(4-7) A40(4-7) A40(4-7) A41(4-7) A41(4-7) 4781const __m512i lhs_mat_23_40_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_40 , (_MM_PERM_ENUM )245 );//A42(4-7) A42(4-7) A43(4-7) A43(4-7) A42(4-7) A42(4-7) A43(4-7) A43(4-7) A42(4-7) A42(4-7) A43(4-7) A43(4-7) A42(4-7) A42(4-7) A43(4-7) A43(4-7) 4782 4783const __m512i lhs_mat_01_41_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_41 , (_MM_PERM_ENUM )245 );//A40(12-15) A40(12-15) A41(12-15) A41(12-15) A40(12-15) A40(12-15) A41(12-15) A41(12-15) A40(12-15) A40(12-15) A41(12-15) A41(12-15) A40(12-15) A40(12-15) A41(12-15) A41(12-15) 4784const __m512i lhs_mat_23_41_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_41 , (_MM_PERM_ENUM )245 );//A42(12-15) A42(12-15) A43(12-15) A43(12-15) A42(12-15) A42(12-15) A43(12-15) A43(12-15) A42(12-15) A42(12-15) A43(12-15) A43(12-15) A42(12-15) A42(12-15) A43(12-15) A43(12-15) 4785 4786const __m512i lhs_mat_01_50_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_50 , (_MM_PERM_ENUM )245 );//A50(4-7) A50(4-7) A51(4-7) A51(4-7) A50(4-7) A50(4-7) A51(4-7) A51(4-7) A50(4-7) A50(4-7) A51(4-7) A51(4-7) A50(4-7) A50(4-7) A51(4-7) A51(4-7) 4787const __m512i lhs_mat_23_50_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_50 , (_MM_PERM_ENUM )245 );//A52(4-7) A52(4-7) A53(4-7) A53(4-7) A52(4-7) A52(4-7) A53(4-7) A53(4-7) A52(4-7) A52(4-7) A53(4-7) A53(4-7) A52(4-7) A52(4-7) A53(4-7) A53(4-7) 4788 4789const __m512i lhs_mat_01_51_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_51 , (_MM_PERM_ENUM )245 );//A50(12-15) A50(12-15) A51(12-15) A51(12-15) A50(12-15) A50(12-15) A51(12-15) A51(12-15) A50(12-15) A50(12-15) A51(12-15) A51(12-15) A50(12-15) A50(12-15) A51(12-15) A51(12-15) 4790const __m512i lhs_mat_23_51_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_51 , (_MM_PERM_ENUM )245 );//A52(12-15) A52(12-15) A53(12-15) A53(12-15) A52(12-15) A52(12-15) A53(12-15) A53(12-15) A52(12-15) A52(12-15) A53(12-15) A53(12-15) A52(12-15) A52(12-15) A53(12-15) A53(12-15) 4791 4792const __m512i lhs_mat_01_60_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_60 , (_MM_PERM_ENUM )245 );//A60(4-7) A60(4-7) A61(4-7) A61(4-7) A60(4-7) A60(4-7) A61(4-7) A61(4-7) A60(4-7) A60(4-7) A61(4-7) A61(4-7) A60(4-7) A60(4-7) A61(4-7) A61(4-7) 4793const __m512i lhs_mat_23_60_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_60 , (_MM_PERM_ENUM )245 );//A62(4-7) A62(4-7) A63(4-7) A63(4-7) A62(4-7) A62(4-7) A63(4-7) A63(4-7) A62(4-7) A62(4-7) A63(4-7) A63(4-7) A62(4-7) A62(4-7) A63(4-7) A63(4-7) 4794 4795const __m512i lhs_mat_01_61_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_61 , (_MM_PERM_ENUM )245 );//A60(12-15) A60(12-15) A61(12-15) A61(12-15) A60(12-15) A60(12-15) A61(12-15) A61(12-15) A60(12-15) A60(12-15) A61(12-15) A61(12-15) A60(12-15) A60(12-15) A61(12-15) A61(12-15) 4796const __m512i lhs_mat_23_61_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_61 , (_MM_PERM_ENUM )245 );//A62(12-15) A62(12-15) A63(12-15) A63(12-15) A62(12-15) A62(12-15) A63(12-15) A63(12-15) A62(12-15) A62(12-15) A63(12-15) A63(12-15) A62(12-15) A62(12-15) A63(12-15) A63(12-15) 4797 4798const __m512i lhs_mat_01_70_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_70 , (_MM_PERM_ENUM )245 );//A70(4-7) A70(4-7) A71(4-7) A71(4-7) A70(4-7) A70(4-7) A71(4-7) A71(4-7) A70(4-7) A70(4-7) A71(4-7) A71(4-7) A70(4-7) A70(4-7) A71(4-7) A71(4-7) 4799const __m512i lhs_mat_23_70_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_70 , (_MM_PERM_ENUM )245 );//A72(4-7) A72(4-7) A73(4-7) A73(4-7) A72(4-7) A72(4-7) A73(4-7) A73(4-7) A72(4-7) A72(4-7) A73(4-7) A73(4-7) A72(4-7) A72(4-7) A73(4-7) A73(4-7) 4800 4801const __m512i lhs_mat_01_71_sp2 = _mm512_shuffle_epi32 (lhs_mat_01_71 , (_MM_PERM_ENUM )245 );//A70(12-15) A70(12-15) A71(12-15) A71(12-15) A70(12-15) A70(12-15) A71(12-15) A71(12-15) A70(12-15) A70(12-15) A71(12-15) A71(12-15) A70(12-15) A70(12-15) A71(12-15) A71(12-15) 4802const __m512i lhs_mat_23_71_sp2 = _mm512_shuffle_epi32 (lhs_mat_23_71 , (_MM_PERM_ENUM )245 );//A72(12-15) A72(12-15) A73(12-15) A73(12-15) A72(12-15) A72(12-15) A73(12-15) A73(12-15) A72(12-15) A72(12-15) A73(12-15) A73(12-15) A72(12-15) A72(12-15) A73(12-15) A73(12-15) 4803 4804// The values arranged in shuffle patterns are operated with dot product operation within 32 bit lane i.e corresponding bytes and multiplied and added into 32 bit integers within 32 bit lane 4805__m512i iacc_mat_00_0_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_00_sp1 ,lhs_mat_01_00_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_01_sp1 ,lhs_mat_01_01_sp1 )); 4806__m512i iacc_mat_01_0_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_00_sp1 ,lhs_mat_01_00_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_01_sp1 ,lhs_mat_01_01_sp1 )); 4807 4808__m512i iacc_mat_10_0_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_00_sp1 ,lhs_mat_23_00_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_01_sp1 ,lhs_mat_23_01_sp1 )); 4809__m512i iacc_mat_11_0_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_00_sp1 ,lhs_mat_23_00_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_01_sp1 ,lhs_mat_23_01_sp1 )); 4810 4811__m512i iacc_mat_00_1_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_10_sp1 ,lhs_mat_01_10_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_11_sp1 ,lhs_mat_01_11_sp1 )); 4812__m512i iacc_mat_01_1_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_10_sp1 ,lhs_mat_01_10_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_11_sp1 ,lhs_mat_01_11_sp1 )); 4813 4814__m512i iacc_mat_10_1_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_10_sp1 ,lhs_mat_23_10_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_11_sp1 ,lhs_mat_23_11_sp1 )); 4815__m512i iacc_mat_11_1_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_10_sp1 ,lhs_mat_23_10_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_11_sp1 ,lhs_mat_23_11_sp1 )); 4816 4817__m512i iacc_mat_00_2_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_20_sp1 ,lhs_mat_01_20_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_21_sp1 ,lhs_mat_01_21_sp1 )); 4818__m512i iacc_mat_01_2_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_20_sp1 ,lhs_mat_01_20_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_21_sp1 ,lhs_mat_01_21_sp1 )); 4819 4820__m512i iacc_mat_10_2_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_20_sp1 ,lhs_mat_23_20_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_21_sp1 ,lhs_mat_23_21_sp1 )); 4821__m512i iacc_mat_11_2_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_20_sp1 ,lhs_mat_23_20_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_21_sp1 ,lhs_mat_23_21_sp1 )); 4822 4823__m512i iacc_mat_00_3_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_30_sp1 ,lhs_mat_01_30_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_31_sp1 ,lhs_mat_01_31_sp1 )); 4824__m512i iacc_mat_01_3_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_30_sp1 ,lhs_mat_01_30_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_31_sp1 ,lhs_mat_01_31_sp1 )); 4825 4826__m512i iacc_mat_10_3_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_30_sp1 ,lhs_mat_23_30_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_31_sp1 ,lhs_mat_23_31_sp1 )); 4827__m512i iacc_mat_11_3_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_30_sp1 ,lhs_mat_23_30_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_31_sp1 ,lhs_mat_23_31_sp1 )); 4828 4829__m512i iacc_mat_00_4_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_40_sp1 ,lhs_mat_01_40_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_41_sp1 ,lhs_mat_01_41_sp1 )); 4830__m512i iacc_mat_01_4_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_40_sp1 ,lhs_mat_01_40_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_41_sp1 ,lhs_mat_01_41_sp1 )); 4831 4832__m512i iacc_mat_10_4_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_40_sp1 ,lhs_mat_23_40_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_41_sp1 ,lhs_mat_23_41_sp1 )); 4833__m512i iacc_mat_11_4_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_40_sp1 ,lhs_mat_23_40_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_41_sp1 ,lhs_mat_23_41_sp1 )); 4834 4835__m512i iacc_mat_00_5_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_50_sp1 ,lhs_mat_01_50_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_51_sp1 ,lhs_mat_01_51_sp1 )); 4836__m512i iacc_mat_01_5_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_50_sp1 ,lhs_mat_01_50_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_51_sp1 ,lhs_mat_01_51_sp1 )); 4837 4838__m512i iacc_mat_10_5_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_50_sp1 ,lhs_mat_23_50_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_51_sp1 ,lhs_mat_23_51_sp1 )); 4839__m512i iacc_mat_11_5_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_50_sp1 ,lhs_mat_23_50_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_51_sp1 ,lhs_mat_23_51_sp1 )); 4840 4841__m512i iacc_mat_00_6_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_60_sp1 ,lhs_mat_01_60_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_61_sp1 ,lhs_mat_01_61_sp1 )); 4842__m512i iacc_mat_01_6_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_60_sp1 ,lhs_mat_01_60_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_61_sp1 ,lhs_mat_01_61_sp1 )); 4843 4844__m512i iacc_mat_10_6_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_60_sp1 ,lhs_mat_23_60_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_61_sp1 ,lhs_mat_23_61_sp1 )); 4845__m512i iacc_mat_11_6_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_60_sp1 ,lhs_mat_23_60_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_61_sp1 ,lhs_mat_23_61_sp1 )); 4846 4847__m512i iacc_mat_00_7_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_70_sp1 ,lhs_mat_01_70_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_71_sp1 ,lhs_mat_01_71_sp1 )); 4848__m512i iacc_mat_01_7_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_70_sp1 ,lhs_mat_01_70_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_71_sp1 ,lhs_mat_01_71_sp1 )); 4849 4850__m512i iacc_mat_10_7_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_70_sp1 ,lhs_mat_23_70_sp1 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_71_sp1 ,lhs_mat_23_71_sp1 )); 4851__m512i iacc_mat_11_7_sp1 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_70_sp1 ,lhs_mat_23_70_sp1 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_71_sp1 ,lhs_mat_23_71_sp1 )); 4852 4853 4854__m512i iacc_mat_00_0_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_00_sp2 ,lhs_mat_01_00_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_01_sp2 ,lhs_mat_01_01_sp2 )); 4855__m512i iacc_mat_01_0_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_00_sp2 ,lhs_mat_01_00_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_01_sp2 ,lhs_mat_01_01_sp2 )); 4856 4857__m512i iacc_mat_10_0_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_00_sp2 ,lhs_mat_23_00_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_01_sp2 ,lhs_mat_23_01_sp2 )); 4858__m512i iacc_mat_11_0_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_00_sp2 ,lhs_mat_23_00_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_01_sp2 ,lhs_mat_23_01_sp2 )); 4859 4860__m512i iacc_mat_00_1_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_10_sp2 ,lhs_mat_01_10_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_11_sp2 ,lhs_mat_01_11_sp2 )); 4861__m512i iacc_mat_01_1_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_10_sp2 ,lhs_mat_01_10_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_11_sp2 ,lhs_mat_01_11_sp2 )); 4862 4863__m512i iacc_mat_10_1_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_10_sp2 ,lhs_mat_23_10_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_11_sp2 ,lhs_mat_23_11_sp2 )); 4864__m512i iacc_mat_11_1_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_10_sp2 ,lhs_mat_23_10_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_11_sp2 ,lhs_mat_23_11_sp2 )); 4865 4866__m512i iacc_mat_00_2_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_20_sp2 ,lhs_mat_01_20_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_21_sp2 ,lhs_mat_01_21_sp2 )); 4867__m512i iacc_mat_01_2_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_20_sp2 ,lhs_mat_01_20_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_21_sp2 ,lhs_mat_01_21_sp2 )); 4868 4869__m512i iacc_mat_10_2_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_20_sp2 ,lhs_mat_23_20_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_21_sp2 ,lhs_mat_23_21_sp2 )); 4870__m512i iacc_mat_11_2_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_20_sp2 ,lhs_mat_23_20_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_21_sp2 ,lhs_mat_23_21_sp2 )); 4871 4872__m512i iacc_mat_00_3_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_30_sp2 ,lhs_mat_01_30_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_31_sp2 ,lhs_mat_01_31_sp2 )); 4873__m512i iacc_mat_01_3_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_30_sp2 ,lhs_mat_01_30_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_31_sp2 ,lhs_mat_01_31_sp2 )); 4874 4875__m512i iacc_mat_10_3_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_30_sp2 ,lhs_mat_23_30_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_31_sp2 ,lhs_mat_23_31_sp2 )); 4876__m512i iacc_mat_11_3_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_30_sp2 ,lhs_mat_23_30_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_31_sp2 ,lhs_mat_23_31_sp2 )); 4877 4878__m512i iacc_mat_00_4_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_40_sp2 ,lhs_mat_01_40_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_41_sp2 ,lhs_mat_01_41_sp2 )); 4879__m512i iacc_mat_01_4_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_40_sp2 ,lhs_mat_01_40_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_41_sp2 ,lhs_mat_01_41_sp2 )); 4880 4881__m512i iacc_mat_10_4_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_40_sp2 ,lhs_mat_23_40_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_41_sp2 ,lhs_mat_23_41_sp2 )); 4882__m512i iacc_mat_11_4_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_40_sp2 ,lhs_mat_23_40_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_41_sp2 ,lhs_mat_23_41_sp2 )); 4883 4884__m512i iacc_mat_00_5_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_50_sp2 ,lhs_mat_01_50_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_51_sp2 ,lhs_mat_01_51_sp2 )); 4885__m512i iacc_mat_01_5_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_50_sp2 ,lhs_mat_01_50_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_51_sp2 ,lhs_mat_01_51_sp2 )); 4886 4887__m512i iacc_mat_10_5_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_50_sp2 ,lhs_mat_23_50_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_51_sp2 ,lhs_mat_23_51_sp2 )); 4888__m512i iacc_mat_11_5_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_50_sp2 ,lhs_mat_23_50_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_51_sp2 ,lhs_mat_23_51_sp2 )); 4889 4890__m512i iacc_mat_00_6_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_60_sp2 ,lhs_mat_01_60_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_61_sp2 ,lhs_mat_01_61_sp2 )); 4891__m512i iacc_mat_01_6_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_60_sp2 ,lhs_mat_01_60_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_61_sp2 ,lhs_mat_01_61_sp2 )); 4892 4893__m512i iacc_mat_10_6_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_60_sp2 ,lhs_mat_23_60_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_61_sp2 ,lhs_mat_23_61_sp2 )); 4894__m512i iacc_mat_11_6_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_60_sp2 ,lhs_mat_23_60_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_61_sp2 ,lhs_mat_23_61_sp2 )); 4895 4896__m512i iacc_mat_00_7_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_70_sp2 ,lhs_mat_01_70_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_71_sp2 ,lhs_mat_01_71_sp2 )); 4897__m512i iacc_mat_01_7_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_70_sp2 ,lhs_mat_01_70_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_71_sp2 ,lhs_mat_01_71_sp2 )); 4898 4899__m512i iacc_mat_10_7_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_014589CD_70_sp2 ,lhs_mat_23_70_sp2 ),_mm512_maddubs_epi16 (rhs_mat_014589CD_71_sp2 ,lhs_mat_23_71_sp2 )); 4900__m512i iacc_mat_11_7_sp2 = _mm512_add_epi16 (_mm512_maddubs_epi16 (rhs_mat_2367ABEF_70_sp2 ,lhs_mat_23_70_sp2 ),_mm512_maddubs_epi16 (rhs_mat_2367ABEF_71_sp2 ,lhs_mat_23_71_sp2 )); 4901 4902// Combine results from both shuffle patterns for each output block 4903__m512i iacc_mat_00_0 = _mm512_add_epi16 (iacc_mat_00_0_sp1 ,iacc_mat_00_0_sp2 ); 4904__m512i iacc_mat_01_0 = _mm512_add_epi16 (iacc_mat_01_0_sp1 ,iacc_mat_01_0_sp2 ); 4905__m512i iacc_mat_10_0 = _mm512_add_epi16 (iacc_mat_10_0_sp1 ,iacc_mat_10_0_sp2 ); 4906__m512i iacc_mat_11_0 = _mm512_add_epi16 (iacc_mat_11_0_sp1 ,iacc_mat_11_0_sp2 ); 4907 4908__m512i iacc_mat_00_1 = _mm512_add_epi16 (iacc_mat_00_1_sp1 ,iacc_mat_00_1_sp2 ); 4909__m512i iacc_mat_01_1 = _mm512_add_epi16 (iacc_mat_01_1_sp1 ,iacc_mat_01_1_sp2 ); 4910__m512i iacc_mat_10_1 = _mm512_add_epi16 (iacc_mat_10_1_sp1 ,iacc_mat_10_1_sp2 ); 4911__m512i iacc_mat_11_1 = _mm512_add_epi16 (iacc_mat_11_1_sp1 ,iacc_mat_11_1_sp2 ); 4912 4913__m512i iacc_mat_00_2 = _mm512_add_epi16 (iacc_mat_00_2_sp1 ,iacc_mat_00_2_sp2 ); 4914__m512i iacc_mat_01_2 = _mm512_add_epi16 (iacc_mat_01_2_sp1 ,iacc_mat_01_2_sp2 ); 4915__m512i iacc_mat_10_2 = _mm512_add_epi16 (iacc_mat_10_2_sp1 ,iacc_mat_10_2_sp2 ); 4916__m512i iacc_mat_11_2 = _mm512_add_epi16 (iacc_mat_11_2_sp1 ,iacc_mat_11_2_sp2 ); 4917 4918__m512i iacc_mat_00_3 = _mm512_add_epi16 (iacc_mat_00_3_sp1 ,iacc_mat_00_3_sp2 ); 4919__m512i iacc_mat_01_3 = _mm512_add_epi16 (iacc_mat_01_3_sp1 ,iacc_mat_01_3_sp2 ); 4920__m512i iacc_mat_10_3 = _mm512_add_epi16 (iacc_mat_10_3_sp1 ,iacc_mat_10_3_sp2 ); 4921__m512i iacc_mat_11_3 = _mm512_add_epi16 (iacc_mat_11_3_sp1 ,iacc_mat_11_3_sp2 ); 4922 4923__m512i iacc_mat_00_4 = _mm512_add_epi16 (iacc_mat_00_4_sp1 ,iacc_mat_00_4_sp2 ); 4924__m512i iacc_mat_01_4 = _mm512_add_epi16 (iacc_mat_01_4_sp1 ,iacc_mat_01_4_sp2 ); 4925__m512i iacc_mat_10_4 = _mm512_add_epi16 (iacc_mat_10_4_sp1 ,iacc_mat_10_4_sp2 ); 4926__m512i iacc_mat_11_4 = _mm512_add_epi16 (iacc_mat_11_4_sp1 ,iacc_mat_11_4_sp2 ); 4927 4928__m512i iacc_mat_00_5 = _mm512_add_epi16 (iacc_mat_00_5_sp1 ,iacc_mat_00_5_sp2 ); 4929__m512i iacc_mat_01_5 = _mm512_add_epi16 (iacc_mat_01_5_sp1 ,iacc_mat_01_5_sp2 ); 4930__m512i iacc_mat_10_5 = _mm512_add_epi16 (iacc_mat_10_5_sp1 ,iacc_mat_10_5_sp2 ); 4931__m512i iacc_mat_11_5 = _mm512_add_epi16 (iacc_mat_11_5_sp1 ,iacc_mat_11_5_sp2 ); 4932 4933__m512i iacc_mat_00_6 = _mm512_add_epi16 (iacc_mat_00_6_sp1 ,iacc_mat_00_6_sp2 ); 4934__m512i iacc_mat_01_6 = _mm512_add_epi16 (iacc_mat_01_6_sp1 ,iacc_mat_01_6_sp2 ); 4935__m512i iacc_mat_10_6 = _mm512_add_epi16 (iacc_mat_10_6_sp1 ,iacc_mat_10_6_sp2 ); 4936__m512i iacc_mat_11_6 = _mm512_add_epi16 (iacc_mat_11_6_sp1 ,iacc_mat_11_6_sp2 ); 4937 4938__m512i iacc_mat_00_7 = _mm512_add_epi16 (iacc_mat_00_7_sp1 ,iacc_mat_00_7_sp2 ); 4939__m512i iacc_mat_01_7 = _mm512_add_epi16 (iacc_mat_01_7_sp1 ,iacc_mat_01_7_sp2 ); 4940__m512i iacc_mat_10_7 = _mm512_add_epi16 (iacc_mat_10_7_sp1 ,iacc_mat_10_7_sp2 ); 4941__m512i iacc_mat_11_7 = _mm512_add_epi16 (iacc_mat_11_7_sp1 ,iacc_mat_11_7_sp2 ); 4942 4943// Output of both shuffle patterns are added in order to sum dot product outputs of all 32 values in block 4944iacc_mat_00_0 = _mm512_madd_epi16 (iacc_mat_00_0 ,scale_014589CD_0 ); 4945iacc_mat_01_0 = _mm512_madd_epi16 (iacc_mat_01_0 ,scale_2367ABEF_0 ); 4946iacc_mat_10_0 = _mm512_madd_epi16 (iacc_mat_10_0 ,scale_014589CD_0 ); 4947iacc_mat_11_0 = _mm512_madd_epi16 (iacc_mat_11_0 ,scale_2367ABEF_0 ); 4948 4949iacc_mat_00_1 = _mm512_madd_epi16 (iacc_mat_00_1 ,scale_014589CD_1 ); 4950iacc_mat_01_1 = _mm512_madd_epi16 (iacc_mat_01_1 ,scale_2367ABEF_1 ); 4951iacc_mat_10_1 = _mm512_madd_epi16 (iacc_mat_10_1 ,scale_014589CD_1 ); 4952iacc_mat_11_1 = _mm512_madd_epi16 (iacc_mat_11_1 ,scale_2367ABEF_1 ); 4953 4954iacc_mat_00_2 = _mm512_madd_epi16 (iacc_mat_00_2 ,scale_014589CD_2 ); 4955iacc_mat_01_2 = _mm512_madd_epi16 (iacc_mat_01_2 ,scale_2367ABEF_2 ); 4956iacc_mat_10_2 = _mm512_madd_epi16 (iacc_mat_10_2 ,scale_014589CD_2 ); 4957iacc_mat_11_2 = _mm512_madd_epi16 (iacc_mat_11_2 ,scale_2367ABEF_2 ); 4958 4959iacc_mat_00_3 = _mm512_madd_epi16 (iacc_mat_00_3 ,scale_014589CD_3 ); 4960iacc_mat_01_3 = _mm512_madd_epi16 (iacc_mat_01_3 ,scale_2367ABEF_3 ); 4961iacc_mat_10_3 = _mm512_madd_epi16 (iacc_mat_10_3 ,scale_014589CD_3 ); 4962iacc_mat_11_3 = _mm512_madd_epi16 (iacc_mat_11_3 ,scale_2367ABEF_3 ); 4963 4964iacc_mat_00_4 = _mm512_madd_epi16 (iacc_mat_00_4 ,scale_014589CD_4 ); 4965iacc_mat_01_4 = _mm512_madd_epi16 (iacc_mat_01_4 ,scale_2367ABEF_4 ); 4966iacc_mat_10_4 = _mm512_madd_epi16 (iacc_mat_10_4 ,scale_014589CD_4 ); 4967iacc_mat_11_4 = _mm512_madd_epi16 (iacc_mat_11_4 ,scale_2367ABEF_4 ); 4968 4969iacc_mat_00_5 = _mm512_madd_epi16 (iacc_mat_00_5 ,scale_014589CD_5 ); 4970iacc_mat_01_5 = _mm512_madd_epi16 (iacc_mat_01_5 ,scale_2367ABEF_5 ); 4971iacc_mat_10_5 = _mm512_madd_epi16 (iacc_mat_10_5 ,scale_014589CD_5 ); 4972iacc_mat_11_5 = _mm512_madd_epi16 (iacc_mat_11_5 ,scale_2367ABEF_5 ); 4973 4974iacc_mat_00_6 = _mm512_madd_epi16 (iacc_mat_00_6 ,scale_014589CD_6 ); 4975iacc_mat_01_6 = _mm512_madd_epi16 (iacc_mat_01_6 ,scale_2367ABEF_6 ); 4976iacc_mat_10_6 = _mm512_madd_epi16 (iacc_mat_10_6 ,scale_014589CD_6 ); 4977iacc_mat_11_6 = _mm512_madd_epi16 (iacc_mat_11_6 ,scale_2367ABEF_6 ); 4978 4979iacc_mat_00_7 = _mm512_madd_epi16 (iacc_mat_00_7 ,scale_014589CD_7 ); 4980iacc_mat_01_7 = _mm512_madd_epi16 (iacc_mat_01_7 ,scale_2367ABEF_7 ); 4981iacc_mat_10_7 = _mm512_madd_epi16 (iacc_mat_10_7 ,scale_014589CD_7 ); 4982iacc_mat_11_7 = _mm512_madd_epi16 (iacc_mat_11_7 ,scale_2367ABEF_7 ); 4983 4984__m512i iacc_mat_00 = _mm512_add_epi32 (_mm512_add_epi32 (_mm512_add_epi32 (iacc_mat_00_0 ,iacc_mat_00_1 ),_mm512_add_epi32 (iacc_mat_00_2 ,iacc_mat_00_3 )),_mm512_add_epi32 (_mm512_add_epi32 (iacc_mat_00_4 ,iacc_mat_00_5 ),_mm512_add_epi32 (iacc_mat_00_6 ,iacc_mat_00_7 ))); 4985__m512i iacc_mat_01 = _mm512_add_epi32 (_mm512_add_epi32 (_mm512_add_epi32 (iacc_mat_01_0 ,iacc_mat_01_1 ),_mm512_add_epi32 (iacc_mat_01_2 ,iacc_mat_01_3 )),_mm512_add_epi32 (_mm512_add_epi32 (iacc_mat_01_4 ,iacc_mat_01_5 ),_mm512_add_epi32 (iacc_mat_01_6 ,iacc_mat_01_7 ))); 4986__m512i iacc_mat_10 = _mm512_add_epi32 (_mm512_add_epi32 (_mm512_add_epi32 (iacc_mat_10_0 ,iacc_mat_10_1 ),_mm512_add_epi32 (iacc_mat_10_2 ,iacc_mat_10_3 )),_mm512_add_epi32 (_mm512_add_epi32 (iacc_mat_10_4 ,iacc_mat_10_5 ),_mm512_add_epi32 (iacc_mat_10_6 ,iacc_mat_10_7 ))); 4987__m512i iacc_mat_11 = _mm512_add_epi32 (_mm512_add_epi32 (_mm512_add_epi32 (iacc_mat_11_0 ,iacc_mat_11_1 ),_mm512_add_epi32 (iacc_mat_11_2 ,iacc_mat_11_3 )),_mm512_add_epi32 (_mm512_add_epi32 (iacc_mat_11_4 ,iacc_mat_11_5 ),_mm512_add_epi32 (iacc_mat_11_6 ,iacc_mat_11_7 ))); 4988 4989// Straighten out to make 4 row vectors 4990__m512i iacc_row_0 = _mm512_mask_blend_epi32 (0xCCCC ,iacc_mat_00 ,_mm512_shuffle_epi32 (iacc_mat_01 , (_MM_PERM_ENUM )78 )); 4991__m512i iacc_row_1 = _mm512_mask_blend_epi32 (0xCCCC ,_mm512_shuffle_epi32 (iacc_mat_00 , (_MM_PERM_ENUM )78 ),iacc_mat_01 ); 4992__m512i iacc_row_2 = _mm512_mask_blend_epi32 (0xCCCC ,iacc_mat_10 ,_mm512_shuffle_epi32 (iacc_mat_11 , (_MM_PERM_ENUM )78 )); 4993__m512i iacc_row_3 = _mm512_mask_blend_epi32 (0xCCCC ,_mm512_shuffle_epi32 (iacc_mat_10 , (_MM_PERM_ENUM )78 ),iacc_mat_11 ); 4994 4995// Load the scale(d) values for all the 4 Q8_k blocks and repeat it across lanes 4996const __m128 row_scale_f32_sse = _mm_load_ps (a_ptr [b ].d ); 4997const __m256 row_scale_f32_ymm = _mm256_set_m128 (row_scale_f32_sse ,row_scale_f32_sse ); 4998const __m512 row_scale_f32 = _mm512_insertf32x8 (_mm512_castps256_ps512 (row_scale_f32_ymm ),row_scale_f32_ymm ,1 ); 4999 5000// Multiply with appropiate scales and accumulate (for both d and dmin) below 5001acc_rows [0 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_0 ),_mm512_mul_ps (col_scale_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,0 )),acc_rows [0 ]); 5002acc_rows [1 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_1 ),_mm512_mul_ps (col_scale_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,85 )),acc_rows [1 ]); 5003acc_rows [2 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_2 ),_mm512_mul_ps (col_scale_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,170 )),acc_rows [2 ]); 5004acc_rows [3 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_3 ),_mm512_mul_ps (col_scale_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,255 )),acc_rows [3 ]); 5005 5006// Take two bsums from two Q8_Ks at a time and multiply with corresponding mins values from each Q2_K 5007__m512i iacc_row_min_0_01 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_01_0123 , (_MM_PERM_ENUM )0 ),mins_01 ); 5008__m512i iacc_row_min_1_01 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_01_0123 , (_MM_PERM_ENUM )170 ),mins_01 ); 5009__m512i iacc_row_min_2_01 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_23_0123 , (_MM_PERM_ENUM )0 ),mins_01 ); 5010__m512i iacc_row_min_3_01 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_23_0123 , (_MM_PERM_ENUM )170 ),mins_01 ); 5011 5012__m512i iacc_row_min_0_23 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_01_0123 , (_MM_PERM_ENUM )85 ),mins_23 ); 5013__m512i iacc_row_min_1_23 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_01_0123 , (_MM_PERM_ENUM )255 ),mins_23 ); 5014__m512i iacc_row_min_2_23 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_23_0123 , (_MM_PERM_ENUM )85 ),mins_23 ); 5015__m512i iacc_row_min_3_23 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_23_0123 , (_MM_PERM_ENUM )255 ),mins_23 ); 5016 5017__m512i iacc_row_min_0_45 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_01_4567 , (_MM_PERM_ENUM )0 ),mins_45 ); 5018__m512i iacc_row_min_1_45 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_01_4567 , (_MM_PERM_ENUM )170 ),mins_45 ); 5019__m512i iacc_row_min_2_45 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_23_4567 , (_MM_PERM_ENUM )0 ),mins_45 ); 5020__m512i iacc_row_min_3_45 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_23_4567 , (_MM_PERM_ENUM )170 ),mins_45 ); 5021 5022__m512i iacc_row_min_0_67 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_01_4567 , (_MM_PERM_ENUM )85 ),mins_67 ); 5023__m512i iacc_row_min_1_67 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_01_4567 , (_MM_PERM_ENUM )255 ),mins_67 ); 5024__m512i iacc_row_min_2_67 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_23_4567 , (_MM_PERM_ENUM )85 ),mins_67 ); 5025__m512i iacc_row_min_3_67 = _mm512_madd_epi16 (_mm512_shuffle_epi32 (lhs_bsums_23_4567 , (_MM_PERM_ENUM )255 ),mins_67 ); 5026 5027__m512i iacc_row_min_0 = _mm512_add_epi32 (_mm512_add_epi32 (iacc_row_min_0_01 ,iacc_row_min_0_23 ),_mm512_add_epi32 (iacc_row_min_0_45 ,iacc_row_min_0_67 )); 5028__m512i iacc_row_min_1 = _mm512_add_epi32 (_mm512_add_epi32 (iacc_row_min_1_01 ,iacc_row_min_1_23 ),_mm512_add_epi32 (iacc_row_min_1_45 ,iacc_row_min_1_67 )); 5029__m512i iacc_row_min_2 = _mm512_add_epi32 (_mm512_add_epi32 (iacc_row_min_2_01 ,iacc_row_min_2_23 ),_mm512_add_epi32 (iacc_row_min_2_45 ,iacc_row_min_2_67 )); 5030__m512i iacc_row_min_3 = _mm512_add_epi32 (_mm512_add_epi32 (iacc_row_min_3_01 ,iacc_row_min_3_23 ),_mm512_add_epi32 (iacc_row_min_3_45 ,iacc_row_min_3_67 )); 5031 5032acc_min_rows [0 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_min_0 ),_mm512_mul_ps (col_dmin_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,0 )),acc_min_rows [0 ]); 5033acc_min_rows [1 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_min_1 ),_mm512_mul_ps (col_dmin_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,85 )),acc_min_rows [1 ]); 5034acc_min_rows [2 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_min_2 ),_mm512_mul_ps (col_dmin_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,170 )),acc_min_rows [2 ]); 5035acc_min_rows [3 ]= _mm512_fmadd_ps (_mm512_cvtepi32_ps (iacc_row_min_3 ),_mm512_mul_ps (col_dmin_f32 ,_mm512_shuffle_ps (row_scale_f32 ,row_scale_f32 ,255 )),acc_min_rows [3 ]); 5036 } 5037 } 5038// Store accumulated values 5039for (int i = 0 ;i < 4 ;i ++ ) { 5040_mm512_storeu_ps ((float * )(s + ((y * 4 + i )* bs + x * 8 )),_mm512_sub_ps (acc_rows [i ],acc_min_rows [i ])); 5041 } 5042 } 5043 } 5044 5045if (anc != nc ) { 5046xstart = anc /8 ; 5047y = 0 ; 5048 } 5049 5050#endif // __AVX512BW__ && __AVX512DQ__ 5051 5052// Take group of four block_q8_Kx4 structures at each pass of the loop and perform dot product operation 5053for (;y < anr /4 ;y += 4 ) { 5054 5055const block_q8_Kx4 * a_ptrs [4 ]; 5056 5057a_ptrs [0 ]= a_ptr_start + (y * nb ); 5058for (int i = 0 ;i < 3 ;++ i ) { 5059a_ptrs [i + 1 ]= a_ptrs [i ]+ nb ; 5060 } 5061 5062// Take group of eight block_q2_kx8 structures at each pass of the loop and perform dot product operation 5063for (int64_t x = xstart ;x < nc /8 ;x ++ ) { 5064 5065const block_q2_Kx8 * b_ptr = b_ptr_start + (x * b_nb ); 5066 5067// Master FP accumulators 5068__m256 acc_rows [16 ]; 5069for (int i = 0 ;i < 16 ;i ++ ) { 5070acc_rows [i ]= _mm256_setzero_ps (); 5071 } 5072 5073__m256 acc_min_rows [16 ]; 5074for (int i = 0 ;i < 16 ;i ++ ) { 5075acc_min_rows [i ]= _mm256_setzero_ps (); 5076 } 5077 5078// For super block 5079for (int64_t b = 0 ;b < nb ;b ++ ) { 5080// Delta values - Load the eight scale values of block_q2_kx8 5081const __m256 col_scale_f32 = GGML_F32Cx8_LOAD (b_ptr [b ].d ); 5082 5083// dmin values - Load the eight dmin values of block_q2_kx8 5084const __m256 col_dmin_f32 = GGML_F32Cx8_LOAD (b_ptr [b ].dmin ); 5085 5086// Loop to iterate over the sixteen sub blocks of a super block - eight sub blocks are processed per iteration 5087for (int sb = 0 ;sb < QK_K /128 ;sb ++ ) { 5088 5089// Load the eight block_q2_K for eight sub blocks quantized values interleaved with each other in chunks of eight bytes - B0,B1 ....B6,B7 5090const __m256i rhs_raw_mat_0123_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + sb * 256 )); 5091const __m256i rhs_raw_mat_4567_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 32 + sb * 256 )); 5092const __m256i rhs_raw_mat_0123_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 64 + sb * 256 )); 5093const __m256i rhs_raw_mat_4567_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 96 + sb * 256 )); 5094const __m256i rhs_raw_mat_0123_2 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 128 + sb * 256 )); 5095const __m256i rhs_raw_mat_4567_2 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 160 + sb * 256 )); 5096const __m256i rhs_raw_mat_0123_3 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 192 + sb * 256 )); 5097const __m256i rhs_raw_mat_4567_3 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 224 + sb * 256 )); 5098 5099// Save the values in the following vectors in the formats B0B1B4B5, B2B3B6B7 for further processing and storing of values 5100//superblock sub block which part of sub block 5101const __m256i rhs_raw_mat_0145_0 = _mm256_blend_epi32 (rhs_raw_mat_0123_0 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_0 ,requiredOrder ),240 ); 5102const __m256i rhs_raw_mat_2367_0 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_0 ,requiredOrder ),rhs_raw_mat_4567_0 ,240 ); 5103 5104const __m256i rhs_raw_mat_0145_1 = _mm256_blend_epi32 (rhs_raw_mat_0123_1 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_1 ,requiredOrder ),240 ); 5105const __m256i rhs_raw_mat_2367_1 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_1 ,requiredOrder ),rhs_raw_mat_4567_1 ,240 ); 5106 5107const __m256i rhs_raw_mat_0145_2 = _mm256_blend_epi32 (rhs_raw_mat_0123_2 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_2 ,requiredOrder ),240 ); 5108const __m256i rhs_raw_mat_2367_2 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_2 ,requiredOrder ),rhs_raw_mat_4567_2 ,240 ); 5109 5110const __m256i rhs_raw_mat_0145_3 = _mm256_blend_epi32 (rhs_raw_mat_0123_3 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_3 ,requiredOrder ),240 ); 5111const __m256i rhs_raw_mat_2367_3 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_3 ,requiredOrder ),rhs_raw_mat_4567_3 ,240 ); 5112 5113// 2-bit -> 8-bit 5114// First sub block of the eight sub blocks processed in the iteration 5115const __m256i rhs_mat_0145_00 = _mm256_and_si256 (rhs_raw_mat_0145_0 ,m3b );//B00(0-7) B01(0-7) B04(0-7) B05(0-7) 5116const __m256i rhs_mat_2367_00 = _mm256_and_si256 (rhs_raw_mat_2367_0 ,m3b );//B02(0-7) B03(0-7) B06(0-7) B07(0-7) 5117 5118const __m256i rhs_mat_0145_01 = _mm256_and_si256 (rhs_raw_mat_0145_1 ,m3b );//B00(8-15) B01(8-15) B04(8-15) B05(8-15) 5119const __m256i rhs_mat_2367_01 = _mm256_and_si256 (rhs_raw_mat_2367_1 ,m3b );//B02(8-15) B03(8-15) B06(8-15) B07(8-15) 5120 5121// Second sub block of the eight sub blocks processed in the iteration 5122const __m256i rhs_mat_0145_10 = _mm256_and_si256 (rhs_raw_mat_0145_2 ,m3b );//B10(0-7) B11(0-7) B14(0-7) B15(0-7) 5123const __m256i rhs_mat_2367_10 = _mm256_and_si256 (rhs_raw_mat_2367_2 ,m3b );//B12(0-7) B13(0-7) B16(0-7) B17(0-7) 5124 5125const __m256i rhs_mat_0145_11 = _mm256_and_si256 (rhs_raw_mat_0145_3 ,m3b );//B10(8-15) B11(8-15) B14(8-15) B15(8-15) 5126const __m256i rhs_mat_2367_11 = _mm256_and_si256 (rhs_raw_mat_2367_3 ,m3b );//B12(8-15) B13(8-15) B16(8-15) B17(8-15) 5127 5128// Third sub block of the eight sub blocks processed in the iteration 5129const __m256i rhs_mat_0145_20 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_0145_0 ,2 ),m3b );//B20(0-7) B21(0-7) B24(0-7) B25(0-7) 5130const __m256i rhs_mat_2367_20 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_2367_0 ,2 ),m3b );//B22(0-7) B23(0-7) B26(0-7) B27(0-7) 5131 5132const __m256i rhs_mat_0145_21 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_0145_1 ,2 ),m3b );//B20(8-15) B21(8-15) B24(8-15) B25(8-15) 5133const __m256i rhs_mat_2367_21 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_2367_1 ,2 ),m3b );//B22(8-15) B23(8-15) B26(8-15) B27(8-15) 5134 5135// Fourth sub block of the eight sub blocks processed in the iteration 5136const __m256i rhs_mat_0145_30 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_0145_2 ,2 ),m3b );//B30(0-7) B31(0-7) B34(0-7) B35(0-7) 5137const __m256i rhs_mat_2367_30 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_2367_2 ,2 ),m3b );//B32(0-7) B33(0-7) B36(0-7) B37(0-7) 5138 5139const __m256i rhs_mat_0145_31 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_0145_3 ,2 ),m3b );//B30(8-15) B31(8-15) B34(8-15) B35(8-15) 5140const __m256i rhs_mat_2367_31 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_2367_3 ,2 ),m3b );//B32(8-15) B33(8-15) B36(8-15) B37(8-15) 5141 5142// Fifth sub block of the eight sub blocks processed in the iteration 5143const __m256i rhs_mat_0145_40 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_0145_0 ,4 ),m3b );//B40(0-7) B41(0-7) B44(0-7) B45(0-7) 5144const __m256i rhs_mat_2367_40 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_2367_0 ,4 ),m3b );//B42(0-7) B43(0-7) B46(0-7) B47(0-7) 5145 5146const __m256i rhs_mat_0145_41 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_0145_1 ,4 ),m3b );//B40(8-15) B41(8-15) B44(8-15) B45(8-15) 5147const __m256i rhs_mat_2367_41 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_2367_1 ,4 ),m3b );//B42(8-15) B43(8-15) B46(8-15) B47(8-15) 5148 5149// Sixth sub block of the eight sub blocks processed in the iteration 5150const __m256i rhs_mat_0145_50 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_0145_2 ,4 ),m3b );//B50(0-7) B51(0-7) B54(0-7) B55(0-7) 5151const __m256i rhs_mat_2367_50 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_2367_2 ,4 ),m3b );//B52(0-7) B53(0-7) B56(0-7) B57(0-7) 5152 5153const __m256i rhs_mat_0145_51 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_0145_3 ,4 ),m3b );//B50(8-15) B51(8-15) B54(8-15) B55(8-15) 5154const __m256i rhs_mat_2367_51 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_2367_3 ,4 ),m3b );//B52(8-15) B53(8-15) B56(8-15) B57(8-15) 5155 5156// Seventh sub block of the eight sub blocks processed in the iteration 5157const __m256i rhs_mat_0145_60 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_0145_0 ,6 ),m3b );//B60(0-7) B61(0-7) B64(0-7) B65(0-7) 5158const __m256i rhs_mat_2367_60 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_2367_0 ,6 ),m3b );//B62(0-7) B63(0-7) B66(0-7) B67(0-7) 5159 5160const __m256i rhs_mat_0145_61 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_0145_1 ,6 ),m3b );//B60(8-15) B61(8-15) B64(8-15) B65(8-15) 5161const __m256i rhs_mat_2367_61 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_2367_1 ,6 ),m3b );//B62(8-15) B63(8-15) B66(8-15) B67(8-15) 5162 5163// Eighth sub block of the eight sub blocks processed in the iteration 5164const __m256i rhs_mat_0145_70 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_0145_2 ,6 ),m3b );//B70(0-7) B71(0-7) B74(0-7) B75(0-7) 5165const __m256i rhs_mat_2367_70 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_2367_2 ,6 ),m3b );//B72(0-7) B73(0-7) B76(0-7) B77(0-7) 5166 5167const __m256i rhs_mat_0145_71 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_0145_3 ,6 ),m3b );//B70(8-15) B71(8-15) B74(8-15) B75(8-15) 5168const __m256i rhs_mat_2367_71 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_2367_3 ,6 ),m3b );//B72(8-15) B73(8-15) B76(8-15) B77(8-15) 5169 5170// Shuffle pattern one - right side input 5171const __m256i rhs_mat_0145_00_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_00 ,136 );//B00(0-3) B01(0-3) B00(0-3) B01(0-3) B04(0-3) B05(0-3) B04(0-3) B05(0-3) 5172const __m256i rhs_mat_2367_00_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_00 ,136 );//B02(0-3) B03(0-3) B02(0-3) B03(0-3) B06(0-3) B07(0-3) B06(0-3) B07(0-3) 5173 5174const __m256i rhs_mat_0145_01_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_01 ,136 );//B00(8-11) B01(8-11) B00(8-11) B01(8-11) B04(8-11) B05(8-11) B04(8-11) B05(8-11) 5175const __m256i rhs_mat_2367_01_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_01 ,136 );//B02(8-11) B03(8-11) B02(8-11) B03(8-11) B06(8-11) B07(8-11) B06(8-11) B07(8-11) 5176 5177const __m256i rhs_mat_0145_10_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_10 ,136 );//B10(0-3) B11(0-3) B10(0-3) B11(0-3) B14(0-3) B15(0-3) B14(0-3) B15(0-3) 5178const __m256i rhs_mat_2367_10_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_10 ,136 );//B12(0-3) B13(0-3) B12(0-3) B13(0-3) B16(0-3) B17(0-3) B16(0-3) B17(0-3) 5179 5180const __m256i rhs_mat_0145_11_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_11 ,136 );//B10(8-11) B11(8-11) B10(8-11) B11(8-11) B14(8-11) B15(8-11) B14(8-11) B15(8-11) 5181const __m256i rhs_mat_2367_11_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_11 ,136 );//B12(8-11) B13(8-11) B12(8-11) B13(8-11) B16(8-11) B17(8-11) B16(8-11) B17(8-11) 5182 5183const __m256i rhs_mat_0145_20_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_20 ,136 );//B20(0-3) B21(0-3) B20(0-3) B21(0-3) B24(0-3) B25(0-3) B24(0-3) B25(0-3) 5184const __m256i rhs_mat_2367_20_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_20 ,136 );//B22(0-3) B23(0-3) B22(0-3) B23(0-3) B26(0-3) B27(0-3) B26(0-3) B27(0-3) 5185 5186const __m256i rhs_mat_0145_21_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_21 ,136 );//B20(8-11) B21(8-11) B20(8-11) B21(8-11) B24(8-11) B25(8-11) B24(8-11) B25(8-11) 5187const __m256i rhs_mat_2367_21_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_21 ,136 );//B22(8-11) B23(8-11) B22(8-11) B23(8-11) B26(8-11) B27(8-11) B26(8-11) B27(8-11) 5188 5189const __m256i rhs_mat_0145_30_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_30 ,136 );//B30(0-3) B31(0-3) B30(0-3) B31(0-3) B34(0-3) B35(0-3) B34(0-3) B35(0-3) 5190const __m256i rhs_mat_2367_30_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_30 ,136 );//B32(0-3) B33(0-3) B32(0-3) B33(0-3) B36(0-3) B37(0-3) B36(0-3) B37(0-3) 5191 5192const __m256i rhs_mat_0145_31_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_31 ,136 );//B30(8-11) B31(8-11) B30(8-11) B31(8-11) B34(8-11) B35(8-11) B34(8-11) B35(8-11 5193const __m256i rhs_mat_2367_31_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_31 ,136 );//B32(8-11) B33(8-11) B32(8-11) B33(8-11) B36(8-11) B37(8-11) B36(8-11) B37(8-11) 5194 5195const __m256i rhs_mat_0145_40_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_40 ,136 );//B40(0-3) B41(0-3) B40(0-3) B41(0-3) B44(0-3) B45(0-3) B44(0-3) B45(0-3) 5196const __m256i rhs_mat_2367_40_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_40 ,136 );//B42(0-3) B43(0-3) B42(0-3) B43(0-3) B46(0-3) B47(0-3) B46(0-3) B47(0-3) 5197 5198const __m256i rhs_mat_0145_41_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_41 ,136 );//B40(8-11) B41(8-11) B40(8-11) B41(8-11) B44(8-11) B45(8-11) B44(8-11) B45(8-11) 5199const __m256i rhs_mat_2367_41_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_41 ,136 );//B42(8-11) B43(8-11) B42(8-11) B43(8-11) B46(8-11) B47(8-11) B46(8-11) B47(8-11) 5200 5201const __m256i rhs_mat_0145_50_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_50 ,136 );//B50(0-3) B51(0-3) B50(0-3) B51(0-3) B54(0-3) B55(0-3) B54(0-3) B55(0-3) 5202const __m256i rhs_mat_2367_50_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_50 ,136 );//B52(0-3) B53(0-3) B52(0-3) B53(0-3) B56(0-3) B57(0-3) B56(0-3) B57(0-3) 5203 5204const __m256i rhs_mat_0145_51_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_51 ,136 );//B50(8-11) B51(8-11) B50(8-11) B51(8-11) B54(8-11) B55(8-11) B54(8-11) B55(8-11) 5205const __m256i rhs_mat_2367_51_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_51 ,136 );//B52(8-11) B53(8-11) B52(8-11) B53(8-11) B56(8-11) B57(8-11) B56(8-11) B57(8-11) 5206 5207const __m256i rhs_mat_0145_60_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_60 ,136 );//B60(0-3) B61(0-3) B60(0-3) B61(0-3) B64(0-3) B65(0-3) B64(0-3) B65(0-3) 5208const __m256i rhs_mat_2367_60_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_60 ,136 );//B62(0-3) B63(0-3) B62(0-3) B63(0-3) B66(0-3) B67(0-3) B66(0-3) B67(0-3) 5209 5210const __m256i rhs_mat_0145_61_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_61 ,136 );//B60(8-11) B61(8-11) B60(8-11) B61(8-11) B64(8-11) B65(8-11) B64(8-11) B65(8-11) 5211const __m256i rhs_mat_2367_61_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_61 ,136 );//B62(8-11) B63(8-11) B62(8-11) B63(8-11) B66(8-11) B67(8-11) B66(8-11) B67(8-11) 5212 5213const __m256i rhs_mat_0145_70_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_70 ,136 );//B70(0-3) B71(0-3) B70(0-3) B71(0-3) B74(0-3) B75(0-3) B74(0-3) B75(0-3) 5214const __m256i rhs_mat_2367_70_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_70 ,136 );//B72(0-3) B73(0-3) B72(0-3) B73(0-3) B76(0-3) B77(0-3) B76(0-3) B77(0-3) 5215 5216const __m256i rhs_mat_0145_71_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_71 ,136 );//B70(8-11) B71(8-11) B70(8-11) B71(8-11) B74(8-11) B75(8-11) B74(8-11) B75(8-11) 5217const __m256i rhs_mat_2367_71_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_71 ,136 );//B72(8-11) B73(8-11) B72(8-11) B73(8-11) B76(8-11) B77(8-11) B76(8-11) B77(8-11) 5218 5219 5220// Shuffle pattern two - right side input 5221const __m256i rhs_mat_0145_00_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_00 ,221 );//B00(4-7) B01(4-7) B00(4-7) B01(4-7) B04(4-7) B05(4-7) B04(4-7) B05(4-7) 5222const __m256i rhs_mat_2367_00_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_00 ,221 );//B02(4-7) B03(4-7) B02(4-7) B03(4-7) B06(4-7) B07(4-7) B06(4-7) B07(4-7) 5223 5224const __m256i rhs_mat_0145_01_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_01 ,221 );//B00(12-15) B01(12-15) B00(12-15) B01(12-15) B04(12-15) B05(12-15) B04(12-15) B05(12-15) 5225const __m256i rhs_mat_2367_01_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_01 ,221 );//B02(12-15) B03(12-15) B02(12-15) B03(12-15) B06(12-15) B07(12-15) B06(12-15) B07(12-15) 5226 5227const __m256i rhs_mat_0145_10_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_10 ,221 );//B10(4-7) B11(4-7) B10(4-7) B11(4-7) B14(4-7) B15(4-7) B14(4-7) B15(4-7) 5228const __m256i rhs_mat_2367_10_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_10 ,221 );//B12(4-7) B13(4-7) B12(4-7) B13(4-7) B16(4-7) B17(4-7) B16(4-7) B17(4-7) 5229 5230const __m256i rhs_mat_0145_11_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_11 ,221 );//B10(12-15) B11(12-15) B10(12-15) B11(12-15) B14(12-15) B15(12-15) B14(12-15) B15(12-15) 5231const __m256i rhs_mat_2367_11_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_11 ,221 );//B12(12-15) B13(12-15) B12(12-15) B13(12-15) B16(12-15) B17(12-15) B16(12-15) B17(12-15) 5232 5233const __m256i rhs_mat_0145_20_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_20 ,221 );//B20(4-7) B21(4-7) B20(4-7) B21(4-7) B24(4-7) B25(4-7) B24(4-7) B25(4-7) 5234const __m256i rhs_mat_2367_20_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_20 ,221 );//B22(4-7) B23(4-7) B22(4-7) B23(4-7) B26(4-7) B27(4-7) B26(4-7) B27(4-7) 5235 5236const __m256i rhs_mat_0145_21_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_21 ,221 );//B20(12-15) B21(12-15) B20(12-15) B21(12-15) B24(12-15) B25(12-15) B24(12-15) B25(12-15) 5237const __m256i rhs_mat_2367_21_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_21 ,221 );//B22(12-15) B23(12-15) B22(12-15) B23(12-15) B26(12-15) B27(12-15) B26(12-15) B27(12-15) 5238 5239const __m256i rhs_mat_0145_30_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_30 ,221 );//B30(4-7) B31(4-7) B30(4-7) B31(4-7) B34(4-7) B35(4-7) B34(4-7) B35(4-7) 5240const __m256i rhs_mat_2367_30_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_30 ,221 );//B32(4-7) B33(4-7) B32(4-7) B33(4-7) B36(4-7) B37(4-7) B36(4-7) B37(4-7) 5241 5242const __m256i rhs_mat_0145_31_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_31 ,221 );//B30(12-15) B31(12-15) B30(12-15) B31(12-15) B34(12-15) B35(12-15) B34(12-15) B35(12-15) 5243const __m256i rhs_mat_2367_31_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_31 ,221 );//B32(12-15) B33(12-15) B32(12-15) B33(12-15) B36(12-15) B37(12-15) B36(12-15) B37(12-15) 5244 5245const __m256i rhs_mat_0145_40_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_40 ,221 );//B40(4-7) B41(4-7) B40(4-7) B41(4-7) B44(4-7) B45(4-7) B44(4-7) B45(4-7) 5246const __m256i rhs_mat_2367_40_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_40 ,221 );//B42(4-7) B43(4-7) B42(4-7) B43(4-7) B46(4-7) B47(4-7) B46(4-7) B47(4-7) 5247 5248const __m256i rhs_mat_0145_41_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_41 ,221 );//B40(12-15) B41(12-15) B40(12-15) B41(12-15) B44(12-15) B45(12-15) B44(12-15) B45(12-15) 5249const __m256i rhs_mat_2367_41_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_41 ,221 );//B42(12-15) B43(12-15) B42(12-15) B43(12-15) B46(12-15) B47(12-15) B46(12-15) B47(12-15) 5250 5251const __m256i rhs_mat_0145_50_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_50 ,221 );//B50(4-7) B51(4-7) B50(4-7) B51(4-7) B54(4-7) B55(4-7) B54(4-7) B55(4-7) 5252const __m256i rhs_mat_2367_50_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_50 ,221 );//B52(4-7) B53(4-7) B52(4-7) B53(4-7) B56(4-7) B57(4-7) B56(4-7) B57(4-7) 5253 5254const __m256i rhs_mat_0145_51_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_51 ,221 );//B50(12-15) B51(12-15) B50(12-15) B51(12-15) B54(12-15) B55(12-15) B54(12-15) B55(12-15) 5255const __m256i rhs_mat_2367_51_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_51 ,221 );//B52(12-15) B53(12-15) B52(12-15) B53(12-15) B56(12-15) B57(12-15) B56(12-15) B57(12-15) 5256 5257const __m256i rhs_mat_0145_60_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_60 ,221 );//B60(4-7) B61(4-7) B60(4-7) B61(4-7) B64(4-7) B65(4-7) B64(4-7) B65(4-7) 5258const __m256i rhs_mat_2367_60_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_60 ,221 );//B62(4-7) B63(4-7) B62(4-7) B63(4-7) B66(4-7) B67(4-7) B66(4-7) B67(4-7) 5259 5260const __m256i rhs_mat_0145_61_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_61 ,221 );//B60(12-15) B61(12-15) B60(12-15) B61(12-15) B64(12-15) B65(12-15) B64(12-15) B65(12-15) 5261const __m256i rhs_mat_2367_61_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_61 ,221 );//B62(12-15) B63(12-15) B62(12-15) B63(12-15) B66(12-15) B67(12-15) B66(12-15) B67(12-15) 5262 5263const __m256i rhs_mat_0145_70_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_70 ,221 );//B70(4-7) B71(4-7) B70(4-7) B71(4-7) B74(4-7) B75(4-7) B74(4-7) B75(4-7) 5264const __m256i rhs_mat_2367_70_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_70 ,221 );//B72(4-7) B73(4-7) B72(4-7) B73(4-7) B76(4-7) B77(4-7) B76(4-7) B77(4-7) 5265 5266const __m256i rhs_mat_0145_71_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_71 ,221 );//B70(12-15) B71(12-15) B70(12-15) B71(12-15) B74(12-15) B75(12-15) B74(12-15) B75(12-15) 5267const __m256i rhs_mat_2367_71_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_71 ,221 );//B72(12-15) B73(12-15) B72(12-15) B73(12-15) B76(12-15) B77(12-15) B76(12-15) B77(12-15) 5268 5269//Scales and Mins of corresponding sub blocks from different Q2_K structures are stored together 5270//s00 m00 s01 m01 s10 m10 s11 m11 s20 m20 s21 m21 s30 m30 s31 m31 s40 m40 s41 m41 s50 m50 s51 m51 s60 m60 s61 m61 s70 m70 s71 m71 5271 5272// Combine mins and scales for sub-blocks: 0-1, 2-3, 4-5, 6-7 in the sb loop 5273const __m128i mins_and_scales_01 = _mm_loadu_si128 ((const __m128i * )(b_ptr [b ].scales + sb * 64 )); 5274const __m128i mins_and_scales_23 = _mm_loadu_si128 ((const __m128i * )(b_ptr [b ].scales + 16 + sb * 64 )); 5275const __m128i mins_and_scales_45 = _mm_loadu_si128 ((const __m128i * )(b_ptr [b ].scales + 32 + sb * 64 )); 5276const __m128i mins_and_scales_67 = _mm_loadu_si128 ((const __m128i * )(b_ptr [b ].scales + 48 + sb * 64 )); 5277 5278// Extract scales which is lower half from mins_and_scales 5279const __m128i scales_01 = _mm_and_si128 (mins_and_scales_01 ,m4b_sse ); 5280const __m128i scales_23 = _mm_and_si128 (mins_and_scales_23 ,m4b_sse ); 5281const __m128i scales_45 = _mm_and_si128 (mins_and_scales_45 ,m4b_sse ); 5282const __m128i scales_67 = _mm_and_si128 (mins_and_scales_67 ,m4b_sse ); 5283 5284// Extract mins which is upper half from mins_and_scales 5285const __m256i mins_01 = _mm256_cvtepu8_epi16 (_mm_and_si128 (_mm_srli_epi16 (mins_and_scales_01 ,4 ),m4b_sse )); 5286const __m256i mins_23 = _mm256_cvtepu8_epi16 (_mm_and_si128 (_mm_srli_epi16 (mins_and_scales_23 ,4 ),m4b_sse )); 5287const __m256i mins_45 = _mm256_cvtepu8_epi16 (_mm_and_si128 (_mm_srli_epi16 (mins_and_scales_45 ,4 ),m4b_sse )); 5288const __m256i mins_67 = _mm256_cvtepu8_epi16 (_mm_and_si128 (_mm_srli_epi16 (mins_and_scales_67 ,4 ),m4b_sse )); 5289 5290const __m256i scales_0 = _mm256_cvtepu8_epi16 (_mm_shuffle_epi8 (scales_01 ,scalesmask1_sse )); 5291const __m256i scales_1 = _mm256_cvtepu8_epi16 (_mm_shuffle_epi8 (scales_01 ,scalesmask2_sse )); 5292 5293const __m256i scales_2 = _mm256_cvtepu8_epi16 (_mm_shuffle_epi8 (scales_23 ,scalesmask1_sse )); 5294const __m256i scales_3 = _mm256_cvtepu8_epi16 (_mm_shuffle_epi8 (scales_23 ,scalesmask2_sse )); 5295 5296const __m256i scales_4 = _mm256_cvtepu8_epi16 (_mm_shuffle_epi8 (scales_45 ,scalesmask1_sse )); 5297const __m256i scales_5 = _mm256_cvtepu8_epi16 (_mm_shuffle_epi8 (scales_45 ,scalesmask2_sse )); 5298 5299const __m256i scales_6 = _mm256_cvtepu8_epi16 (_mm_shuffle_epi8 (scales_67 ,scalesmask1_sse )); 5300const __m256i scales_7 = _mm256_cvtepu8_epi16 (_mm_shuffle_epi8 (scales_67 ,scalesmask2_sse )); 5301 5302const __m256i scale_0145_0 = _mm256_shuffle_epi32 (scales_0 ,68 ); 5303const __m256i scale_2367_0 = _mm256_shuffle_epi32 (scales_0 ,238 ); 5304 5305const __m256i scale_0145_1 = _mm256_shuffle_epi32 (scales_1 ,68 ); 5306const __m256i scale_2367_1 = _mm256_shuffle_epi32 (scales_1 ,238 ); 5307 5308const __m256i scale_0145_2 = _mm256_shuffle_epi32 (scales_2 ,68 ); 5309const __m256i scale_2367_2 = _mm256_shuffle_epi32 (scales_2 ,238 ); 5310 5311const __m256i scale_0145_3 = _mm256_shuffle_epi32 (scales_3 ,68 ); 5312const __m256i scale_2367_3 = _mm256_shuffle_epi32 (scales_3 ,238 ); 5313 5314const __m256i scale_0145_4 = _mm256_shuffle_epi32 (scales_4 ,68 ); 5315const __m256i scale_2367_4 = _mm256_shuffle_epi32 (scales_4 ,238 ); 5316 5317const __m256i scale_0145_5 = _mm256_shuffle_epi32 (scales_5 ,68 ); 5318const __m256i scale_2367_5 = _mm256_shuffle_epi32 (scales_5 ,238 ); 5319 5320const __m256i scale_0145_6 = _mm256_shuffle_epi32 (scales_6 ,68 ); 5321const __m256i scale_2367_6 = _mm256_shuffle_epi32 (scales_6 ,238 ); 5322 5323const __m256i scale_0145_7 = _mm256_shuffle_epi32 (scales_7 ,68 ); 5324const __m256i scale_2367_7 = _mm256_shuffle_epi32 (scales_7 ,238 ); 5325 5326 5327for (int rp = 0 ;rp < 4 ;rp ++ ) { 5328 5329// Load the four block_q8_k quantized values interleaved with each other in chunks of eight bytes - A0,A1,A2,A3 5330// Loaded as set of 128 bit vectors and repeated into a 256 bit vector 5331__m256i lhs_mat_0123_00 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 512 * sb ))); 5332__m256i lhs_mat_01_00 = _mm256_permute2f128_si256 (lhs_mat_0123_00 ,lhs_mat_0123_00 ,0 ); 5333__m256i lhs_mat_23_00 = _mm256_permute2f128_si256 (lhs_mat_0123_00 ,lhs_mat_0123_00 ,17 ); 5334__m256i lhs_mat_0123_01 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 32 + 512 * sb ))); 5335__m256i lhs_mat_01_01 = _mm256_permute2f128_si256 (lhs_mat_0123_01 ,lhs_mat_0123_01 ,0 ); 5336__m256i lhs_mat_23_01 = _mm256_permute2f128_si256 (lhs_mat_0123_01 ,lhs_mat_0123_01 ,17 ); 5337__m256i lhs_mat_0123_10 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 64 + 512 * sb ))); 5338__m256i lhs_mat_01_10 = _mm256_permute2f128_si256 (lhs_mat_0123_10 ,lhs_mat_0123_10 ,0 ); 5339__m256i lhs_mat_23_10 = _mm256_permute2f128_si256 (lhs_mat_0123_10 ,lhs_mat_0123_10 ,17 ); 5340__m256i lhs_mat_0123_11 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 96 + 512 * sb ))); 5341__m256i lhs_mat_01_11 = _mm256_permute2f128_si256 (lhs_mat_0123_11 ,lhs_mat_0123_11 ,0 ); 5342__m256i lhs_mat_23_11 = _mm256_permute2f128_si256 (lhs_mat_0123_11 ,lhs_mat_0123_11 ,17 ); 5343__m256i lhs_mat_0123_20 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 128 + 512 * sb ))); 5344__m256i lhs_mat_01_20 = _mm256_permute2f128_si256 (lhs_mat_0123_20 ,lhs_mat_0123_20 ,0 ); 5345__m256i lhs_mat_23_20 = _mm256_permute2f128_si256 (lhs_mat_0123_20 ,lhs_mat_0123_20 ,17 ); 5346__m256i lhs_mat_0123_21 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 160 + 512 * sb ))); 5347__m256i lhs_mat_01_21 = _mm256_permute2f128_si256 (lhs_mat_0123_21 ,lhs_mat_0123_21 ,0 ); 5348__m256i lhs_mat_23_21 = _mm256_permute2f128_si256 (lhs_mat_0123_21 ,lhs_mat_0123_21 ,17 ); 5349__m256i lhs_mat_0123_30 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 192 + 512 * sb ))); 5350__m256i lhs_mat_01_30 = _mm256_permute2f128_si256 (lhs_mat_0123_30 ,lhs_mat_0123_30 ,0 ); 5351__m256i lhs_mat_23_30 = _mm256_permute2f128_si256 (lhs_mat_0123_30 ,lhs_mat_0123_30 ,17 ); 5352__m256i lhs_mat_0123_31 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 224 + 512 * sb ))); 5353__m256i lhs_mat_01_31 = _mm256_permute2f128_si256 (lhs_mat_0123_31 ,lhs_mat_0123_31 ,0 ); 5354__m256i lhs_mat_23_31 = _mm256_permute2f128_si256 (lhs_mat_0123_31 ,lhs_mat_0123_31 ,17 ); 5355 5356__m256i lhs_mat_0123_40 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 256 + 512 * sb ))); 5357__m256i lhs_mat_01_40 = _mm256_permute2f128_si256 (lhs_mat_0123_40 ,lhs_mat_0123_40 ,0 ); 5358__m256i lhs_mat_23_40 = _mm256_permute2f128_si256 (lhs_mat_0123_40 ,lhs_mat_0123_40 ,17 ); 5359__m256i lhs_mat_0123_41 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 288 + 512 * sb ))); 5360__m256i lhs_mat_01_41 = _mm256_permute2f128_si256 (lhs_mat_0123_41 ,lhs_mat_0123_41 ,0 ); 5361__m256i lhs_mat_23_41 = _mm256_permute2f128_si256 (lhs_mat_0123_41 ,lhs_mat_0123_41 ,17 ); 5362__m256i lhs_mat_0123_50 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 320 + 512 * sb ))); 5363__m256i lhs_mat_01_50 = _mm256_permute2f128_si256 (lhs_mat_0123_50 ,lhs_mat_0123_50 ,0 ); 5364__m256i lhs_mat_23_50 = _mm256_permute2f128_si256 (lhs_mat_0123_50 ,lhs_mat_0123_50 ,17 ); 5365__m256i lhs_mat_0123_51 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 352 + 512 * sb ))); 5366__m256i lhs_mat_01_51 = _mm256_permute2f128_si256 (lhs_mat_0123_51 ,lhs_mat_0123_51 ,0 ); 5367__m256i lhs_mat_23_51 = _mm256_permute2f128_si256 (lhs_mat_0123_51 ,lhs_mat_0123_51 ,17 ); 5368__m256i lhs_mat_0123_60 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 384 + 512 * sb ))); 5369__m256i lhs_mat_01_60 = _mm256_permute2f128_si256 (lhs_mat_0123_60 ,lhs_mat_0123_60 ,0 ); 5370__m256i lhs_mat_23_60 = _mm256_permute2f128_si256 (lhs_mat_0123_60 ,lhs_mat_0123_60 ,17 ); 5371__m256i lhs_mat_0123_61 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 416 + 512 * sb ))); 5372__m256i lhs_mat_01_61 = _mm256_permute2f128_si256 (lhs_mat_0123_61 ,lhs_mat_0123_61 ,0 ); 5373__m256i lhs_mat_23_61 = _mm256_permute2f128_si256 (lhs_mat_0123_61 ,lhs_mat_0123_61 ,17 ); 5374__m256i lhs_mat_0123_70 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 448 + 512 * sb ))); 5375__m256i lhs_mat_01_70 = _mm256_permute2f128_si256 (lhs_mat_0123_70 ,lhs_mat_0123_70 ,0 ); 5376__m256i lhs_mat_23_70 = _mm256_permute2f128_si256 (lhs_mat_0123_70 ,lhs_mat_0123_70 ,17 ); 5377__m256i lhs_mat_0123_71 = _mm256_loadu_si256 ((const __m256i * )((a_ptrs [rp ][b ].qs + 480 + 512 * sb ))); 5378__m256i lhs_mat_01_71 = _mm256_permute2f128_si256 (lhs_mat_0123_71 ,lhs_mat_0123_71 ,0 ); 5379__m256i lhs_mat_23_71 = _mm256_permute2f128_si256 (lhs_mat_0123_71 ,lhs_mat_0123_71 ,17 ); 5380 5381// Bsums are loaded for the different Q8_K blocks 5382__m128i lhs_raw_bsums_01_0123 = _mm_loadu_si128 ((const __m128i * )((a_ptrs [rp ][b ].bsums + 32 * sb ))); 5383__m128i lhs_raw_bsums_23_0123 = _mm_loadu_si128 ((const __m128i * )(a_ptrs [rp ][b ].bsums + 8 + 32 * sb )); 5384__m128i lhs_raw_bsums_01_4567 = _mm_loadu_si128 ((const __m128i * )((a_ptrs [rp ][b ].bsums + 16 + 32 * sb ))); 5385__m128i lhs_raw_bsums_23_4567 = _mm_loadu_si128 ((const __m128i * )(a_ptrs [rp ][b ].bsums + 24 + 32 * sb )); 5386 5387// Shuffle pattern one - left side input 5388const __m256i lhs_mat_01_00_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_00 ,160 );//A00(0-3) A00(0-3) A01(0-3) A01(0-3) A00(0-3) A00(0-3) A01(0-3) A01(0-3) 5389const __m256i lhs_mat_23_00_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_00 ,160 );//A02(0-3) A03(0-3) A02(0-3) A03(0-3) A02(0-3) A03(0-3) A02(0-3) A03(0-3) 5390 5391const __m256i lhs_mat_01_01_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_01 ,160 );//A00(8-11) A00(8-11) A01(8-11) A01(8-11) A00(8-11) A00(8-11) A01(8-11) A01(8-11) 5392const __m256i lhs_mat_23_01_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_01 ,160 );//A02(8-11) A03(8-11) A02(8-11) A03(8-11) A02(8-11) A03(8-11) A02(8-11) A03(8-11) 5393 5394const __m256i lhs_mat_01_10_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_10 ,160 );//A10(0-3) A10(0-3) A11(0-3) A11(0-3) A10(0-3) A10(0-3) A11(0-3) A11(0-3) 5395const __m256i lhs_mat_23_10_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_10 ,160 );//A12(0-3) A13(0-3) A12(0-3) A13(0-3) A12(0-3) A13(0-3) A12(0-3) A13(0-3) 5396 5397const __m256i lhs_mat_01_11_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_11 ,160 );//A10(8-11) A10(8-11) A11(8-11) A11(8-11) A10(8-11) A10(8-11) A11(8-11) A11(8-11) 5398const __m256i lhs_mat_23_11_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_11 ,160 );//A12(8-11) A13(8-11) A12(8-11) A13(8-11) A12(8-11) A13(8-11) A12(8-11) A13(8-11) 5399 5400const __m256i lhs_mat_01_20_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_20 ,160 );//A20(0-3) A20(0-3) A21(0-3) A21(0-3) A20(0-3) A20(0-3) A21(0-3) A21(0-3) 5401const __m256i lhs_mat_23_20_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_20 ,160 );//A22(0-3) A23(0-3) A22(0-3) A23(0-3) A22(0-3) A23(0-3) A22(0-3) A23(0-3) 5402 5403const __m256i lhs_mat_01_21_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_21 ,160 );//A20(8-11) A20(8-11) A21(8-11) A21(8-11) A20(8-11) A20(8-11) A21(8-11) A21(8-11) 5404const __m256i lhs_mat_23_21_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_21 ,160 );//A22(8-11) A23(8-11) A22(8-11) A23(8-11) A22(8-11) A23(8-11) A22(8-11) A23(8-11) 5405 5406const __m256i lhs_mat_01_30_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_30 ,160 );//A30(0-3) A30(0-3) A31(0-3) A31(0-3) A30(0-3) A30(0-3) A31(0-3) A31(0-3) 5407const __m256i lhs_mat_23_30_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_30 ,160 );//A32(0-3) A33(0-3) A32(0-3) A33(0-3) A32(0-3) A33(0-3) A32(0-3) A33(0-3) 5408 5409const __m256i lhs_mat_01_31_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_31 ,160 );//A30(8-11) A30(8-11) A31(8-11) A31(8-11) A30(8-11) A30(8-11) A31(8-11) A31(8-11) 5410const __m256i lhs_mat_23_31_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_31 ,160 );//A32(8-11) A33(8-11) A32(8-11) A33(8-11) A32(8-11) A33(8-11) A32(8-11) A33(8-11) 5411 5412const __m256i lhs_mat_01_40_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_40 ,160 );//A40(0-3) A40(0-3) A41(0-3) A41(0-3) A40(0-3) A40(0-3) A41(0-3) A41(0-3) 5413const __m256i lhs_mat_23_40_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_40 ,160 );//A42(0-3) A43(0-3) A42(0-3) A43(0-3) A42(0-3) A43(0-3) A42(0-3) A43(0-3) 5414 5415const __m256i lhs_mat_01_41_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_41 ,160 );//A40(8-11) A40(8-11) A41(8-11) A41(8-11) A40(8-11) A40(8-11) A41(8-11) A41(8-11) 5416const __m256i lhs_mat_23_41_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_41 ,160 );//A42(8-11) A43(8-11) A42(8-11) A43(8-11) A42(8-11) A43(8-11) A42(8-11) A43(8-11) 5417 5418const __m256i lhs_mat_01_50_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_50 ,160 );//A50(0-3) A50(0-3) A51(0-3) A51(0-3) A50(0-3) A50(0-3) A51(0-3) A51(0-3) 5419const __m256i lhs_mat_23_50_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_50 ,160 );//A52(0-3) A53(0-3) A52(0-3) A53(0-3) A52(0-3) A53(0-3) A52(0-3) A53(0-3) 5420 5421const __m256i lhs_mat_01_51_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_51 ,160 );//A50(8-11) A50(8-11) A51(8-11) A51(8-11) A50(8-11) A50(8-11) A51(8-11) A51(8-11) 5422const __m256i lhs_mat_23_51_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_51 ,160 );//A52(8-11) A53(8-11) A52(8-11) A53(8-11) A52(8-11) A53(8-11) A52(8-11) A53(8-11) 5423 5424const __m256i lhs_mat_01_60_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_60 ,160 );//A60(0-3) A60(0-3) A61(0-3) A61(0-3) A60(0-3) A60(0-3) A61(0-3) A61(0-3) 5425const __m256i lhs_mat_23_60_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_60 ,160 );//A62(0-3) A63(0-3) A62(0-3) A63(0-3) A62(0-3) A63(0-3) A62(0-3) A63(0-3) 5426 5427const __m256i lhs_mat_01_61_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_61 ,160 );//A60(8-11) A60(8-11) A61(8-11) A61(8-11) A60(8-11) A60(8-11) A61(8-11) A61(8-11) 5428const __m256i lhs_mat_23_61_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_61 ,160 );//A62(8-11) A63(8-11) A62(8-11) A63(8-11) A62(8-11) A63(8-11) A62(8-11) A63(8-11) 5429 5430const __m256i lhs_mat_01_70_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_70 ,160 );//A70(0-3) A70(0-3) A71(0-3) A71(0-3) A70(0-3) A70(0-3) A71(0-3) A71(0-3) 5431const __m256i lhs_mat_23_70_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_70 ,160 );//A72(0-3) A73(0-3) A72(0-3) A73(0-3) A72(0-3) A73(0-3) A72(0-3) A73(0-3) 5432 5433const __m256i lhs_mat_01_71_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_71 ,160 );//A70(8-11) A70(8-11) A71(8-11) A71(8-11) A70(8-11) A70(8-11) A71(8-11) A71(8-11) 5434const __m256i lhs_mat_23_71_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_71 ,160 );//A72(8-11) A73(8-11) A72(8-11) A73(8-11) A72(8-11) A73(8-11) A72(8-11) A73(8-11) 5435 5436// Shuffle pattern two- left side input 5437const __m256i lhs_mat_01_00_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_00 ,245 );//A00(4-7) A00(4-7) A01(4-7) A01(4-7) A00(4-7) A00(4-7) A01(4-7) A01(4-7) 5438const __m256i lhs_mat_23_00_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_00 ,245 );//A02(4-7) A03(4-7) A02(4-7) A03(4-7) A02(4-7) A03(4-7) A02(4-7) A03(4-7) 5439 5440const __m256i lhs_mat_01_01_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_01 ,245 );//A00(12-15) A00(12-15) A01(12-15) A01(12-15) A00(12-15) A00(12-15) A01(12-15) A01(12-15) 5441const __m256i lhs_mat_23_01_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_01 ,245 );//A02(12-15) A03(12-15) A02(12-15) A03(12-15) A02(12-15) A03(12-15) A02(12-15) A03(12-15) 5442 5443const __m256i lhs_mat_01_10_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_10 ,245 );//A10(4-7) A10(4-7) A11(4-7) A11(4-7) A10(4-7) A10(4-7) A11(4-7) A11(4-7) 5444const __m256i lhs_mat_23_10_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_10 ,245 );//A12(4-7) A13(4-7) A12(4-7) A13(4-7) A12(4-7) A13(4-7) A12(4-7) A13(4-7) 5445 5446const __m256i lhs_mat_01_11_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_11 ,245 );//A10(12-15) A10(12-15) A11(12-15) A11(12-15) A10(12-15) A10(12-15) A11(12-15) A11(12-15) 5447const __m256i lhs_mat_23_11_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_11 ,245 );//A12(12-15) A13(12-15) A12(12-15) A13(12-15) A12(12-15) A13(12-15) A12(12-15) A13(12-15) 5448 5449const __m256i lhs_mat_01_20_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_20 ,245 );//A20(4-7) A20(4-7) A21(4-7) A21(4-7) A20(4-7) A20(4-7) A21(4-7) A21(4-7) 5450const __m256i lhs_mat_23_20_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_20 ,245 );//A22(4-7) A23(4-7) A22(4-7) A23(4-7) A22(4-7) A23(4-7) A22(4-7) A23(4-7) 5451 5452const __m256i lhs_mat_01_21_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_21 ,245 );//A20(12-15) A20(12-15) A21(12-15) A21(12-15) A20(12-15) A20(12-15) A21(12-15) A21(12-15) 5453const __m256i lhs_mat_23_21_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_21 ,245 );//A22(12-15) A23(12-15) A22(12-15) A23(12-15) A22(12-15) A23(12-15) A22(12-15) A23(12-15) 5454 5455const __m256i lhs_mat_01_30_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_30 ,245 );//A30(4-7) A30(4-7) A31(4-7) A31(4-7) A30(4-7) A30(4-7) A31(4-7) A31(4-7) 5456const __m256i lhs_mat_23_30_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_30 ,245 );//A32(4-7) A33(4-7) A32(4-7) A33(4-7) A32(4-7) A33(4-7) A32(4-7) A33(4-7) 5457 5458const __m256i lhs_mat_01_31_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_31 ,245 );//A30(12-15) A30(12-15) A31(12-15) A31(12-15) A30(12-15) A30(12-15) A31(12-15) A31(12-15) 5459const __m256i lhs_mat_23_31_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_31 ,245 );//A32(12-15) A33(12-15) A32(12-15) A33(12-15) A32(12-15) A33(12-15) A32(12-15) A33(12-15) 5460 5461const __m256i lhs_mat_01_40_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_40 ,245 );//A40(4-7) A40(4-7) A41(4-7) A41(4-7) A40(4-7) A40(4-7) A41(4-7) A41(4-7) 5462const __m256i lhs_mat_23_40_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_40 ,245 );//A42(4-7) A43(4-7) A42(4-7) A43(4-7) A42(4-7) A43(4-7) A42(4-7) A43(4-7) 5463 5464const __m256i lhs_mat_01_41_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_41 ,245 );//A40(12-15) A40(12-15) A41(12-15) A41(12-15) A40(12-15) A40(12-15) A41(12-15) A41(12-15) 5465const __m256i lhs_mat_23_41_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_41 ,245 );//A42(12-15) A43(12-15) A42(12-15) A43(12-15) A42(12-15) A43(12-15) A42(12-15) A43(12-15) 5466 5467const __m256i lhs_mat_01_50_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_50 ,245 );//A50(4-7) A50(4-7) A51(4-7) A51(4-7) A50(4-7) A50(4-7) A51(4-7) A51(4-7) 5468const __m256i lhs_mat_23_50_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_50 ,245 );//A52(4-7) A53(4-7) A52(4-7) A53(4-7) A52(4-7) A53(4-7) A52(4-7) A53(4-7) 5469 5470const __m256i lhs_mat_01_51_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_51 ,245 );//A50(12-15) A50(12-15) A51(12-15) A51(12-15) A50(12-15) A50(12-15) A51(12-15) A51(12-15) 5471const __m256i lhs_mat_23_51_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_51 ,245 );//A52(12-15) A53(12-15) A52(12-15) A53(12-15) A52(12-15) A53(12-15) A52(12-15) A53(12-15) 5472 5473const __m256i lhs_mat_01_60_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_60 ,245 );//A60(4-7) A60(4-7) A61(4-7) A61(4-7) A60(4-7) A60(4-7) A61(4-7) A61(4-7) 5474const __m256i lhs_mat_23_60_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_60 ,245 );//A62(4-7) A63(4-7) A62(4-7) A63(4-7) A62(4-7) A63(4-7) A62(4-7) A63(4-7) 5475 5476const __m256i lhs_mat_01_61_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_61 ,245 );//A60(12-15) A60(12-15) A61(12-15) A61(12-15) A60(12-15) A60(12-15) A61(12-15) A61(12-15) 5477const __m256i lhs_mat_23_61_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_61 ,245 );//A62(12-15) A63(12-15) A62(12-15) A63(12-15) A62(12-15) A63(12-15) A62(12-15) A63(12-15) 5478 5479const __m256i lhs_mat_01_70_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_70 ,245 );//A70(4-7) A70(4-7) A71(4-7) A71(4-7) A70(4-7) A70(4-7) A71(4-7) A71(4-7) 5480const __m256i lhs_mat_23_70_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_70 ,245 );//A72(4-7) A73(4-7) A72(4-7) A73(4-7) A72(4-7) A73(4-7) A72(4-7) A73(4-7) 5481 5482const __m256i lhs_mat_01_71_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_71 ,245 );//A70(12-15) A70(12-15) A71(12-15) A71(12-15) A70(12-15) A70(12-15) A71(12-15) A71(12-15) 5483const __m256i lhs_mat_23_71_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_71 ,245 );//A72(12-15) A73(12-15) A72(12-15) A73(12-15) A72(12-15) A73(12-15) A72(12-15) A73(12-15) 5484 5485// The values arranged in shuffle patterns are operated with dot product operation within 32 bit lane i.e corresponding bytes and multiplied and added into 32 bit integers within 32 bit lane 5486__m256i iacc_mat_00_0_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_00_sp1 ,lhs_mat_01_00_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_01_sp1 ,lhs_mat_01_01_sp1 )); 5487__m256i iacc_mat_01_0_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_00_sp1 ,lhs_mat_01_00_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_01_sp1 ,lhs_mat_01_01_sp1 )); 5488 5489__m256i iacc_mat_10_0_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_00_sp1 ,lhs_mat_23_00_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_01_sp1 ,lhs_mat_23_01_sp1 )); 5490__m256i iacc_mat_11_0_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_00_sp1 ,lhs_mat_23_00_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_01_sp1 ,lhs_mat_23_01_sp1 )); 5491 5492__m256i iacc_mat_00_1_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_10_sp1 ,lhs_mat_01_10_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_11_sp1 ,lhs_mat_01_11_sp1 )); 5493__m256i iacc_mat_01_1_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_10_sp1 ,lhs_mat_01_10_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_11_sp1 ,lhs_mat_01_11_sp1 )); 5494 5495__m256i iacc_mat_10_1_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_10_sp1 ,lhs_mat_23_10_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_11_sp1 ,lhs_mat_23_11_sp1 )); 5496__m256i iacc_mat_11_1_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_10_sp1 ,lhs_mat_23_10_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_11_sp1 ,lhs_mat_23_11_sp1 )); 5497 5498__m256i iacc_mat_00_2_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_20_sp1 ,lhs_mat_01_20_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_21_sp1 ,lhs_mat_01_21_sp1 )); 5499__m256i iacc_mat_01_2_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_20_sp1 ,lhs_mat_01_20_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_21_sp1 ,lhs_mat_01_21_sp1 )); 5500 5501__m256i iacc_mat_10_2_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_20_sp1 ,lhs_mat_23_20_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_21_sp1 ,lhs_mat_23_21_sp1 )); 5502__m256i iacc_mat_11_2_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_20_sp1 ,lhs_mat_23_20_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_21_sp1 ,lhs_mat_23_21_sp1 )); 5503 5504__m256i iacc_mat_00_3_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_30_sp1 ,lhs_mat_01_30_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_31_sp1 ,lhs_mat_01_31_sp1 )); 5505__m256i iacc_mat_01_3_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_30_sp1 ,lhs_mat_01_30_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_31_sp1 ,lhs_mat_01_31_sp1 )); 5506 5507__m256i iacc_mat_10_3_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_30_sp1 ,lhs_mat_23_30_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_31_sp1 ,lhs_mat_23_31_sp1 )); 5508__m256i iacc_mat_11_3_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_30_sp1 ,lhs_mat_23_30_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_31_sp1 ,lhs_mat_23_31_sp1 )); 5509 5510__m256i iacc_mat_00_4_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_40_sp1 ,lhs_mat_01_40_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_41_sp1 ,lhs_mat_01_41_sp1 )); 5511__m256i iacc_mat_01_4_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_40_sp1 ,lhs_mat_01_40_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_41_sp1 ,lhs_mat_01_41_sp1 )); 5512 5513__m256i iacc_mat_10_4_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_40_sp1 ,lhs_mat_23_40_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_41_sp1 ,lhs_mat_23_41_sp1 )); 5514__m256i iacc_mat_11_4_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_40_sp1 ,lhs_mat_23_40_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_41_sp1 ,lhs_mat_23_41_sp1 )); 5515 5516__m256i iacc_mat_00_5_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_50_sp1 ,lhs_mat_01_50_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_51_sp1 ,lhs_mat_01_51_sp1 )); 5517__m256i iacc_mat_01_5_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_50_sp1 ,lhs_mat_01_50_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_51_sp1 ,lhs_mat_01_51_sp1 )); 5518 5519__m256i iacc_mat_10_5_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_50_sp1 ,lhs_mat_23_50_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_51_sp1 ,lhs_mat_23_51_sp1 )); 5520__m256i iacc_mat_11_5_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_50_sp1 ,lhs_mat_23_50_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_51_sp1 ,lhs_mat_23_51_sp1 )); 5521 5522__m256i iacc_mat_00_6_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_60_sp1 ,lhs_mat_01_60_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_61_sp1 ,lhs_mat_01_61_sp1 )); 5523__m256i iacc_mat_01_6_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_60_sp1 ,lhs_mat_01_60_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_61_sp1 ,lhs_mat_01_61_sp1 )); 5524 5525__m256i iacc_mat_10_6_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_60_sp1 ,lhs_mat_23_60_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_61_sp1 ,lhs_mat_23_61_sp1 )); 5526__m256i iacc_mat_11_6_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_60_sp1 ,lhs_mat_23_60_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_61_sp1 ,lhs_mat_23_61_sp1 )); 5527 5528__m256i iacc_mat_00_7_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_70_sp1 ,lhs_mat_01_70_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_71_sp1 ,lhs_mat_01_71_sp1 )); 5529__m256i iacc_mat_01_7_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_70_sp1 ,lhs_mat_01_70_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_71_sp1 ,lhs_mat_01_71_sp1 )); 5530 5531__m256i iacc_mat_10_7_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_70_sp1 ,lhs_mat_23_70_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_71_sp1 ,lhs_mat_23_71_sp1 )); 5532__m256i iacc_mat_11_7_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_70_sp1 ,lhs_mat_23_70_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_71_sp1 ,lhs_mat_23_71_sp1 )); 5533 5534 5535__m256i iacc_mat_00_0_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_00_sp2 ,lhs_mat_01_00_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_01_sp2 ,lhs_mat_01_01_sp2 )); 5536__m256i iacc_mat_01_0_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_00_sp2 ,lhs_mat_01_00_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_01_sp2 ,lhs_mat_01_01_sp2 )); 5537 5538__m256i iacc_mat_10_0_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_00_sp2 ,lhs_mat_23_00_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_01_sp2 ,lhs_mat_23_01_sp2 )); 5539__m256i iacc_mat_11_0_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_00_sp2 ,lhs_mat_23_00_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_01_sp2 ,lhs_mat_23_01_sp2 )); 5540 5541__m256i iacc_mat_00_1_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_10_sp2 ,lhs_mat_01_10_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_11_sp2 ,lhs_mat_01_11_sp2 )); 5542__m256i iacc_mat_01_1_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_10_sp2 ,lhs_mat_01_10_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_11_sp2 ,lhs_mat_01_11_sp2 )); 5543 5544__m256i iacc_mat_10_1_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_10_sp2 ,lhs_mat_23_10_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_11_sp2 ,lhs_mat_23_11_sp2 )); 5545__m256i iacc_mat_11_1_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_10_sp2 ,lhs_mat_23_10_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_11_sp2 ,lhs_mat_23_11_sp2 )); 5546 5547__m256i iacc_mat_00_2_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_20_sp2 ,lhs_mat_01_20_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_21_sp2 ,lhs_mat_01_21_sp2 )); 5548__m256i iacc_mat_01_2_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_20_sp2 ,lhs_mat_01_20_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_21_sp2 ,lhs_mat_01_21_sp2 )); 5549 5550__m256i iacc_mat_10_2_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_20_sp2 ,lhs_mat_23_20_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_21_sp2 ,lhs_mat_23_21_sp2 )); 5551__m256i iacc_mat_11_2_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_20_sp2 ,lhs_mat_23_20_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_21_sp2 ,lhs_mat_23_21_sp2 )); 5552 5553__m256i iacc_mat_00_3_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_30_sp2 ,lhs_mat_01_30_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_31_sp2 ,lhs_mat_01_31_sp2 )); 5554__m256i iacc_mat_01_3_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_30_sp2 ,lhs_mat_01_30_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_31_sp2 ,lhs_mat_01_31_sp2 )); 5555 5556__m256i iacc_mat_10_3_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_30_sp2 ,lhs_mat_23_30_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_31_sp2 ,lhs_mat_23_31_sp2 )); 5557__m256i iacc_mat_11_3_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_30_sp2 ,lhs_mat_23_30_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_31_sp2 ,lhs_mat_23_31_sp2 )); 5558 5559__m256i iacc_mat_00_4_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_40_sp2 ,lhs_mat_01_40_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_41_sp2 ,lhs_mat_01_41_sp2 )); 5560__m256i iacc_mat_01_4_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_40_sp2 ,lhs_mat_01_40_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_41_sp2 ,lhs_mat_01_41_sp2 )); 5561 5562__m256i iacc_mat_10_4_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_40_sp2 ,lhs_mat_23_40_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_41_sp2 ,lhs_mat_23_41_sp2 )); 5563__m256i iacc_mat_11_4_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_40_sp2 ,lhs_mat_23_40_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_41_sp2 ,lhs_mat_23_41_sp2 )); 5564 5565__m256i iacc_mat_00_5_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_50_sp2 ,lhs_mat_01_50_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_51_sp2 ,lhs_mat_01_51_sp2 )); 5566__m256i iacc_mat_01_5_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_50_sp2 ,lhs_mat_01_50_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_51_sp2 ,lhs_mat_01_51_sp2 )); 5567 5568__m256i iacc_mat_10_5_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_50_sp2 ,lhs_mat_23_50_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_51_sp2 ,lhs_mat_23_51_sp2 )); 5569__m256i iacc_mat_11_5_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_50_sp2 ,lhs_mat_23_50_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_51_sp2 ,lhs_mat_23_51_sp2 )); 5570 5571__m256i iacc_mat_00_6_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_60_sp2 ,lhs_mat_01_60_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_61_sp2 ,lhs_mat_01_61_sp2 )); 5572__m256i iacc_mat_01_6_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_60_sp2 ,lhs_mat_01_60_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_61_sp2 ,lhs_mat_01_61_sp2 )); 5573 5574__m256i iacc_mat_10_6_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_60_sp2 ,lhs_mat_23_60_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_61_sp2 ,lhs_mat_23_61_sp2 )); 5575__m256i iacc_mat_11_6_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_60_sp2 ,lhs_mat_23_60_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_61_sp2 ,lhs_mat_23_61_sp2 )); 5576 5577__m256i iacc_mat_00_7_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_70_sp2 ,lhs_mat_01_70_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_71_sp2 ,lhs_mat_01_71_sp2 )); 5578__m256i iacc_mat_01_7_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_70_sp2 ,lhs_mat_01_70_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_71_sp2 ,lhs_mat_01_71_sp2 )); 5579 5580__m256i iacc_mat_10_7_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_70_sp2 ,lhs_mat_23_70_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_71_sp2 ,lhs_mat_23_71_sp2 )); 5581__m256i iacc_mat_11_7_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_70_sp2 ,lhs_mat_23_70_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_71_sp2 ,lhs_mat_23_71_sp2 )); 5582 5583// Combine results from both shuffle patterns for each output block 5584__m256i iacc_mat_00_0 = _mm256_add_epi16 (iacc_mat_00_0_sp1 ,iacc_mat_00_0_sp2 ); 5585__m256i iacc_mat_01_0 = _mm256_add_epi16 (iacc_mat_01_0_sp1 ,iacc_mat_01_0_sp2 ); 5586__m256i iacc_mat_10_0 = _mm256_add_epi16 (iacc_mat_10_0_sp1 ,iacc_mat_10_0_sp2 ); 5587__m256i iacc_mat_11_0 = _mm256_add_epi16 (iacc_mat_11_0_sp1 ,iacc_mat_11_0_sp2 ); 5588 5589__m256i iacc_mat_00_1 = _mm256_add_epi16 (iacc_mat_00_1_sp1 ,iacc_mat_00_1_sp2 ); 5590__m256i iacc_mat_01_1 = _mm256_add_epi16 (iacc_mat_01_1_sp1 ,iacc_mat_01_1_sp2 ); 5591__m256i iacc_mat_10_1 = _mm256_add_epi16 (iacc_mat_10_1_sp1 ,iacc_mat_10_1_sp2 ); 5592__m256i iacc_mat_11_1 = _mm256_add_epi16 (iacc_mat_11_1_sp1 ,iacc_mat_11_1_sp2 ); 5593 5594__m256i iacc_mat_00_2 = _mm256_add_epi16 (iacc_mat_00_2_sp1 ,iacc_mat_00_2_sp2 ); 5595__m256i iacc_mat_01_2 = _mm256_add_epi16 (iacc_mat_01_2_sp1 ,iacc_mat_01_2_sp2 ); 5596__m256i iacc_mat_10_2 = _mm256_add_epi16 (iacc_mat_10_2_sp1 ,iacc_mat_10_2_sp2 ); 5597__m256i iacc_mat_11_2 = _mm256_add_epi16 (iacc_mat_11_2_sp1 ,iacc_mat_11_2_sp2 ); 5598 5599__m256i iacc_mat_00_3 = _mm256_add_epi16 (iacc_mat_00_3_sp1 ,iacc_mat_00_3_sp2 ); 5600__m256i iacc_mat_01_3 = _mm256_add_epi16 (iacc_mat_01_3_sp1 ,iacc_mat_01_3_sp2 ); 5601__m256i iacc_mat_10_3 = _mm256_add_epi16 (iacc_mat_10_3_sp1 ,iacc_mat_10_3_sp2 ); 5602__m256i iacc_mat_11_3 = _mm256_add_epi16 (iacc_mat_11_3_sp1 ,iacc_mat_11_3_sp2 ); 5603 5604__m256i iacc_mat_00_4 = _mm256_add_epi16 (iacc_mat_00_4_sp1 ,iacc_mat_00_4_sp2 ); 5605__m256i iacc_mat_01_4 = _mm256_add_epi16 (iacc_mat_01_4_sp1 ,iacc_mat_01_4_sp2 ); 5606__m256i iacc_mat_10_4 = _mm256_add_epi16 (iacc_mat_10_4_sp1 ,iacc_mat_10_4_sp2 ); 5607__m256i iacc_mat_11_4 = _mm256_add_epi16 (iacc_mat_11_4_sp1 ,iacc_mat_11_4_sp2 ); 5608 5609__m256i iacc_mat_00_5 = _mm256_add_epi16 (iacc_mat_00_5_sp1 ,iacc_mat_00_5_sp2 ); 5610__m256i iacc_mat_01_5 = _mm256_add_epi16 (iacc_mat_01_5_sp1 ,iacc_mat_01_5_sp2 ); 5611__m256i iacc_mat_10_5 = _mm256_add_epi16 (iacc_mat_10_5_sp1 ,iacc_mat_10_5_sp2 ); 5612__m256i iacc_mat_11_5 = _mm256_add_epi16 (iacc_mat_11_5_sp1 ,iacc_mat_11_5_sp2 ); 5613 5614__m256i iacc_mat_00_6 = _mm256_add_epi16 (iacc_mat_00_6_sp1 ,iacc_mat_00_6_sp2 ); 5615__m256i iacc_mat_01_6 = _mm256_add_epi16 (iacc_mat_01_6_sp1 ,iacc_mat_01_6_sp2 ); 5616__m256i iacc_mat_10_6 = _mm256_add_epi16 (iacc_mat_10_6_sp1 ,iacc_mat_10_6_sp2 ); 5617__m256i iacc_mat_11_6 = _mm256_add_epi16 (iacc_mat_11_6_sp1 ,iacc_mat_11_6_sp2 ); 5618 5619__m256i iacc_mat_00_7 = _mm256_add_epi16 (iacc_mat_00_7_sp1 ,iacc_mat_00_7_sp2 ); 5620__m256i iacc_mat_01_7 = _mm256_add_epi16 (iacc_mat_01_7_sp1 ,iacc_mat_01_7_sp2 ); 5621__m256i iacc_mat_10_7 = _mm256_add_epi16 (iacc_mat_10_7_sp1 ,iacc_mat_10_7_sp2 ); 5622__m256i iacc_mat_11_7 = _mm256_add_epi16 (iacc_mat_11_7_sp1 ,iacc_mat_11_7_sp2 ); 5623 5624// Output of both shuffle patterns are added in order to sum dot product outputs of all 32 values in block 5625iacc_mat_00_0 = _mm256_madd_epi16 (iacc_mat_00_0 ,scale_0145_0 ); 5626iacc_mat_01_0 = _mm256_madd_epi16 (iacc_mat_01_0 ,scale_2367_0 ); 5627iacc_mat_10_0 = _mm256_madd_epi16 (iacc_mat_10_0 ,scale_0145_0 ); 5628iacc_mat_11_0 = _mm256_madd_epi16 (iacc_mat_11_0 ,scale_2367_0 ); 5629 5630iacc_mat_00_1 = _mm256_madd_epi16 (iacc_mat_00_1 ,scale_0145_1 ); 5631iacc_mat_01_1 = _mm256_madd_epi16 (iacc_mat_01_1 ,scale_2367_1 ); 5632iacc_mat_10_1 = _mm256_madd_epi16 (iacc_mat_10_1 ,scale_0145_1 ); 5633iacc_mat_11_1 = _mm256_madd_epi16 (iacc_mat_11_1 ,scale_2367_1 ); 5634 5635iacc_mat_00_2 = _mm256_madd_epi16 (iacc_mat_00_2 ,scale_0145_2 ); 5636iacc_mat_01_2 = _mm256_madd_epi16 (iacc_mat_01_2 ,scale_2367_2 ); 5637iacc_mat_10_2 = _mm256_madd_epi16 (iacc_mat_10_2 ,scale_0145_2 ); 5638iacc_mat_11_2 = _mm256_madd_epi16 (iacc_mat_11_2 ,scale_2367_2 ); 5639 5640iacc_mat_00_3 = _mm256_madd_epi16 (iacc_mat_00_3 ,scale_0145_3 ); 5641iacc_mat_01_3 = _mm256_madd_epi16 (iacc_mat_01_3 ,scale_2367_3 ); 5642iacc_mat_10_3 = _mm256_madd_epi16 (iacc_mat_10_3 ,scale_0145_3 ); 5643iacc_mat_11_3 = _mm256_madd_epi16 (iacc_mat_11_3 ,scale_2367_3 ); 5644 5645iacc_mat_00_4 = _mm256_madd_epi16 (iacc_mat_00_4 ,scale_0145_4 ); 5646iacc_mat_01_4 = _mm256_madd_epi16 (iacc_mat_01_4 ,scale_2367_4 ); 5647iacc_mat_10_4 = _mm256_madd_epi16 (iacc_mat_10_4 ,scale_0145_4 ); 5648iacc_mat_11_4 = _mm256_madd_epi16 (iacc_mat_11_4 ,scale_2367_4 ); 5649 5650iacc_mat_00_5 = _mm256_madd_epi16 (iacc_mat_00_5 ,scale_0145_5 ); 5651iacc_mat_01_5 = _mm256_madd_epi16 (iacc_mat_01_5 ,scale_2367_5 ); 5652iacc_mat_10_5 = _mm256_madd_epi16 (iacc_mat_10_5 ,scale_0145_5 ); 5653iacc_mat_11_5 = _mm256_madd_epi16 (iacc_mat_11_5 ,scale_2367_5 ); 5654 5655iacc_mat_00_6 = _mm256_madd_epi16 (iacc_mat_00_6 ,scale_0145_6 ); 5656iacc_mat_01_6 = _mm256_madd_epi16 (iacc_mat_01_6 ,scale_2367_6 ); 5657iacc_mat_10_6 = _mm256_madd_epi16 (iacc_mat_10_6 ,scale_0145_6 ); 5658iacc_mat_11_6 = _mm256_madd_epi16 (iacc_mat_11_6 ,scale_2367_6 ); 5659 5660iacc_mat_00_7 = _mm256_madd_epi16 (iacc_mat_00_7 ,scale_0145_7 ); 5661iacc_mat_01_7 = _mm256_madd_epi16 (iacc_mat_01_7 ,scale_2367_7 ); 5662iacc_mat_10_7 = _mm256_madd_epi16 (iacc_mat_10_7 ,scale_0145_7 ); 5663iacc_mat_11_7 = _mm256_madd_epi16 (iacc_mat_11_7 ,scale_2367_7 ); 5664 5665__m256i iacc_mat_00 = _mm256_add_epi32 (_mm256_add_epi32 (_mm256_add_epi32 (iacc_mat_00_0 ,iacc_mat_00_1 ),_mm256_add_epi32 (iacc_mat_00_2 ,iacc_mat_00_3 )),_mm256_add_epi32 (_mm256_add_epi32 (iacc_mat_00_4 ,iacc_mat_00_5 ),_mm256_add_epi32 (iacc_mat_00_6 ,iacc_mat_00_7 ))); 5666__m256i iacc_mat_01 = _mm256_add_epi32 (_mm256_add_epi32 (_mm256_add_epi32 (iacc_mat_01_0 ,iacc_mat_01_1 ),_mm256_add_epi32 (iacc_mat_01_2 ,iacc_mat_01_3 )),_mm256_add_epi32 (_mm256_add_epi32 (iacc_mat_01_4 ,iacc_mat_01_5 ),_mm256_add_epi32 (iacc_mat_01_6 ,iacc_mat_01_7 ))); 5667__m256i iacc_mat_10 = _mm256_add_epi32 (_mm256_add_epi32 (_mm256_add_epi32 (iacc_mat_10_0 ,iacc_mat_10_1 ),_mm256_add_epi32 (iacc_mat_10_2 ,iacc_mat_10_3 )),_mm256_add_epi32 (_mm256_add_epi32 (iacc_mat_10_4 ,iacc_mat_10_5 ),_mm256_add_epi32 (iacc_mat_10_6 ,iacc_mat_10_7 ))); 5668__m256i iacc_mat_11 = _mm256_add_epi32 (_mm256_add_epi32 (_mm256_add_epi32 (iacc_mat_11_0 ,iacc_mat_11_1 ),_mm256_add_epi32 (iacc_mat_11_2 ,iacc_mat_11_3 )),_mm256_add_epi32 (_mm256_add_epi32 (iacc_mat_11_4 ,iacc_mat_11_5 ),_mm256_add_epi32 (iacc_mat_11_6 ,iacc_mat_11_7 ))); 5669 5670// Straighten out to make 4 row vectors 5671__m256i iacc_row_0 = _mm256_blend_epi32 (iacc_mat_00 ,_mm256_shuffle_epi32 (iacc_mat_01 ,78 ),204 ); 5672__m256i iacc_row_1 = _mm256_blend_epi32 (_mm256_shuffle_epi32 (iacc_mat_00 ,78 ),iacc_mat_01 ,204 ); 5673__m256i iacc_row_2 = _mm256_blend_epi32 (iacc_mat_10 ,_mm256_shuffle_epi32 (iacc_mat_11 ,78 ),204 ); 5674__m256i iacc_row_3 = _mm256_blend_epi32 (_mm256_shuffle_epi32 (iacc_mat_10 ,78 ),iacc_mat_11 ,204 ); 5675 5676// Load the scale(d) values for all the 4 Q8_k blocks and repeat it across lanes 5677const __m128 row_scale_f32_sse = _mm_load_ps (a_ptrs [rp ][b ].d ); 5678const __m256 row_scale_f32 = _mm256_set_m128 (row_scale_f32_sse ,row_scale_f32_sse ); 5679 5680// Multiply with appropriate scales and accumulate (for both d and dmin) below 5681acc_rows [rp * 4 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_0 ),_mm256_mul_ps (col_scale_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,0 )),acc_rows [rp * 4 ]); 5682acc_rows [rp * 4 + 1 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_1 ),_mm256_mul_ps (col_scale_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,85 )),acc_rows [rp * 4 + 1 ]); 5683acc_rows [rp * 4 + 2 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_2 ),_mm256_mul_ps (col_scale_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,170 )),acc_rows [rp * 4 + 2 ]); 5684acc_rows [rp * 4 + 3 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_3 ),_mm256_mul_ps (col_scale_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,255 )),acc_rows [rp * 4 + 3 ]); 5685 5686__m256i lhs_bsums_01_0123 = _mm256_inserti128_si256 (_mm256_castsi128_si256 (lhs_raw_bsums_01_0123 ),lhs_raw_bsums_01_0123 ,1 ); 5687__m256i lhs_bsums_23_0123 = _mm256_inserti128_si256 (_mm256_castsi128_si256 (lhs_raw_bsums_23_0123 ),lhs_raw_bsums_23_0123 ,1 ); 5688__m256i lhs_bsums_01_4567 = _mm256_inserti128_si256 (_mm256_castsi128_si256 (lhs_raw_bsums_01_4567 ),lhs_raw_bsums_01_4567 ,1 ); 5689__m256i lhs_bsums_23_4567 = _mm256_inserti128_si256 (_mm256_castsi128_si256 (lhs_raw_bsums_23_4567 ),lhs_raw_bsums_23_4567 ,1 ); 5690 5691// Take two bsums from two Q8_Ks at a time and multiply with corresponding mins values from each Q2_K 5692__m256i iacc_row_min_0_01 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_01_0123 ,0 ),mins_01 ); 5693__m256i iacc_row_min_1_01 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_01_0123 ,170 ),mins_01 ); 5694__m256i iacc_row_min_2_01 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_23_0123 ,0 ),mins_01 ); 5695__m256i iacc_row_min_3_01 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_23_0123 ,170 ),mins_01 ); 5696 5697__m256i iacc_row_min_0_23 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_01_0123 ,85 ),mins_23 ); 5698__m256i iacc_row_min_1_23 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_01_0123 ,255 ),mins_23 ); 5699__m256i iacc_row_min_2_23 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_23_0123 ,85 ),mins_23 ); 5700__m256i iacc_row_min_3_23 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_23_0123 ,255 ),mins_23 ); 5701 5702__m256i iacc_row_min_0_45 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_01_4567 ,0 ),mins_45 ); 5703__m256i iacc_row_min_1_45 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_01_4567 ,170 ),mins_45 ); 5704__m256i iacc_row_min_2_45 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_23_4567 ,0 ),mins_45 ); 5705__m256i iacc_row_min_3_45 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_23_4567 ,170 ),mins_45 ); 5706 5707__m256i iacc_row_min_0_67 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_01_4567 ,85 ),mins_67 ); 5708__m256i iacc_row_min_1_67 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_01_4567 ,255 ),mins_67 ); 5709__m256i iacc_row_min_2_67 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_23_4567 ,85 ),mins_67 ); 5710__m256i iacc_row_min_3_67 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_23_4567 ,255 ),mins_67 ); 5711 5712__m256i iacc_row_min_0 = _mm256_add_epi32 (_mm256_add_epi32 (iacc_row_min_0_01 ,iacc_row_min_0_23 ),_mm256_add_epi32 (iacc_row_min_0_45 ,iacc_row_min_0_67 )); 5713__m256i iacc_row_min_1 = _mm256_add_epi32 (_mm256_add_epi32 (iacc_row_min_1_01 ,iacc_row_min_1_23 ),_mm256_add_epi32 (iacc_row_min_1_45 ,iacc_row_min_1_67 )); 5714__m256i iacc_row_min_2 = _mm256_add_epi32 (_mm256_add_epi32 (iacc_row_min_2_01 ,iacc_row_min_2_23 ),_mm256_add_epi32 (iacc_row_min_2_45 ,iacc_row_min_2_67 )); 5715__m256i iacc_row_min_3 = _mm256_add_epi32 (_mm256_add_epi32 (iacc_row_min_3_01 ,iacc_row_min_3_23 ),_mm256_add_epi32 (iacc_row_min_3_45 ,iacc_row_min_3_67 )); 5716 5717acc_min_rows [rp * 4 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_min_0 ),_mm256_mul_ps (col_dmin_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,0 )),acc_min_rows [rp * 4 ]); 5718acc_min_rows [rp * 4 + 1 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_min_1 ),_mm256_mul_ps (col_dmin_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,85 )),acc_min_rows [rp * 4 + 1 ]); 5719acc_min_rows [rp * 4 + 2 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_min_2 ),_mm256_mul_ps (col_dmin_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,170 )),acc_min_rows [rp * 4 + 2 ]); 5720acc_min_rows [rp * 4 + 3 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_min_3 ),_mm256_mul_ps (col_dmin_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,255 )),acc_min_rows [rp * 4 + 3 ]); 5721 5722 } 5723 } 5724 } 5725// Store the accumulated values 5726for (int i = 0 ;i < 16 ;i ++ ) { 5727_mm256_storeu_ps ((float * )(s + ((y * 4 + i )* bs + x * 8 )),_mm256_sub_ps (acc_rows [i ],acc_min_rows [i ])); 5728 5729 } 5730 } 5731 } 5732 5733for (;y < nr /4 ;y ++ ) { 5734 5735const block_q8_Kx4 * a_ptr = a_ptr_start + (y * nb ); 5736 5737// Take group of eight block_q2_kx8 structures at each pass of the loop and perform dot product operation 5738for (int64_t x = xstart ;x < nc /8 ;x ++ ) { 5739 5740const block_q2_Kx8 * b_ptr = b_ptr_start + (x * b_nb ); 5741 5742// Master FP accumulators 5743__m256 acc_rows [4 ]; 5744for (int i = 0 ;i < 4 ;i ++ ) { 5745acc_rows [i ]= _mm256_setzero_ps (); 5746 } 5747 5748__m256 acc_min_rows [4 ]; 5749for (int i = 0 ;i < 4 ;i ++ ) { 5750acc_min_rows [i ]= _mm256_setzero_ps (); 5751 } 5752 5753for (int64_t b = 0 ;b < nb ;b ++ ) { 5754// Delta values - Load the eight scale values of block_q2_kx8 5755const __m256 col_scale_f32 = GGML_F32Cx8_LOAD (b_ptr [b ].d ); 5756 5757// dmin values - Load the eight dmin values of block_q2_kx8 5758const __m256 col_dmin_f32 = GGML_F32Cx8_LOAD (b_ptr [b ].dmin ); 5759 5760// Loop to iterate over the sixteen sub blocks of a super block - eight sub blocks are processed per iteration 5761for (int sb = 0 ;sb < QK_K /128 ;sb ++ ) { 5762 5763// Load the eight block_q2_k for eight sub blocks quantized values interleaved with each other in chunks of eight bytes - B0,B1 ....B6,B7 5764const __m256i rhs_raw_mat_0123_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + sb * 256 )); 5765const __m256i rhs_raw_mat_4567_0 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 32 + sb * 256 )); 5766const __m256i rhs_raw_mat_0123_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 64 + sb * 256 )); 5767const __m256i rhs_raw_mat_4567_1 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 96 + sb * 256 )); 5768const __m256i rhs_raw_mat_0123_2 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 128 + sb * 256 )); 5769const __m256i rhs_raw_mat_4567_2 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 160 + sb * 256 )); 5770const __m256i rhs_raw_mat_0123_3 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 192 + sb * 256 )); 5771const __m256i rhs_raw_mat_4567_3 = _mm256_loadu_si256 ((const __m256i * )(b_ptr [b ].qs + 224 + sb * 256 )); 5772 5773// Save the values in the following vectors in the formats B0B1B4B5, B2B3B6B7 for further processing and storing of values 5774//superblock sub block which part of sub block 5775const __m256i rhs_raw_mat_0145_0 = _mm256_blend_epi32 (rhs_raw_mat_0123_0 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_0 ,requiredOrder ),240 ); 5776const __m256i rhs_raw_mat_2367_0 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_0 ,requiredOrder ),rhs_raw_mat_4567_0 ,240 ); 5777 5778const __m256i rhs_raw_mat_0145_1 = _mm256_blend_epi32 (rhs_raw_mat_0123_1 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_1 ,requiredOrder ),240 ); 5779const __m256i rhs_raw_mat_2367_1 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_1 ,requiredOrder ),rhs_raw_mat_4567_1 ,240 ); 5780 5781const __m256i rhs_raw_mat_0145_2 = _mm256_blend_epi32 (rhs_raw_mat_0123_2 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_2 ,requiredOrder ),240 ); 5782const __m256i rhs_raw_mat_2367_2 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_2 ,requiredOrder ),rhs_raw_mat_4567_2 ,240 ); 5783 5784const __m256i rhs_raw_mat_0145_3 = _mm256_blend_epi32 (rhs_raw_mat_0123_3 ,_mm256_permutevar8x32_epi32 (rhs_raw_mat_4567_3 ,requiredOrder ),240 ); 5785const __m256i rhs_raw_mat_2367_3 = _mm256_blend_epi32 (_mm256_permutevar8x32_epi32 (rhs_raw_mat_0123_3 ,requiredOrder ),rhs_raw_mat_4567_3 ,240 ); 5786 5787// 2-bit -> 8-bit 5788// First sub block of the eight sub blocks processed in the iteration 5789const __m256i rhs_mat_0145_00 = _mm256_and_si256 (rhs_raw_mat_0145_0 ,m3b );//B00(0-7) B01(0-7) B04(0-7) B05(0-7) 5790const __m256i rhs_mat_2367_00 = _mm256_and_si256 (rhs_raw_mat_2367_0 ,m3b );//B02(0-7) B03(0-7) B06(0-7) B07(0-7) 5791 5792const __m256i rhs_mat_0145_01 = _mm256_and_si256 (rhs_raw_mat_0145_1 ,m3b );//B00(8-15) B01(8-15) B04(8-15) B05(8-15) 5793const __m256i rhs_mat_2367_01 = _mm256_and_si256 (rhs_raw_mat_2367_1 ,m3b );//B02(8-15) B03(8-15) B06(8-15) B07(8-15) 5794 5795// Second sub block of the eight sub blocks processed in the iteration 5796const __m256i rhs_mat_0145_10 = _mm256_and_si256 (rhs_raw_mat_0145_2 ,m3b );//B10(0-7) B11(0-7) B14(0-7) B15(0-7) 5797const __m256i rhs_mat_2367_10 = _mm256_and_si256 (rhs_raw_mat_2367_2 ,m3b );//B12(0-7) B13(0-7) B16(0-7) B17(0-7) 5798 5799const __m256i rhs_mat_0145_11 = _mm256_and_si256 (rhs_raw_mat_0145_3 ,m3b );//B10(8-15) B11(8-15) B14(8-15) B15(8-15) 5800const __m256i rhs_mat_2367_11 = _mm256_and_si256 (rhs_raw_mat_2367_3 ,m3b );//B12(8-15) B13(8-15) B16(8-15) B17(8-15) 5801 5802// Third sub block of the eight sub blocks processed in the iteration 5803const __m256i rhs_mat_0145_20 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_0145_0 ,2 ),m3b );//B20(0-7) B21(0-7) B24(0-7) B25(0-7) 5804const __m256i rhs_mat_2367_20 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_2367_0 ,2 ),m3b );//B22(0-7) B23(0-7) B26(0-7) B27(0-7) 5805 5806const __m256i rhs_mat_0145_21 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_0145_1 ,2 ),m3b );//B20(8-15) B21(8-15) B24(8-15) B25(8-15) 5807const __m256i rhs_mat_2367_21 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_2367_1 ,2 ),m3b );//B22(8-15) B23(8-15) B26(8-15) B27(8-15) 5808 5809// Fourth sub block of the eight sub blocks processed in the iteration 5810const __m256i rhs_mat_0145_30 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_0145_2 ,2 ),m3b );//B30(0-7) B31(0-7) B34(0-7) B35(0-7) 5811const __m256i rhs_mat_2367_30 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_2367_2 ,2 ),m3b );//B32(0-7) B33(0-7) B36(0-7) B37(0-7) 5812 5813const __m256i rhs_mat_0145_31 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_0145_3 ,2 ),m3b );//B30(8-15) B31(8-15) B34(8-15) B35(8-15) 5814const __m256i rhs_mat_2367_31 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_2367_3 ,2 ),m3b );//B32(8-15) B33(8-15) B36(8-15) B37(8-15) 5815 5816// Fifth sub block of the eight sub blocks processed in the iteration 5817const __m256i rhs_mat_0145_40 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_0145_0 ,4 ),m3b );//B40(0-7) B41(0-7) B44(0-7) B45(0-7) 5818const __m256i rhs_mat_2367_40 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_2367_0 ,4 ),m3b );//B42(0-7) B43(0-7) B46(0-7) B47(0-7) 5819 5820const __m256i rhs_mat_0145_41 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_0145_1 ,4 ),m3b );//B40(8-15) B41(8-15) B44(8-15) B45(8-15) 5821const __m256i rhs_mat_2367_41 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_2367_1 ,4 ),m3b );//B42(8-15) B43(8-15) B46(8-15) B47(8-15) 5822 5823// Sixth sub block of the eight sub blocks processed in the iteration 5824const __m256i rhs_mat_0145_50 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_0145_2 ,4 ),m3b );//B50(0-7) B51(0-7) B54(0-7) B55(0-7) 5825const __m256i rhs_mat_2367_50 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_2367_2 ,4 ),m3b );//B52(0-7) B53(0-7) B56(0-7) B57(0-7) 5826 5827const __m256i rhs_mat_0145_51 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_0145_3 ,4 ),m3b );//B50(8-15) B51(8-15) B54(8-15) B55(8-15) 5828const __m256i rhs_mat_2367_51 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_2367_3 ,4 ),m3b );//B52(8-15) B53(8-15) B56(8-15) B57(8-15) 5829 5830// Seventh sub block of the eight sub blocks processed in the iteration 5831const __m256i rhs_mat_0145_60 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_0145_0 ,6 ),m3b );//B60(0-7) B61(0-7) B64(0-7) B65(0-7) 5832const __m256i rhs_mat_2367_60 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_2367_0 ,6 ),m3b );//B62(0-7) B63(0-7) B66(0-7) B67(0-7) 5833 5834const __m256i rhs_mat_0145_61 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_0145_1 ,6 ),m3b );//B60(8-15) B61(8-15) B64(8-15) B65(8-15) 5835const __m256i rhs_mat_2367_61 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_2367_1 ,6 ),m3b );//B62(8-15) B63(8-15) B66(8-15) B67(8-15) 5836 5837// Eighth sub block of the eight sub blocks processed in the iteration 5838const __m256i rhs_mat_0145_70 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_0145_2 ,6 ),m3b );//B70(0-7) B71(0-7) B74(0-7) B75(0-7) 5839const __m256i rhs_mat_2367_70 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_2367_2 ,6 ),m3b );//B72(0-7) B73(0-7) B76(0-7) B77(0-7) 5840 5841const __m256i rhs_mat_0145_71 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_0145_3 ,6 ),m3b );//B70(8-15) B71(8-15) B74(8-15) B75(8-15) 5842const __m256i rhs_mat_2367_71 = _mm256_and_si256 (_mm256_srli_epi16 (rhs_raw_mat_2367_3 ,6 ),m3b );//B72(8-15) B73(8-15) B76(8-15) B77(8-15) 5843 5844// Shuffle pattern one - right side input 5845const __m256i rhs_mat_0145_00_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_00 ,136 );//B00(0-3) B01(0-3) B00(0-3) B01(0-3) B04(0-3) B05(0-3) B04(0-3) B05(0-3) 5846const __m256i rhs_mat_2367_00_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_00 ,136 );//B02(0-3) B03(0-3) B02(0-3) B03(0-3) B06(0-3) B07(0-3) B06(0-3) B07(0-3) 5847 5848const __m256i rhs_mat_0145_01_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_01 ,136 );//B00(8-11) B01(8-11) B00(8-11) B01(8-11) B04(8-11) B05(8-11) B04(8-11) B05(8-11) 5849const __m256i rhs_mat_2367_01_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_01 ,136 );//B02(8-11) B03(8-11) B02(8-11) B03(8-11) B06(8-11) B07(8-11) B06(8-11) B07(8-11) 5850 5851const __m256i rhs_mat_0145_10_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_10 ,136 );//B10(0-3) B11(0-3) B10(0-3) B11(0-3) B14(0-3) B15(0-3) B14(0-3) B15(0-3) 5852const __m256i rhs_mat_2367_10_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_10 ,136 );//B12(0-3) B13(0-3) B12(0-3) B13(0-3) B16(0-3) B17(0-3) B16(0-3) B17(0-3) 5853 5854const __m256i rhs_mat_0145_11_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_11 ,136 );//B10(8-11) B11(8-11) B10(8-11) B11(8-11) B14(8-11) B15(8-11) B14(8-11) B15(8-11) 5855const __m256i rhs_mat_2367_11_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_11 ,136 );//B12(8-11) B13(8-11) B12(8-11) B13(8-11) B16(8-11) B17(8-11) B16(8-11) B17(8-11) 5856 5857const __m256i rhs_mat_0145_20_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_20 ,136 );//B20(0-3) B21(0-3) B20(0-3) B21(0-3) B24(0-3) B25(0-3) B24(0-3) B25(0-3) 5858const __m256i rhs_mat_2367_20_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_20 ,136 );//B22(0-3) B23(0-3) B22(0-3) B23(0-3) B26(0-3) B27(0-3) B26(0-3) B27(0-3) 5859 5860const __m256i rhs_mat_0145_21_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_21 ,136 );//B20(8-11) B21(8-11) B20(8-11) B21(8-11) B24(8-11) B25(8-11) B24(8-11) B25(8-11) 5861const __m256i rhs_mat_2367_21_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_21 ,136 );//B22(8-11) B23(8-11) B22(8-11) B23(8-11) B26(8-11) B27(8-11) B26(8-11) B27(8-11) 5862 5863const __m256i rhs_mat_0145_30_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_30 ,136 );//B30(0-3) B31(0-3) B30(0-3) B31(0-3) B34(0-3) B35(0-3) B34(0-3) B35(0-3) 5864const __m256i rhs_mat_2367_30_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_30 ,136 );//B32(0-3) B33(0-3) B32(0-3) B33(0-3) B36(0-3) B37(0-3) B36(0-3) B37(0-3) 5865 5866const __m256i rhs_mat_0145_31_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_31 ,136 );//B30(8-11) B31(8-11) B30(8-11) B31(8-11) B34(8-11) B35(8-11) B34(8-11) B35(8-11 5867const __m256i rhs_mat_2367_31_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_31 ,136 );//B32(8-11) B33(8-11) B32(8-11) B33(8-11) B36(8-11) B37(8-11) B36(8-11) B37(8-11) 5868 5869const __m256i rhs_mat_0145_40_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_40 ,136 );//B40(0-3) B41(0-3) B40(0-3) B41(0-3) B44(0-3) B45(0-3) B44(0-3) B45(0-3) 5870const __m256i rhs_mat_2367_40_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_40 ,136 );//B42(0-3) B43(0-3) B42(0-3) B43(0-3) B46(0-3) B47(0-3) B46(0-3) B47(0-3) 5871 5872const __m256i rhs_mat_0145_41_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_41 ,136 );//B40(8-11) B41(8-11) B40(8-11) B41(8-11) B44(8-11) B45(8-11) B44(8-11) B45(8-11) 5873const __m256i rhs_mat_2367_41_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_41 ,136 );//B42(8-11) B43(8-11) B42(8-11) B43(8-11) B46(8-11) B47(8-11) B46(8-11) B47(8-11) 5874 5875const __m256i rhs_mat_0145_50_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_50 ,136 );//B50(0-3) B51(0-3) B50(0-3) B51(0-3) B54(0-3) B55(0-3) B54(0-3) B55(0-3) 5876const __m256i rhs_mat_2367_50_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_50 ,136 );//B52(0-3) B53(0-3) B52(0-3) B53(0-3) B56(0-3) B57(0-3) B56(0-3) B57(0-3) 5877 5878const __m256i rhs_mat_0145_51_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_51 ,136 );//B50(8-11) B51(8-11) B50(8-11) B51(8-11) B54(8-11) B55(8-11) B54(8-11) B55(8-11) 5879const __m256i rhs_mat_2367_51_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_51 ,136 );//B52(8-11) B53(8-11) B52(8-11) B53(8-11) B56(8-11) B57(8-11) B56(8-11) B57(8-11) 5880 5881const __m256i rhs_mat_0145_60_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_60 ,136 );//B60(0-3) B61(0-3) B60(0-3) B61(0-3) B64(0-3) B65(0-3) B64(0-3) B65(0-3) 5882const __m256i rhs_mat_2367_60_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_60 ,136 );//B62(0-3) B63(0-3) B62(0-3) B63(0-3) B66(0-3) B67(0-3) B66(0-3) B67(0-3) 5883 5884const __m256i rhs_mat_0145_61_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_61 ,136 );//B60(8-11) B61(8-11) B60(8-11) B61(8-11) B64(8-11) B65(8-11) B64(8-11) B65(8-11) 5885const __m256i rhs_mat_2367_61_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_61 ,136 );//B62(8-11) B63(8-11) B62(8-11) B63(8-11) B66(8-11) B67(8-11) B66(8-11) B67(8-11) 5886 5887const __m256i rhs_mat_0145_70_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_70 ,136 );//B70(0-3) B71(0-3) B70(0-3) B71(0-3) B74(0-3) B75(0-3) B74(0-3) B75(0-3) 5888const __m256i rhs_mat_2367_70_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_70 ,136 );//B72(0-3) B73(0-3) B72(0-3) B73(0-3) B76(0-3) B77(0-3) B76(0-3) B77(0-3) 5889 5890const __m256i rhs_mat_0145_71_sp1 = _mm256_shuffle_epi32 (rhs_mat_0145_71 ,136 );//B70(8-11) B71(8-11) B70(8-11) B71(8-11) B74(8-11) B75(8-11) B74(8-11) B75(8-11) 5891const __m256i rhs_mat_2367_71_sp1 = _mm256_shuffle_epi32 (rhs_mat_2367_71 ,136 );//B72(8-11) B73(8-11) B72(8-11) B73(8-11) B76(8-11) B77(8-11) B76(8-11) B77(8-11) 5892 5893 5894// Shuffle pattern two - right side input 5895const __m256i rhs_mat_0145_00_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_00 ,221 );//B00(4-7) B01(4-7) B00(4-7) B01(4-7) B04(4-7) B05(4-7) B04(4-7) B05(4-7) 5896const __m256i rhs_mat_2367_00_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_00 ,221 );//B02(4-7) B03(4-7) B02(4-7) B03(4-7) B06(4-7) B07(4-7) B06(4-7) B07(4-7) 5897 5898const __m256i rhs_mat_0145_01_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_01 ,221 );//B00(12-15) B01(12-15) B00(12-15) B01(12-15) B04(12-15) B05(12-15) B04(12-15) B05(12-15) 5899const __m256i rhs_mat_2367_01_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_01 ,221 );//B02(12-15) B03(12-15) B02(12-15) B03(12-15) B06(12-15) B07(12-15) B06(12-15) B07(12-15) 5900 5901const __m256i rhs_mat_0145_10_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_10 ,221 );//B10(4-7) B11(4-7) B10(4-7) B11(4-7) B14(4-7) B15(4-7) B14(4-7) B15(4-7) 5902const __m256i rhs_mat_2367_10_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_10 ,221 );//B12(4-7) B13(4-7) B12(4-7) B13(4-7) B16(4-7) B17(4-7) B16(4-7) B17(4-7) 5903 5904const __m256i rhs_mat_0145_11_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_11 ,221 );//B10(12-15) B11(12-15) B10(12-15) B11(12-15) B14(12-15) B15(12-15) B14(12-15) B15(12-15) 5905const __m256i rhs_mat_2367_11_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_11 ,221 );//B12(12-15) B13(12-15) B12(12-15) B13(12-15) B16(12-15) B17(12-15) B16(12-15) B17(12-15) 5906 5907const __m256i rhs_mat_0145_20_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_20 ,221 );//B20(4-7) B21(4-7) B20(4-7) B21(4-7) B24(4-7) B25(4-7) B24(4-7) B25(4-7) 5908const __m256i rhs_mat_2367_20_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_20 ,221 );//B22(4-7) B23(4-7) B22(4-7) B23(4-7) B26(4-7) B27(4-7) B26(4-7) B27(4-7) 5909 5910const __m256i rhs_mat_0145_21_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_21 ,221 );//B20(12-15) B21(12-15) B20(12-15) B21(12-15) B24(12-15) B25(12-15) B24(12-15) B25(12-15) 5911const __m256i rhs_mat_2367_21_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_21 ,221 );//B22(12-15) B23(12-15) B22(12-15) B23(12-15) B26(12-15) B27(12-15) B26(12-15) B27(12-15) 5912 5913const __m256i rhs_mat_0145_30_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_30 ,221 );//B30(4-7) B31(4-7) B30(4-7) B31(4-7) B34(4-7) B35(4-7) B34(4-7) B35(4-7) 5914const __m256i rhs_mat_2367_30_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_30 ,221 );//B32(4-7) B33(4-7) B32(4-7) B33(4-7) B36(4-7) B37(4-7) B36(4-7) B37(4-7) 5915 5916const __m256i rhs_mat_0145_31_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_31 ,221 );//B30(12-15) B31(12-15) B30(12-15) B31(12-15) B34(12-15) B35(12-15) B34(12-15) B35(12-15) 5917const __m256i rhs_mat_2367_31_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_31 ,221 );//B32(12-15) B33(12-15) B32(12-15) B33(12-15) B36(12-15) B37(12-15) B36(12-15) B37(12-15) 5918 5919const __m256i rhs_mat_0145_40_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_40 ,221 );//B40(4-7) B41(4-7) B40(4-7) B41(4-7) B44(4-7) B45(4-7) B44(4-7) B45(4-7) 5920const __m256i rhs_mat_2367_40_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_40 ,221 );//B42(4-7) B43(4-7) B42(4-7) B43(4-7) B46(4-7) B47(4-7) B46(4-7) B47(4-7) 5921 5922const __m256i rhs_mat_0145_41_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_41 ,221 );//B40(12-15) B41(12-15) B40(12-15) B41(12-15) B44(12-15) B45(12-15) B44(12-15) B45(12-15) 5923const __m256i rhs_mat_2367_41_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_41 ,221 );//B42(12-15) B43(12-15) B42(12-15) B43(12-15) B46(12-15) B47(12-15) B46(12-15) B47(12-15) 5924 5925const __m256i rhs_mat_0145_50_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_50 ,221 );//B50(4-7) B51(4-7) B50(4-7) B51(4-7) B54(4-7) B55(4-7) B54(4-7) B55(4-7) 5926const __m256i rhs_mat_2367_50_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_50 ,221 );//B52(4-7) B53(4-7) B52(4-7) B53(4-7) B56(4-7) B57(4-7) B56(4-7) B57(4-7) 5927 5928const __m256i rhs_mat_0145_51_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_51 ,221 );//B50(12-15) B51(12-15) B50(12-15) B51(12-15) B54(12-15) B55(12-15) B54(12-15) B55(12-15) 5929const __m256i rhs_mat_2367_51_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_51 ,221 );//B52(12-15) B53(12-15) B52(12-15) B53(12-15) B56(12-15) B57(12-15) B56(12-15) B57(12-15) 5930 5931const __m256i rhs_mat_0145_60_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_60 ,221 );//B60(4-7) B61(4-7) B60(4-7) B61(4-7) B64(4-7) B65(4-7) B64(4-7) B65(4-7) 5932const __m256i rhs_mat_2367_60_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_60 ,221 );//B62(4-7) B63(4-7) B62(4-7) B63(4-7) B66(4-7) B67(4-7) B66(4-7) B67(4-7) 5933 5934const __m256i rhs_mat_0145_61_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_61 ,221 );//B60(12-15) B61(12-15) B60(12-15) B61(12-15) B64(12-15) B65(12-15) B64(12-15) B65(12-15) 5935const __m256i rhs_mat_2367_61_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_61 ,221 );//B62(12-15) B63(12-15) B62(12-15) B63(12-15) B66(12-15) B67(12-15) B66(12-15) B67(12-15) 5936 5937const __m256i rhs_mat_0145_70_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_70 ,221 );//B70(4-7) B71(4-7) B70(4-7) B71(4-7) B74(4-7) B75(4-7) B74(4-7) B75(4-7) 5938const __m256i rhs_mat_2367_70_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_70 ,221 );//B72(4-7) B73(4-7) B72(4-7) B73(4-7) B76(4-7) B77(4-7) B76(4-7) B77(4-7) 5939 5940const __m256i rhs_mat_0145_71_sp2 = _mm256_shuffle_epi32 (rhs_mat_0145_71 ,221 );//B70(12-15) B71(12-15) B70(12-15) B71(12-15) B74(12-15) B75(12-15) B74(12-15) B75(12-15) 5941const __m256i rhs_mat_2367_71_sp2 = _mm256_shuffle_epi32 (rhs_mat_2367_71 ,221 );//B72(12-15) B73(12-15) B72(12-15) B73(12-15) B76(12-15) B77(12-15) B76(12-15) B77(12-15) 5942 5943 5944//Scales and Mins of corresponding sub blocks from different Q2_K structures are stored together 5945//s00 m00 s01 m01 s10 m10 s11 m11 s20 m20 s21 m21 s30 m30 s31 m31 s40 m40 s41 m41 s50 m50 s51 m51 s60 m60 s61 m61 s70 m70 s71 m71 5946 5947// Combine mins and scales for sub-blocks: 0-1, 2-3, 4-5, 6-7 in the sb loop 5948const __m128i mins_and_scales_01 = _mm_loadu_si128 ((const __m128i * )(b_ptr [b ].scales + sb * 64 )); 5949const __m128i mins_and_scales_23 = _mm_loadu_si128 ((const __m128i * )(b_ptr [b ].scales + 16 + sb * 64 )); 5950const __m128i mins_and_scales_45 = _mm_loadu_si128 ((const __m128i * )(b_ptr [b ].scales + 32 + sb * 64 )); 5951const __m128i mins_and_scales_67 = _mm_loadu_si128 ((const __m128i * )(b_ptr [b ].scales + 48 + sb * 64 )); 5952 5953// Extract scales which is lower half from mins_and_scales 5954const __m128i scales_01 = _mm_and_si128 (mins_and_scales_01 ,m4b_sse ); 5955const __m128i scales_23 = _mm_and_si128 (mins_and_scales_23 ,m4b_sse ); 5956const __m128i scales_45 = _mm_and_si128 (mins_and_scales_45 ,m4b_sse ); 5957const __m128i scales_67 = _mm_and_si128 (mins_and_scales_67 ,m4b_sse ); 5958 5959// Extract mins which is upper half from mins_and_scales 5960const __m256i mins_01 = _mm256_cvtepu8_epi16 (_mm_and_si128 (_mm_srli_epi16 (mins_and_scales_01 ,4 ),m4b_sse )); 5961const __m256i mins_23 = _mm256_cvtepu8_epi16 (_mm_and_si128 (_mm_srli_epi16 (mins_and_scales_23 ,4 ),m4b_sse )); 5962const __m256i mins_45 = _mm256_cvtepu8_epi16 (_mm_and_si128 (_mm_srli_epi16 (mins_and_scales_45 ,4 ),m4b_sse )); 5963const __m256i mins_67 = _mm256_cvtepu8_epi16 (_mm_and_si128 (_mm_srli_epi16 (mins_and_scales_67 ,4 ),m4b_sse )); 5964 5965const __m256i scales_0 = _mm256_cvtepu8_epi16 (_mm_shuffle_epi8 (scales_01 ,scalesmask1_sse )); 5966const __m256i scales_1 = _mm256_cvtepu8_epi16 (_mm_shuffle_epi8 (scales_01 ,scalesmask2_sse )); 5967 5968const __m256i scales_2 = _mm256_cvtepu8_epi16 (_mm_shuffle_epi8 (scales_23 ,scalesmask1_sse )); 5969const __m256i scales_3 = _mm256_cvtepu8_epi16 (_mm_shuffle_epi8 (scales_23 ,scalesmask2_sse )); 5970 5971const __m256i scales_4 = _mm256_cvtepu8_epi16 (_mm_shuffle_epi8 (scales_45 ,scalesmask1_sse )); 5972const __m256i scales_5 = _mm256_cvtepu8_epi16 (_mm_shuffle_epi8 (scales_45 ,scalesmask2_sse )); 5973 5974const __m256i scales_6 = _mm256_cvtepu8_epi16 (_mm_shuffle_epi8 (scales_67 ,scalesmask1_sse )); 5975const __m256i scales_7 = _mm256_cvtepu8_epi16 (_mm_shuffle_epi8 (scales_67 ,scalesmask2_sse )); 5976 5977const __m256i scale_0145_0 = _mm256_shuffle_epi32 (scales_0 ,68 ); 5978const __m256i scale_2367_0 = _mm256_shuffle_epi32 (scales_0 ,238 ); 5979 5980const __m256i scale_0145_1 = _mm256_shuffle_epi32 (scales_1 ,68 ); 5981const __m256i scale_2367_1 = _mm256_shuffle_epi32 (scales_1 ,238 ); 5982 5983const __m256i scale_0145_2 = _mm256_shuffle_epi32 (scales_2 ,68 ); 5984const __m256i scale_2367_2 = _mm256_shuffle_epi32 (scales_2 ,238 ); 5985 5986const __m256i scale_0145_3 = _mm256_shuffle_epi32 (scales_3 ,68 ); 5987const __m256i scale_2367_3 = _mm256_shuffle_epi32 (scales_3 ,238 ); 5988 5989const __m256i scale_0145_4 = _mm256_shuffle_epi32 (scales_4 ,68 ); 5990const __m256i scale_2367_4 = _mm256_shuffle_epi32 (scales_4 ,238 ); 5991 5992const __m256i scale_0145_5 = _mm256_shuffle_epi32 (scales_5 ,68 ); 5993const __m256i scale_2367_5 = _mm256_shuffle_epi32 (scales_5 ,238 ); 5994 5995const __m256i scale_0145_6 = _mm256_shuffle_epi32 (scales_6 ,68 ); 5996const __m256i scale_2367_6 = _mm256_shuffle_epi32 (scales_6 ,238 ); 5997 5998const __m256i scale_0145_7 = _mm256_shuffle_epi32 (scales_7 ,68 ); 5999const __m256i scale_2367_7 = _mm256_shuffle_epi32 (scales_7 ,238 ); 6000 6001// Load the four block_q8_k quantized values interleaved with each other in chunks of eight bytes - A0,A1,A2,A3 6002// Loaded as set of 128 bit vectors and repeated into a 256 bit vector 6003__m256i lhs_mat_0123_00 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 512 * sb ))); 6004__m256i lhs_mat_01_00 = _mm256_permute2f128_si256 (lhs_mat_0123_00 ,lhs_mat_0123_00 ,0 ); 6005__m256i lhs_mat_23_00 = _mm256_permute2f128_si256 (lhs_mat_0123_00 ,lhs_mat_0123_00 ,17 ); 6006__m256i lhs_mat_0123_01 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 32 + 512 * sb ))); 6007__m256i lhs_mat_01_01 = _mm256_permute2f128_si256 (lhs_mat_0123_01 ,lhs_mat_0123_01 ,0 ); 6008__m256i lhs_mat_23_01 = _mm256_permute2f128_si256 (lhs_mat_0123_01 ,lhs_mat_0123_01 ,17 ); 6009__m256i lhs_mat_0123_10 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 64 + 512 * sb ))); 6010__m256i lhs_mat_01_10 = _mm256_permute2f128_si256 (lhs_mat_0123_10 ,lhs_mat_0123_10 ,0 ); 6011__m256i lhs_mat_23_10 = _mm256_permute2f128_si256 (lhs_mat_0123_10 ,lhs_mat_0123_10 ,17 ); 6012__m256i lhs_mat_0123_11 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 96 + 512 * sb ))); 6013__m256i lhs_mat_01_11 = _mm256_permute2f128_si256 (lhs_mat_0123_11 ,lhs_mat_0123_11 ,0 ); 6014__m256i lhs_mat_23_11 = _mm256_permute2f128_si256 (lhs_mat_0123_11 ,lhs_mat_0123_11 ,17 ); 6015__m256i lhs_mat_0123_20 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 128 + 512 * sb ))); 6016__m256i lhs_mat_01_20 = _mm256_permute2f128_si256 (lhs_mat_0123_20 ,lhs_mat_0123_20 ,0 ); 6017__m256i lhs_mat_23_20 = _mm256_permute2f128_si256 (lhs_mat_0123_20 ,lhs_mat_0123_20 ,17 ); 6018__m256i lhs_mat_0123_21 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 160 + 512 * sb ))); 6019__m256i lhs_mat_01_21 = _mm256_permute2f128_si256 (lhs_mat_0123_21 ,lhs_mat_0123_21 ,0 ); 6020__m256i lhs_mat_23_21 = _mm256_permute2f128_si256 (lhs_mat_0123_21 ,lhs_mat_0123_21 ,17 ); 6021__m256i lhs_mat_0123_30 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 192 + 512 * sb ))); 6022__m256i lhs_mat_01_30 = _mm256_permute2f128_si256 (lhs_mat_0123_30 ,lhs_mat_0123_30 ,0 ); 6023__m256i lhs_mat_23_30 = _mm256_permute2f128_si256 (lhs_mat_0123_30 ,lhs_mat_0123_30 ,17 ); 6024__m256i lhs_mat_0123_31 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 224 + 512 * sb ))); 6025__m256i lhs_mat_01_31 = _mm256_permute2f128_si256 (lhs_mat_0123_31 ,lhs_mat_0123_31 ,0 ); 6026__m256i lhs_mat_23_31 = _mm256_permute2f128_si256 (lhs_mat_0123_31 ,lhs_mat_0123_31 ,17 ); 6027 6028__m256i lhs_mat_0123_40 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 256 + 512 * sb ))); 6029__m256i lhs_mat_01_40 = _mm256_permute2f128_si256 (lhs_mat_0123_40 ,lhs_mat_0123_40 ,0 ); 6030__m256i lhs_mat_23_40 = _mm256_permute2f128_si256 (lhs_mat_0123_40 ,lhs_mat_0123_40 ,17 ); 6031__m256i lhs_mat_0123_41 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 288 + 512 * sb ))); 6032__m256i lhs_mat_01_41 = _mm256_permute2f128_si256 (lhs_mat_0123_41 ,lhs_mat_0123_41 ,0 ); 6033__m256i lhs_mat_23_41 = _mm256_permute2f128_si256 (lhs_mat_0123_41 ,lhs_mat_0123_41 ,17 ); 6034__m256i lhs_mat_0123_50 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 320 + 512 * sb ))); 6035__m256i lhs_mat_01_50 = _mm256_permute2f128_si256 (lhs_mat_0123_50 ,lhs_mat_0123_50 ,0 ); 6036__m256i lhs_mat_23_50 = _mm256_permute2f128_si256 (lhs_mat_0123_50 ,lhs_mat_0123_50 ,17 ); 6037__m256i lhs_mat_0123_51 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 352 + 512 * sb ))); 6038__m256i lhs_mat_01_51 = _mm256_permute2f128_si256 (lhs_mat_0123_51 ,lhs_mat_0123_51 ,0 ); 6039__m256i lhs_mat_23_51 = _mm256_permute2f128_si256 (lhs_mat_0123_51 ,lhs_mat_0123_51 ,17 ); 6040__m256i lhs_mat_0123_60 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 384 + 512 * sb ))); 6041__m256i lhs_mat_01_60 = _mm256_permute2f128_si256 (lhs_mat_0123_60 ,lhs_mat_0123_60 ,0 ); 6042__m256i lhs_mat_23_60 = _mm256_permute2f128_si256 (lhs_mat_0123_60 ,lhs_mat_0123_60 ,17 ); 6043__m256i lhs_mat_0123_61 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 416 + 512 * sb ))); 6044__m256i lhs_mat_01_61 = _mm256_permute2f128_si256 (lhs_mat_0123_61 ,lhs_mat_0123_61 ,0 ); 6045__m256i lhs_mat_23_61 = _mm256_permute2f128_si256 (lhs_mat_0123_61 ,lhs_mat_0123_61 ,17 ); 6046__m256i lhs_mat_0123_70 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 448 + 512 * sb ))); 6047__m256i lhs_mat_01_70 = _mm256_permute2f128_si256 (lhs_mat_0123_70 ,lhs_mat_0123_70 ,0 ); 6048__m256i lhs_mat_23_70 = _mm256_permute2f128_si256 (lhs_mat_0123_70 ,lhs_mat_0123_70 ,17 ); 6049__m256i lhs_mat_0123_71 = _mm256_loadu_si256 ((const __m256i * )((a_ptr [b ].qs + 480 + 512 * sb ))); 6050__m256i lhs_mat_01_71 = _mm256_permute2f128_si256 (lhs_mat_0123_71 ,lhs_mat_0123_71 ,0 ); 6051__m256i lhs_mat_23_71 = _mm256_permute2f128_si256 (lhs_mat_0123_71 ,lhs_mat_0123_71 ,17 ); 6052 6053// Bsums are loaded for the different Q8_K blocks 6054__m128i lhs_raw_bsums_01_0123 = _mm_loadu_si128 ((const __m128i * )((a_ptr [b ].bsums + 32 * sb ))); 6055__m128i lhs_raw_bsums_23_0123 = _mm_loadu_si128 ((const __m128i * )(a_ptr [b ].bsums + 8 + 32 * sb )); 6056__m128i lhs_raw_bsums_01_4567 = _mm_loadu_si128 ((const __m128i * )((a_ptr [b ].bsums + 16 + 32 * sb ))); 6057__m128i lhs_raw_bsums_23_4567 = _mm_loadu_si128 ((const __m128i * )(a_ptr [b ].bsums + 24 + 32 * sb )); 6058 6059// Shuffle pattern one - left side input 6060const __m256i lhs_mat_01_00_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_00 ,160 );//A00(0-3) A00(0-3) A01(0-3) A01(0-3) A00(0-3) A00(0-3) A01(0-3) A01(0-3) 6061const __m256i lhs_mat_23_00_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_00 ,160 );//A02(0-3) A03(0-3) A02(0-3) A03(0-3) A02(0-3) A03(0-3) A02(0-3) A03(0-3) 6062 6063const __m256i lhs_mat_01_01_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_01 ,160 );//A00(8-11) A00(8-11) A01(8-11) A01(8-11) A00(8-11) A00(8-11) A01(8-11) A01(8-11) 6064const __m256i lhs_mat_23_01_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_01 ,160 );//A02(8-11) A03(8-11) A02(8-11) A03(8-11) A02(8-11) A03(8-11) A02(8-11) A03(8-11) 6065 6066const __m256i lhs_mat_01_10_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_10 ,160 );//A10(0-3) A10(0-3) A11(0-3) A11(0-3) A10(0-3) A10(0-3) A11(0-3) A11(0-3) 6067const __m256i lhs_mat_23_10_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_10 ,160 );//A12(0-3) A13(0-3) A12(0-3) A13(0-3) A12(0-3) A13(0-3) A12(0-3) A13(0-3) 6068 6069const __m256i lhs_mat_01_11_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_11 ,160 );//A10(8-11) A10(8-11) A11(8-11) A11(8-11) A10(8-11) A10(8-11) A11(8-11) A11(8-11) 6070const __m256i lhs_mat_23_11_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_11 ,160 );//A12(8-11) A13(8-11) A12(8-11) A13(8-11) A12(8-11) A13(8-11) A12(8-11) A13(8-11) 6071 6072const __m256i lhs_mat_01_20_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_20 ,160 );//A20(0-3) A20(0-3) A21(0-3) A21(0-3) A20(0-3) A20(0-3) A21(0-3) A21(0-3) 6073const __m256i lhs_mat_23_20_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_20 ,160 );//A22(0-3) A23(0-3) A22(0-3) A23(0-3) A22(0-3) A23(0-3) A22(0-3) A23(0-3) 6074 6075const __m256i lhs_mat_01_21_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_21 ,160 );//A20(8-11) A20(8-11) A21(8-11) A21(8-11) A20(8-11) A20(8-11) A21(8-11) A21(8-11) 6076const __m256i lhs_mat_23_21_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_21 ,160 );//A22(8-11) A23(8-11) A22(8-11) A23(8-11) A22(8-11) A23(8-11) A22(8-11) A23(8-11) 6077 6078const __m256i lhs_mat_01_30_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_30 ,160 );//A30(0-3) A30(0-3) A31(0-3) A31(0-3) A30(0-3) A30(0-3) A31(0-3) A31(0-3) 6079const __m256i lhs_mat_23_30_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_30 ,160 );//A32(0-3) A33(0-3) A32(0-3) A33(0-3) A32(0-3) A33(0-3) A32(0-3) A33(0-3) 6080 6081const __m256i lhs_mat_01_31_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_31 ,160 );//A30(8-11) A30(8-11) A31(8-11) A31(8-11) A30(8-11) A30(8-11) A31(8-11) A31(8-11) 6082const __m256i lhs_mat_23_31_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_31 ,160 );//A32(8-11) A33(8-11) A32(8-11) A33(8-11) A32(8-11) A33(8-11) A32(8-11) A33(8-11) 6083 6084const __m256i lhs_mat_01_40_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_40 ,160 );//A40(0-3) A40(0-3) A41(0-3) A41(0-3) A40(0-3) A40(0-3) A41(0-3) A41(0-3) 6085const __m256i lhs_mat_23_40_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_40 ,160 );//A42(0-3) A43(0-3) A42(0-3) A43(0-3) A42(0-3) A43(0-3) A42(0-3) A43(0-3) 6086 6087const __m256i lhs_mat_01_41_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_41 ,160 );//A40(8-11) A40(8-11) A41(8-11) A41(8-11) A40(8-11) A40(8-11) A41(8-11) A41(8-11) 6088const __m256i lhs_mat_23_41_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_41 ,160 );//A42(8-11) A43(8-11) A42(8-11) A43(8-11) A42(8-11) A43(8-11) A42(8-11) A43(8-11) 6089 6090const __m256i lhs_mat_01_50_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_50 ,160 );//A50(0-3) A50(0-3) A51(0-3) A51(0-3) A50(0-3) A50(0-3) A51(0-3) A51(0-3) 6091const __m256i lhs_mat_23_50_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_50 ,160 );//A52(0-3) A53(0-3) A52(0-3) A53(0-3) A52(0-3) A53(0-3) A52(0-3) A53(0-3) 6092 6093const __m256i lhs_mat_01_51_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_51 ,160 );//A50(8-11) A50(8-11) A51(8-11) A51(8-11) A50(8-11) A50(8-11) A51(8-11) A51(8-11) 6094const __m256i lhs_mat_23_51_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_51 ,160 );//A52(8-11) A53(8-11) A52(8-11) A53(8-11) A52(8-11) A53(8-11) A52(8-11) A53(8-11) 6095 6096const __m256i lhs_mat_01_60_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_60 ,160 );//A60(0-3) A60(0-3) A61(0-3) A61(0-3) A60(0-3) A60(0-3) A61(0-3) A61(0-3) 6097const __m256i lhs_mat_23_60_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_60 ,160 );//A62(0-3) A63(0-3) A62(0-3) A63(0-3) A62(0-3) A63(0-3) A62(0-3) A63(0-3) 6098 6099const __m256i lhs_mat_01_61_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_61 ,160 );//A60(8-11) A60(8-11) A61(8-11) A61(8-11) A60(8-11) A60(8-11) A61(8-11) A61(8-11) 6100const __m256i lhs_mat_23_61_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_61 ,160 );//A62(8-11) A63(8-11) A62(8-11) A63(8-11) A62(8-11) A63(8-11) A62(8-11) A63(8-11) 6101 6102const __m256i lhs_mat_01_70_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_70 ,160 );//A70(0-3) A70(0-3) A71(0-3) A71(0-3) A70(0-3) A70(0-3) A71(0-3) A71(0-3) 6103const __m256i lhs_mat_23_70_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_70 ,160 );//A72(0-3) A73(0-3) A72(0-3) A73(0-3) A72(0-3) A73(0-3) A72(0-3) A73(0-3) 6104 6105const __m256i lhs_mat_01_71_sp1 = _mm256_shuffle_epi32 (lhs_mat_01_71 ,160 );//A70(8-11) A70(8-11) A71(8-11) A71(8-11) A70(8-11) A70(8-11) A71(8-11) A71(8-11) 6106const __m256i lhs_mat_23_71_sp1 = _mm256_shuffle_epi32 (lhs_mat_23_71 ,160 );//A72(8-11) A73(8-11) A72(8-11) A73(8-11) A72(8-11) A73(8-11) A72(8-11) A73(8-11) 6107 6108// Shuffle pattern two- left side input 6109const __m256i lhs_mat_01_00_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_00 ,245 );//A00(4-7) A00(4-7) A01(4-7) A01(4-7) A00(4-7) A00(4-7) A01(4-7) A01(4-7) 6110const __m256i lhs_mat_23_00_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_00 ,245 );//A02(4-7) A03(4-7) A02(4-7) A03(4-7) A02(4-7) A03(4-7) A02(4-7) A03(4-7) 6111 6112const __m256i lhs_mat_01_01_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_01 ,245 );//A00(12-15) A00(12-15) A01(12-15) A01(12-15) A00(12-15) A00(12-15) A01(12-15) A01(12-15) 6113const __m256i lhs_mat_23_01_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_01 ,245 );//A02(12-15) A03(12-15) A02(12-15) A03(12-15) A02(12-15) A03(12-15) A02(12-15) A03(12-15) 6114 6115const __m256i lhs_mat_01_10_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_10 ,245 );//A10(4-7) A10(4-7) A11(4-7) A11(4-7) A10(4-7) A10(4-7) A11(4-7) A11(4-7) 6116const __m256i lhs_mat_23_10_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_10 ,245 );//A12(4-7) A13(4-7) A12(4-7) A13(4-7) A12(4-7) A13(4-7) A12(4-7) A13(4-7) 6117 6118const __m256i lhs_mat_01_11_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_11 ,245 );//A10(12-15) A10(12-15) A11(12-15) A11(12-15) A10(12-15) A10(12-15) A11(12-15) A11(12-15) 6119const __m256i lhs_mat_23_11_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_11 ,245 );//A12(12-15) A13(12-15) A12(12-15) A13(12-15) A12(12-15) A13(12-15) A12(12-15) A13(12-15) 6120 6121const __m256i lhs_mat_01_20_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_20 ,245 );//A20(4-7) A20(4-7) A21(4-7) A21(4-7) A20(4-7) A20(4-7) A21(4-7) A21(4-7) 6122const __m256i lhs_mat_23_20_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_20 ,245 );//A22(4-7) A23(4-7) A22(4-7) A23(4-7) A22(4-7) A23(4-7) A22(4-7) A23(4-7) 6123 6124const __m256i lhs_mat_01_21_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_21 ,245 );//A20(12-15) A20(12-15) A21(12-15) A21(12-15) A20(12-15) A20(12-15) A21(12-15) A21(12-15) 6125const __m256i lhs_mat_23_21_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_21 ,245 );//A22(12-15) A23(12-15) A22(12-15) A23(12-15) A22(12-15) A23(12-15) A22(12-15) A23(12-15) 6126 6127const __m256i lhs_mat_01_30_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_30 ,245 );//A30(4-7) A30(4-7) A31(4-7) A31(4-7) A30(4-7) A30(4-7) A31(4-7) A31(4-7) 6128const __m256i lhs_mat_23_30_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_30 ,245 );//A32(4-7) A33(4-7) A32(4-7) A33(4-7) A32(4-7) A33(4-7) A32(4-7) A33(4-7) 6129 6130const __m256i lhs_mat_01_31_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_31 ,245 );//A30(12-15) A30(12-15) A31(12-15) A31(12-15) A30(12-15) A30(12-15) A31(12-15) A31(12-15) 6131const __m256i lhs_mat_23_31_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_31 ,245 );//A32(12-15) A33(12-15) A32(12-15) A33(12-15) A32(12-15) A33(12-15) A32(12-15) A33(12-15) 6132 6133const __m256i lhs_mat_01_40_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_40 ,245 );//A40(4-7) A40(4-7) A41(4-7) A41(4-7) A40(4-7) A40(4-7) A41(4-7) A41(4-7) 6134const __m256i lhs_mat_23_40_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_40 ,245 );//A42(4-7) A43(4-7) A42(4-7) A43(4-7) A42(4-7) A43(4-7) A42(4-7) A43(4-7) 6135 6136const __m256i lhs_mat_01_41_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_41 ,245 );//A40(12-15) A40(12-15) A41(12-15) A41(12-15) A40(12-15) A40(12-15) A41(12-15) A41(12-15) 6137const __m256i lhs_mat_23_41_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_41 ,245 );//A42(12-15) A43(12-15) A42(12-15) A43(12-15) A42(12-15) A43(12-15) A42(12-15) A43(12-15) 6138 6139const __m256i lhs_mat_01_50_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_50 ,245 );//A50(4-7) A50(4-7) A51(4-7) A51(4-7) A50(4-7) A50(4-7) A51(4-7) A51(4-7) 6140const __m256i lhs_mat_23_50_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_50 ,245 );//A52(4-7) A53(4-7) A52(4-7) A53(4-7) A52(4-7) A53(4-7) A52(4-7) A53(4-7) 6141 6142const __m256i lhs_mat_01_51_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_51 ,245 );//A50(12-15) A50(12-15) A51(12-15) A51(12-15) A50(12-15) A50(12-15) A51(12-15) A51(12-15) 6143const __m256i lhs_mat_23_51_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_51 ,245 );//A52(12-15) A53(12-15) A52(12-15) A53(12-15) A52(12-15) A53(12-15) A52(12-15) A53(12-15) 6144 6145const __m256i lhs_mat_01_60_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_60 ,245 );//A60(4-7) A60(4-7) A61(4-7) A61(4-7) A60(4-7) A60(4-7) A61(4-7) A61(4-7) 6146const __m256i lhs_mat_23_60_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_60 ,245 );//A62(4-7) A63(4-7) A62(4-7) A63(4-7) A62(4-7) A63(4-7) A62(4-7) A63(4-7) 6147 6148const __m256i lhs_mat_01_61_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_61 ,245 );//A60(12-15) A60(12-15) A61(12-15) A61(12-15) A60(12-15) A60(12-15) A61(12-15) A61(12-15) 6149const __m256i lhs_mat_23_61_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_61 ,245 );//A62(12-15) A63(12-15) A62(12-15) A63(12-15) A62(12-15) A63(12-15) A62(12-15) A63(12-15) 6150 6151const __m256i lhs_mat_01_70_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_70 ,245 );//A70(4-7) A70(4-7) A71(4-7) A71(4-7) A70(4-7) A70(4-7) A71(4-7) A71(4-7) 6152const __m256i lhs_mat_23_70_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_70 ,245 );//A72(4-7) A73(4-7) A72(4-7) A73(4-7) A72(4-7) A73(4-7) A72(4-7) A73(4-7) 6153 6154const __m256i lhs_mat_01_71_sp2 = _mm256_shuffle_epi32 (lhs_mat_01_71 ,245 );//A70(12-15) A70(12-15) A71(12-15) A71(12-15) A70(12-15) A70(12-15) A71(12-15) A71(12-15) 6155const __m256i lhs_mat_23_71_sp2 = _mm256_shuffle_epi32 (lhs_mat_23_71 ,245 );//A72(12-15) A73(12-15) A72(12-15) A73(12-15) A72(12-15) A73(12-15) A72(12-15) A73(12-15) 6156 6157// The values arranged in shuffle patterns are operated with dot product operation within 32 bit lane i.e corresponding bytes and multiplied and added into 32 bit integers within 32 bit lane 6158__m256i iacc_mat_00_0_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_00_sp1 ,lhs_mat_01_00_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_01_sp1 ,lhs_mat_01_01_sp1 )); 6159__m256i iacc_mat_01_0_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_00_sp1 ,lhs_mat_01_00_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_01_sp1 ,lhs_mat_01_01_sp1 )); 6160 6161__m256i iacc_mat_10_0_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_00_sp1 ,lhs_mat_23_00_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_01_sp1 ,lhs_mat_23_01_sp1 )); 6162__m256i iacc_mat_11_0_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_00_sp1 ,lhs_mat_23_00_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_01_sp1 ,lhs_mat_23_01_sp1 )); 6163 6164__m256i iacc_mat_00_1_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_10_sp1 ,lhs_mat_01_10_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_11_sp1 ,lhs_mat_01_11_sp1 )); 6165__m256i iacc_mat_01_1_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_10_sp1 ,lhs_mat_01_10_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_11_sp1 ,lhs_mat_01_11_sp1 )); 6166 6167__m256i iacc_mat_10_1_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_10_sp1 ,lhs_mat_23_10_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_11_sp1 ,lhs_mat_23_11_sp1 )); 6168__m256i iacc_mat_11_1_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_10_sp1 ,lhs_mat_23_10_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_11_sp1 ,lhs_mat_23_11_sp1 )); 6169 6170__m256i iacc_mat_00_2_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_20_sp1 ,lhs_mat_01_20_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_21_sp1 ,lhs_mat_01_21_sp1 )); 6171__m256i iacc_mat_01_2_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_20_sp1 ,lhs_mat_01_20_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_21_sp1 ,lhs_mat_01_21_sp1 )); 6172 6173__m256i iacc_mat_10_2_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_20_sp1 ,lhs_mat_23_20_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_21_sp1 ,lhs_mat_23_21_sp1 )); 6174__m256i iacc_mat_11_2_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_20_sp1 ,lhs_mat_23_20_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_21_sp1 ,lhs_mat_23_21_sp1 )); 6175 6176__m256i iacc_mat_00_3_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_30_sp1 ,lhs_mat_01_30_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_31_sp1 ,lhs_mat_01_31_sp1 )); 6177__m256i iacc_mat_01_3_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_30_sp1 ,lhs_mat_01_30_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_31_sp1 ,lhs_mat_01_31_sp1 )); 6178 6179__m256i iacc_mat_10_3_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_30_sp1 ,lhs_mat_23_30_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_31_sp1 ,lhs_mat_23_31_sp1 )); 6180__m256i iacc_mat_11_3_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_30_sp1 ,lhs_mat_23_30_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_31_sp1 ,lhs_mat_23_31_sp1 )); 6181 6182__m256i iacc_mat_00_4_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_40_sp1 ,lhs_mat_01_40_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_41_sp1 ,lhs_mat_01_41_sp1 )); 6183__m256i iacc_mat_01_4_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_40_sp1 ,lhs_mat_01_40_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_41_sp1 ,lhs_mat_01_41_sp1 )); 6184 6185__m256i iacc_mat_10_4_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_40_sp1 ,lhs_mat_23_40_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_41_sp1 ,lhs_mat_23_41_sp1 )); 6186__m256i iacc_mat_11_4_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_40_sp1 ,lhs_mat_23_40_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_41_sp1 ,lhs_mat_23_41_sp1 )); 6187 6188__m256i iacc_mat_00_5_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_50_sp1 ,lhs_mat_01_50_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_51_sp1 ,lhs_mat_01_51_sp1 )); 6189__m256i iacc_mat_01_5_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_50_sp1 ,lhs_mat_01_50_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_51_sp1 ,lhs_mat_01_51_sp1 )); 6190 6191__m256i iacc_mat_10_5_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_50_sp1 ,lhs_mat_23_50_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_51_sp1 ,lhs_mat_23_51_sp1 )); 6192__m256i iacc_mat_11_5_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_50_sp1 ,lhs_mat_23_50_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_51_sp1 ,lhs_mat_23_51_sp1 )); 6193 6194__m256i iacc_mat_00_6_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_60_sp1 ,lhs_mat_01_60_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_61_sp1 ,lhs_mat_01_61_sp1 )); 6195__m256i iacc_mat_01_6_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_60_sp1 ,lhs_mat_01_60_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_61_sp1 ,lhs_mat_01_61_sp1 )); 6196 6197__m256i iacc_mat_10_6_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_60_sp1 ,lhs_mat_23_60_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_61_sp1 ,lhs_mat_23_61_sp1 )); 6198__m256i iacc_mat_11_6_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_60_sp1 ,lhs_mat_23_60_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_61_sp1 ,lhs_mat_23_61_sp1 )); 6199 6200__m256i iacc_mat_00_7_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_70_sp1 ,lhs_mat_01_70_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_71_sp1 ,lhs_mat_01_71_sp1 )); 6201__m256i iacc_mat_01_7_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_70_sp1 ,lhs_mat_01_70_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_71_sp1 ,lhs_mat_01_71_sp1 )); 6202 6203__m256i iacc_mat_10_7_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_70_sp1 ,lhs_mat_23_70_sp1 ),_mm256_maddubs_epi16 (rhs_mat_0145_71_sp1 ,lhs_mat_23_71_sp1 )); 6204__m256i iacc_mat_11_7_sp1 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_70_sp1 ,lhs_mat_23_70_sp1 ),_mm256_maddubs_epi16 (rhs_mat_2367_71_sp1 ,lhs_mat_23_71_sp1 )); 6205 6206 6207__m256i iacc_mat_00_0_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_00_sp2 ,lhs_mat_01_00_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_01_sp2 ,lhs_mat_01_01_sp2 )); 6208__m256i iacc_mat_01_0_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_00_sp2 ,lhs_mat_01_00_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_01_sp2 ,lhs_mat_01_01_sp2 )); 6209 6210__m256i iacc_mat_10_0_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_00_sp2 ,lhs_mat_23_00_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_01_sp2 ,lhs_mat_23_01_sp2 )); 6211__m256i iacc_mat_11_0_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_00_sp2 ,lhs_mat_23_00_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_01_sp2 ,lhs_mat_23_01_sp2 )); 6212 6213__m256i iacc_mat_00_1_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_10_sp2 ,lhs_mat_01_10_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_11_sp2 ,lhs_mat_01_11_sp2 )); 6214__m256i iacc_mat_01_1_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_10_sp2 ,lhs_mat_01_10_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_11_sp2 ,lhs_mat_01_11_sp2 )); 6215 6216__m256i iacc_mat_10_1_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_10_sp2 ,lhs_mat_23_10_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_11_sp2 ,lhs_mat_23_11_sp2 )); 6217__m256i iacc_mat_11_1_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_10_sp2 ,lhs_mat_23_10_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_11_sp2 ,lhs_mat_23_11_sp2 )); 6218 6219__m256i iacc_mat_00_2_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_20_sp2 ,lhs_mat_01_20_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_21_sp2 ,lhs_mat_01_21_sp2 )); 6220__m256i iacc_mat_01_2_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_20_sp2 ,lhs_mat_01_20_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_21_sp2 ,lhs_mat_01_21_sp2 )); 6221 6222__m256i iacc_mat_10_2_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_20_sp2 ,lhs_mat_23_20_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_21_sp2 ,lhs_mat_23_21_sp2 )); 6223__m256i iacc_mat_11_2_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_20_sp2 ,lhs_mat_23_20_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_21_sp2 ,lhs_mat_23_21_sp2 )); 6224 6225__m256i iacc_mat_00_3_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_30_sp2 ,lhs_mat_01_30_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_31_sp2 ,lhs_mat_01_31_sp2 )); 6226__m256i iacc_mat_01_3_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_30_sp2 ,lhs_mat_01_30_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_31_sp2 ,lhs_mat_01_31_sp2 )); 6227 6228__m256i iacc_mat_10_3_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_30_sp2 ,lhs_mat_23_30_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_31_sp2 ,lhs_mat_23_31_sp2 )); 6229__m256i iacc_mat_11_3_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_30_sp2 ,lhs_mat_23_30_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_31_sp2 ,lhs_mat_23_31_sp2 )); 6230 6231__m256i iacc_mat_00_4_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_40_sp2 ,lhs_mat_01_40_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_41_sp2 ,lhs_mat_01_41_sp2 )); 6232__m256i iacc_mat_01_4_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_40_sp2 ,lhs_mat_01_40_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_41_sp2 ,lhs_mat_01_41_sp2 )); 6233 6234__m256i iacc_mat_10_4_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_40_sp2 ,lhs_mat_23_40_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_41_sp2 ,lhs_mat_23_41_sp2 )); 6235__m256i iacc_mat_11_4_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_40_sp2 ,lhs_mat_23_40_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_41_sp2 ,lhs_mat_23_41_sp2 )); 6236 6237__m256i iacc_mat_00_5_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_50_sp2 ,lhs_mat_01_50_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_51_sp2 ,lhs_mat_01_51_sp2 )); 6238__m256i iacc_mat_01_5_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_50_sp2 ,lhs_mat_01_50_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_51_sp2 ,lhs_mat_01_51_sp2 )); 6239 6240__m256i iacc_mat_10_5_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_50_sp2 ,lhs_mat_23_50_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_51_sp2 ,lhs_mat_23_51_sp2 )); 6241__m256i iacc_mat_11_5_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_50_sp2 ,lhs_mat_23_50_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_51_sp2 ,lhs_mat_23_51_sp2 )); 6242 6243__m256i iacc_mat_00_6_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_60_sp2 ,lhs_mat_01_60_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_61_sp2 ,lhs_mat_01_61_sp2 )); 6244__m256i iacc_mat_01_6_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_60_sp2 ,lhs_mat_01_60_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_61_sp2 ,lhs_mat_01_61_sp2 )); 6245 6246__m256i iacc_mat_10_6_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_60_sp2 ,lhs_mat_23_60_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_61_sp2 ,lhs_mat_23_61_sp2 )); 6247__m256i iacc_mat_11_6_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_60_sp2 ,lhs_mat_23_60_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_61_sp2 ,lhs_mat_23_61_sp2 )); 6248 6249__m256i iacc_mat_00_7_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_70_sp2 ,lhs_mat_01_70_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_71_sp2 ,lhs_mat_01_71_sp2 )); 6250__m256i iacc_mat_01_7_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_70_sp2 ,lhs_mat_01_70_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_71_sp2 ,lhs_mat_01_71_sp2 )); 6251 6252__m256i iacc_mat_10_7_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_0145_70_sp2 ,lhs_mat_23_70_sp2 ),_mm256_maddubs_epi16 (rhs_mat_0145_71_sp2 ,lhs_mat_23_71_sp2 )); 6253__m256i iacc_mat_11_7_sp2 = _mm256_add_epi16 (_mm256_maddubs_epi16 (rhs_mat_2367_70_sp2 ,lhs_mat_23_70_sp2 ),_mm256_maddubs_epi16 (rhs_mat_2367_71_sp2 ,lhs_mat_23_71_sp2 )); 6254 6255// Combine results from both shuffle patterns for each output block. 6256__m256i iacc_mat_00_0 = _mm256_add_epi16 (iacc_mat_00_0_sp1 ,iacc_mat_00_0_sp2 ); 6257__m256i iacc_mat_01_0 = _mm256_add_epi16 (iacc_mat_01_0_sp1 ,iacc_mat_01_0_sp2 ); 6258__m256i iacc_mat_10_0 = _mm256_add_epi16 (iacc_mat_10_0_sp1 ,iacc_mat_10_0_sp2 ); 6259__m256i iacc_mat_11_0 = _mm256_add_epi16 (iacc_mat_11_0_sp1 ,iacc_mat_11_0_sp2 ); 6260 6261__m256i iacc_mat_00_1 = _mm256_add_epi16 (iacc_mat_00_1_sp1 ,iacc_mat_00_1_sp2 ); 6262__m256i iacc_mat_01_1 = _mm256_add_epi16 (iacc_mat_01_1_sp1 ,iacc_mat_01_1_sp2 ); 6263__m256i iacc_mat_10_1 = _mm256_add_epi16 (iacc_mat_10_1_sp1 ,iacc_mat_10_1_sp2 ); 6264__m256i iacc_mat_11_1 = _mm256_add_epi16 (iacc_mat_11_1_sp1 ,iacc_mat_11_1_sp2 ); 6265 6266__m256i iacc_mat_00_2 = _mm256_add_epi16 (iacc_mat_00_2_sp1 ,iacc_mat_00_2_sp2 ); 6267__m256i iacc_mat_01_2 = _mm256_add_epi16 (iacc_mat_01_2_sp1 ,iacc_mat_01_2_sp2 ); 6268__m256i iacc_mat_10_2 = _mm256_add_epi16 (iacc_mat_10_2_sp1 ,iacc_mat_10_2_sp2 ); 6269__m256i iacc_mat_11_2 = _mm256_add_epi16 (iacc_mat_11_2_sp1 ,iacc_mat_11_2_sp2 ); 6270 6271__m256i iacc_mat_00_3 = _mm256_add_epi16 (iacc_mat_00_3_sp1 ,iacc_mat_00_3_sp2 ); 6272__m256i iacc_mat_01_3 = _mm256_add_epi16 (iacc_mat_01_3_sp1 ,iacc_mat_01_3_sp2 ); 6273__m256i iacc_mat_10_3 = _mm256_add_epi16 (iacc_mat_10_3_sp1 ,iacc_mat_10_3_sp2 ); 6274__m256i iacc_mat_11_3 = _mm256_add_epi16 (iacc_mat_11_3_sp1 ,iacc_mat_11_3_sp2 ); 6275 6276__m256i iacc_mat_00_4 = _mm256_add_epi16 (iacc_mat_00_4_sp1 ,iacc_mat_00_4_sp2 ); 6277__m256i iacc_mat_01_4 = _mm256_add_epi16 (iacc_mat_01_4_sp1 ,iacc_mat_01_4_sp2 ); 6278__m256i iacc_mat_10_4 = _mm256_add_epi16 (iacc_mat_10_4_sp1 ,iacc_mat_10_4_sp2 ); 6279__m256i iacc_mat_11_4 = _mm256_add_epi16 (iacc_mat_11_4_sp1 ,iacc_mat_11_4_sp2 ); 6280 6281__m256i iacc_mat_00_5 = _mm256_add_epi16 (iacc_mat_00_5_sp1 ,iacc_mat_00_5_sp2 ); 6282__m256i iacc_mat_01_5 = _mm256_add_epi16 (iacc_mat_01_5_sp1 ,iacc_mat_01_5_sp2 ); 6283__m256i iacc_mat_10_5 = _mm256_add_epi16 (iacc_mat_10_5_sp1 ,iacc_mat_10_5_sp2 ); 6284__m256i iacc_mat_11_5 = _mm256_add_epi16 (iacc_mat_11_5_sp1 ,iacc_mat_11_5_sp2 ); 6285 6286__m256i iacc_mat_00_6 = _mm256_add_epi16 (iacc_mat_00_6_sp1 ,iacc_mat_00_6_sp2 ); 6287__m256i iacc_mat_01_6 = _mm256_add_epi16 (iacc_mat_01_6_sp1 ,iacc_mat_01_6_sp2 ); 6288__m256i iacc_mat_10_6 = _mm256_add_epi16 (iacc_mat_10_6_sp1 ,iacc_mat_10_6_sp2 ); 6289__m256i iacc_mat_11_6 = _mm256_add_epi16 (iacc_mat_11_6_sp1 ,iacc_mat_11_6_sp2 ); 6290 6291__m256i iacc_mat_00_7 = _mm256_add_epi16 (iacc_mat_00_7_sp1 ,iacc_mat_00_7_sp2 ); 6292__m256i iacc_mat_01_7 = _mm256_add_epi16 (iacc_mat_01_7_sp1 ,iacc_mat_01_7_sp2 ); 6293__m256i iacc_mat_10_7 = _mm256_add_epi16 (iacc_mat_10_7_sp1 ,iacc_mat_10_7_sp2 ); 6294__m256i iacc_mat_11_7 = _mm256_add_epi16 (iacc_mat_11_7_sp1 ,iacc_mat_11_7_sp2 ); 6295 6296// Output of both shuffle patterns are added in order to sum dot product outputs of all 32 values in block 6297iacc_mat_00_0 = _mm256_madd_epi16 (iacc_mat_00_0 ,scale_0145_0 ); 6298iacc_mat_01_0 = _mm256_madd_epi16 (iacc_mat_01_0 ,scale_2367_0 ); 6299iacc_mat_10_0 = _mm256_madd_epi16 (iacc_mat_10_0 ,scale_0145_0 ); 6300iacc_mat_11_0 = _mm256_madd_epi16 (iacc_mat_11_0 ,scale_2367_0 ); 6301 6302iacc_mat_00_1 = _mm256_madd_epi16 (iacc_mat_00_1 ,scale_0145_1 ); 6303iacc_mat_01_1 = _mm256_madd_epi16 (iacc_mat_01_1 ,scale_2367_1 ); 6304iacc_mat_10_1 = _mm256_madd_epi16 (iacc_mat_10_1 ,scale_0145_1 ); 6305iacc_mat_11_1 = _mm256_madd_epi16 (iacc_mat_11_1 ,scale_2367_1 ); 6306 6307iacc_mat_00_2 = _mm256_madd_epi16 (iacc_mat_00_2 ,scale_0145_2 ); 6308iacc_mat_01_2 = _mm256_madd_epi16 (iacc_mat_01_2 ,scale_2367_2 ); 6309iacc_mat_10_2 = _mm256_madd_epi16 (iacc_mat_10_2 ,scale_0145_2 ); 6310iacc_mat_11_2 = _mm256_madd_epi16 (iacc_mat_11_2 ,scale_2367_2 ); 6311 6312iacc_mat_00_3 = _mm256_madd_epi16 (iacc_mat_00_3 ,scale_0145_3 ); 6313iacc_mat_01_3 = _mm256_madd_epi16 (iacc_mat_01_3 ,scale_2367_3 ); 6314iacc_mat_10_3 = _mm256_madd_epi16 (iacc_mat_10_3 ,scale_0145_3 ); 6315iacc_mat_11_3 = _mm256_madd_epi16 (iacc_mat_11_3 ,scale_2367_3 ); 6316 6317iacc_mat_00_4 = _mm256_madd_epi16 (iacc_mat_00_4 ,scale_0145_4 ); 6318iacc_mat_01_4 = _mm256_madd_epi16 (iacc_mat_01_4 ,scale_2367_4 ); 6319iacc_mat_10_4 = _mm256_madd_epi16 (iacc_mat_10_4 ,scale_0145_4 ); 6320iacc_mat_11_4 = _mm256_madd_epi16 (iacc_mat_11_4 ,scale_2367_4 ); 6321 6322iacc_mat_00_5 = _mm256_madd_epi16 (iacc_mat_00_5 ,scale_0145_5 ); 6323iacc_mat_01_5 = _mm256_madd_epi16 (iacc_mat_01_5 ,scale_2367_5 ); 6324iacc_mat_10_5 = _mm256_madd_epi16 (iacc_mat_10_5 ,scale_0145_5 ); 6325iacc_mat_11_5 = _mm256_madd_epi16 (iacc_mat_11_5 ,scale_2367_5 ); 6326 6327iacc_mat_00_6 = _mm256_madd_epi16 (iacc_mat_00_6 ,scale_0145_6 ); 6328iacc_mat_01_6 = _mm256_madd_epi16 (iacc_mat_01_6 ,scale_2367_6 ); 6329iacc_mat_10_6 = _mm256_madd_epi16 (iacc_mat_10_6 ,scale_0145_6 ); 6330iacc_mat_11_6 = _mm256_madd_epi16 (iacc_mat_11_6 ,scale_2367_6 ); 6331 6332iacc_mat_00_7 = _mm256_madd_epi16 (iacc_mat_00_7 ,scale_0145_7 ); 6333iacc_mat_01_7 = _mm256_madd_epi16 (iacc_mat_01_7 ,scale_2367_7 ); 6334iacc_mat_10_7 = _mm256_madd_epi16 (iacc_mat_10_7 ,scale_0145_7 ); 6335iacc_mat_11_7 = _mm256_madd_epi16 (iacc_mat_11_7 ,scale_2367_7 ); 6336 6337__m256i iacc_mat_00 = _mm256_add_epi32 (_mm256_add_epi32 (_mm256_add_epi32 (iacc_mat_00_0 ,iacc_mat_00_1 ),_mm256_add_epi32 (iacc_mat_00_2 ,iacc_mat_00_3 )),_mm256_add_epi32 (_mm256_add_epi32 (iacc_mat_00_4 ,iacc_mat_00_5 ),_mm256_add_epi32 (iacc_mat_00_6 ,iacc_mat_00_7 ))); 6338__m256i iacc_mat_01 = _mm256_add_epi32 (_mm256_add_epi32 (_mm256_add_epi32 (iacc_mat_01_0 ,iacc_mat_01_1 ),_mm256_add_epi32 (iacc_mat_01_2 ,iacc_mat_01_3 )),_mm256_add_epi32 (_mm256_add_epi32 (iacc_mat_01_4 ,iacc_mat_01_5 ),_mm256_add_epi32 (iacc_mat_01_6 ,iacc_mat_01_7 ))); 6339__m256i iacc_mat_10 = _mm256_add_epi32 (_mm256_add_epi32 (_mm256_add_epi32 (iacc_mat_10_0 ,iacc_mat_10_1 ),_mm256_add_epi32 (iacc_mat_10_2 ,iacc_mat_10_3 )),_mm256_add_epi32 (_mm256_add_epi32 (iacc_mat_10_4 ,iacc_mat_10_5 ),_mm256_add_epi32 (iacc_mat_10_6 ,iacc_mat_10_7 ))); 6340__m256i iacc_mat_11 = _mm256_add_epi32 (_mm256_add_epi32 (_mm256_add_epi32 (iacc_mat_11_0 ,iacc_mat_11_1 ),_mm256_add_epi32 (iacc_mat_11_2 ,iacc_mat_11_3 )),_mm256_add_epi32 (_mm256_add_epi32 (iacc_mat_11_4 ,iacc_mat_11_5 ),_mm256_add_epi32 (iacc_mat_11_6 ,iacc_mat_11_7 ))); 6341 6342// Straighten out to make 4 row vectors 6343__m256i iacc_row_0 = _mm256_blend_epi32 (iacc_mat_00 ,_mm256_shuffle_epi32 (iacc_mat_01 ,78 ),204 ); 6344__m256i iacc_row_1 = _mm256_blend_epi32 (_mm256_shuffle_epi32 (iacc_mat_00 ,78 ),iacc_mat_01 ,204 ); 6345__m256i iacc_row_2 = _mm256_blend_epi32 (iacc_mat_10 ,_mm256_shuffle_epi32 (iacc_mat_11 ,78 ),204 ); 6346__m256i iacc_row_3 = _mm256_blend_epi32 (_mm256_shuffle_epi32 (iacc_mat_10 ,78 ),iacc_mat_11 ,204 ); 6347 6348// Load the scale(d) values for all the 4 Q8_k blocks and repeat it across lanes 6349const __m128 row_scale_f32_sse = _mm_load_ps (a_ptr [b ].d ); 6350const __m256 row_scale_f32 = _mm256_set_m128 (row_scale_f32_sse ,row_scale_f32_sse ); 6351 6352// Multiply with appropriate scales and accumulate (for both d and dmin) below 6353acc_rows [0 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_0 ),_mm256_mul_ps (col_scale_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,0 )),acc_rows [0 ]); 6354acc_rows [1 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_1 ),_mm256_mul_ps (col_scale_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,85 )),acc_rows [1 ]); 6355acc_rows [2 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_2 ),_mm256_mul_ps (col_scale_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,170 )),acc_rows [2 ]); 6356acc_rows [3 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_3 ),_mm256_mul_ps (col_scale_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,255 )),acc_rows [3 ]); 6357 6358__m256i lhs_bsums_01_0123 = _mm256_inserti128_si256 (_mm256_castsi128_si256 (lhs_raw_bsums_01_0123 ),lhs_raw_bsums_01_0123 ,1 ); 6359__m256i lhs_bsums_23_0123 = _mm256_inserti128_si256 (_mm256_castsi128_si256 (lhs_raw_bsums_23_0123 ),lhs_raw_bsums_23_0123 ,1 ); 6360__m256i lhs_bsums_01_4567 = _mm256_inserti128_si256 (_mm256_castsi128_si256 (lhs_raw_bsums_01_4567 ),lhs_raw_bsums_01_4567 ,1 ); 6361__m256i lhs_bsums_23_4567 = _mm256_inserti128_si256 (_mm256_castsi128_si256 (lhs_raw_bsums_23_4567 ),lhs_raw_bsums_23_4567 ,1 ); 6362 6363// Take two bsums from two Q8_Ks at a time and multiply with corresponding mins values from each Q2_K 6364__m256i iacc_row_min_0_01 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_01_0123 ,0 ),mins_01 ); 6365__m256i iacc_row_min_1_01 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_01_0123 ,170 ),mins_01 ); 6366__m256i iacc_row_min_2_01 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_23_0123 ,0 ),mins_01 ); 6367__m256i iacc_row_min_3_01 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_23_0123 ,170 ),mins_01 ); 6368 6369__m256i iacc_row_min_0_23 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_01_0123 ,85 ),mins_23 ); 6370__m256i iacc_row_min_1_23 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_01_0123 ,255 ),mins_23 ); 6371__m256i iacc_row_min_2_23 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_23_0123 ,85 ),mins_23 ); 6372__m256i iacc_row_min_3_23 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_23_0123 ,255 ),mins_23 ); 6373 6374__m256i iacc_row_min_0_45 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_01_4567 ,0 ),mins_45 ); 6375__m256i iacc_row_min_1_45 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_01_4567 ,170 ),mins_45 ); 6376__m256i iacc_row_min_2_45 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_23_4567 ,0 ),mins_45 ); 6377__m256i iacc_row_min_3_45 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_23_4567 ,170 ),mins_45 ); 6378 6379__m256i iacc_row_min_0_67 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_01_4567 ,85 ),mins_67 ); 6380__m256i iacc_row_min_1_67 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_01_4567 ,255 ),mins_67 ); 6381__m256i iacc_row_min_2_67 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_23_4567 ,85 ),mins_67 ); 6382__m256i iacc_row_min_3_67 = _mm256_madd_epi16 (_mm256_shuffle_epi32 (lhs_bsums_23_4567 ,255 ),mins_67 ); 6383 6384__m256i iacc_row_min_0 = _mm256_add_epi32 (_mm256_add_epi32 (iacc_row_min_0_01 ,iacc_row_min_0_23 ),_mm256_add_epi32 (iacc_row_min_0_45 ,iacc_row_min_0_67 )); 6385__m256i iacc_row_min_1 = _mm256_add_epi32 (_mm256_add_epi32 (iacc_row_min_1_01 ,iacc_row_min_1_23 ),_mm256_add_epi32 (iacc_row_min_1_45 ,iacc_row_min_1_67 )); 6386__m256i iacc_row_min_2 = _mm256_add_epi32 (_mm256_add_epi32 (iacc_row_min_2_01 ,iacc_row_min_2_23 ),_mm256_add_epi32 (iacc_row_min_2_45 ,iacc_row_min_2_67 )); 6387__m256i iacc_row_min_3 = _mm256_add_epi32 (_mm256_add_epi32 (iacc_row_min_3_01 ,iacc_row_min_3_23 ),_mm256_add_epi32 (iacc_row_min_3_45 ,iacc_row_min_3_67 )); 6388 6389acc_min_rows [0 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_min_0 ),_mm256_mul_ps (col_dmin_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,0 )),acc_min_rows [0 ]); 6390acc_min_rows [1 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_min_1 ),_mm256_mul_ps (col_dmin_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,85 )),acc_min_rows [1 ]); 6391acc_min_rows [2 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_min_2 ),_mm256_mul_ps (col_dmin_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,170 )),acc_min_rows [2 ]); 6392acc_min_rows [3 ]= _mm256_fmadd_ps (_mm256_cvtepi32_ps (iacc_row_min_3 ),_mm256_mul_ps (col_dmin_f32 ,_mm256_shuffle_ps (row_scale_f32 ,row_scale_f32 ,255 )),acc_min_rows [3 ]); 6393 } 6394 } 6395// Store the accumulated values 6396for (int i = 0 ;i < 4 ;i ++ ) { 6397_mm256_storeu_ps ((float * )(s + ((y * 4 + i )* bs + x * 8 )),_mm256_sub_ps (acc_rows [i ],acc_min_rows [i ])); 6398 } 6399 } 6400 } 6401#else 6402 6403ggml_gemm_q2_K_8x8_q8_K_generic (n ,s ,bs ,vx ,vy ,nr ,nc ); 6404 6405 6406#endif 6407}