【发布时间】:2013-11-18 15:40:20
【问题描述】:
我知道这应该是一个谷歌搜索问题,但我找不到答案。
假设我有一个__m128 变量a,其内容是a[0]、a[1]、a[2]、a[3]。是否有一个 single 函数可以将其反转为a[3]、a[2]、a[1]、a[0]?
【问题讨论】:
我知道这应该是一个谷歌搜索问题,但我找不到答案。
假设我有一个__m128 变量a,其内容是a[0]、a[1]、a[2]、a[3]。是否有一个 single 函数可以将其反转为a[3]、a[2]、a[1]、a[0]?
【问题讨论】:
使用_mm_shuffle_ps()。该指令已经在 SSE 中可用,并且可以通过组合来自两个输入向量中的每一个的两个任意 32 位分量,在一个向量中收集 4 个 32 位分量。
如何使用宏_MM_SHUFFLE()创建掩码
宏定义如下:
/* Create a selector for use with the SHUFPS instruction. */
#define _MM_SHUFFLE(fp3,fp2,fp1,fp0) \
(((fp3) << 6) | ((fp2) << 4) | ((fp1) << 2) | (fp0))
源和目标索引从右到左按升序排列。
前两个选择器值(fp0 和fp1)指定m1 中的源组件,
最后两个(fp2 和 fp3)在m2 中。每个选定的源组件都分配给m3[index],其中index 对应于其选择器参数fp<index>。
反转向量中的 32 位分量
__m128 input = ...;
__m128 reversed = _mm_shuffle_ps(input,input,_MM_SHUFFLE(0, 1, 2, 3));
注意:掩码是立即数。它不能是动态的,因为它是生成的机器指令的一部分。
英特尔内部指南:https://software.intel.com/sites/landingpage/IntrinsicsGuide/
【讨论】:
_mm_shuffle_ps() 的前两个参数将是相同的。
_MM_SHUFFLE 的描述是倒退的——前两个参数是从第二个参数中选择的单词(0 是 LSW)并打包到结果的上半部分,而最后一个两个参数是从第一个参数中选择的单词。为什么会被交换?谁知道呢。
_mm_shuffle_ps() 的向量参数在一致性方面可能是有意义的,但在一般情况下不一定。