如何旋转SSE / AVX矢量

时间:2012-08-10 17:52:29

标签: c x86 sse intrinsics avx

我需要在尽可能短的时钟周期内执行旋转操作。 在第一种情况下,让我们假设__m128i为源和目标类型:

source: || A0 || A1 || A2 || A3 ||
  dest: || A1 || A2 || A3 || A0 ||
dest = (__m128i)_mm_shuffle_epi32((__m128i)source, _MM_SHUFFLE(0,3,2,1));

现在我想对AVX内在函数做同样的事情。 因此,我们假设此时__m256i为源和目标类型:

source: || A0 || A1 || A2 || A3 || A4 || A5 || A6 || A7 ||
  dest: || A1 || A2 || A3 || A4 || A5 || A6 || A7 || A0 ||

AVX内在函数缺少大多数相应的SSE整数运算。 也许有一些方法可以使用浮点版本获得所需的输出。

我试过了:

dest = (__m256i)_mm256_shuffle_ps((__m256)source, (__m256)source, _MM_SHUFFLE(0,3,2,1));

但我得到的是:

|| A0 || A2 || A3 || A4 || A5 || A6 || A7 || A1 ||

关于如何以有效的方式解决这个问题的任何想法? (没有混合SSE和AVX操作而没有“手动”反转A0A1

提前致谢!

1 个答案:

答案 0 :(得分:15)

我的解决方案:

__m256 tmp =  ( __m256 ) _mm256_permute_ps((__m256)_source, _MM_SHUFFLE ( 0,3,2,1 ));
* ( _dest ) =  ( __m256i) _mm256_blend_ps(tmp, _mm256_permute2f128_ps ( tmp,tmp,1 ), 136);