本文目录
Cache(超级重点)
并行体系需要程序存储是连续的更好发挥作用,而程序的转移概率不会低,数据分布离散型大,所以单靠改变主存是不够的,我们需要在存储体系上进行改进,加入一层Cache
一般Cache采用高速的SRAM制作(也就是上面所提的静态RAM)
cache按块存储于传输
cache标记:是主存块和cache块的对应关系,CPU会首先看访问的块号是不是在cache中
块长往往和存取周期可以取出的大小一致
理论原理:Cache根据程序的局部性原理:
时间局部性:在一定时间内,只是对主存局部地址区域的访问。
空间局部性这是由于大多指令和数据在主存内部存放是连续分布的,并且有些指令和数据往往被多次调用(如子程序,循环程序,一些常数),即指令和数据在主存中的地址分布不是随机的,而是相对的簇聚,
使得CPU在执行程序时,访存具有相对的局部性
工作流程:
CPU给出内存地址,块内地址可以直接传,而块号需要在地址映射变换机构确认是否命中,如果命中需要给出当前内存块保存在哪个cache块中,形成真正块号;如果没有命中需要查询cache是否还有空间装入这个主存块,如果有则访问主存,将次块装入cache,如果满了,就要启动cache替换机构根据替换算法决定cache哪个块中需要退出写入主存或者作废,然后将此主存块顶替上去
-
块内地址直接传,块号如果命中(转换后的Cache块与CPU欲访问的主存建立关系) 直接访问存储体,如果未命中(未建立关系),查看是否有空间,有就访问主存装入Cache块中,如果没有,启用Cache替换机构,根据替换算法选择替换的地方
-
地址映射:是个规则,主存中的块,如果放入Cache中,可以放在Cache的哪一个块中或哪些块中
-
地址变换,主存块号转换成Cache块号,在Cache当中找到相应的位置
-
主存和Cache之间有一条通路,完成了主存和Cache的数据交换,有些计算机为了速度,如果出现不命中的情况,主存可以直接向CPU提供数据,同时与Cache之间传送
读写操作
比如我们累加方法,这个sum变量每次都会更新完cache又要更新主存,其实我们完全可以最后程序执行完(这个cache块被替换出去)的时候一次性改主存,这时候写回法优越性好,但是假如并行的话,写回法就复杂了
Cache改进
一丶 地址映射方法
直接映射:
将主存储器划分为若干个与cache大小相等的若干个区,主存的任何某一个区的第i块只能装入到Cache中第i块
cache的第零块可以装载任何一个区的第零块,那么怎么区分是哪个区的呢,cache中就增加标记,来标记这里存储的是主存的哪个区的,所以我们首先扎到cache字块地址定位到cache的哪一行,然后用cache的标记和t位长的主存字块标记比较,相等则命中
这种cache的利用率很低,冲突概率很大
题
某32位计算机的cache容量为16KB,cache块的大小为16B,若主存与cache的地址映射采用直接映射方式,则主存地址为1234E8F8(十六进制)的单元装入的cache地址为______。
Cache容量为16KB,块的大小为16B(24),Cache可分为1K(210)块,这样块内地址占4位,块号10位。主存地址1234E8F8(十六进制)中后14位,即10 1000 1111 1000(二进制)就是装入的cache地址。
全相联映射
主存的任何一个块可以放入到cache任何一个块中,给出主存地址,首先我们要确认这个地址所在的块是否被调入cache,因为全相连,所以可能在任何一个块中,所以我们的主存字块标记要和任何一个cache中的标记比较,这个比较需要同时进行电路复杂,速度慢;而且cache标记区号和块号部分都要保存到标记中,参加比较的位数也比较长,比较器的长度也较长
组相联映射
上两种的折中位置
将主存储器划分为若干个与cache大小相等的若干个区,主存中的每个区第i个块可以放入Cache某i个组的任何位置,确认是否命中,只需要确定主存的区号,找到对应的组,比较给定组当中的每个标号和区号进行比较
比较的数量少得多,利用率也比较高,这是现代计算机常用的映射方法
组地址:就是Cache字块地址
题:
某计算机的Cache共有16块,采用2路组相联映射方式(即每组2块)。每个主存块大小为32字节,按字节编址。主存129号单元所在主存块应装入到的Cache组号是
A.0 B.2 C.4 D.6
- 上面我讲解的是区中i块对应i组,129/32=第4块 ,第一区第四块对应第四组 C
- 二进制129为1+128 10000001,块大小为32占五位,所以前三位为块号 100
三种方法比较
优点 | 缺点 | |
---|---|---|
直接映射 | 实现简单,字块是否在Cache中,只需要主存地址中的某些位判断,速度也快 | Cache的利用率可能会很低,Cache块调用冲突可能性大 |
全相联映射 | Cache的利用率高 | 确定是否在Cache中需要主存块号与Cache中的每一个标记比较,电路复杂,比较位数长,速度慢 |
组相联映射 | 两者结合,电路结构也简单了,比较次数也少了(换到到jmodQ组 |
注:比较器并行进行,一个行就可以了