使用单个AVX内在函数反转包含双精度的AVX寄存器

use*_*122 3 c sse simd vectorization avx

如果我有一个AVX寄存器,其中有4个双打,并且我想将其反向存储在另一个寄存器中,是否可以使用单个内部命令执行此操作?

例如:如果我在SSE寄存器中有4个浮点数,我可以使用:

_mm_shuffle_ps(A,A,_MM_SHUFFLE(0,1,2,3));
Run Code Online (Sandbox Code Playgroud)

我可以使用_mm256_permute2f128_pd()吗?我不认为你可以用上面的内在来解决每个人的双重问题.

Mys*_*ial 8

你实际上需要2个permutes来做到这一点:

  • _mm256_permute2f128_pd() 仅在128位块中进行置换.
  • _mm256_permute_pd() 不会跨越128位边界进行置换.

所以你需要同时使用:

inline __m256d reverse(__m256d x){
    x = _mm256_permute2f128_pd(x,x,1);
    x = _mm256_permute_pd(x,5);
    return x;
}
Run Code Online (Sandbox Code Playgroud)

测试:

int main(){
    __m256d x = _mm256_set_pd(13,12,11,10);

    cout << x.m256d_f64[0] << "  " << x.m256d_f64[1] << "  " << x.m256d_f64[2] << "  " << x.m256d_f64[3] << endl;
    x = reverse(x);
    cout << x.m256d_f64[0] << "  " << x.m256d_f64[1] << "  " << x.m256d_f64[2] << "  " << x.m256d_f64[3] << endl;
}
Run Code Online (Sandbox Code Playgroud)

输出:

10  11  12  13
13  12  11  10
Run Code Online (Sandbox Code Playgroud)