每个指令的周期 - 汇编中的一行代码是否与cpi操作不同?

Ped*_*ino 0 performance x86 assembly

想象一下,你有两个装配说明:

movl $10, %ecx
movl 0(%eax), %edx
Run Code Online (Sandbox Code Playgroud)

移动的CPI为1,内存的CPI为2.

对于第一行CPI = 1.对于第二行,CPI = 2还是3?我们总结进入内存(2个周期)+移动成本,还是只考虑对内存的访问?

Dar*_*zka 5

自Pentium 4上市以来,循环计数已不再适用.深度管道,三级内存缓存层次结构,多个执行单元,无序执行,分支预测......

通常可以很好地猜测更大的代码的时间,但是对于两个独立的指令,实际上是不可能的(除非一个指令恰好是DIV或IDIV,否则我们知道它一定是坏的).上下文很重要,因为依赖链起着重要的作用(关键路径).

在实际代码中,如果它们在某些其他指令的延迟阴影中执行,那么您的两条指令可能对总时序没有任何贡献.另一方面,如果EAX解决的值不在任何缓存中,那么它需要花费数百个周期,如果数据必须从磁盘中分页,则需要花费数千个...

当前的英特尔®64和IA-32架构优化参考手册包含您需要的所有内容.它包含大多数指令的循环计数(延迟和吞吐量)表,以及几百页解释为什么简单的循环计数不起作用.

  • 不,它不会.它可能会花费你没有任何周期,或几十,或几千.您可以在两条指令旁边写下数字**4.5**但它完全没有意义,与代码的实际运行时行为完全无关.此外,CPU之间的数字差别很大. (2认同)