CPU 寄存器的内容多久更改一次?

How often do the contents of a CPU register change?

CPU 注册的数据是否经常变化? Wikipedia article 将寄存器描述为“ 一个快速访问的位置......少量快速存储”。我假设内存很快,因为经常访问和修改寄存器?

自现代 CPU 以 GHz 为单位的 运行 以来,CPU 寄存器每秒可以更改它们存储的内容数亿次甚至数十亿次。

由于大多数现代 CPU 有大约 128 个寄存器,它们通常会在执行许多操作时每秒更改几百万次值。

是的,数据寄存器可能会在后续指令中发生变化,这很常见。超标量、乱序执行、流水线操作、寄存器重命名等使分析变得复杂,但即使在简单的有序 CPU 上,寄存器也可以每条指令更改一次。一个合理的程序可能有 运行 条指令,所有指令都影响同一个寄存器:

// Type your code here, or load an example.
int polynom(int num) {
    return num * num + 2 * num + 1;
}

编译为:

polynom(int):
        push    rbp
        mov     rbp, rsp
        mov     DWORD PTR [rbp-4], edi
      * mov     eax, DWORD PTR [rbp-4]
      * imul    eax, eax
      * mov     edx, DWORD PTR [rbp-4]
        add     edx, edx
      * add     eax, edx
      * add     eax, 1
        pop     rbp
        ret

注意对 eax 寄存器的多次写入,用星号标注。在这个小函数中,五个几乎连续的指令写入这个特定的寄存器,这意味着我们可以预期程序可见状态 eax1 如果要在紧密循环中调用此代码,则以超过 1 GHz 的速率变化。

更基本的一点是,有些架构寄存器几乎总是在每条指令上发生变化。其中最明显的是程序计数器(在许多情况下称为 PC,在 x86 上称为 EIP,在 x86_64 上称为 RIP)。因为这个寄存器指向当前正在执行的指令,所以它肯定会随着每条指令而改变,除非像 x86 REP 编码这样的反例或简单地跳转到自身的指令。

1 同样,除了寄存器重命名等架构方面的考虑,它使用多个物理寄存器来实现单个逻辑的、程序可见的寄存器。