Multithreading 在多核CPU上,两条指令真的可以同时执行吗
假设x86多核PC体系结构 假设有2个内核(能够执行2个独立的指令流),CPU和RAM之间的接口是内存总线 在这样的机器上,调度在两个不同内核上的两条指令(访问一些内存)真的可以同时执行吗 我不是说两条指令访问同一个内存位置的情况。即使在2条指令访问完全不同的内存位置的情况下(也假设这些位置的内存内容不在任何缓存中),我认为CPU和RAM之间的单一内存总线(这是非常常见的)将导致总线仲裁电路序列化这2条指令: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]
CPU0 CPU1
mov eax,[1000] mov ebx,[2000]
这是真的吗?如果是这样的话,如果您要运行的软件是多线程的,但是有很多内存访问,那么多核有什么好处?这些指令不都会在最后序列化吗
另外,如果这是真的,那么x86中用于使内存访问指令原子化的
锁
前缀有什么意义 您需要检查一下x86体系结构的一些概念,以回答以下问题:
- 推测性执行(和无序)
- 加载存储缓冲区
- MESI协议
- 负载转发
- 记忆障碍
- 努马
lock x86指令是关于刷新加载存储缓冲区的,以便其他内核可以查看指令管道中操作的当前值。这比RAM写入问题更接近CPU。LOCK允许内核不处理某些可变内容的本地视图,因为如果没有它,CPU会假定它只能考虑一个线程的任何优化,这意味着它通常会将所有内容都保存在寄存器中,而不依赖缓存。当你考虑<代码>加载FoWaldA//>,或者更精确地称为“代码>存储”来加载转发< /代码>时,它可以稍微超前。你的标题就有一个明显的答案。你把锁和内存顺序与内存延迟混淆了。排序意味着您只有一个观察时间或排序点,内存延迟仍然很长,因此多个访问(来自多个核心,甚至单个核心)可以重叠以节省时间。当然,如果所有人都访问同一个DRAM,您将不得不使用内存控制器在总线上以某种方式订购它们,但这仍然比每时每刻都挂起一个请求要高效得多。感谢您提供了非常有见地的答案!你提到的关键词是…你提到的关键词帮助我在谷歌上很好地研究这个话题!