为什么SSE设置(_mm_set_ps)反转参数的顺序

时间:2011-03-08 20:30:16

标签: c++ c sse simd

我最近注意到了

_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订单访问?

3 个答案:

答案 0 :(得分:7)

根据您的想法,您可以使用_mm_set_ps或_mm_setr_ps。

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

答案 1 :(得分:6)

这与x86硬件的little-endian性质不一致吗?它存储long long字节的方式。

答案 2 :(得分:5)

这只是一个惯例;他们必须选择一些订单,只要每个人都遵循它,订单是什么并不重要。英特尔恰好喜欢小端。

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