2个指令可以在多核CPU上真正同时发生

时间:2014-03-19 05:18:14

标签: multithreading memory parallel-processing x86 computer-architecture

假设x86多核PC架构......

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

在这样的机器上,2个不同核心上安排的2条指令(访问某些内存)是否真的同时

我不是在谈论2条指令访问同一内存位置的情况。即使在2条指令访问完全不同的内存位置的情况下(并且还假设这些位置的内存内容不在任何缓存中),我认为单个内存总线位于CPU和RAM之间(非常常见)会导致这两条指令被总线仲裁电路序列化:

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

这是真的吗?如果是这样,如果您将运行的软件是多线程但具有大量内存访问权限,那么拥有多个内核的优势是什么?这些说明不会在最后被序列化吗?

另外,如果这是真的,那么x86中用于使内存访问指令原子的LOCK前缀是什么意思?

1 个答案:

答案 0 :(得分:2)

您需要检查x86架构的一些概念来回答这个问题:

  • 投机执行(和乱序)
  • 加载存储缓冲区
  • MESI协议
  • load forwarding
  • 记忆障碍
  • NUMA
基本上,我的猜测是你的指令将完全并行执行,但内存中的结果将是一个或另一个线程,选举将由MESI硬件决定。

要扩展答案,当您有多个流和单个数据(http://en.wikipedia.org/wiki/MISD)时,您需要预期序列化。请注意,如果您访问不同的内存地址,尤其是在NUMA系统上,则可以减轻这种情况。

Opterons和新的i7有NUMA硬件,但操作系统需要激活它们,而不是默认情况下。如果你有NUMA,你可以利用一条总线的优势将一个核心连接到一个内存区域。但是核心必须是该区域的所有者,如果核心分配了其区域本身,则应对其进行验证。

在所有其他硬件中都会有序列化,但是如果内存地址不同,由于存储缓冲区和L2中间缓存,它们不会妨碍写入性能(在写入结束前不等待)。 L2内容稍后提交到RAM,L2由内核提交,因此序列化发生但不会阻碍可以继续执行的CPU指令。

关于LOCK问题的编辑: lock x86指令是关于刷新加载存储缓冲区,以便其他内核可以获得对指令管道中操作的当前值的可见性。这比RAM写入问题更接近CPU。 LOCK允许内核不在其某些变量内容的本地视图上工作,因为没有它,CPU假定任何优化它只能考虑一个线程,这意味着它通常会将所有内容保存在寄存器中而不依赖于缓存。当您考虑load fowarding或更精确地称为store to load forwarding时,它可以略微超前。