如何在AVX2中对齐/旋转256位向量?

问题描述 投票:0回答:1

我正在使用 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]

rust simd intrinsics avx avx2
1个回答
0
投票

如果你能负担得起常数向量,请执行以下操作:

__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 );
}
© www.soinside.com 2019 - 2024. All rights reserved.