存储器性能测试

Xeon E5620

Xeon E5620

E7500

E7500

In virtual machine, E7500

最近做了个存储器性能测试,结果如上图。z轴表示速度,单位是MB/s, x轴和y轴一个表示步长,即两次访问数据之间的距离;另一个是读写的数据总量,单位是字节。源代码可以通过 http://csapp.cs.cmu.edu/public/1e/public/mountain.tar 获取。

这个测试是CSAPP书里用来说明存储器山的一个实验。关于这个测试,有两个基本的概念:时间局部性与空间局部性。

时间局部性:

被引用过一次的存储器位置在未来会被多次引用(通常在循环中)。
 

空间局部性:

如果一个存储器的位置被引用,那么将来他附近的位置也会被引用
 
 
从步长的轴上取出一个切面进行分析,x轴对应的是读写数据集的大小,y轴对应的是访问速度。这个切面表示的就是空间局部性。
从数据集大小的轴上取出一个切面,x轴对应的是for循环访问数组时,步长的大小,y轴对应的是访问速度。这个切面表示的就是时间局部性。
 
 
这两个特性,是由于CPU的分级缓存机制造成的。由于CPU速度越来越快,跟内存的读写速度拉开的差距也越来越大。为此,工程师们在硬件上引入了L1和L2 缓存层。L1、L2的读写速度很快,但是价格很贵,所以容量很小。
 
 
CPU需要读写内存的时候,就往缓存里面找,找不到就会发生一次缓存缺失。缺失发生时,有多种应对的策略,具体可以参见 http://en.wikipedia.org/wiki/CPU_cache。缓存缺失时采用的策略,决定了什么样的数据块会留在缓存里,影响着时间局部性。在一个循环里,由于循环变量在每次循环时都会用到,长留在缓存里,不会发生缓存缺失,因此具有很好的时间局部性。
 
 
读取内存时,并非只读取一个元素,而是读取所需元素及附近的元素到缓存中。若以后对数组的访问都是以步长为1进行访问的话,所需的数据已经先行进入缓存了,就会获得较好的空间局部性。
 
好的程序,应该充分利用时间局部性和空间局部性,也就是说,需要将相关的数据尽可能相邻的放在一起,提高空间局部性。同时,优化逻辑,复用部分控制变量,实现短时间内多次访问,让变量始终在缓存中存在,提高读写性能。
 
参见:
http://zh.wikipedia.org/wiki/%E5%AD%98%E5%82%A8%E5%99%A8%E5%B1%B1
 
原文地址:https://www.cnblogs.com/Lifehacker/p/memory_mountain.html