反向含双打使用单一AVX内在一个AVX寄存器 [英] Reverse a AVX register containing doubles using a single AVX intrinsic

查看:228
本文介绍了反向含双打使用单一AVX内在一个AVX寄存器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果我在他们4双打的AVX寄存器,我想这个反向存储在另一个寄存器中,是否有可能用一个固有的命令来做到这一点?

If I have an AVX register with 4 doubles in them and I want to store the reverse of this in another register, is it possible to do this with a single intrinsic command?

例如:如果我在一个SSE寄存器有4个浮筒,我可以使用:

For example: If I had 4 floats in a SSE register, I could use:

_mm_shuffle_ps(A,A,_MM_SHUFFLE(0,1,2,3));

我能做到这一点使用,也许 _mm256_permute2f128_pd()?我不认为你可以使用上述内部解决每个人的两倍。

Can I do this using, maybe _mm256_permute2f128_pd()? I don't think you can address each individual double using the above intrinsic.

推荐答案

您确实需要2 permutes做到这一点:

You actually need 2 permutes to do this:


  • _mm256_permute2f128_pd()仅在128位块permutes。

  • _mm256_permute_pd()不跨越128位边界重排。

  • _mm256_permute2f128_pd() only permutes in 128-bit chunks.
  • _mm256_permute_pd() does not permute across 128-bit boundaries.

所以,你需要同时使用:

So you need to use both:

inline __m256d reverse(__m256d x){
    x = _mm256_permute2f128_pd(x,x,1);
    x = _mm256_permute_pd(x,5);
    return x;
}

测试:

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;
}

输出:

10  11  12  13
13  12  11  10

这篇关于反向含双打使用单一AVX内在一个AVX寄存器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆