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
寄存器的多次写入,用星号标注。在这个小函数中,五个几乎连续的指令写入这个特定的寄存器,这意味着我们可以预期程序可见状态 eax
1 如果要在紧密循环中调用此代码,则以超过 1 GHz 的速率变化。
更基本的一点是,有些架构寄存器几乎总是在每条指令上发生变化。其中最明显的是程序计数器(在许多情况下称为 PC,在 x86 上称为 EIP
,在 x86_64 上称为 RIP
)。因为这个寄存器指向当前正在执行的指令,所以它肯定会随着每条指令而改变,除非像 x86 REP 编码这样的反例或简单地跳转到自身的指令。
1 同样,除了寄存器重命名等架构方面的考虑,它使用多个物理寄存器来实现单个逻辑的、程序可见的寄存器。
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
寄存器的多次写入,用星号标注。在这个小函数中,五个几乎连续的指令写入这个特定的寄存器,这意味着我们可以预期程序可见状态 eax
1 如果要在紧密循环中调用此代码,则以超过 1 GHz 的速率变化。
更基本的一点是,有些架构寄存器几乎总是在每条指令上发生变化。其中最明显的是程序计数器(在许多情况下称为 PC,在 x86 上称为 EIP
,在 x86_64 上称为 RIP
)。因为这个寄存器指向当前正在执行的指令,所以它肯定会随着每条指令而改变,除非像 x86 REP 编码这样的反例或简单地跳转到自身的指令。
1 同样,除了寄存器重命名等架构方面的考虑,它使用多个物理寄存器来实现单个逻辑的、程序可见的寄存器。