diff --git a/src/layer/x86/convolution_im2col_gemm_int8.h b/src/layer/x86/convolution_im2col_gemm_int8.h index bacf8d2c30a..4ec3180475f 100644 --- a/src/layer/x86/convolution_im2col_gemm_int8.h +++ b/src/layer/x86/convolution_im2col_gemm_int8.h @@ -1352,198 +1352,79 @@ static void convolution_gemm_transB_packed_tile_int8(const Mat& AT_tile, const M } int kk = 0; + for (; kk + 1 < max_kk; kk += 2) { -#if !__AVX512F__ - __m256i _sum0z = _mm256_setzero_si256(); - __m256i _sum1z = _mm256_setzero_si256(); - __m256i _sum2z = _mm256_setzero_si256(); - __m256i _sum3z = _mm256_setzero_si256(); - __m256i _sum4z = _mm256_setzero_si256(); - __m256i _sum5z = _mm256_setzero_si256(); - __m256i _sum6z = _mm256_setzero_si256(); - __m256i _sum7z = _mm256_setzero_si256(); -#endif - for (; kk + 1 < max_kk; kk += 2) - { - __m128i _pA = _mm_loadu_si128((const __m128i*)pA); - __m128i _pB = _mm_loadu_si128((const __m128i*)pB); + __m128i _pA = _mm_loadu_si128((const __m128i*)pA); + __m128i _pB = _mm_loadu_si128((const __m128i*)pB); - __m256i _pA0 = _mm256_cvtepi8_epi16(_pA); - __m256i _pBB = _mm256_cvtepi8_epi16(_pB); + __m256i _pA0 = _mm256_cvtepi8_epi16(_pA); + __m256i _pBB = _mm256_cvtepi8_epi16(_pB); #if __AVX512F__ - __m512i _pAA = _mm512_inserti32x8(_mm512_castsi256_si512(_pA0), _pA0, 1); + __m512i _pAA = _mm512_inserti32x8(_mm512_castsi256_si512(_pA0), _pA0, 1); - // 0123 4567 -> 0213 4657 - _pBB = _mm256_shuffle_epi32(_pBB, _MM_SHUFFLE(3, 1, 2, 0)); + // 0123 4567 -> 0213 4657 + _pBB = _mm256_shuffle_epi32(_pBB, _MM_SHUFFLE(3, 1, 2, 0)); - // 0213 4657 -> 0246 1357 - _pBB = _mm256_permute4x64_epi64(_pBB, _MM_SHUFFLE(3, 1, 2, 0)); + // 0213 4657 -> 0246 1357 + _pBB = _mm256_permute4x64_epi64(_pBB, _MM_SHUFFLE(3, 1, 2, 0)); - // 0246 1357 -> 0246 0246 1357 1357 - __m512i _pBBBB = _mm512_shuffle_i32x4(_mm512_castsi256_si512(_pBB), _mm512_castsi256_si512(_pBB), _MM_SHUFFLE(1, 1, 0, 0)); + // 0246 1357 -> 0246 0246 1357 1357 + __m512i _pBBBB = _mm512_shuffle_i32x4(_mm512_castsi256_si512(_pBB), _mm512_castsi256_si512(_pBB), _MM_SHUFFLE(1, 1, 0, 0)); - // 0246 0246 1357 1357 -> 00000000 11111111 - __m512i _pB01 = _mm512_shuffle_epi32(_pBBBB, _MM_PERM_AAAA); - __m512i _pB23 = _mm512_shuffle_epi32(_pBBBB, _MM_PERM_BBBB); - __m512i _pB45 = _mm512_shuffle_epi32(_pBBBB, _MM_PERM_CCCC); - __m512i _pB67 = _mm512_shuffle_epi32(_pBBBB, _MM_PERM_DDDD); + // 0246 0246 1357 1357 -> 00000000 11111111 + __m512i _pB01 = _mm512_shuffle_epi32(_pBBBB, _MM_PERM_AAAA); + __m512i _pB23 = _mm512_shuffle_epi32(_pBBBB, _MM_PERM_BBBB); + __m512i _pB45 = _mm512_shuffle_epi32(_pBBBB, _MM_PERM_CCCC); + __m512i _pB67 = _mm512_shuffle_epi32(_pBBBB, _MM_PERM_DDDD); #if __AVX512VNNI__ - _sum01 = _mm512_dpwssd_epi32(_sum01, _pAA, _pB01); - _sum23 = _mm512_dpwssd_epi32(_sum23, _pAA, _pB23); - _sum45 = _mm512_dpwssd_epi32(_sum45, _pAA, _pB45); - _sum67 = _mm512_dpwssd_epi32(_sum67, _pAA, _pB67); + _sum01 = _mm512_dpwssd_epi32(_sum01, _pAA, _pB01); + _sum23 = _mm512_dpwssd_epi32(_sum23, _pAA, _pB23); + _sum45 = _mm512_dpwssd_epi32(_sum45, _pAA, _pB45); + _sum67 = _mm512_dpwssd_epi32(_sum67, _pAA, _pB67); #else - _sum01 = _mm512_add_epi32(_sum01, _mm512_madd_epi16(_pAA, _pB01)); - _sum23 = _mm512_add_epi32(_sum23, _mm512_madd_epi16(_pAA, _pB23)); - _sum45 = _mm512_add_epi32(_sum45, _mm512_madd_epi16(_pAA, _pB45)); - _sum67 = _mm512_add_epi32(_sum67, _mm512_madd_epi16(_pAA, _pB67)); + _sum01 = _mm512_add_epi32(_sum01, _mm512_madd_epi16(_pAA, _pB01)); + _sum23 = _mm512_add_epi32(_sum23, _mm512_madd_epi16(_pAA, _pB23)); + _sum45 = _mm512_add_epi32(_sum45, _mm512_madd_epi16(_pAA, _pB45)); + _sum67 = _mm512_add_epi32(_sum67, _mm512_madd_epi16(_pAA, _pB67)); #endif // __AVX512VNNI__ #else // __AVX512F__ - - // 0123 4567 - // 4567 0123 - __m256i _pA1 = _mm256_permute4x64_epi64(_pA0, _MM_SHUFFLE(1, 0, 3, 2)); - - // 0123 4567 - // 1230 5674 - // 2301 6745 - // 3012 7456 - __m256i _pB0 = _pBB; - __m256i _pB1 = _mm256_shuffle_epi32(_pBB, _MM_SHUFFLE(2, 1, 0, 3)); - __m256i _pB2 = _mm256_shuffle_epi32(_pBB, _MM_SHUFFLE(1, 0, 3, 2)); - __m256i _pB3 = _mm256_shuffle_epi32(_pBB, _MM_SHUFFLE(0, 3, 2, 1)); - -#if __AVXVNNI__ - _sum0z = _mm256_dpwssd_epi32(_sum0z, _pA0, _pB0); - _sum1z = _mm256_dpwssd_epi32(_sum1z, _pA0, _pB1); - _sum2z = _mm256_dpwssd_epi32(_sum2z, _pA0, _pB2); - _sum3z = _mm256_dpwssd_epi32(_sum3z, _pA0, _pB3); - _sum4z = _mm256_dpwssd_epi32(_sum4z, _pA1, _pB0); - _sum5z = _mm256_dpwssd_epi32(_sum5z, _pA1, _pB1); - _sum6z = _mm256_dpwssd_epi32(_sum6z, _pA1, _pB2); - _sum7z = _mm256_dpwssd_epi32(_sum7z, _pA1, _pB3); -#else - _sum0z = _mm256_add_epi32(_sum0z, _mm256_madd_epi16(_pA0, _pB0)); - _sum1z = _mm256_add_epi32(_sum1z, _mm256_madd_epi16(_pA0, _pB1)); - _sum2z = _mm256_add_epi32(_sum2z, _mm256_madd_epi16(_pA0, _pB2)); - _sum3z = _mm256_add_epi32(_sum3z, _mm256_madd_epi16(_pA0, _pB3)); - _sum4z = _mm256_add_epi32(_sum4z, _mm256_madd_epi16(_pA1, _pB0)); - _sum5z = _mm256_add_epi32(_sum5z, _mm256_madd_epi16(_pA1, _pB1)); - _sum6z = _mm256_add_epi32(_sum6z, _mm256_madd_epi16(_pA1, _pB2)); - _sum7z = _mm256_add_epi32(_sum7z, _mm256_madd_epi16(_pA1, _pB3)); -#endif // __AVXVNNI__ - - // __m256i _pBBl = _mm256_permute4x64_epi64(_pBB, _MM_SHUFFLE(1, 0, 1, 0)); - // __m256i _pBBh = _mm256_permute4x64_epi64(_pBB, _MM_SHUFFLE(3, 2, 3, 2)); - // - // // 01230123 -> 00000000 11111111 22222222 33333333 - // __m256i _pB0 = _mm256_shuffle_epi32(_pBBl, _MM_SHUFFLE(0, 0, 0, 0)); - // __m256i _pB1 = _mm256_shuffle_epi32(_pBBl, _MM_SHUFFLE(1, 1, 1, 1)); - // __m256i _pB2 = _mm256_shuffle_epi32(_pBBl, _MM_SHUFFLE(2, 2, 2, 2)); - // __m256i _pB3 = _mm256_shuffle_epi32(_pBBl, _MM_SHUFFLE(3, 3, 3, 3)); - // __m256i _pB4 = _mm256_shuffle_epi32(_pBBh, _MM_SHUFFLE(0, 0, 0, 0)); - // __m256i _pB5 = _mm256_shuffle_epi32(_pBBh, _MM_SHUFFLE(1, 1, 1, 1)); - // __m256i _pB6 = _mm256_shuffle_epi32(_pBBh, _MM_SHUFFLE(2, 2, 2, 2)); - // __m256i _pB7 = _mm256_shuffle_epi32(_pBBh, _MM_SHUFFLE(3, 3, 3, 3)); - -// #if __AVXVNNI__ -// _sum0 = _mm256_dpwssd_epi32(_sum0, _pA0, _pB0); -// _sum1 = _mm256_dpwssd_epi32(_sum1, _pA0, _pB1); -// _sum2 = _mm256_dpwssd_epi32(_sum2, _pA0, _pB2); -// _sum3 = _mm256_dpwssd_epi32(_sum3, _pA0, _pB3); -// _sum4 = _mm256_dpwssd_epi32(_sum4, _pA0, _pB4); -// _sum5 = _mm256_dpwssd_epi32(_sum5, _pA0, _pB5); -// _sum6 = _mm256_dpwssd_epi32(_sum6, _pA0, _pB6); -// _sum7 = _mm256_dpwssd_epi32(_sum7, _pA0, _pB7); -// #else -// _sum0 = _mm256_add_epi32(_sum0, _mm256_madd_epi16(_pA0, _pB0)); -// _sum1 = _mm256_add_epi32(_sum1, _mm256_madd_epi16(_pA0, _pB1)); -// _sum2 = _mm256_add_epi32(_sum2, _mm256_madd_epi16(_pA0, _pB2)); -// _sum3 = _mm256_add_epi32(_sum3, _mm256_madd_epi16(_pA0, _pB3)); -// _sum4 = _mm256_add_epi32(_sum4, _mm256_madd_epi16(_pA0, _pB4)); -// _sum5 = _mm256_add_epi32(_sum5, _mm256_madd_epi16(_pA0, _pB5)); -// _sum6 = _mm256_add_epi32(_sum6, _mm256_madd_epi16(_pA0, _pB6)); -// _sum7 = _mm256_add_epi32(_sum7, _mm256_madd_epi16(_pA0, _pB7)); -// #endif // __AVXVNNI__ -#endif // __AVX512F__ - - pA += 16; - pB += 16; - } -#if !__AVX512F__ - // 00 11 22 33 44 55 66 77 - // 03 10 21 32 47 54 65 76 - // 02 13 20 31 46 57 64 75 - // 01 12 23 30 45 56 67 74 - - // 40 51 62 73 04 15 26 37 - // 43 50 61 72 07 14 25 36 - // 42 53 60 71 06 17 24 35 - // 41 52 63 70 05 16 27 34 - - _sum0z = _sum0z; - _sum1z = _mm256_shuffle_epi32(_sum1z, _MM_SHUFFLE(0, 3, 2, 1)); - _sum2z = _mm256_shuffle_epi32(_sum2z, _MM_SHUFFLE(1, 0, 3, 2)); - _sum3z = _mm256_shuffle_epi32(_sum3z, _MM_SHUFFLE(2, 1, 0, 3)); - _sum4z = _sum4z; - _sum5z = _mm256_shuffle_epi32(_sum5z, _MM_SHUFFLE(0, 3, 2, 1)); - _sum6z = _mm256_shuffle_epi32(_sum6z, _MM_SHUFFLE(1, 0, 3, 2)); - _sum7z = _mm256_shuffle_epi32(_sum7z, _MM_SHUFFLE(2, 1, 0, 3)); - - // 00 11 22 33 44 55 66 77 - // 10 21 32 03 54 65 76 47 - // 20 31 02 13 64 75 46 57 - // 30 01 12 23 74 45 56 67 - - // 40 51 62 73 04 15 26 37 - // 50 61 72 43 14 25 36 07 - // 60 71 42 53 24 35 06 17 - // 70 41 52 63 34 05 16 27 - - transpose8x8_epi32(_sum0z, _sum1z, _sum2z, _sum3z, _sum4z, _sum5z, _sum6z, _sum7z); - // 0123 4567 - // 1230 5674 - // 2301 6745 - // 3012 7456 // 4567 0123 - // 5674 1230 - // 6745 2301 - // 7456 3012 - - _sum4z = _mm256_permute4x64_epi64(_sum4z, _MM_SHUFFLE(1, 0, 3, 2)); - _sum5z = _mm256_permute4x64_epi64(_sum5z, _MM_SHUFFLE(1, 0, 3, 2)); - _sum6z = _mm256_permute4x64_epi64(_sum6z, _MM_SHUFFLE(1, 0, 3, 2)); - _sum7z = _mm256_permute4x64_epi64(_sum7z, _MM_SHUFFLE(1, 0, 3, 2)); + __m256i _pA1 = _mm256_permute4x64_epi64(_pA0, _MM_SHUFFLE(1, 0, 3, 2)); // 0123 4567 - // 1230 5674 - // 2301 6745 // 3012 7456 - // 0123 4567 - // 1230 5674 // 2301 6745 - // 3012 7456 + // 1230 5674 + __m256i _pB0 = _pBB; + __m256i _pB1 = _mm256_shuffle_epi32(_pBB, _MM_SHUFFLE(2, 1, 0, 3)); + __m256i _pB2 = _mm256_shuffle_epi32(_pBB, _MM_SHUFFLE(1, 0, 3, 2)); + __m256i _pB3 = _mm256_shuffle_epi32(_pBB, _MM_SHUFFLE(0, 3, 2, 1)); - _sum0z = _sum0z; - _sum1z = _mm256_shuffle_epi32(_sum1z, _MM_SHUFFLE(2, 1, 0, 3)); - _sum2z = _mm256_shuffle_epi32(_sum2z, _MM_SHUFFLE(1, 0, 3, 2)); - _sum3z = _mm256_shuffle_epi32(_sum3z, _MM_SHUFFLE(0, 3, 2, 1)); - _sum4z = _sum4z; - _sum5z = _mm256_shuffle_epi32(_sum5z, _MM_SHUFFLE(2, 1, 0, 3)); - _sum6z = _mm256_shuffle_epi32(_sum6z, _MM_SHUFFLE(1, 0, 3, 2)); - _sum7z = _mm256_shuffle_epi32(_sum7z, _MM_SHUFFLE(0, 3, 2, 1)); - - _sum0 = _mm256_add_epi32(_sum0, _sum0z); - _sum1 = _mm256_add_epi32(_sum1, _sum1z); - _sum2 = _mm256_add_epi32(_sum2, _sum2z); - _sum3 = _mm256_add_epi32(_sum3, _sum3z); - _sum4 = _mm256_add_epi32(_sum4, _sum4z); - _sum5 = _mm256_add_epi32(_sum5, _sum5z); - _sum6 = _mm256_add_epi32(_sum6, _sum6z); - _sum7 = _mm256_add_epi32(_sum7, _sum7z); -#endif // !__AVX512F__ +#if __AVXVNNI__ + _sum0 = _mm256_dpwssd_epi32(_sum0, _pA0, _pB0); + _sum1 = _mm256_dpwssd_epi32(_sum1, _pA0, _pB1); + _sum2 = _mm256_dpwssd_epi32(_sum2, _pA0, _pB2); + _sum3 = _mm256_dpwssd_epi32(_sum3, _pA0, _pB3); + _sum4 = _mm256_dpwssd_epi32(_sum4, _pA1, _pB0); + _sum5 = _mm256_dpwssd_epi32(_sum5, _pA1, _pB1); + _sum6 = _mm256_dpwssd_epi32(_sum6, _pA1, _pB2); + _sum7 = _mm256_dpwssd_epi32(_sum7, _pA1, _pB3); +#else + _sum0 = _mm256_add_epi32(_sum0, _mm256_madd_epi16(_pA0, _pB0)); + _sum1 = _mm256_add_epi32(_sum1, _mm256_madd_epi16(_pA0, _pB1)); + _sum2 = _mm256_add_epi32(_sum2, _mm256_madd_epi16(_pA0, _pB2)); + _sum3 = _mm256_add_epi32(_sum3, _mm256_madd_epi16(_pA0, _pB3)); + _sum4 = _mm256_add_epi32(_sum4, _mm256_madd_epi16(_pA1, _pB0)); + _sum5 = _mm256_add_epi32(_sum5, _mm256_madd_epi16(_pA1, _pB1)); + _sum6 = _mm256_add_epi32(_sum6, _mm256_madd_epi16(_pA1, _pB2)); + _sum7 = _mm256_add_epi32(_sum7, _mm256_madd_epi16(_pA1, _pB3)); +#endif // __AVXVNNI__ +#endif // __AVX512F__ + + pA += 16; + pB += 16; } for (; kk < max_kk; kk += 1) { @@ -1581,34 +1462,28 @@ static void convolution_gemm_transB_packed_tile_int8(const Mat& AT_tile, const M _sum45 = _mm512_add_epi32(_sum45, _s45); _sum67 = _mm512_add_epi32(_sum67, _s67); #else - // 01234567 -> 00112233 / 44556677 - __m128i _pB0123 = _mm_unpacklo_epi16(_pB, _pB); - __m128i _pB4567 = _mm_unpackhi_epi16(_pB, _pB); - - // 00112233 -> 00001111 / 22223333 - __m128i _pB01 = _mm_unpacklo_epi32(_pB0123, _pB0123); - __m128i _pB23 = _mm_unpackhi_epi32(_pB0123, _pB0123); - __m128i _pB45 = _mm_unpacklo_epi32(_pB4567, _pB4567); - __m128i _pB67 = _mm_unpackhi_epi32(_pB4567, _pB4567); - - // 00001111 -> 00000000 / 11111111 - __m128i _pB0 = _mm_unpacklo_epi64(_pB01, _pB01); - __m128i _pB1 = _mm_unpackhi_epi64(_pB01, _pB01); - __m128i _pB2 = _mm_unpacklo_epi64(_pB23, _pB23); - __m128i _pB3 = _mm_unpackhi_epi64(_pB23, _pB23); - __m128i _pB4 = _mm_unpacklo_epi64(_pB45, _pB45); - __m128i _pB5 = _mm_unpackhi_epi64(_pB45, _pB45); - __m128i _pB6 = _mm_unpacklo_epi64(_pB67, _pB67); - __m128i _pB7 = _mm_unpackhi_epi64(_pB67, _pB67); + // 0123 4567 + // 4567 0123 + __m128i _pA0 = _pA; + __m128i _pA1 = _mm_shuffle_epi32(_pA, _MM_SHUFFLE(1, 0, 3, 2)); - __m256i _s0 = _mm256_cvtepi16_epi32(_mm_mullo_epi16(_pA, _pB0)); - __m256i _s1 = _mm256_cvtepi16_epi32(_mm_mullo_epi16(_pA, _pB1)); - __m256i _s2 = _mm256_cvtepi16_epi32(_mm_mullo_epi16(_pA, _pB2)); - __m256i _s3 = _mm256_cvtepi16_epi32(_mm_mullo_epi16(_pA, _pB3)); - __m256i _s4 = _mm256_cvtepi16_epi32(_mm_mullo_epi16(_pA, _pB4)); - __m256i _s5 = _mm256_cvtepi16_epi32(_mm_mullo_epi16(_pA, _pB5)); - __m256i _s6 = _mm256_cvtepi16_epi32(_mm_mullo_epi16(_pA, _pB6)); - __m256i _s7 = _mm256_cvtepi16_epi32(_mm_mullo_epi16(_pA, _pB7)); + // 0123 4567 + // 3012 7456 + // 2301 6745 + // 1230 5674 + __m128i _pB0 = _pB; + __m128i _pB1 = _mm_shufflehi_epi16(_mm_shufflelo_epi16(_pB, _MM_SHUFFLE(2, 1, 0, 3)), _MM_SHUFFLE(2, 1, 0, 3)); + __m128i _pB2 = _mm_shuffle_epi32(_pB, _MM_SHUFFLE(2, 3, 0, 1)); + __m128i _pB3 = _mm_shufflehi_epi16(_mm_shufflelo_epi16(_pB, _MM_SHUFFLE(0, 3, 2, 1)), _MM_SHUFFLE(0, 3, 2, 1)); + + __m256i _s0 = _mm256_cvtepi16_epi32(_mm_mullo_epi16(_pA0, _pB0)); + __m256i _s1 = _mm256_cvtepi16_epi32(_mm_mullo_epi16(_pA0, _pB1)); + __m256i _s2 = _mm256_cvtepi16_epi32(_mm_mullo_epi16(_pA0, _pB2)); + __m256i _s3 = _mm256_cvtepi16_epi32(_mm_mullo_epi16(_pA0, _pB3)); + __m256i _s4 = _mm256_cvtepi16_epi32(_mm_mullo_epi16(_pA1, _pB0)); + __m256i _s5 = _mm256_cvtepi16_epi32(_mm_mullo_epi16(_pA1, _pB1)); + __m256i _s6 = _mm256_cvtepi16_epi32(_mm_mullo_epi16(_pA1, _pB2)); + __m256i _s7 = _mm256_cvtepi16_epi32(_mm_mullo_epi16(_pA1, _pB3)); _sum0 = _mm256_add_epi32(_sum0, _s0); _sum1 = _mm256_add_epi32(_sum1, _s1); @@ -1626,6 +1501,72 @@ static void convolution_gemm_transB_packed_tile_int8(const Mat& AT_tile, const M if (k_end) { +#if !__AVX512F__ + // 00 11 22 33 44 55 66 77 + // 03 10 21 32 47 54 65 76 + // 02 13 20 31 46 57 64 75 + // 01 12 23 30 45 56 67 74 + + // 40 51 62 73 04 15 26 37 + // 43 50 61 72 07 14 25 36 + // 42 53 60 71 06 17 24 35 + // 41 52 63 70 05 16 27 34 + + _sum0 = _sum0; + _sum1 = _mm256_shuffle_epi32(_sum1, _MM_SHUFFLE(0, 3, 2, 1)); + _sum2 = _mm256_shuffle_epi32(_sum2, _MM_SHUFFLE(1, 0, 3, 2)); + _sum3 = _mm256_shuffle_epi32(_sum3, _MM_SHUFFLE(2, 1, 0, 3)); + _sum4 = _sum4; + _sum5 = _mm256_shuffle_epi32(_sum5, _MM_SHUFFLE(0, 3, 2, 1)); + _sum6 = _mm256_shuffle_epi32(_sum6, _MM_SHUFFLE(1, 0, 3, 2)); + _sum7 = _mm256_shuffle_epi32(_sum7, _MM_SHUFFLE(2, 1, 0, 3)); + + // 00 11 22 33 44 55 66 77 + // 10 21 32 03 54 65 76 47 + // 20 31 02 13 64 75 46 57 + // 30 01 12 23 74 45 56 67 + + // 40 51 62 73 04 15 26 37 + // 50 61 72 43 14 25 36 07 + // 60 71 42 53 24 35 06 17 + // 70 41 52 63 34 05 16 27 + + transpose8x8_epi32(_sum0, _sum1, _sum2, _sum3, _sum4, _sum5, _sum6, _sum7); + + // 0123 4567 + // 1230 5674 + // 2301 6745 + // 3012 7456 + // 4567 0123 + // 5674 1230 + // 6745 2301 + // 7456 3012 + + _sum4 = _mm256_permute4x64_epi64(_sum4, _MM_SHUFFLE(1, 0, 3, 2)); + _sum5 = _mm256_permute4x64_epi64(_sum5, _MM_SHUFFLE(1, 0, 3, 2)); + _sum6 = _mm256_permute4x64_epi64(_sum6, _MM_SHUFFLE(1, 0, 3, 2)); + _sum7 = _mm256_permute4x64_epi64(_sum7, _MM_SHUFFLE(1, 0, 3, 2)); + + // 0123 4567 + // 1230 5674 + // 2301 6745 + // 3012 7456 + // 0123 4567 + // 1230 5674 + // 2301 6745 + // 3012 7456 + + _sum0 = _sum0; + _sum1 = _mm256_shuffle_epi32(_sum1, _MM_SHUFFLE(2, 1, 0, 3)); + _sum2 = _mm256_shuffle_epi32(_sum2, _MM_SHUFFLE(1, 0, 3, 2)); + _sum3 = _mm256_shuffle_epi32(_sum3, _MM_SHUFFLE(0, 3, 2, 1)); + _sum4 = _sum4; + _sum5 = _mm256_shuffle_epi32(_sum5, _MM_SHUFFLE(2, 1, 0, 3)); + _sum6 = _mm256_shuffle_epi32(_sum6, _MM_SHUFFLE(1, 0, 3, 2)); + _sum7 = _mm256_shuffle_epi32(_sum7, _MM_SHUFFLE(0, 3, 2, 1)); + +#endif // !__AVX512F__ + if (out_elempack == 8) { #if __AVX512F__