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

时间:2017-02-22 22:48:32

标签: memory concurrency io cpu dma

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

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

THX

2 个答案:

答案 0 :(得分:4)

简短的回答是“它很复杂,但在某些情况下,访问肯定会潜在并行发生”#34;。

我认为你的问题有点过于黑白:你可能正在寻找像#34;是的,多个设备可以在相同的时间访问内存"或者"不,他们不能,但实际情况是,首先你需要描述一些特定的硬件配置,包括一些低级实现细节和优化功能,以获得确切的答案。最后,你需要准确定义你的意思"同一时间"。

通常,良好的一阶近似是硬件会使出现所有硬件几乎可以同时访问内存,可能会增加延迟并因争用而减少带宽。在非常细粒度的定时级别访问一个设备可能确实推迟了另一个设备的访问,或者它可能不会,这取决于许多因素。您不太可能需要此信息来正确实现软件,并且您甚至不太可能需要了解详细信息以获得最佳性能。

那就是说,如果你真的需要知道细节,请继续阅读,我可以对某种理想化的latpop /桌面/服务器规模硬件进行一些一般性的观察。

正如马蒂亚斯所说,你首先要考虑缓存。缓存意味着任何受缓存的读取或写入操作(包括几乎所有CPU请求和许多其他类型的请求)都可能根本不接触存储器,因此从这个意义上说,许多核心可以“访问”#34;内存(至少是它的缓存图像)同时发生。

如果您再考虑所有缓存级别中的请求,则需要了解内存子系统的配置。一般来说,RAM芯片只能做一件事"一次(即命令 1 这样的读写适用于整个模块),并且通常扩展到由几个芯片组成的DRAM模块,也延伸到通过总线连接到一系列DRAM的一系列DRAM 单个内存控制器。

所以你可以说说话,一个内存控制器及其附加内存控制器的组合很可能只在的东西上做立刻。现在 thing 通常类似于从物理上连续的字节跨度读取字节,但该操作实际上可以帮助同时处理来自不同设备的多个请求:即使每个设备向控制器发送单独的请求,良好的实现将coalesce请求到相同或附近的 2 区域内存。

此外,即使CPU可能具备这样的能力:当新请求发生时,它可以/必须注意到重叠区域的现有请求正在进行中,并将新请求与旧请求联系起来。

但是,您可以说,对于单个内存控制器,您通常通常一次提供一个设备的请求,没有异常的机会来组合请求。现在请求本身通常是纳秒级,因此可以在很短的时间内提供许多单独的请求,因此这个"排他性"细粒度且通常不明显的 3

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

这是一个很长的答案。

事实上,命令流比“" read"或"写"并涉及诸如打开内存页面,从中传输字节等概念。What every programmer should know about memory是该主题的优秀介绍。

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

3 当然,如果您要跨多个设备竞争内存,整体影响可能非常明显:每设备带宽减少和延迟增加,但我的意思是共享的细微程度足以让您无法区分精细切片的独占访问和某些假设设备之间的区别,这些设备可以在每个时间段内对每个请求同时进行。

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

答案 1 :(得分:1)

有许多事情发挥作用。例如。在最低级别,有总线仲裁机制,允许多个参与者可以访问共享地址和数据总线。

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