存储器山是一种综合研究存储器层次结构的工具。它反映了存储器层次结构中不同层次的带宽。也反映了具有不同的时间局部性与空间局部性的程序的性能。通过分析存储器山的数据,还可以看出存储器系统的部分硬件参数。
T. Stricker于1997年在其论文中介绍了存储器山的思想,利用它对存储器系统进行全面描述,并在后来的工作中提出了术语“存储器山”。卡耐基梅隆大学教授Randal Bryant的著作《深入理解计算机系统》(Computer Systems: A programmer‘s Perspective, Randal Bryant, DavidO‘Hallaron)一书第6.6.1节亦提出了存储器山的概念,并进行了详细分析。
内存山就是一种存储器山,层次结构主要包括cache和memory。下面是intel i7处理器的一个内存山。
图的左上角是CPU的参数,主要参数就是三级cache的大小。这个十分关键,因为就是这三个数使得内存山呈现出图中的状态。
首先看坐标轴,working set size 指工作集的大小,stride是访问数据的步长,stride为1,就是按序访问数据,为2就是间隔一个访问,这关系到数据的局部性。Read throughput 是指存储器访问速度,或者是效率,或者是吞吐量,总之这个指标越高越好。
好了,这样就可以拆解来看这座山了。我们看working set size,可以发现,绿色和紫色的边界大概是32K,绿色和和黄色的边界大概是256K,浅紫色和蓝色的边界大概是8M,这正好是三级cache的大小。这是很好解释的,如果工作集合小到完全可以装到一级cache里,那么访问速度几乎就是1级cache的访问速度。所以在cache大小的边界处会出现一个急剧的下坡。形成了图中的四层结构。
从stride来看,步长越长,速度越慢。大步长的访问方法完全破坏了时间局部性,因此会造成访问速度下降。
综合来看,我希望能够描述清楚几件事情。第一,当步长很小时,就算工作集很大,访问速率也在紫色区域。这是因为,充分利用了时间局部性,相同cache块内的数据,只有第一个发生了miss,而在这次miss之后,其他数据被一同加载了进来。第二,当步长很大工作集很小时,访问速度也很高。其实这里的步长并未对访问速度造成什么影响,因为整个工作集都会加载到cache中。第三,对于大的工作集合和大的步长,那么cache就形同虚设,因为根本就不存在局部性,cache是为局部性而生的,因此,访问速度只能是memory级别,也就是图中的浅蓝色。
可以对存储器山进行测试,更深的理论和实验可以参考:
http://www.opengpu.org/forum.php?mod=viewthread&tid=975