uint64_t A[16] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
__m256i row0 = _mm256_loadu_si256((__m256i*)&A[ 0]); //0 1 2 3
__m256i row1 = _mm256_loadu_si256((__m256i*)&A[ 4]); //4 5 6 7
__m256i row2 = _mm256_loadu_si256((__m256i*)&A[ 8]); //8 9 a b
__m256i row3 = _mm256_loadu_si256((__m256i*)&A[12]); //c d e f
我现在没有硬件来测试它,但是像下面这样的东西应该可以做你想要的
__m256i tmp3, tmp2, tmp1, tmp0;
tmp0 = _mm256_unpacklo_epi64(row0, row1); //0 4 2 6
tmp1 = _mm256_unpackhi_epi64(row0, row1); //1 5 3 7
tmp2 = _mm256_unpacklo_epi64(row2, row3); //8 c a e
tmp3 = _mm256_unpackhi_epi64(row2, row3); //9 d b f
//now select the appropriate 128-bit lanes
row0 = _mm256_permute2x128_si256(tmp0, tmp2, 0x20); //0 4 8 c
row1 = _mm256_permute2x128_si256(tmp1, tmp3, 0x20); //1 5 9 d
row2 = _mm256_permute2x128_si256(tmp0, tmp2, 0x31); //2 6 a e
row3 = _mm256_permute2x128_si256(tmp1, tmp3, 0x31); //3 7 b f
这
__m256i _mm256_permute2x128_si256 (__m256i a, __m256i b, const int imm)
内在从两个源中选择 128 位通道。您可以在Intel Intrinsic Guide中了解它。有一个版本_mm256_permute2f128_si256
只需要 AVX 并在浮点域中运行。我用它来检查我是否使用了正确的控制字。