通过不连续的内存访问评估最坏情况RAM有效带宽

时间:2018-05-07 13:00:14

标签: multithreading cpu ram bandwidth latency

我试图评估有效内存"带宽" (在最坏的情况下,从主存储器到CPU的吞吐量(以字节为单位))由于处理的连续地址中的长距离,RAM缓存的效率非常低。据我所知,这里重要的是RAM延迟而不是带宽(这是传输大量连续数据块时的吞吐量)。

场景是这样的(假设您使用64位= 8字节值):

  • 您通过地址
  • 读取数据
  • 进行一些轻量级CPU计算(以便CPU不是瓶颈)
  • 然后你在远离第一个地址的新地址读取数据

我想了解吞吐量(以字节为单位)。假设RAM具有典型的DDR3 13 ns延迟的简单计算产生8 B / 13 ns = 600 MB / s的带宽。但这提出了几点:

  • 这种推理(至少是示意性的)是正确的吗?
  • 是准确获取数据RAM延迟的时间,还是需要添加一些与缓存,CPU或其间任何组件相关的时间?你知道多少吗?
  • 在多线程中执行此操作会发生什么?每个线程的每个线程都有600 MB的带宽吗?

1 个答案:

答案 0 :(得分:1)

  

...有效记忆"带宽" ...在最糟糕的情况下,从主存储器到CPU:

有两个"最差"场景:不使用(未命中)CPU缓存和内存访问的内存访问,它访问太远的地址并且无法重用开放的DRAM行。

  

RAM缓存

缓存不是RAM的一部分,它是CPU的一部分,名为CPU cachememory hierarchy的顶部)。

  由于处理的连续地址中的距离很远,因此

完全没有效率。

现代CPU缓存有许多内置hardware prefetchers,可以检测多次内存访问之间的非随机步骤。许多预取器将检测对齐的4千字节(KB)页面内的任何步骤:如果访问地址1,然后地址1 + 256字节,则L1预取程序将开始访问地址1 + 256 * 2,地址1 + 256 * 3等。一些预取程序可能会尝试预测超出4 KB范围。因此,仅使用访问之间的长距离可能是不够的。 (预取者可能被禁用https://software.intel.com/en-us/articles/disclosure-of-hw-prefetcher-control-on-some-intel-processors

  

据我所知,这里重要的是RAM延迟而不是带宽

是的,当RAM访问受延迟限制时,有一些模式。

  

场景是这样的(假设您使用64位= 8字节值):

您可以使用8字节值;但你应该考虑内存和缓存使用更大的单位。现代DRAM存储器具有64位(8字节)宽的总线(在ECC的情况下为64 + 8的72位),并且许多事务可能使用几个总线时钟周期(DDR4 SDRAM中的突发预取使用8n - 8 * 64位。 CPU缓存和内存控制器之间的许多事务也更大,并且大小为完整cache line或缓存行的一半。 Typical cache line is 64 bytes

you read data at an address
make some light weight CPU computation (so that CPU is not the bottleneck)
then you read data at new address quite far-away from the first one

此方法不适合现代无序CPU。在当前存储器访问完成之前,CPU可以推测性地重新排序机器命令并开始执行下一存储器访问。

cpu缓存和内存延迟的经典测试(来自lmbench http://www.bitmover.com/lmbench/lat_mem_rd.8.html和许多其他人的lat_mem_rd)使用填充了一些特殊的伪随机指针模式的内存数组;读取延迟的测试就像(https://github.com/foss-for-synopsys-dwc-arc-processors/lmbench/blob/master/src/lat_mem_rd.c#L95

char **p = start_pointer;
for(i = 0; i < N; i++) {
      p = (char **)*p; 
      p = (char **)*p; 
  ... // repeated many times to hide loop overhead
      p = (char **)*p; 
}

因此,下一个指针的地址存储在存储器中; cpu无法预测下一个地址并以推测方式开始下一次访问,它将等待来自缓存或内存的读取数据。

  

我想了解吞吐量(以字节为单位)。

可以以每秒访问量来衡量;对于字节访问,或字访问或8字节访问,将有相似数量的访问/ s,吞吐量(字节/秒)将乘以所使用的单位。

有时会测量类似的值 - GUPS - guga-updates per second(内存中的数据被读取,更新和写回)并测试Random Access。此测试可以使用数百(或数万)PC的计算集群内存 - 检查http://icl.cs.utk.edu/hpcc/hpcc_results.cgi?display=combo中的GUP / s列

  

一个简单的计算,假设RAM具有典型的DDR3 13 ns延迟,则带宽为8 B / 13 ns = 600 MB / s。但这提出了几点:

RAM有几个延迟(时间) - https://en.wikipedia.org/wiki/Memory_timings

只有当您访问打开的行时,13 ns CAS才有意义。对于随机访问,您通常会访问闭合行,并将T_RCD延迟添加到CAS。