多个 CPU 是不是竞争相同的内存带宽?

Posted

技术标签:

【中文标题】多个 CPU 是不是竞争相同的内存带宽?【英文标题】:Do multiple CPUs compete for the same memory bandwidth?多个 CPU 是否竞争相同的内存带宽? 【发布时间】:2013-05-06 21:55:29 【问题描述】:

在多 CPU 的机器中,不同的 CPU 是竞争相同的内存带宽,还是独立访问 DRAM?

换句话说,如果程序的内存带宽受到限制,例如,1-CPU 8 核系统,那么迁移到 4-CPU 4*8 核机器有机会加快它(假设CPU 和 DRAM 可比)?

【问题讨论】:

【参考方案1】:

您的主要问题的答案是:取决于。它取决于什么?这取决于您的设置所在的阵营,从技术上讲,有两个。

在称为共享内存多核的第一个阵营中,您的问题的答案是“是”。使用此模型,如果您愿意,具有多个内核的多个处理器通过公共总线(这是您遇到瓶颈的地方)共享内存,除此之外,没有任何东西将 CPU 连接在一起。这是典型的消费级计算机所属的类别/阵营/模型。

在称为分布式内存多核的第二个阵营中,您的问题的答案是“否”。这种硬件设置方案意味着每个处理器都有自己的私有内存,但有一条总线将处理器直接连接在一起。使这种情况成为可能的协议是Message Passing Interface。这也意味着 CPU 组在物理上不必与它们访问的 RAM 在同一个盒子或房间中。你可能不会在家里找到这种设置。想想研究机构、实验室、大学、大中型企业等。

回答你的第二个问题。答案也是取决于。这取决于,因为需要知道程序是否被编写为利用系统的并行执行可能性的并行性。尽管您的消费级计算机有一个或两个处理器共享一个内存总线,但如果在编写程序时考虑到并行性,那么您会注意到性能有所提高。否则,来自程序的串行指令将仅在一个内核上串行执行。

如果您深入了解多核处理的本质,以及如何通过程序访问内存,那么扩展您的头盖骨的一个很好的“网关资源”是Flynn's Taxonomy)。如果您有兴趣,只需谷歌一下,它就会带您进入兔子洞。

编辑:为了给予应得的荣誉,我强烈推荐 Gaston C. Hillar 的 Professional Parallel Programming in C#。在我短暂的职业生涯中,这本令人愉快的书对我来说是关于并行性主题的最有启发性的。它有助于澄清并行编程和多核编程之间的区别以及我刚刚提到的多核处理类型,并附有图表!

【讨论】:

您的问题的答案是“是” 我认为这通常是不正确的,具体取决于硬件。使用 NUMA,不同的 CPU 可以有单独的 DRAM 访问通道。 除此之外,没有任何东西将 CPU 连接在一起这也是不正确的(参见 Csaba 的回答)。【参考方案2】:

是的,所有 CPU 都在竞争相同的带宽。从 CPU 芯片到 RAM 只有一个硬件连接,因此所有访问都必须通过它。

不同级别的 CPU 缓存可以共享或不共享以缓解此问题。只有缓存未命中需要转到 RAM 本身。见http://en.wikipedia.org/wiki/CPU_cache#Multi-core_chips

【讨论】:

从 CPU 芯片到 RAM 只有一个硬件连接 -- 我的问题更多的是关于多个 CPU,而不是同一个 CPU 上的多个内核。我不清楚你的回答是否适用于他们。 @MaxB,你说得对,我没有完全理解这个问题。多个 CPU 芯片可能可以独立访问不同的内存库,但我对这些设置还不够熟悉,无法多说。 这个问题涉及多个 CPU,而不是多个内核。【参考方案3】:

多个 CPU 是否竞争相同的内存带宽?

不一定。 Non-Uniform Memory Access 和 multi-channel memory architecture 可以产生比单 CPU 更高的总内存带宽。

【讨论】:

如果您试图回答您的问题,您提供的是一个完全不同的问题的答案,而不是您在此线程上提出的问题。您只是问 1)多个处理器是否竞争相同的内存,以及 2)程序是否会通过添加更多处理器而受益。我已经给了你两个完全有效的答案。相反,您已经声明您提供的两个来源为单个 CPU 提供了更高的内存带宽。同样,这不是您自己问题的答案,而是一个全新的问题。如果您想更改问题,请提供编辑【参考方案4】:

如果您使用相对较新的硬件并且您的软件的内存限制部分来自 CPU 到 CPU 的通信,那么您很有可能可以合理地扩展。较旧的 x86 SMP 架构使用一个前端总线 (FSB),每个 CPU 只能使用该单个前端总线与另一个 CPU 共享数据。借助 Opteron 服务器处理器系列,CPU 内核还通过专用的 Hyper-Transport 线路单独连接到其他 CPU 内核。这导致 Opteron 服务器的扩展性比当时的 Intel 服务器好得多。但自从多年前英特尔聘请了那些为 AMD 开发 Hyper-Transport 的工程师(历史上这些工程师利用他们从 Alpha EV6 总线获得的经验)还为英特尔开发了一种可扩展的 CPU 到 CPU SMP 链接架构,称为 QPI。所以今天的英特尔服务器产品也比旧的 FSB PC 更具可扩展性。如果您使用的是非 x86 服务器,您可能还拥有一些可通过这种方式扩展的架构。 在这种情况下,如果您有这样的软件需要内核之间的交互,那可以显着加快这些速度。

【讨论】:

以上是关于多个 CPU 是不是竞争相同的内存带宽?的主要内容,如果未能解决你的问题,请参考以下文章

cache和内存

在一个内核上运行的多个线程如何进行数据竞争?

R语言使用timeROC包计算无竞争情况下的生存资料多个标记物在相同时间下的AUC值并可视化多个标记物在相同时间下的ROC值多指标的ROC曲线

多线程详解

C++:在多个线程中访问同一数组/向量的不同单元是不是会产生数据竞争?

忙等待中的互斥