我检查uops表(https://uops.info/table.html),发现jmp rel8
的TP远大于jmp rel32
。这是否意味着jmp rel8
比jmp 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
1条答案
按热度按时间unhi4e5o1#
这不是一个非常有代表性的测量。对于采用的分支,每2个周期一个吞吐量是正常的,或者对于微小循环中的循环分支,每时钟1个吞吐量是正常的。但是,根据微体系结构的不同,每个16字节代码块有更多的分支,分支预测的效果可能会更差,因此打包
jmp next_instruction
(jmp 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,要高得多,你希望只有在人工微基准测试中才会遇到这种情况。