我最近注意到了
_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
?
根据您的想法,您可以使用_mm_set_ps或_mm_setr_ps.
__m128 _mm_setr_ps(float z,float y,float x,float w)以相反的顺序将四个SP FP值设置为四个输入.
这只是一个惯例; 他们必须选择一些订单,只要每个人都遵循它,订单是什么并不重要.英特尔恰好喜欢小端.
至于按索引访问...最好的办法是尽量避免这样做.没有什么能像元素访问一样杀死矢量性能.如果必须,请尝试进行设置,以使索引与硬件矢量通道匹配; 这就是大多数矢量程序员(根据我的经验)所期望的.
归档时间: |
|
查看次数: |
6233 次 |
最近记录: |