超标量处理器设计读书笔记-Cache篇
第一章 概览
超标量=superscalar
可变指令宽度=VLIW
第二章 Cache
2.1 Cache设计的三要素-组织方式,写策略,替换算法。
Cache的组织方式
包括直接映射、组相连、全相连映射,对应的查找算法为直接寻址、逐路比较、按内容寻址。
直接寻址容易发生冲突。组相连会把不同way的cacheline组成cache set。存在并行访问和串行访问两种方式,前者功耗消耗更大,关键路径更后者多花一个周期,但是周期时间更短。
全相连的缺失率是最低的。但是需要比较的内容太多,延迟也是最大的。注定不会有太大的容量。
Cache的写策略
主要有两种策略,写通和写回写分配。
写通适合访存性能较好的场合,写回写分配适合访存延迟较大的场合。
替换策略
1、LRU最近最少使用法
理想的实现方式是每个cacheline配一位age。每个way当中年龄最小的age被使用时,把另一个way的age清零。但是way数多了以后代价昂贵。
实际上会采用逐级编码比较的方式来实现LRU。对所有way进行分组,每一组使用1位年龄部分。最后定位到某一个way。
2、随机法
可以使用时钟算法实现
2.2 Cache如何提高性能
三种失效(3C定律)
(1)强制性失效(Compulsory miss)
当第一次访问一个块时,该块不在Cache中,需从下一级存储器中调入Cache,这就是强制性失效
(冷启动失效,首次访问失效)
(2)容量失效(Capacity miss)
如果程序执行时所需的块不能全部调入Cache中,则当某些块被替换后,若又重新被访问,就会发生失效。这种失效称为容量失效。
(3)冲突失效(Conflict miss)
在组相联或直接映像Cache中,若太多的块映像到同一组(块)中,则会出现该组中某个块被别的块替换(即使别的组或块有空闲位置),然后又被重新访问的情况。这就是发生了冲突失效。
(碰撞失效,干扰失效)
1.写缓存
写缓存是为了屏蔽d-cache写下级存储器的时间,存在于L1-cache到其他存储层次。有利于结合写通方法。
2.流水线
tag RAM的读取和比较可以放在同一周期,对data的写入和读取可以打一拍。由此形成流水线。
处理读写相关性时要注意forwarding data来自寄存器的情况。
3.多级结构
存储器的容量和速度相互制约,低速cache消耗更多cycle来访问。
L2-cache包括exclusive和inclusive两种,前者节约空间,后者有利于维护一致性。
4.victim cache
L1-cache替换出去的cacheline,存储到VC当中。
这是为了适应一种情况,程序频繁使用同一set的不同cacheline的数据,但是相连路数小于数据数量,引发频繁替换。
一般采用全相连方式,位于L1-L2cache当中,但是data接口直连cpu和L1-cache。Cache和VC是exclusive的关系。
另外有filter cache思想
5. 预取技术
硬件预取不直接写到cache,而是在命中的时候再写。
对于不处理分支指令的情况有比较好的性能。分支的情况下,浪费总线和功耗。
软件预取由编译器控制,要求D-cache是非阻塞结构的。预取的时机决定Cache是否被污染。
2.3 多端口D-Cache
1.多端口SRAM实现
消耗面积和功耗。
2.复制Cache实现
需要维护Cache的同步
3.多bank Cache
同一bank上的访问才冲突。需要编译器配合。
Tag Ram是多端口,Data Ram不是多端口。
2.4 超标量处理器的取指
取指地址不可能n字对齐,cache的取指宽带要大于处理器的取指宽度。