我尝试以下代码。我知道随机播放功能有一些车道限制。但我不知道如何正确处理。有人有想法吗?
#include <immintrin.h>
int main() {
auto vals = _mm256_setr_epi8(
0, 3, 6, 9,
1, 4, 7, 10,
2, 5, 8, 11,
0, 0, 0, 0,
12, 15, 18, 21,
13, 16, 19, 22,
14, 17, 20, 23,
0, 0, 0, 0
);
auto mask = _mm256_setr_epi8(
0, 4, 8,
1, 5, 9,
2, 6, 10,
3, 7, 11,
16, 20, 24,
17, 21, 25,
18, 22, 26,
19, 23, 27,
-1, -1, -1,
-1, -1, -1,
-1, -1);
auto res = _mm256_shuffle_epi8(vals, mask);
/*res is:
0 1 2 3 4 5 6 7 8 9 10 11 0 1 2 3 12 17 18 19 20 21 22 23 0 0 0 0 0 0 0 0 0
but should
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 0 0 0 0 0 0 0 0 0
*/
return 0;
}
问题是,
_mm256_shuffle_epi8
无法在向量的 16 字节通道上移动这些字节。
一种可能的解决方法是随后执行另一个随机指令,这是一个示例。
__m256i collectRgb( __m256i vals )
{
// Move the bytes within 16-byte pieces of the vector
const __m128i gather16 = _mm_setr_epi8(
0, 4, 8, 1, 5, 9, 2, 6, 10, 3, 7, 11, -1, -1, -1, -1 );
const __m256i gatherMask = _mm256_broadcastsi128_si256( gather16 );
vals = _mm256_shuffle_epi8( vals, gatherMask );
// Shuffle 4-byte pieces across the complete AVX vector
const __m256i perm = _mm256_setr_epi32( 0, 1, 2, 4, 5, 6, 7, 7 );
return _mm256_permutevar8x32_epi32( vals, perm );
}