动机
专门的硬件加速器需要有明确对源码进行软硬件抽象,分裂出硬件能够执行的代码,然后使用硬件去加速。软硬件分离的过程是比较耗费人力或者硬件的,比如专用加速器需要人工的方式抽象硬件执行的代码,乱序处理器能够处理循环内的迭代,但硬件开销相比顺序处理器大的多。
本文作者提出了xloop(explicit loop specialization)来编码循环迭代间的依赖关系,指示硬件去执行循环。这些重新编码的循环可以根据加速的硬件执行的快慢来调整执行的载体,即当CPU、加速硬件那个执行的快由谁去执行。
实现
1、编码循环间的迭代
xloop ISA扩展指令的目的是,使用xloop指令对循环数据依赖和控制依赖模式进行编码,刻画出循环固有的并行性
2、编译器支持
这部分将的比较粗糙
a、输入源码的循环注释,说明了xloop指令是{uc/ ua/o}依赖关系的
b、通过修改loop-strength reduction pass 生成xi指令编码MIV(归纳变量的线性函数)
c、使用analysis pass确定迭代间的依赖关系,确定{or/om/orm}
3、硬件实现
IDQ(index queue) : 保存循环的索引
laneRF 的大小和GPP不同是为了减少lane中寄存器堆的大小,因此保存循环指令到Inst Buf时,需要对每条指令做寄存器映射
CIB(cross-iteration buffers) 用于保存CIR(cross-iteration register) 解决寄存器依赖模式(xloop.or):当源操作数为CIR时,因为CIR数据保存在前面的lane中,当前面的CIR有效时当前的lane才可以去执行
LSQ(load-store queue) 用于解决xloop.om模式,store的结果保存LSQ,load时广播到所有的LSQ查询是否存在于LSQ当中。
xloop 加速硬件执行包括了如下两个步骤:
scan phase
当遇到xloop指令时,会将循环的指令提取到Inst Buf,GPP 寄存器转移到laneRF(需要做寄存器映射)
specialized execution phase
LMU 分发迭代索引到各lane IDQ, 开始执行循环,当整个xloop循环执行完,内存更新完毕,LMU通知GPP继续执行
结果
收获启发
访存stall和squash的分析,贯穿整个实验设计和分析。也是发现性能瓶颈,优化加速硬件的好方法。