assembly 程序集`jmp rel8`与`jmp rel32`的性能

f0brbegy  于 2023-06-06  发布在  其他
关注(0)|答案(1)|浏览(164)

我检查了uops表(https://uops.info/table.html),发现jmp rel8TP远远大于jmp rel32。这是否意味着jmp rel8jmp rel32慢?

jmp rel32

With unroll_count=500 and no inner loop

    Code:

       0:   e9 00 00 00 00          jmp    0x5

    Show nanoBench command
    Results:
        Instructions retired: 1.0
        Core cycles: 2.75
        Reference cycles: 2.05

jmp rel8

With unroll_count=500 and no inner loop

    Code:

       0:   eb 00                   jmp    0x2

    Show nanoBench command
    Results:
        Instructions retired: 1.0
        Core cycles: 5.84
        Reference cycles: 4.61
kq0g1dla

kq0g1dla1#

这不是一个非常有代表性的测量。对于采用的分支,每2个周期一个吞吐量是正常的,或者对于微小循环中的循环分支,每时钟1个吞吐量是正常的。但是,根据微体系结构的不同,每个16字节代码块有更多的分支,分支预测的效果可能会更差,因此打包jmp next_instructionjmp rel8=0)是不好的。(特别是当你把500个放在一排时,比如Slow jmp-instruction
那个5.84的数字看起来像桤木湖的P核。他们为其他的教区长提出了不同的数字;对于这种低级的东西,你看哪种体系结构很重要。
无论如何,我认为这里的关键点是https://uops.info/并没有很好地基准测试taken jumps;他们使用与其他指令相同的测试工具(展开很多次),导致不好的结果,不能很好地表征它。
Agner Fog的指令表报告不同的数字(https://agner.org/optimize/),例如Skylake和Ice Lake上相对jmp的1-2周期吞吐量,与大多数早期Intel相同。如果你在一个循环中有跳转,这是现实的,所以它是按顺序执行的 * 相同 * 的几个跳转指令。
但是uops.info测得Skylake的温度为2.12c或4.80c,要高得多,你希望只有在人工微基准测试中才会遇到这种情况。

相关问题