在现代多核平台上,内存带宽限制应用程序的并行性能通常不能很好地适应核心数量.通常,在一定数量的核心上观察到加速,但在此之后性能饱和.合成示例是众所周知的 STREAM benchmark,其经
在单个Xeon E5-2680上考虑以下STREAM基准测试(Triad)结果,峰值内存带宽为42.7GB / s(DDR3-1333):
1 core 16 GB/s 2 cores 30 GB/s 3+ cores 36 GB/s
STREAM可以从1到2个核心很好地扩展,但是在3个核心之上,性能大致不变.
我的问题是:什么决定了单个CPU内核可以实现的内存带宽?由于这个问题肯定过于宽泛,我将其缩小到上述架构:如何预测1个线程的STREAM将从E5-2680的规格中获得16 GB / s,或者通过查看硬件计数器等?
对于单核,主要因素是CPU频率和CPU微架构,即单核向总线发出请求的速度以及CPU如何预测您要访问的内存位置.如果内存访问是随机的并且代码执行依赖于您必须考虑内存访问延迟的数据,那么CPU设计人员会竭尽全力让事情看起来比实际更快并隐藏延迟的影响,而如果你只读了一堆数据并说加起来你就会有带宽.但对于单核,绝对上限是时钟速度.对于多线程访问,瓶颈将是主板和北桥上的总线和RAM架构.所以它取决于你的主板.你可以将DRAM减速50%,但其中4个并行并实现加速.或相反亦然.
然而,问题非常广泛.如果您想从程序员的角度了解更多关于内存的信息,请查看What every programmer should know about memory.它对各种因素进行了深入的描述.
这是一个非常深入的话题.
PS,至于预测,它不太可能,或者不太实用.测量更好,除非您可以访问非常详细的CPU,芯片组,主板和RAM规格,即便如此,它只是一个有根据的猜测.在您的特定工作量下,您最好在现实生活中测量它.