【发布时间】:2012-08-08 01:25:59
【问题描述】:
我需要以尽可能少的时钟周期执行旋转操作。
在第一种情况下,我们假设 __m128i 作为源和目标类型:
来源:|| A0 || A1 || A2 || A3 ||
目标:|| A1 || A2 || A3 || A0 ||
dest = (__m128i)_mm_shuffle_epi32((__m128i)source, _MM_SHUFFLE(0,3,2,1));
现在我想对 AVX 内在函数做同样的事情。
所以让我们假设这次__m256i 作为源和目标类型:
来源:|| A0 || A1 || A2 || A3 || A4 || A5 || A6 || A7 ||
目标:|| 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 操作,也没有“手动”反转 A0 和 A1
提前致谢!
【问题讨论】:
-
对SSE和AVX没有太多经验,但是在第二行代码中,如果dest类型是
__m256,为什么要转换成__m128i? -
当然是__m256i,谢谢!
-
不,我只是剪切和粘贴出错了..
-
似乎所有有用的指令都在 AVX2 中(他们为什么不发布那个first?)
标签: c x86 sse intrinsics avx