假设x86多核PC架构......
假设有2个内核(能够执行2个独立的指令流),并且CPU和RAM之间的接口是内存总线。
在这样的机器上,2个不同核心上安排的2条指令(访问某些内存)是否真的同时?
我不是在谈论2条指令访问同一内存位置的情况。即使在2条指令访问完全不同的内存位置的情况下(并且还假设这些位置的内存内容不在任何缓存中),我认为单个内存总线位于CPU和RAM之间(非常常见)会导致这两条指令被总线仲裁电路序列化:
CPU0 CPU1
mov eax,[1000] mov ebx,[2000]
这是真的吗?如果是这样,如果您将运行的软件是多线程但具有大量内存访问权限,那么拥有多个内核的优势是什么?这些说明不会在最后被序列化吗?
另外,如果这是真的,那么x86中用于使内存访问指令原子的LOCK
前缀是什么意思?
答案 0 :(得分:2)
您需要检查x86架构的一些概念来回答这个问题:
要扩展答案,当您有多个流和单个数据(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
时,它可以略微超前。