多核CPU上2条指令可以真正同时执行吗

问题描述 投票:0回答:1

假设x86多核PC架构...

假设有 2 个内核(能够执行 2 个独立的指令流),CPU 和 RAM 之间的接口是内存总线。

在这样的机器上,调度在 2 个不同内核上的 2 条指令(访问某些内存)真的可以“同时”执行吗? 我不是在谈论两条指令访问同一内存位置的情况。即使在 2 条指令访问完全不同的内存位置的情况下(并且还假设这些位置的内存内容不在任何缓存中),我认为位于 CPU 和 RAM 之间的单个内存总线(很常见)会导致这两条指令被总线仲裁电路串行化:

CPU0 CPU1 mov eax,[1000] mov ebx,[2000]

这是真的吗?如果是这样,如果您要运行的软件是多线程但有大量内存访问,那么拥有多个内核的优势是什么?这些指令最后不都连载了吗?

此外,如果这是真的,那么 x86 中用于使内存访问指令原子化的

LOCK

前缀有什么意义呢?

    

memory parallel-processing x86 cpu-architecture superscalar
1个回答
3
投票

投机执行(并且无序)
  • 加载存储缓冲区
  • MESI协议
  • 负载转发
  • 记忆障碍
  • NUMA
  • 基本上,我的猜测是你的指令将绝对并行执行,但内存中的结果将是线程中的一个或另一个,并且选择将由 MESI 硬件决定。

为了扩展答案,当您有多个流和单个数据时(

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
时,它可以稍微提前一点。
    

© www.soinside.com 2019 - 2024. All rights reserved.