Multithreading 在多核CPU上,两条指令真的可以同时执行吗

Multithreading 在多核CPU上,两条指令真的可以同时执行吗,multithreading,memory,parallel-processing,x86,computer-architecture,Multithreading,Memory,Parallel Processing,X86,Computer Architecture,假设x86多核PC体系结构 假设有2个内核(能够执行2个独立的指令流),CPU和RAM之间的接口是内存总线 在这样的机器上,调度在两个不同内核上的两条指令(访问一些内存)真的可以同时执行吗 我不是说两条指令访问同一个内存位置的情况。即使在2条指令访问完全不同的内存位置的情况下(也假设这些位置的内存内容不在任何缓存中),我认为CPU和RAM之间的单一内存总线(这是非常常见的)将导致总线仲裁电路序列化这2条指令: CPU0 CPU1 mov eax,[1000]

假设x86多核PC体系结构

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

在这样的机器上,调度在两个不同内核上的两条指令(访问一些内存)真的可以同时执行吗

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

CPU0               CPU1
mov eax,[1000]     mov ebx,[2000]
这是真的吗?如果是这样的话,如果您要运行的软件是多线程的,但是有很多内存访问,那么多核有什么好处?这些指令不都会在最后序列化吗


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

您需要检查一下x86体系结构的一些概念,以回答以下问题:

  • 推测性执行(和无序)
  • 加载存储缓冲区
  • MESI协议
  • 负载转发
  • 记忆障碍
  • 努马
基本上,我猜您的指令将完全并行执行,但内存中的结果将是线程的一个或另一个,选择将由MESI硬件决定

为了扩展答案,当您有多个流和单个数据()时,您需要期望序列化。请注意,如果您访问不同的内存地址,尤其是在NUMA系统上,这可以减轻

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

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

编辑有关锁的问题:
lock x86指令是关于刷新加载存储缓冲区的,以便其他内核可以查看指令管道中操作的当前值。这比RAM写入问题更接近CPU。LOCK允许内核不处理某些可变内容的本地视图,因为如果没有它,CPU会假定它只能考虑一个线程的任何优化,这意味着它通常会将所有内容都保存在寄存器中,而不依赖缓存。当你考虑<代码>加载FoWaldA//>,或者更精确地称为“代码>存储”来加载转发< /代码>时,它可以稍微超前。你的标题就有一个明显的答案。你把锁和内存顺序与内存延迟混淆了。排序意味着您只有一个观察时间或排序点,内存延迟仍然很长,因此多个访问(来自多个核心,甚至单个核心)可以重叠以节省时间。当然,如果所有人都访问同一个DRAM,您将不得不使用内存控制器在总线上以某种方式订购它们,但这仍然比每时每刻都挂起一个请求要高效得多。感谢您提供了非常有见地的答案!你提到的关键词是…你提到的关键词帮助我在谷歌上很好地研究这个话题!