我最近注意到了
_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
订单访问?
答案 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)
这只是一个惯例;他们必须选择一些订单,只要每个人都遵循它,订单是什么并不重要。英特尔恰好喜欢小端。
就索引访问而言...最好的办法是尽量避免这样做。没有什么能像元素访问一样杀死矢量性能。如果必须,请尝试进行设置,以使索引与硬件矢量通道匹配;这就是大多数矢量程序员(根据我的经验)所期望的。