多核架构中的 CPU 和内存访问

CPUs in multi-core architectures and memory access

我想知道如何处理内存访问 "in general" 例如,如果 CPU 的 2 个核心尝试同时访问内存(通过内存控制器)?实际上,当核心和启用 DMA 的 IO 设备尝试以相同方式访问时,同样适用。

,内存控制器足够聪明,可以利用地址总线并同时处理这些请求,但是我不确定当它们尝试访问同一位置或 IO 操作独占时会发生什么地址总线,CPU 没有空间继续前进。

感谢

有很多东西在起作用。例如。在最底层有总线仲裁机制,允许多个参与者访问共享地址和数据总线。

在更高的层次上,还有像 CPU 缓存这样的事情需要考虑:如果 CPU 从内存中读取它可能只从它的本地缓存中读取,这可能不会反映存在于另一个 CPU 核心本地缓存中的状态。为了在多核系统中同步缓存实例之间的内存,存在在 CPU 中实现的缓存一致性协议。这些必须保证,如果一个 CPU 写入共享内存,则所有其他 CPU 的缓存(可能还包含内存位置内容的副本)得到更新。

简短的回答是 "it's complex, but access can certainly potentially occur in parallel in certain situations"。

我认为您的问题有点过于黑白分明:您可能正在寻找 "yes, multiple devices can access memory at the same time" 或 "no they can't" 之类的答案,但实际情况是您首先需要描述一些具体的硬件配置,包括一些底层的实现细节和优化特性,才能得到准确的答案。最后,您需要准确定义 "the same time".

的含义

一般来说,一个很好的一阶近似是硬件会让看起来所有硬件几乎可以同时访问内存,可能会增加延迟并减少争用导致的带宽。在非常细粒度的时间级别上,访问一个设备可能确实会延迟另一个设备的访问,也可能不会,这取决于许多因素。您极不可能需要这些信息来正确地实施软件,而且您也不太可能需要了解详细信息以最大限度地提高性能。

就是说,如果您真的需要了解详细信息,请继续阅读,我可以对某种理想化的 latpop/desktop/server 秤硬件给出一些一般性观察。

正如 Matthias 提到的,您首先必须考虑缓存。缓存意味着任何受缓存影响的读取或写入操作(包括几乎所有 CPU 请求和许多其他类型的请求)可能根本不会触及内存,因此从这个意义上讲,许多内核可以 "access"内存(至少它的缓存图像)同时。

如果您随后考虑未命中所有缓存级别的请求,则需要了解内存子系统的配置。通常,RAM 芯片一次只能执行 "one thing"(即,命令1 这样的读写适用于整个模块)并且通常扩展到包含的 DRAM 模块几个芯片以及通过总线连接到 单个 内存控制器的一系列 DRAM。

所以你可以说电气来说,一个内存控制器及其附属RAM的组合很可能只在事情一次。现在 thing 通常类似于从物理上连续的字节范围中读取字节,但该操作实际上可以帮助同时处理来自不同设备的多个请求:即使每个设备发送单独的请求对于控制器,良好的实现将 coalesce 请求相同或附近的 2 内存区域。

此外,甚至 CPU 也可能有这样的能力:当一个新的请求出现时,它 can/must 注意到一个现有的请求正在进行重叠区域,并将新请求与旧请求联系起来一.

不过,您可以说,对于单个内存控制器,您通常一次服务一个设备的请求,没有不寻常的组合请求的机会。现在请求本身通常是纳秒级的,所以可以在一个小的时间单位内处理许多单独的请求,所以这个 "exclusiveness" 细粒度并且通常不会引起注意3.

上面我小心地将讨论限制在单个内存控制器上——当你有多个内存控制器时4你绝对可以让多个设备同时访问内存,即使在内存级别。这里每个控制器基本上都是独立的,因此如果来自两个设备的请求映射到不同的控制器(不同的 NUMA 区域),它们可以并行处理。

答案很长。


1 其实command stream比"read"或"write"更底层更复杂,涉及开内存等概念页面,其中的流字节等。What every programmer should know about memory 是对该主题的精彩介绍。

2 例如,想象两个对内存中相邻字节的请求:如果它们适合总线宽度,控制器可以将它们组合成一个请求。

3 当然,如果你在多个设备之间竞争内存,整体影响可能会非常明显:每台设备带宽减少,延迟增加,但我的意思是共享的粒度足够细,以至于您通常无法区分精细切片的独占访问和一些假设的设备,这些设备在每个周期的每个请求上同时取得进展。

4 现代硬件上最常见的配置是每个插槽一个内存控制器,因此在 2P 系统上你通常有两个控制器,还有其他配置(更高和更高)更低)当然是可能的。