【问题标题】:How to reverse an __m128 type variable?如何反转 __m128 类型变量?
【发布时间】: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]

【问题讨论】:

    标签: c++ c x86 sse simd


    【解决方案1】:

    使用_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))
    

    源和目标索引从右到左按升序排列。 前两个选择器值(fp0fp1)指定m1 中的源组件, 最后两个(fp2fp3)在m2 中。每个选定的源组件都分配给m3[index],其中index 对应于其选择器参数fp&lt;index&gt;

    反转向量中的 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)并打包到结果的上半部分,而最后一个两个参数是从第一个参数中选择的单词。为什么会被交换?谁知道呢。
    • @ChrisDodd 感谢您指出这一点。描述是错误的,因为它没有涵盖参数顺序。我试图澄清这一点。我认为在这种特殊情况下交换_mm_shuffle_ps() 的向量参数在一致性方面可能是有意义的,但在一般情况下不一定。
    猜你喜欢
    • 2013-12-03
    • 1970-01-01
    • 2011-08-27
    • 1970-01-01
    • 2011-07-03
    • 2011-01-28
    • 1970-01-01
    • 2011-08-21
    • 2020-06-19
    相关资源
    最近更新 更多