【发布时间】:2011-12-29 22:36:18
【问题描述】:
在现代处理器 (AMD Phenom II 1090T) 上执行时,以下代码更可能消耗多少时钟滴答:3 还是 11?
label: mov (%rsi), %rax
adc %rax, (%rdx)
lea 8(%rdx), %rdx
lea 8(%rsi), %rsi
dec %ecx
jnz label
问题是,当我对此类代码执行多次迭代时,每次迭代的结果不时变化接近 3 或 11 个滴答声。而且我无法决定“谁是谁”。
UPD 根据Table of instruction latencies (PDF) 的说法,我的一段代码在 AMD K10 微架构上至少需要 10 个时钟周期。因此,每次迭代不可能有 3 个滴答,这是由测量中的错误引起的。
已解决
@Atom 注意到,现代处理器中的循环频率不是恒定的。当我在 BIOS 中禁用三个选项 - Core Performance Boost、AMD C1E Support 和 AMD K8 Cool&Quiet Control 时,我的“六条指令”的消耗稳定在 3 个时钟节拍 :-)
【问题讨论】:
-
您在寻找吞吐量还是延迟?我们可以假设一切都在 L1 缓存中吗? L2?内存? RAM 有多快?
-
正如 Dietrich 所暗示的,差异几乎肯定与数据的位置有关。当循环运行最快时,数据已经在 L1 缓存中,当它运行最慢时,数据必须从较慢的内存中引入。
-
你如何测量每次迭代的这些刻度?您只是在现代窗口多任务操作系统下运行代码并测量执行大量迭代所需的时间? (而且我暗示现在尝试运行基准测试并期望它具有任何准确性是毫无意义的。)
-
你确定 CPU 一直在 3.2 GHz 运行吗?
标签: performance assembly x86-64 amd-processor