前言

本文为北京大学研究生课程高等计算机体系结构(18-19学年第2学期)的作业。任务是对Alpha Microprocessor的设计进行综述。笔者才疏学浅,不到之处望读者斧正。

总览

Alpha 21264处理器每个周期可以取四条指令,同时其在内部支持乱序执行。在这种情况下,指令可以被并行执行,并且可以在其最早的能执行的时刻被执行。同时,此处理器支持推测执行,很大程度上加速了处理器的执行速度。Alpha 21264处理器复杂的转移预测机制支持了推测执行。在这些设计的支持下,该处理器的速度比前代Alpha 21164快50%到200%。

在存储系统方面,Alpha 21264提供了片上与片下的缓存系统,降低了访问存储的平均延迟。同时,21264也增加了对内存的并行访问,提高了数据带宽。在Stream benchmark中,Alpha 21264能够获得1.3GBytes/sec的访存速度。

Alpha 21264的主频在500至600MHz之间,由15M个2.2V,0.35mm晶体管组成。芯片面积为$3.1cm^2$,有587个管脚。芯片平面图如下:

die photo
die photo

芯片的结构抽象图如下:

Instruction Pipeline
Instruction Pipeline

指令流 (Instruction Pipeline – Fetch)

Alpha 21264处理器每个周期会向乱序执行部件传递四条指令。处理器会根据转移预测指令来进行指令的预取。由于转移预测的准确率极高,所以流水线在绝大部分时候都能被正确的指令所填充。

Alpha 21264通过两个结构支持取指的高效:路组预测(line and way prediction)和转移预测(branch prediction)。

Line and way prediction

Alpha 21264处理器的I-Cache是64Kb,2路组相连。处理器实现了路预测算法,结合了组相联的缓存效率与直接映射缓存的访问速度。取指部件的结构图如下:

Instruction Fetch
Instruction Fetch

每次取四条指令之后,都会生成一个line和way的预测。该预测指向接下来四条指令的取指位置,包括line和way两个位置信息。处理器在根据预测读取接下来四条指令的同时,会并行地对正在执行的的四条指令的正确性进行检查。

在I-Cache被填充时,以及预测出错时,预测器会被重新训练。在绝大部分的应用程序中,预测器对于line的预测正确率达到了85%,对way的预测准确率达到了100%。为了避免过度训练,预测器设置了2 bit的滞后计数器。当且仅当目前预测器多次发生错误的时候才会进行重新训练。由于预测的高准确率以及很低的miss panalty,该预测机制能够大大提升处理器速度。不仅如此,对于一些可预测的跳转(如动态链接库的调用),可以被很好地训练,减少了计算转移地址的开销(约8个周期)。

当I-Cache发生缓存不命中时,I-Cache会向L2缓存预取最多64字节的数据(即16条指令)。这种预取模式很大地提高了取指的带宽。

转移预测

相比于前代的处理器,转移预测模块对于Alpha 21264的影响更大,原因如下:

  1. Alpha 21264的panelty是7个周期,比前代稍高。
  2. Alpha 21264处理器的指令执行速度大大提升。
  3. 成功的转移预测能够更好地配合推测执行机制。21164处理器可以容纳20条推测执行的指令,而21264可以容纳多达80条指令。

Alpha 21264的转移预测系统从局部预测和全局预测中动态选择。再绝大多数benchmark中可以得到90%到100%的准确率。21264的预测器结构如下图:

Branch Predictor
Branch Predictor

该图左侧是10-bit局部转移pattern,并包含3-bit计数器。局部预测器根据这10-bit从1024个转移计数器中选取一个。图右侧是12-bit的全局转移预测器,对应着全局信息表中的4096个条目之一。同时处理器还有一个Choice Predictor来决定选择哪个预测器的结果。这个predictor根据12-bit的全局记录对4096个条目进行索引。

当一个转移指令被最终提交之后,局部预测器被更新。当一个转移指令发射时,全局计数器就会提前被更新。当然,全局计数器会保存该计数器的备份来防止转移预测失败。

乱序执行 (Out-Of-Order Execution)

Alpha 21264的乱序执行机制允许每个周期发射四条指令。OOO部件会对寄存器进行重命名及映射以解决不必要的寄存器依赖。指令将会被放在队列中,等待其需要的部件的空闲。Alpha 21264有两个定点运算部件以及两个浮点运算部件,所以每个周期处理器最多同时指令6条指令。

下图是乱序执行部件的结构图:

Renaming map and queue
Renaming map and queue

寄存器重命名

寄存器重命名为每条指令分配程序员不可见的结果寄存器。这种技术有以下优点:

  1. 较好地支持推测执行
  2. 在解决了write-after-read和write-after-write冲突的同时保留了read-after-write的依赖

上图的左侧更详细地展示了重命名部件。不难发现,寄存器重命名是在Content-Addressable Memory(CAM)上完成的。流水线中所涉及到的所有操作都发生在重命名后的寄存器中,而不是用户可见的寄存器。

除了用户可见的31个定点寄存器和31个浮点寄存器,Alpha 21264还有用户不可见的41个定点寄存器和41个浮点寄存器。乱序执行、推测执行的结果均存放在这些不可见的寄存器中,不影响用户可见的寄存器的状态。

条件传送指令(conditional-move instruction)在重命名阶段需要被特殊处理。这条指令选择性地将两个寄存器中的一个移动到第三个寄存器中。这是Alpha处理器中唯一需要三个源寄存器的指令:两个寄存器存放待传送的值,一个寄存器保留目标寄存器的原值(以应对传送不发生的情况)。Alpha 21264会将每个条件传送指令分解为两个指令。这两个指令只有两个源寄存器。第一条指令将两个存放待传送的值的寄存器之一放入一个内部寄存器,该内部寄存器的第65位用来标记传送是否成功。第二条指令根据标志位将内部寄存器和目标寄存器的原值选择一个存入目标寄存器。

乱序执行队列(Out-of-Order issues queue)

执行队列由定点执行队列与浮点执行队列两个独立的队列组成。通过记分板技术,处理器每个周期将从队列中选择运算部件可用的指令。记分板将记录单周期、多周期以及不定周期(方寸)指令。一旦这些指令retire,记分板会向所有需要该指令结果的指令进行广播。定点执行队列有20个位置,浮点执行队列有15个位置。队列的结构如上图的右侧。

定点队列静态地将每条指令分配给两个仲裁器中的一个。每个仲裁者负责四个定点执行流水线中的两个。在一个周期中,每个仲裁者将issue队列中最老的两条指令。这部分具体的细节在Execution Engine一章中有更为详细的介绍。

在定点和浮点执行队列中,老的指令的优先级高于新的指令。这保证了推测执行不会影响到正常执行的指令的速度。

指令retire与中断处理

虽然指令被乱序执行,但是所有指令都是被按序retire的。按序retire保证了精确中断。当一个指令执行完毕后,当且仅当这条指令之前的所有指令都retire以后,这条指令才可以retire。按序retire要求处理器记录内部寄存器的使用。每条指令都会额外记录其目的寄存器的原值。当这条指令retire后,原值不可能再被用到,故即可丢掉。如果需要回滚指令,则可以使用保存的原值进行指令回滚。Retire部件有一个80个entry的窗口,提供了极高的并发度。下图展示了不同类型指令从issue到retire的最小需要的周期数:

retire pipe stage
retire pipe stage

在较短的时间窗口内,retire机制在一个周期最多可以提交11条指令,并且可保持在每个周期retire 8条指令。

执行引擎 (Execution Engine)

下图为执行引擎的结构:

execution pipes
execution pipes

从图中我们可以看到,整个处理器有六个执行的流水线,其由两个浮点运算流水线与四个定点运算流水线组成。这些流水线在物理上被放置在相应的寄存器堆的上方或者下方。Alpha 21264处理器将定点的计算流水线划分为两个集群(cluster),每个集群都会保存一整份寄存器堆。虽然定点寄存器集群需要额外的一个周期来广播寄存器的变化,这种设计大大简化了处理器的设计,并提升了处理器的性能。

事实上,集群的结构带来的性能开销很小,原因如下:

  1. 很多操作(如Load与Store)只能在集群的上部或者下部进行运算,其不会对寄存器堆产生影响
  2. 关键路径(critical path)上的指令倾向于在同一个集群上执行

由于老的指令critical程度高于新的指令,所以critical程度越高的指令,在集群中会更早地被执行。这使得集群之间对数据的等待过程减少。

上图中同样描述了浮点流水线,该流水线有一个72个entry的寄存器堆。

Alpha 21264有如下新的计算部件:

  • Alpha motion-video instruction(MVI): 加速图像处理
  • 一个完全整合在流水线中的定点乘法单元
  • Integer population count and leading/trailing zero count unit
  • 浮点开平方运算单元
  • 在定点寄存器与浮点寄存器之间传送数据的部件

下图展示了Alpha 21264中的指令延迟:

Instruction latencies
Instruction latencies

内部存储系统 (Internal Memory System)

Alpha 21264的内部存储系统支持尚未完成的访存、推测执行。访存处理每个周期最多处理来自定点运算部件的两个访存请求。Alpha 21264的访存部件最多可以追踪32个未完成的Load、32个未完成的Store和8个未完成的缓存失效。该存储系统有一个64Kb的二路组相联高速缓存,其不命中率远低于8Kb高速缓存。该访存系统具有高带宽、低延迟的特点。

数据通路 (data path)

Alpha 21264每周期支持两个不冲突的访存操作。为支持这一点,Alpha 21264的cache每周期支持两次访问(在时钟的上升沿和下降沿各一次)。所以Ahpha 21264的D-Cache访问频率是时钟频率的两倍,这是21264存储系统的重要特点。下图是21264存储系统的数据通路:

21264 internal memory data path
21264 internal memory data path

两条64位的数据线路是内部存储系统的核心。每次load操作都会通过这两条数据线路从D-Cache、推测执行数据缓冲区(speculative store data buffer)或者外部系统数据中得到数据。Store指令则是先将数据存入推测执行数据缓冲区,当指令retire之后,数据才会被写入到D-Cache或者其它地方。每此对cache的写可以将两条写操作合并为一条写128位的数据。

Read-modify-write是处理器的一种原子操作。该操作通过在时钟的两个沿先读后写实现。同时,其使用SECDED ECC进行1-bit纠错。

写操作的数据可以被前递给后续的读取操作。如果某个读指令的地址和处于pending状态的写指令地址一直,则进行数据前递。

在上图中,当外部数据被加载进来时,写入寄存器堆(pending load)与写入cache堆操作是并行完成的,同样在时钟周期堆两个沿分别操作。D-Cache使用写返回。

地址与控制结构 (Address and control structure)

内部存储系统存在一个32-entry的LDQ(load queue)和一个32-entry的STQ(store queue)。两个队列中操作的排列顺序和取指顺序一致。

当一个新的访存指令被issue时,其检查该指令的操作地址和时间。Dual-ported address CAM解决了read-after-read,write-after-write,read-after-write和write-after-read四种hazard。STQ CAM逻辑实现了数据前递功能。

下图是21264存储系统规划的示例:

memory pipeline
memory pipeline

这张图没看懂,看懂了再补……

预取与缓存管理 (Cache prefetching and management)

Alpha 21264设计了一套缓存预取指令,使得程序员可以充分利用缓存系统的高带宽。对于循环或者长数组的操作,这样的指令对程序加速很有帮助。下图是缓存预取与缓存管理的指令:

Cache prefetching and management
Cache prefetching and management

总线接口 (Buf Interface Unit)

总线接口(BIU)连接了内部存储系统,L2缓存和其它部分系统。从上层发送的MAF(miss address file)请求经过BIU在从L2(命中)或者从system chipset(不命中)得到请求。BIU在L2缓存和system chipset中借助8-entry当victim file来传递数据。

下图展示了21264的外部线路:

external-interface
external-interface

芯片到L2的数据通路和芯片到system的数据通路时分离的。所有的通路都是高速的点对点通信。Alpha 21264使用clock-forwarding技术去最大化带宽利用。

L2缓存提供了对primary cache对备份。这个缓存是直接映射高速缓存,被数据和指令共享,大小从1M到16M。BIU可支持对SRAM对不同大小、速度的访问。L2缓存的最高传输速度是每1.5CPU周期16Byte,在400MHz的频率下为6.4Gb/s。访问L2缓存的最小延迟是12个周期,比访问D-Cache多9个周期。

Alpha 21264将address-in和address-out分离。这种设计为地址请求(address requests)和系统探针(system probes)提供了小规模多处理器系统设计的可能。21264的系统接口有管脚数量少,管脚带宽高的特点,使得小规模的多核系统设计变得比较简单。BIU有一个8-entry的系统探针队列,其可以在最短的时间内相应系统探针。

Alpha 21264提供了一致性操作(coherence actions)。它可以扩展为大规模的计算系统。21264也支持五种标准的cache状态(MOESI, modified-owned-exlusive-share-invalid)。

BIU提供了范围很大的总线速度。其最大的带宽为每1.5时钟周期8byte数据,在400-MHz的频率下可达3.2GB/s。数据加载延迟为160ns,其中包括60ns的DRAM访问延迟。8个in-flight的MAF队列和8个in-flight的victim队列提供了并行与调度的可能。在Stream benchmark中,Alpha 21264达到1.3GB/s的访存速度。

后记

牛逼