gpt4 book ai didi

现代处理器的性能

转载 作者:行者123 更新时间:2023-12-01 19:24:07 26 4
gpt4 key购买 nike

在现代处理器 (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 个时钟周期:-)

最佳答案

我不会尝试确切地回答每次迭代运行需要多少个周期(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

因此处理器可以并行执行这三个任务。

另一件事是这样的:

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 个周期,可能有很多原因:分支预测错误、一些随机管道气泡......

关于现代处理器的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8674302/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com