寻找最小/最大优化

时间:2016-06-05 17:24:06

标签: optimization x86

.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的朋友慢。 我不明白为什么。这个循环不是最佳的吗?你看到了原因吗?

1 个答案:

答案 0 :(得分:1)

K8只有64位执行单元,因此每128b指令被解码为2个m-ops。此外,即使地址对齐,movups的m-op也比movaps多。 (虽然根据Agner Fog的表格,它仍然与movaps每2周期吞吐量相同。)

如果您在标量版本中使用了分支,并且minmax不经常更改,则分支预测可以使其运行得非常快。

这是SIMD必须做更多工作的情况之一,它实际上比标量慢。虽然这个SSE2版本实际上可能比具有全宽矢量单位的CPU上的标量更好,例如K10或Merom。 (或更新)

当然,使用SSE4.1 pmaxsd / pminsd可以获得更好的结果。