为什么循环指令慢?英特尔不能有效地实现它吗?

环(英特尔参考文献人工输入)ECX/RCX递减,如果非零。虽然速度很慢,但英特尔不能便宜地让它跑得更快吗?dec/jnz已经宏熔断为单个uop。在沙桥家族;唯一的区别是设置旗子。

loop在不同的微体系结构上阿格纳·福格(氏)指令表:

  • K8/K10:7m-OPS
  • 推土机-家庭/Ryzen:1mop(与宏融合测试和分支相同的成本,或jecxz)

  • P4:4 OOPS(同jecxz)

  • P6(PII/PIII):8 OOPS
  • 奔腾M,核心2:11 uops
  • Nehalem:6 uops。(11)

    loope / loopne

    )。吞吐量=4c(

    loop

    )或7c(

    loope/ne).

  • SNB-家庭

    *7英尺。(11)

    loope / loopne). 吞吐量=每5个周期一个

    ,就像将循环计数器保存在内存中一样是一个瓶颈!

    jecxz

    只有两个uop具有与常规的相同的吞吐量。

    jcc

  • 西尔佛蒙特:7乌普
  • AMD捷豹(低功耗):8 uops,5c吞吐量
  • 通过Nano 3000:2 uops

难道解码器不能像lea rcx, [rcx-1] / jrcxz?那将是3次。至少在没有地址大小前缀的情况下,它必须使用ecx截断RIPEIP如果跳下去了;也许控制减幅的地址大小的奇怪选择解释了为什么会有这么多uop?

或者更好的是,把它解码成一个不设置标志的融合的分叉?dec ecx / jnz在SNB上,解码为单个uop(它确实设置了标志)。

我知道真正的代码不使用它(因为它一直缓慢从至少P5或什么),但AMD认为这是值得的,使它快速推土机。可能是因为这很容易。


  • 对于SNB家族的人来说,拥有快速的生活是件容易的事吗?loop?如果是的话,他们为什么不呢?如果不是,为什么会很难呢?很多解码器晶体管?或者在一个融合的Dec&分支uop中额外的位来记录它没有设置标志?那七个人能做什么?这是一个非常简单的指示。

  • 开快车的推土机有什么特别之处?loop容易/值得吗?或者AMD在制造过程中浪费了一堆晶体管loop快地?如果是这样的话,大概有人认为这是个好主意。


如果loop太快了,这将是完美的BigInteger任意精度adc循环,以避免部分旗档/减速。(请参阅我对我的答案的评论),或任何其他情况下,您想要在不接触标志的情况下循环。与代码大小相比,它还具有较小的代码大小优势。dec/jnz。(和dec/jnz只有宏观保险丝对SNB-家庭)。

关于现代CPUdec/jnz在ADC循环中没问题,loop对于ADCX/ADOX循环(保留)来说还是不错的。

如果loop如果是快速的,编译器将已经使用它作为一个窥视孔优化的代码大小+速度上的CPU,没有宏融合。


它也无法阻止我对所有使用错误16位代码的问题感到恼火loop对于每个循环,即使当它们还需要在循环中另一个计数器时。但至少不会坏的。


一只名叫tom的猫
浏览 687回答 3
3回答
打开App,查看更多内容
随时随地看视频慕课网APP