在尝试优化有限差分代码所需的未对齐读取时,我更改了未对齐的负载,如下所示:
__m128 pm1 =_mm_loadu_ps(&H[k-1]);
进入这个对齐的读取+随机播放代码:
__m128 p0 =_mm_load_ps(&H[k]);
__m128 pm4 =_mm_load_ps(&H[k-4]);
__m128 pm1 =_mm_shuffle_ps(p0,p0,0x90); // move 3 floats to higher positions
__m128 tpm1 =_mm_shuffle_ps(pm4,pm4,0x03); // get missing lowest float
pm1 =_mm_move_ss(pm1,tpm1); // pack lowest float with 3 others
where H
16 字节对齐;并且也有类似的变化H[k+1]
, H[k±3]
and movlhps
& movhlps
优化为H[k±2]
(here http://paste.ubuntu.com/7306179/'是循环的完整代码)。
我发现在我的 Core i7-930 上优化了阅读H[k±3]
似乎是富有成效的,同时添加了下一个优化±1
减慢了我的循环速度(以百分比为单位)。之间切换±1
and ±3
优化并没有改变结果。
同时,在 Core 2 Duo 6300 和 Core 2 Quad 上启用两种优化(对于±1
and ±3
)提高了性能(百分之几十),而对于 Core i7-4765T,这两者都降低了性能(以百分比为单位)。
在 Pentium 4 上,所有优化未对齐读取的尝试,包括那些movlhps
/movhlps
导致放缓。
为什么不同的CPU会有这么大的差异呢?是否是因为代码大小增加导致循环可能不适合某些指令缓存?或者是因为某些 CPU 对未对齐读取不敏感,而其他 CPU 则更敏感?或者诸如洗牌之类的操作在某些 CPU 上可能很慢?