gpt4 book ai didi

multithreading - 多核 CPU 上能否真正同时执行 2 条指令

转载 作者:行者123 更新时间:2023-12-04 06:48:56 26 4
gpt4 key购买 nike

假设 x86 多核 PC 架构...

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

调度在 2 个不同内核上的 2 条指令(访问一些内存)真的可以是 同步 在这样的机器上?

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

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

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

此外,如果这是真的,那么 LOCK 的意义何在? x86中用于使内存访问指令原子化的前缀?

最佳答案

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

  • 推测性执行(和无序)
  • 加载存储缓冲区
  • MESI协议(protocol)
  • 负载转发
  • 内存屏障
  • NUMA

  • 基本上,我的猜测是您的指令将绝对并行执行,但内存中的结果将是线程中的一个或另一个,并且选举将由 MESI 硬件决定。

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

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

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

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

    关于multithreading - 多核 CPU 上能否真正同时执行 2 条指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22496879/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com