Gra*_*ate 6 performance x86 assembly micro-optimization
这些加载指令之间的性能有差异吗mov?与简单的寻址模式相比,更复杂的寻址模式是否有额外的开销(延迟或吞吐量)?
# AT&T syntax # Intel syntax:
movq (%rsi), %rax mov rax, [rsi]
movq (%rdi, %rsi), %rax mov rax, [rdi + rsi]
movq (%rdi, %rsi, 4), %rax mov rax, [rdi + rsi*4]
Run Code Online (Sandbox Code Playgroud)
取决于具体的CPU;大多数情况下“不,没有额外的开销”。然而...
大多数 CPU 都有无序内核,这意味着它们以最快的顺序执行指令,而不是按照给出指令的顺序。为此,一条指令(例如)在它所依赖的事情完成(例如和中的值已知)movq (%rdi, %rsi, 4), %rax之前不会发生。rdirsi
例如,这两条指令可以并行发生(因为第二条指令不依赖于第一条指令):
movq (%rdi), %edi
movq (%rsi), %rax
Run Code Online (Sandbox Code Playgroud)
并且这两条指令不能并行发生(第二条指令必须等到第一条指令完成):
movq (%rdi), %rdi
movq (%rdi, %rsi), %rax
Run Code Online (Sandbox Code Playgroud)
另请注意,一段代码的瓶颈可能不是执行。如果瓶颈是取指令,那么较大的指令会更糟;如果瓶颈是指令解码,那么更复杂的指令可能会更糟;如果瓶颈是数据缓存带宽,那么任何读/写内存的操作都会变得更糟,等等。
基本上; 您不能孤立地查看各个指令并决定它们是否更好/更差。您必须查看多个指令的整个序列,以便了解对先前指令的任何依赖性(及其延迟);并且您必须知道瓶颈是什么(例如通过性能监控工具);如果您了解所有这些,那么您可以做出“有根据的猜测”,该猜测仅对少数 CPU 真正有用(因为不同的 CPU 有不同的特性)。
| 归档时间: |
|
| 查看次数: |
1445 次 |
| 最近记录: |