超标量处理器设计读书笔记-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的取指宽带要大于处理器的取指宽度。