Digital的Alpha 21164处理器发布于1994年,它超标量,有两条整数流水线和两条浮点流水线,采用Alpha ISA。比起上代21064,流水线设计相似但宽一倍,比起之后的21264,它则完全按顺序执行。
21164的L1指令和数据缓存为8KB直接映射缓存,L2增大至96KB 3-way集关联缓存。两个48位的全关联TLB管理虚拟内存地址转换。L1缓存的延迟为两周期6.7ns,Miss的地址将存在Miss Address File(MAF)等待从L2读取,L2的延迟为20ns。
流水线前端分4级,如图。在S0,处理器同时读取四个指令到两Instruction Buffer(IB)之一。21164 必须等待IB内所有指令执行后才能读下一批,因此编译器优化可以放一些NOP来防止可避免的延迟。S1时,如果指令是个分支,处理器将进行分支预测,而或许更新PC返回S0。21164的分支预测器已今天的水平来看很简易。S0和S1基本上相当于传统流水线中的IF和ID阶段。
在S2,指令会根据需求分配流水线。21164最多能分配两个整数(包括分支,内存读写)指令(整数乘最多一个),和两个浮点指令,而且必须按顺序。如果超出两个整数或浮点指令,剩余的指令将停留在S2等下一周期。在S3,处理器将通过Scoreboard检查RAW或WAW风险(Scoreboard设计可参考CDC6600),有风险的指令如果不能及时传输正确数据也需要停留。假设21164读取以下指令:
i1: R1 <- R2 +R3 #使用整数流水线1
i2: R4 <- R1 +R5 #使用整数流水线2
i3: R7 <- R8 –R9 #整数流水线不足,停留在S2
i4: F0 <- F2 +F4 #i3不能执行,停留在S2
在S2时,只有i1和i2能够继续到S3,及时i4跟以上指令不冲突,处理器要保持完全按顺序执行,因此这里IPC损失很大,接下来到S3时:
i1: R1 <- R2 +R3 #执行
i2: R4 <- R1 +R5 #RAW风险,停留在S3
i3: R7 <- R8 –R9 #已停留在S2
i4: F0 <- F2 +F4 #已停留在S2
指令i2被检测到数据风险因此也不能执行。到最后只有i1顺利到S4(EX1)使用整数流水线开始执行。如果21164使用乱序执行,i3,i4其实不冲突,可以瞬间提高IPC
当指令进入S4之后会执行下去。在整数流水线中,S4阶段ALU会计算内存地址/分支结果/计算结果,并开始访问L1 Data缓存。在S5时,缓存验证Hit或Miss,Miss的情况下,S6开始访问L2缓存并在S12得到结果。21164的MAF做了一定优化,比如说,如果两个Cache Miss的地址在L1的同一个Cache Line上(很常见,程序数据一般都挨着),MAF就只会记录一项。