【问题标题】:Performance of modern processor现代处理器的性能
【发布时间】: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 BoostAMD C1E SupportAMD K8 Cool&Quiet Control 时,我的“六条指令”的消耗稳定在 3 个时钟节拍 :-)

【问题讨论】:

  • 您在寻找吞吐量还是延迟?我们可以假设一切都在 L1 缓存中吗? L2?内存? RAM 有多快?
  • 正如 Dietrich 所暗示的,差异几乎肯定与数据的位置有关。当循环运行最快时,数据已经在 L1 缓存中,当它运行最慢时,数据必须从较慢的内存中引入。
  • 你如何测量每次迭代的这些刻度?您只是在现代窗口多任务操作系统下运行代码并测量执行大量迭代所需的时间? (而且我暗示现在尝试运行基准测试并期望它具有任何准确性是毫无意义的。)
  • 你确定 CPU 一直在 3.2 GHz 运行吗?

标签: performance assembly x86-64 amd-processor


【解决方案1】:

我不会尝试肯定地回答运行每次迭代需要多少个周期(3 或 10 个),但我会解释如何可能每次获得 3 个周期迭代。

(请注意,这是针对一般处理器的,我没有针对 AMD 处理器做任何参考。)

关键概念:

当今大多数现代(非嵌入式)处理器都是超标量和无序的。不仅可以并行执行多条(独立)指令,还可以重新排序指令以打破依赖关系等。

让我们分解你的例子:

label:
    mov (%rsi), %rax
    adc %rax, (%rdx)
    lea 8(%rdx), %rdx
    lea 8(%rsi), %rsi
    dec %ecx
    jnz label

首先要注意的是分支前的最后3条指令都是独立的:

    lea 8(%rdx), %rdx
    lea 8(%rsi), %rsi
    dec %ecx

因此,处理器可以并行执行所有这 3 个操作。

另一件事是这样的:

adc %rax, (%rdx)
lea 8(%rdx), %rdx

似乎存在对rdx 的依赖,这会阻止两者并行运行。但实际上,这是错误的依赖,因为第二条指令实际上并没有 取决于第一条指令的输出。现代处理器能够重命名rdx 寄存器,以允许这两条指令重新排序或并行执行。

同样适用于rsi 之间的寄存器:

mov (%rsi), %rax
lea 8(%rsi), %rsi

因此,最终,3 个周期(可能)可实现如下(这只是几种可能的顺序之一):

1:   mov (%rsi), %rax        lea 8(%rdx), %rdx        lea 8(%rsi), %rsi
2:   adc %rax, (%rdx)        dec %ecx
3:   jnz label

*当然,为了简单起见,我将事情过度简化了。实际上,延迟可能更长,并且循环的不同迭代之间存在重叠。

无论如何,这可以解释如何获得 3 个周期。至于为什么有时会出现 10 个周期,可能有很多原因:分支错误预测、一些随机管道泡沫......

【讨论】:

  • 我忘了提到一个有趣的事实,即“周期数”在 OS 进程执行中没有变化,因为处理器在任务开始时实际上选择了“速度”。查看两个实际的后续执行(我对问题的评论中的测量代码在循环中重复了 20 次):pastie.org/3094509
  • 这绝对是一个有趣的结果——如果不知道处理器未经审查的核心细节,就很难解释。 (我不知道)但正如我所提到的,有很多因素可能会使其不太理想。 (在某些 Intel 上,将 adc/subinc/dec 混合会导致一些非常糟糕的停顿……但在 AMD 上不确定。)
  • 啊...所以它需要额外运行以使 CPU 退出省电模式... :)
【解决方案2】:

在英特尔,Dr. David Levinthal's "Performance Analysis Guide" 非常详细地调查了这些问题的答案。

【讨论】:

    猜你喜欢
    • 2012-01-15
    • 2018-09-10
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    • 2014-06-10
    • 2010-12-23
    相关资源
    最近更新 更多