.loop:
movups xmm1, [esi+ecx*4]
movaps xmm2, xmm0
movaps xmm5, xmm1
pcmpgtd xmm2, xmm1
andps xmm0, xmm2
andnps xmm2, xmm1
orps xmm0, xmm2
pcmpgtd xmm5, xmm3
andps xmm3, xmm5
andnps xmm5, xmm1
orps xmm3, xmm5
.cond:
add ecx, 4
js .loop
这是查找整数之间的最大值/最小值的基本循环。 我的处理器是AMD K8。我无法计算圆柱数,但我可以比较一下,我的代码比没有使用SIMD的朋友慢。 我不明白为什么。这个循环不是最佳的吗?你看到了原因吗?
答案 0 :(得分:1)
K8只有64位执行单元,因此每128b指令被解码为2个m-ops。此外,即使地址对齐,movups
的m-op也比movaps
多。 (虽然根据Agner Fog的表格,它仍然与movaps
每2周期吞吐量相同。)
如果您在标量版本中使用了分支,并且min
和max
不经常更改,则分支预测可以使其运行得非常快。
这是SIMD必须做更多工作的情况之一,它实际上比标量慢。虽然这个SSE2版本实际上可能比具有全宽矢量单位的CPU上的标量更好,例如K10或Merom。 (或更新)
当然,使用SSE4.1 pmaxsd
/ pminsd
可以获得远更好的结果。