15

我最近注意到

_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

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

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

还有一个后续问题:

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

4

3 回答 3

7

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

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

于 2011-05-02T19:42:59.940 回答
6

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

于 2011-03-08T20:37:09.217 回答
6

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

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

于 2011-03-08T23:20:21.203 回答