要点一:
存储器系统是一个具有不同容量、成本和访问时间的存储设备的层次结构。
靠近CPU的小的、快速的高速缓存存储器作为一部分存储在相对慢速的主存储器中数据个指令的缓冲区域。主存缓存存储再容量较大的、慢速磁盘上的数据,而这些磁盘常常又作为存储在网络连接的其他机器的磁盘或磁带上的数据的缓冲区域。
要点二:
随机访问存储器(RAM)分为两类:静态和动态。静态的RAM(SRAM)比动态(DRAM)的更快,也更贵。
SRAM将每个位存储在一个双稳态的存储器单元里,每个单元六个晶体管电路来实现。其中它有两个稳定状态(左稳态和右稳态)。
由于SRAM存储器单元的双稳态特性,只要有电,它就会永远地保持它的值(即使有干扰来扰乱电压,当干扰消除时,电路就会恢复到稳定值)
DRAM将每个位存储为一个电容的充电。
与SRAM不同的是,当DRAM电容的电压被扰乱后,它就永远不会恢复了,其次,暴露在光线下会导致电容电压改变。
以下是静态和动态的特性:
要点三:
DRAM可以被分为dω个的超单元。可以用坐标(i,j)表示,其中i表示行,j表示列。
每个DRAM芯片被连接到某个称为内存控制器的电路,这个电路可以一次传送ω位到每个DRAM芯片或一次从每个DRAM芯片传出ω位。为了读出超单元(i,j)的内容,内存控制器将行地址i发送到DRAM,然后是列地址j。(也就是说,它们不是同时传送的)。DRAM把超单元(i,j)的内容发回给控制器作为响应。行地址i称为RAS请求,j称为CAS请求。
要点三:
一开始的DRAM只是一个原型机,生产厂商试图跟上迅速增长的处理器速度,市场上就会定期推出新的种类,每种都是基于原型机进行了一些优化,提高了访问基本DRAM单元的速度:
快页模式DRAM
扩展数据输出DRAM
同步DRAM
双倍数据速率DRAM
视频RAM
要点四:
如果断电,RAM都会丢失它们的信息,从这个意义上说,它们是易失的。
另一方面,非易失性存储器即使是在关电后,仍然保存着它们的信息。(也就是ROM)
关于ROM的知识,在之前学校的操作系统课程中就有很详细的介绍了。
但是还是有几个公式比较重要:
要点五:
不同的存储技术有不同的价格和性能折中。SRAM比DRAM快,而DRAM比磁盘要快很多。另一方面,快速存储总是比慢速存储要贵的。
要点六:
一个编写良好的计算机程序常常具有良好的局部性。这种倾向性,被称为局部性原理。
局部性通常有两种不同的形式:时间局部性和空间局部性。
一般而言,有良好局部性的程序比局部性差的程序运行得更快。
一段代码中讨论局部性,往往是针对单个元素讨论的:
对于sum来说,因为在循环中连续引用,所以有好的时间局部性,但是因为sum是标量,没有空间局部性。
而对于变量v来说,因为i是逐个增加,所以有良好的空间局部性,但是因为每个向量元素只访问一次,所以时间局部性很差。
要点七:
量化评价程序中局部性的一些简单原则:
重复引用相同变量的程序有良好的时间局部性
对于具有步长为k的引用模式的程序,步长越小,空间局部性越好。具有步长为l的引用模式的程序有很好的空间局部性。在内存中以大步长跳来跳去的程序空间局部性会很差
对于取指令来说,循环有好的时间和空间局部性。循环体越小,循环迭代次数越多,局部性越好。
要点八:
存储器层次结构:
数据总是以块大小为传送单元在第k层和第k+1蹭之间来回复制的。上边的是下边的存储器的缓存。虽然在层次结构中任何一对相邻的层次之间块大小是固定的,但是其他的层次对之间可以有不同的块大小。
要点八:
缓存的内容:
要点九:
早期计算机系统的存储器层次结构只有三层:CPU寄存器、主DRAM存储器和磁盘存储设备。之后由于CPU和主存之间逐渐增大的差距,系统设计者被迫在CPU寄存器文件和主存之间插入一个小的SRAM存储器,称为L1高速缓存(一级缓存)。最后又因为差距又逐渐增大,于是有了L2、L3。
每个存储器地址有m位,形成M=2^m个不同的地址。这样一个机器的高速缓存被组织成一个S=2^S 个高速缓存组的数组。以下是它的一个结构:
struct
参数总结:
要点十:
根据每组的高速缓存行数E,高数缓存被分为不同的类。每个组只有一行(E=1)的高速缓存称为直接映射高速缓存。
高速缓存确定一个请求是否命中,然后抽取出被请求的字的过程,分为三步:组选择、行匹配、字抽取。
当然,如果缓存不命中,就需要进行行变换。从存储器层次结构中的下一层取出被请求的块,然后将新的块存储在组索引位指示的组中的一个高速缓存行中,如果组中都是有效高速缓存行了,那么必须要驱逐出一个现存的行。对于直接映射高速缓存来说,替换策略就是用新取出的行替换当前的行。
要点十一:
直接映射高速缓存容易引起冲突不命中引起的问题(因为E=1),那么组相联高速缓存放松了这条限制,所以每个组都保存有多于一个的高速缓存行。一个1<E<C/B的高速缓存通常称为E组相联高速缓存。
与直接映射高速缓存相比,组选择是一样的,但是行匹配和字选择组相联高速缓存要更复杂。
要点十二:
全相联高速缓存是由一个包含所有高速缓存行的组(即E=C/B)组成的。
因为只有一个组,所以就不需要组选择了:
要点十三:
只保存指令的高速缓存称为i-cache;只保存数据的高速缓存称为d-cache;两者兼具的称为统一的高速缓存。
现代处理器包括独立的i-cache和d-cache。通常会针对不同的访问模式来优化这两个高速缓存,它们可以有不同的块大小,相联度和容量。
使用不同的高速缓存也确保了数据访问不会与指令访问形成冲突不命中,反过来也是一样,代价就是可能会引起容量不命中增加。
例如,在Intel Core i7处理器的高速缓存层次结构中,每个CPU芯片有四个核。每个核有自己私有的L1 i-cache、L1 d-cache 和 L2 统一的高速缓存。所有的核共享片上L3 统一的高速缓存。这个层次结构的一个特性是所有的SRAM高速缓存存储器都在CPU芯片上。
CPU
要点十四:
编写高速缓存友好的代码,可以考虑以下:
1)让最常见的情况运行得快。
2)尽量减小每个循环内部得缓存不命中数量。
1、对局部变量反复引用是好的。因为编译器能够将它们缓存在寄存器文件中(时间局部 性)
2、步长为1得引用模式是好的。因为存储器层次结构中所有层次上的缓存都是将数据存 储为连续的块(空间局部性)
要点十五:
在程序中利用局部性,可以考虑:
1)大部分计算和内存访问都发生在内循环上,因此可以将注意力集中在内循环。
2)通过按照数据对象存储在内存中的顺序、以步长为1的来读数据,从而使得程序中得空间局部性最大
3)一旦从存储器中读入了一个数据对象,就尽可能多地使用它,从而使得程序中的时间局部性最大。