多个CPU /内核可以同时访问同一RAM吗?


15

这是会发生的:

  1. 如果两个内核试图访问RAM中的相同地址,则一个内核必须等待另一个内核访问RAM。在第二时间,每个核心将尝试访问相同的地址,他们仍然可能有RAM缓存,这样他们就可以访问各自的同时缓存

  2. 如果两个内核试图访问同一RAM中的不同地址,则一个内核必须等待另一个内核访问RAM。

换句话说,我想对于RAM密集型编程任务来说,多处理将无济于事,除非它涉及每个内核多次从RAM中的同一地址读取数据。

那么,多个CPU /内核可以同时访问同一个RAM,还是我所说的正确?


我无法说出您所指的硬件级别,但是我可以说ram密集型任务可以通过简单地划分用法来实现多处理。也就是说,如果您需要处理的RAM中有500mb的数据,则将250mb的数据/ ram分配给一个proc,将250mb的数据分配给另一个proc,则实际上使您吞吐量增加了一倍(不受ram带宽限制)。除了硬件是否可以做到之外,让多个处理器访问相同的内存地址确实是一个坏主意,大多数多过程代码都在尽力避免这种情况。
Jimmy Hoffa 2013年

1
@JimmyHoffa但是RAM带宽限制恰恰是他在说的(假设任务是内存绑定的)。

@Jimmy我看不到两个处理器尝试从同一RAM地址读取的任何问题。如果他们尝试同时写信给我,我只会看到一个问题。
失落的霍比特人2013年

1
在我以前使用过的特定多核处理器上,内核不“知道”其本地缓存之外的任何内容。在指定数量的处理器周期内,透明地完成了与共享缓存同步所需的工作;程序员愿意考虑这一点,只需nop在其汇编代码中手动添加所需的s即可
gnat 2013年

2
简短的答案:取决于您的系统总线体系结构,缓存一致性协议,DDR控制器中的端口数和DDR控制器数。详细的答案在系统的数据表中。
SK-logic

Answers:


11

简介:如果只进行内存访问,则单个内核通常有可能使内存总线饱和。

如果您建立了计算机的内存带宽,则应该能够看到单线程进程是否可以真正实现这一目标,如果不能,那么有效带宽的使用如何随处理器数量的增加而扩展。


详细信息将取决于您使用的体系结构。假设类似现代的SMP和SDRAM:

  1. 如果两个内核试图访问RAM中的相同地址...

    可以采取几种方式:

    • 他们俩都想同时阅读:

      • 同一芯片上的两个内核可能会共享某个级别(2或3)的中间缓存,因此读取将仅执行一次。在现代架构上,每个内核都可能能够继续从一个或多个管线执行µ-op,直到缓存行准备就绪
      • 不同芯片上的两个内核可能不会共享高速缓存,但仍需要协调对总线的访问:理想情况下,无论哪个芯片发出读取,都只会监听响应
    • 如果他们俩都想写:

      • 同一芯片上的两个内核将仅写入相同的缓存,而只需将其刷新到RAM一次。实际上,由于每条缓存行将读取和写入内存,因此可以将在不同但足够接近的地址处的写入合并为一次写入RAM

      • 不同芯片上的两个内核确实存在冲突,高速缓存行将需要由chip1写回RAM,提取到chip2的缓存中,进行修改,然后再写回(不知道是否可以通过监听来合并写入/获取)

  2. 如果两个内核试图访问不同的地址...

    对于单次访问,CAS延迟意味着可以对两个操作进行交错处理,以使其花费的时间比总线空闲的时间更短(或可能只是更长的时间)。


另一个列表项是当另一个内核在目标区域上刺戳时启动一个DMA传输。
ott

7

那么,多个CPU /内核可以同时访问同一个RAM,还是我所说的正确?

那里有许多不同的机器架构,每种都有自己的功能集。一类多处理机称为MISD,用于多指令单数据,此类计算机旨在将相同的数据同时提供给多个处理器。相关的一类称为SIMD架构(单指令多数据)的机器更为常见,并且还可以同时访问同一内存,但是该内存包含指令而不是数据。在MIMD和SIMD中,“访问”都表示读访问-您可以想象如果两个单元试图同时写入同一位置会遇到麻烦!


3

尽管大多数答案都是从软件和/或硬件模型的角度出发,但最干净的方法是考虑物理RAM芯片的工作方式。(高速缓存位于处理器和内存之间,并且仅使用相同的地址总线,并且其操作对处理器而言是完全透明的。)RAM芯片具有一个单个地址解码器,该解码器接收存储单元的地址并到达地址总线(以及类似的数据总线,输入或输出)。当前的存储器以“单处理器方法”构建,即,一个处理器通过一条总线连接到一个存储芯片。换句话说,这就是“冯·诺依曼瓶颈”,因为每条指令必须至少引用一次内存。因此,在一根电线(或多根电线,又名总线)上,一次只能存在一个信号,因此RAM芯片一次只能接收一个单元地址。在确保两个内核将相同地址放入地址总线之前,实际上不可能通过两个不同的总线驱动程序(如内核)同时访问总线。(并且,如果相同,则是多余的)。

剩下的就是所谓的硬件加速。相干总线,高速缓存,SIMD访问等只是物理RAM前面的一些漂亮外观,您的问题是关于。提到的加速器可能会专门解决使用地址总线的问题,而编程模型与您的问题关系不大。还应注意,同时访问也将违反抽象的“专用地址空间”。

因此,您的问题是:不能同时使用相同或不同的地址进行直接直接RAM访问。使用缓存可能涵盖了这一事实,并且在某些情况下可能允许同时进行访问。它取决于缓存级别和构造,以及数据的空间和时间局部性。是的,您是对的:没有增强的RAM访问权限的多核处理对RAM密集型应用程序无济于事。

为了更好地理解,请回想一下直接内存访问的工作原理。CPU和DMA设备都可以将地址放入总线,因此必须在同时使用总线时将彼此排斥。


1

你不关心物理RAM,您更在意的虚拟内存地址空间进程线程在实践中(同一进程共享一个公共地址空间的所有线程)。

当然,如果您正在编码多核操作系统内核,那么您将非常在意RAM和缓存的一致性。

大多数多核处理器具有某种形式的缓存一致性机制。详细信息是特定于处理器的。由于处理器使用CPU缓存,因此有时它们的行为就像处理器的多个内核正在同时访问相同的内存位置一样。

诸如C11C ++ 11之类的工业语言的最新标准具有一些(多线程感知)内存模型


0

现代CPU在物理上与它们的外部存储设备绑定在一起,以获得最大的数据传输带宽。这是由于维持高传输速率所必需的信号完整性要求(走线长度,端接,时钟偏斜等)。例如,在多CPU主板上,每个CPU都有一组专用的DIMM插槽。无论软件程序员会怎么想,一个CPU都不能简单地访问另一个CPU的外部存储器数据。系统的内存管理软件(无论是OS内核,系统管理程序,数据平面核心还是其他级别的内存管理软件)都可以处理CPU间内存数据传输。


1
这篇文章很难阅读(文字墙)。您介意将其编辑为更好的形状吗?
蚊蚋
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.