假设x86多核PC架构...
假设有 2 个内核(能够执行 2 个独立的指令流),CPU 和 RAM 之间的接口是内存总线。
在这样的机器上,调度在 2 个不同内核上的 2 条指令(访问某些内存)真的可以“同时”执行吗? 我不是在谈论两条指令访问同一内存位置的情况。即使在 2 条指令访问完全不同的内存位置的情况下(并且还假设这些位置的内存内容不在任何缓存中),我认为位于 CPU 和 RAM 之间的单个内存总线(很常见)会导致这两条指令被总线仲裁电路串行化:
CPU0 CPU1
mov eax,[1000] mov ebx,[2000]
这是真的吗?如果是这样,如果您要运行的软件是多线程但有大量内存访问,那么拥有多个内核的优势是什么?这些指令最后不都连载了吗?
此外,如果这是真的,那么 x86 中用于使内存访问指令原子化的
LOCK
前缀有什么意义呢?
投机执行(并且无序)
为了扩展答案,当您有多个流和单个数据时(
http://en.wikipedia.org/wiki/MISD),您需要期待序列化。请注意,如果您访问不同的内存地址,尤其是在 NUMA 系统上,这种情况可以得到缓解。 Opterons 和新 i7 具有 NUMA 硬件,但操作系统需要激活它们,并且默认情况下不会激活它们。如果你有NUMA,你可以利用一根总线的优势将一个核心连接到一个内存区域。然而,核心必须是该区域的所有者,如果核心自己分配了其区域,则应验证这一点。
在所有其他硬件中都会存在序列化,但如果内存地址不同,由于存储缓冲区和 L2 中间缓存,它们不会影响写入性能(写入结束前无需等待)。 L2 内容稍后提交到 RAM,L2 是由核心执行的,因此会发生序列化,但不会妨碍可以继续继续执行的 CPU 指令。
编辑有关锁定问题: lock x86 指令是关于刷新加载存储缓冲区,以便其他内核可以获得指令管道中操作的当前值的可见性。这比RAM写入问题更接近CPU。 LOCK 允许内核不处理某些变量内容的本地视图,因为如果没有它,CPU 就会假设它只能考虑一个线程进行任何优化,这意味着它通常会将所有内容保存在寄存器中而不依赖于缓存。当你考虑
load fowarding
,或者更准确地说是
store to load forwarding
时,它可以稍微提前一点。