我试图评估有效内存"带宽" (在最坏的情况下,从主存储器到CPU的吞吐量(以字节为单位))由于处理的连续地址中的长距离,RAM缓存的效率非常低。据我所知,这里重要的是RAM延迟而不是带宽(这是传输大量连续数据块时的吞吐量)。
场景是这样的(假设您使用64位= 8字节值):
我想了解吞吐量(以字节为单位)。假设RAM具有典型的DDR3 13 ns延迟的简单计算产生8 B / 13 ns = 600 MB / s的带宽。但这提出了几点:
答案 0 :(得分:1)
...有效记忆"带宽" ...在最糟糕的情况下,从主存储器到CPU:
有两个"最差"场景:不使用(未命中)CPU缓存和内存访问的内存访问,它访问太远的地址并且无法重用开放的DRAM行。
RAM缓存
缓存不是RAM的一部分,它是CPU的一部分,名为CPU cache(memory 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。