【问题标题】:Why does does SSE set (_mm_set_ps) reverse the order of arguments为什么 SSE set (_mm_set_ps) 会颠倒参数的顺序
【发布时间】:2011-07-11 09:53:29
【问题描述】:

我最近注意到

_m128 m = _mm_set_ps(0,1,2,3);

在转换为浮点数组时将 4 个浮点数倒序排列:

(float*) p = (float*)(&m);
// p[0] == 3
// p[1] == 2
// p[2] == 1
// p[3] == 0

union { _m128 m; float[4] a; } 也会发生同样的情况。

为什么 SSE 操作使用这种排序?这没什么大不了的,但有点令人困惑。

还有一个后续问题:

当按索引访问数组中的元素时,应该按0..3 的顺序访问还是按3..0 的顺序访问?

【问题讨论】:

    标签: c++ c sse simd


    【解决方案1】:

    这不符合 x86 硬件的小端特性吗?它存储long long字节的方式。

    【讨论】:

    • 是的,这只是正常的小端序。对于 SSE(以及一般的 SIMD 编程),元素的实际顺序通常并不重要,除了当您开始更改元素的宽度(打包/解包等)或执行任何访问特定元素的东西(排列、插入/提取等)。
    【解决方案2】:

    这只是一个约定;他们必须选择一些顺序,只要每个人都遵循它,顺序是什么并不重要。英特尔恰好喜欢 little-endianness。

    就按索引访问而言……最好的办法是尽量避免这样做。没有什么能像按元素访问那样扼杀向量性能了。如果必须,请尝试进行设置,以使索引与硬件矢量通道匹配;这是大多数矢量程序员(根据我的经验)所期望的。

    【讨论】:

    • 英特尔不遵循自己的顺序。您可以使用例如测试_mm_extract_ps() 接受整数索引的内在函数。
    【解决方案3】:

    取决于你想做什么,你可以使用 _mm_set_ps 或 _mm_setr_ps。

    __m128 _mm_setr_ps (float z, float y, float x, float w) 以相反的顺序将四个 SP FP 值设置为四个输入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-20
      • 2021-06-10
      • 2019-01-12
      • 2013-10-27
      • 2020-11-21
      • 2017-03-20
      相关资源
      最近更新 更多