存储器系统是一个具有不同容量、成本和访问时间的存储设备的层次结构:CPU寄存器-》高速缓冲存储器-》主存储器-》磁盘-》通过网络连接的其他存储设备。
SRAM静态,一般作为高速缓冲存储器。
DRAM动态,一般作为大容量的主存储器
每次CPU和主存之间的数据传送都是通过一些列的步骤完成的,这些步骤称为总线事务。读事务从主存传送数据到CPU,写事务从CPU传送数据到主存。
局部性:一般较好的程序都有较好的局部性,也就是说,它们倾向于引用的数据项邻近于其他最近引用过的数据项,或者邻近于最近自我引用过的数据项。对应的就是空间局部性和时间局部性。
局部性小结:
1、重复引用同一变量的程序有较好的时间局部性。
2、对于具有步长为k的引用模式的程序,步长越小,空间局部性就越好。具有步长为1的引用模式的程序有很好的空间局部性。在存储器中以大步跳来跳去的程序的空间局部性就很差。
3、对于取指令来说,循环有很好的空间和时间局部性。循环体越小,循环迭代次数越多,局部性越好。
编写高速缓存友好的代码
编写高速缓冲友好的代码的基本方法:
1、让最常见的情况运行得快。程序通常把大部分时间都花在少量的核心函数上,而这些函数通常把大部分时间都花在了少量的循环上。所以要把注意力集中在核心函数的循环上,而忽略其他部分。
2、在每个循环内部使缓存不命中数量最小。在其他条件,例如加载和存储的总次数相同的情况下,不命中率低的程序运行得更快。
注意:编译器将局部变量存储到寄存器中,因此循环内对局部变量的引用不需要任何加载或存储指令。
高速缓存对程序性能的影响: