4

在现代多核平台上,内存带宽受限应用程序的并行性能通常不能很好地随内核数量而扩展。通常,在达到一定数量的内核时会观察到加速,但在那之后性能就会饱和。一个综合的例子是著名的STREAM 基准测试,它通常用于报告可实现的内存带宽,即饱和点的内存带宽。

考虑在峰值内存带宽为 42.7GB/s (DDR3-1333) 的单个 Xeon E5-2680 上的 STREAM 基准测试 (Triad) 的以下结果:

1  core  16 GB/s
2  cores 30 GB/s
3+ cores 36 GB/s

STREAM 可以很好地从 1 核扩展到 2 核,但在 3 核以上时,性能大致保持不变。

我的问题是:是什么决定了单个 CPU 内核可以实现的内存带宽?由于这个问题太宽泛了,我把它缩小到上面提到的架构:我怎么能预测带有 1 个线程的 STREAM 会给我 16 GB/s 从 E5-2680 的规格,或者通过查看硬件计数器等?

4

1 回答 1

2

对于单核,主要因素是 CPU 频率和 CPU 微架构,即单核向总线发出请求的速度以及 CPU 预测您要访问的内存位置的能力. 如果内存访问是随机的并且代码执行取决于数据,那么 CPU 设计人员会竭尽全力让事情看起来比实际速度更快,并隐藏延迟的影响,而如果您只读取一堆数据并说将其加起来您将拥有带宽。但对于单核来说,绝对上限是时钟速度。

对于多线程访问,瓶颈将是主板和北桥上的总线和 RAM 架构。所以这取决于你的主板。您可以将 DRAM 速度降低 50%,但其中 4 个并行并实现加速。或相反亦然。

然而,这个问题非常广泛。如果您想从程序员的角度了解更多关于内存的信息,请查看每个程序员应该了解的关于内存的知识。它对各种因素进行了深入的描述。

这是一个非常深入的话题。

PS,至于预测,不太可能,或者不太实用。测量更好,除非您可以访问非常详细的 CPU、芯片组、主板和 RAM 规格,即使这样也只是有根据的猜测。你最好在现实生活中,在你的特定工作量下测量它。

于 2014-02-05T23:45:58.953 回答