我正在使用 AVX2 内在函数,并希望获得以下内容:
输入:
[1,2,3,4,5,6,7,8]
输出:
[8,1,2,3,4,5,6,7]
以下适用于 128 位向量:
let vec1 = _mm_set_epi32(1,2,3,4);
let vec2 = _mm_alignr_epi8(vec1, 4); // shift values one position, catch at bottom
vec1 将给出
[1,2,3,4]
vec2 将给出 [4,1,2,3]
。
这正如预期的那样。
具有 256 位向量
let vec256_1 = _mm256_set_epi32(1,2,3,4,5,6,7,8);
let vec256_2 = _mm256_alignr_epi8(vec256_1, 4); // shift values one position
vec256_1 将给出
[1,2,3,4,5,6,7,8]
vec256_2 将给出 [4,1,2,3,8,5,6,7]
所以在我看来它正在做 128 位版本的低和高部分。
我的问题是:我怎样才能做到这一点,以便整个 256 位向左移动一个值?
目标:如何得到以下向量:
[8,1,2,3,4,5,6,7]
如果你能负担得起常数向量,请执行以下操作:
__m256i rotate1( __m256i v )
{
const __m256i perm = _mm256_setr_epi32( 7, 0, 1, 2, 3, 4, 5, 6 );
return _mm256_permutevar8x32_epi32( v, perm );
}
如果您不想加载内存,这里有另一个版本,它可以通过 2 条指令完成您想要的操作:
__m256i rotate2( __m256i v )
{
// Make another vector with 16-byte pieces flipped
__m256i flipped = _mm256_permute2x128_si256( v, v, 0x01 );
// With these two vectors, `vpalignr` can rotate the complete input
return _mm256_alignr_epi8( v, flipped, 12 );
}