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

Inv*_*rse 15 c c++ sse simd

我最近注意到了

_m128 m = _mm_set_ps(0,1,2,3);
Run Code Online (Sandbox Code Playgroud)

在转换为float数组时,将4个浮点数置于相反的顺序:

(float*) p = (float*)(&m);
// p[0] == 3
// p[1] == 2
// p[2] == 1
// p[3] == 0
Run Code Online (Sandbox Code Playgroud)

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

为什么SSE操作使用这种排序?这不是什么大问题,但有点令人困惑.

还有一个后续问题:

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

ech*_*cho 7

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

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


Bo *_*son 6

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


Ste*_*non 5

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

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