在看《深入理解计算机系统》时,上面有一个存储器山,自己也制作了一个自用电脑cpu的存储器山。放图如下:
i7-10700k存储器山.png
i7-10700k存储器山-stride.png
时间局部性视图(步长S为1时)
时间局部性视图.png
- 可以看出每个山脊变化点是32K,256K,8m;
- 而i7-10700K的缓存大小是L1:512KB,L2:2.0MB,L3:16.0MB
- 可以看出硬件的L1 cache难道它的L1 d-cache(即数据的cache)是32KB?
空间局部性视图
在数据大小为4M时,可以完整放入L3的缓存,而无法完整放入L2的缓存。随着步长增加,缓存不命中比率增大,但是其有一个限度,为:min(1,(wordsize*S)/B),B=64,wordsize=8,那么在步长S为8时达到最大值,小于8时则为小于1的数,从图中可以观察到步长大于8后读吞吐量几乎为常数。
数据大小为4M时的读吞吐量
那么,我觉着,读吞吐量的上,下限度是由其数据大小决定的,再看另一数据集大小为128KB的情况:
数据大小为128KB时的读吞吐量
其下限约为30000MB/S,比上面高约3倍。这时整个数据包能完整塞入L2缓存,由于不需要向下一级请求,所以最低速度会变大。
当数据能完整塞进L1时,情况入下图:
数据大小为32KB时的读吞吐量
可以看到此时的吞吐量随着步长相差很小,此时下限变得很高了。由于数据都在L1中,几乎不会有读不命中。
结论
- 读吞吐量是随着数据集大小和步长变化的;
- 数据集大小控制着时间局部性,步长控制着空间局部性;
- 步长为定值情况下,步长的大小控制着不同数据集大小读吞吐量的上下限;
- 数据集大小一定时,数据集的大小控制着不同步长的读吞吐量的上下限(和缓存大小有关);
- 有时我们不能控制数据集的大小,需要重点关注控制步长,让步长尽量减小,让我们尽量在这个山的高点。