软件开发与应用
Software Development And Application
电子技术与软件工程
Electronic Technology & Software Engineer!ng
基于RISC-V GCC 编译器的指令延迟调度
天津职称英语报名
余晓江罗欣
(西华师范大学四川省南充市637000 )
摘 要:本文通过对RISC-V GCC 编译器的改进和优化,为进一步研究和优化RSIC-V GCC 奠定了编译器基础,更为快速研究新型的 RISC-V 指令集架构处理器起着重要的推动作用。在深入分析RISC-V GCC 中表调度算法得出编译器可以计算出指令停顿的位置和拍数,指 令延迟调度技术是在编译器中静态调度指令达到动态调度的效果以避免流水线冒险和特殊时序带来的问题.验证了使用指令延迟调度技术
的编译器的性能和正确性,并在火苗原型系统和超导模拟器上运行测试通过.
多谢粤语
关键词:RISC-V 指令集;编译器;延迟调度;指令调度
1引言
2014年加州 大学伯克利分校(University of Cal-I fomia at Berkeley,以下简称 UCB)的研究人员 Krste Asa-novic 、Andrew
典雅意思Waterman 、Yunsup Lee 设计并发布了 RISC-V 指令集架构ul «
RISC-V 基于精简指令集计算(RISC)原理构建的开放RISC-V 指
令集架构(RISC-V instruction t architecture 简 称 RISC-V ISA)
punching
jiangyu121 o RISC-V 指令集架构釆用的是精简指令集,同时有着非常良好
的可扩展性,并且RISC-V 生态系统迅速的发展,促进了这种新型
的RISC-V ISA 在各大处理器设计中得到应用。RISC-V 开源自由
协议受到个人、科研团队以及商业公司的青睐,各大公司纷纷加入
R1SC-V 联盟,如蜂鸟、中科院计算所、英伟达、华为、谷歌、阿
里巴巴等等⑶⑷⑸。
大多数早期超标量处理器⑹都是顺序执行,RISC-V 处理器设
计初期均采用单发射顺序执行的流水线工艺⑺。
流水线技术之所以能提高性能,其本质是利用了时间上的并行
性,让原本应该先后执行的指令在时间上一定程度的并行起来,然
而这样也会带来一些冲突和矛盾,进而可能引发错误,这种情况就
被称为流水线冒险。数据冒险是流水线冒险中最常见的一种,数据 冒险是指令所需要的数据矛盾,如果一条指令需要某个数据而该数
据正在被之前的指令操作,那这条指令就无法执行,就导致了数据
冒险。针对流水线冒险其中一种解决方案是使用流水线停顿来延迟
下一条指令。从而避免流水线冒险带来的程序执行错误。
在传统处理器设计中,流水线借助于一个执行单元队列,让暂
未满足各类资源的指令在此等待一定周期,或者采用流水线停顿技 术(stall)让整个流水线上相关的资源均陷于一定周期的等待状态,
直至问题解除国【刃。等待的周期主要取决于两个因素:前驱指令的
执行开销、以及当前指令所需硬件资源。而这些恰恰是编译器静态 指令调度策略中的核心影响因素。因此,如果借助于静态调度策略,
为当前指令去权衡计算它需要等待的时间,适当调整指令的位置,
在指令排布过程中拉长它和前驱的距离,我们就能保证它在正确的peak
时间完成译码以及到达执行功能部件。
综上所述,虽然成熟的处理器大部分使用动态调度来避免流水
线冒险,但是基于RISC-V 指令集的处理器目前尚未成熟,都处在 研究设计阶段,所以使用RISC-V ISA 的处理器研发时,为缩短研
发周期和研发成本。静态调度是解决流水线冒险最有效的方法。本
thanos文提出一种面向RISC-V 处理器的指令调度技术一一指令延迟调度
技术,用于向RISC-V 处理器研究提供一种实用、有效的软件解决 方案。在RISC-V 处理器研发处于萌芽期的大背景下,编译器延迟 调度技术是一种实用、有效的途径,使编译器的研发不受硬件时序
控制设计与验证的约束,直接在具有基本执行功能的FPGA 或者软 件模拟器上进行研发,从而使软件研发与处理器研发同步前行。
2指令延迟调度技术
本文提出一种基于RISC-V 处理器的编译器调度技术一一指令
延迟调度技术,它通过一个保守的资源开销评估模型对当前指令的
overrun正确发射时间进行评估。通过指令的静态调度对流水线上的指令到 达执行部件的时刻进行干涉,从而有效避免由于指令提前到达执行
部件所引发的流水线冒险。指令延迟调度技术是一种实用、有效的 软件解决方案,使核心软件可以与处理器设计同期同步开展。优化
后的表调度分析算法能够准确地记录每一个基本块中指令流中需要
插入延迟指令的位置和数量。通过本地延迟指令生成算法,生成占
用拍数但又不做任何操作的NOP 指令[,0]o 指令延迟调度技术根据
表调度算法计算出的数据对表调度之后的指令流进行再次调度,使
enter your code每一拍都有指令发射,从而避免流水线冒险带来的执行错误。经过
指令延迟调度的程序在处理器上不需要进行动态调度即可正确高效
的执行。为了不影响编译器的功能模块和方便进行对比测试。将指 令延迟调度封装在编译选项-fsched-delay 中,在编译时,通过使用
编译选项-fsched-delay 来控制编译器使用指令延迟调度技术。
(1)表调度分析算法。要对表调度后的RTL 进行指令延迟调
度,需要优化表调度的分析算法。通过指令调度数据流DUMP 算
法的输出数据流,直观的显示了指令信息。RTL 中间表示阶段所有 指令是由一个结构体存储即INSNo 要对指令进行延迟调度,首先
需要了解表调度的调度原理,如图1所示。指令INSN 已提交到计
划中,从“Ready ”列表移动到“Scheduled ”列表。当发生这种情 况时,“Pending ”列表中的INSN 满足其依赖关系并移动到“Ready ”
列表或“Queued ”集合,具体取决于是否已经有足够的时间使其准
备就绪;随着时间的推移,准备就绪的INSN 从“Queued ”移动到
“Ready ” 列表;“Pending ” 列表(P)是未安排的 INSN_FORW_ DEPS 中的INSN,即准备好,排队和挂起的INSNo "Queued ”
集合(Q )由变量insn_queue 实现。“Ready ”列表(R)由变
量ready 和nread y 实现。"Scheduled"列表(S)是由此传递构
•基金项目:西华师范大学英才科研基金项目(No. 17YC163) o
69
>抄送英语