单核可实现的内存带宽

ang*_*nor 5 performance multicore memory-bandwidth

在现代多核平台上,内存带宽有限的应用程序的并行性能通常无法随着核心数量的增加而很好地扩展。通常,在达到一定数量的核心时会观察到加速,但之后性能就会饱和。一个综合的例子是众所周知的STREAM benchmark,它通常用于报告可实现的内存带宽,即饱和点处的内存带宽。

请考虑在峰值内存带宽为 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
Run Code Online (Sandbox Code Playgroud)

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

我的问题是:什么决定了单个CPU核心可以达到的内存带宽?由于这个问题肯定太宽泛,所以我将其缩小到上述架构:如何根据 E5-2680 的规格或通过查看硬件计数器等来预测具有 1 个线程的 STREAM 将为我提供 16 GB/s ?

Mar*_*tin 3

对于单核来说,主要因素是 CPU 频率和 CPU 微架构,也就是说单核向总线发出请求的速度以及 CPU 预测要访问哪个内存位置的能力。CPU 设计者竭尽全力让事情看起来比实际情况更快,并隐藏延迟的影响,如果内存访问是随机的并且代码执行取决于数据,则必须考虑内存访问延迟,而如果您只需读取一堆数据,然后将其相加即可获得带宽。但对于单核来说,绝对的上限就是主频。

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

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

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

PS,至于预测,不太可能,或者说不太实用。除非您能够获得 CPU、芯片组、主板和 RAM 的非常详细的规格,否则测量效果会更好,即便如此,这也只是一个有根据的猜测。您最好在现实生活中、在您的特定工作负载下进行测量。

  • 对于单核来说,理论上上限应该是内存带宽。以Intel Haswell i7-4770 CPU为例,L1级缓存负载带宽为64Byte/cycle,频率为3.6GHz,因此单核峰值吞吐量为64*3.6GB/s,远大于内存带宽。 (2认同)