Quality Optimization Method of Dynamic Binary Translation Code Targeting for RISC-V
-
摘要:
动态二进制翻译是解决一款指令集面临生态系统壁垒问题的主流技术,通过将二进制程序从源指令集翻译成目标指令集,可以在目标指令集的处理器上运行源指令集的应用程序. 动态二进制翻译技术的一大挑战是如何生成高质量的目标指令序列,尤其当源指令集和目标指令集存在差异时. 为探究该问题,以RISC-V64指令集为目标指令集,分析了当RISC-V64,RISC-V32,MIPS32,x86分别作为源指令集时,影响动态二进制翻译技术翻译质量的因素. 针对这些因素,分别提出相应优化方法,并借助RISC-V B扩展和RISC-V P扩展中的部分指令提升翻译质量. 最后,提出一个新的动态二进制翻译程序DBT-FEMU实现优化. 在模拟器和FPGA中的评估数据显示,运行SPEC CPU2006的整数基准程序时,优化方法可使目标程序所执行的动态指令数平均减少57%,平均性能达QEMU-i386的4.12倍.
Abstract:Dynamic binary translation is a mainstream technology to solve the problem of an instruction set facing ecological barriers. By translating the binary program of the source instruction set into the target instruction set, the application program of the source instruction set can be run on the processor of the target instruction set. A major challenge of dynamic binary translation technology is how to generate high-quality target instruction sequences, especially when there are differences between the source instruction sets and the target instruction sets. In order to explore this problem, We take RISC-V64 instruction set as the target instruction, and analyze the factors that affect the translation quality of dynamic binary translation technology when RISC-V64, RISC-V32, MIPS32 and x86 are used as source instructions respectively. In view of these factors, We propose corresponding optimization methods, and improve the translation quality with the help of some instructions in RISC-V B extension and P extension. Finally, We propose a new dynamic binary translation program DBT-FEMU and implement the above optimization technique, DBT-FEMU is evaluated in the simulator and FPGA. The evaluation data show that when running the SPEC CPU2006 integer benchmark, the above optimization techniques can reduce the number of dynamic instructions executed by the target program by an average of 57%, and the average performance of the translated target program is 4.12 times that of QEMU-i386.
-
Keywords:
- dynamic binary translation /
- RISC-V /
- instruction set /
- translation quality /
- optimization
-
生态系统是一款指令集架构(instruction set architecture,ISA)以及相应芯片的生命力所在. 目前主流的两大生态系统是以Windows和Intel为联盟的Wintel生态系统,以及以Android和ARM为联盟的AA生态系统. 对于其他ISA(尤其是新兴ISA,如RISC-V),其生态系统建设面临生态系统壁垒问题:生态系统构成庞大,而且与ISA的耦合度非常高,要将一个生态系统从一款ISA完美地移植到另一款是一项非常困难的工作.因此,生态系统建设需要投入大量人员和精力. 以RISC-V为例,自2011年5月第1版发布起,Linux内核和Binutils工具链分别经过78个月和71个月才进入主线分支[1];而Debian发行版自宣布开始往RISC-V移植至正式发布,则花费41个月 [1].
解决生态系统壁垒问题的主流技术是动态二进制翻译技术. 动态二进制翻译技术的思想与编译技术十分类似,编译技术负责将程序从源代码静态地翻译成行为等价的二进制指令;而动态二进制翻译技术则通过二进制翻译程序在运行时刻将二进制程序从一种源指令翻译成另一种目标指令. 但在生态系统复用的场景中,大部分缺失源代码的二进制程序无法通过编译技术重新生成目标ISA的二进制文件,故编译技术不能解决此问题. 相对地,动态二进制翻译技术在提供二进制程序的场景下即可使用,同时可通过收集运行时刻的信息辅助翻译,因此成为解决生态系统壁垒问题的主流技术.
动态二进制翻译技术的效率受3个因素影响:翻译程序的翻译效率(是否翻译得快);翻译的目标代码质量(是否翻译得好);动态二进制翻译机制的维护开销(是否维护得好). 对于大部分具有明显热点的程序,如SPEC CPU2006基准程序 [2],其执行时间主要集中在若干热点代码片段中,能否翻译出质量更高的目标代码,对这些程序的执行效率影响很大. 因此本文将重点讨论动态二进制翻译的目标代码质量优化方法.
为分析出潜在的优化点,本文选定了一种目标ISA,然后按照语义差异由小到大分析从其他ISA翻译到该目标ISA时,影响动态二进制翻译技术目标代码质量的因素. 具体地,本文以当前流行的RISC-V64为目标ISA,分别将RISC-V64,RISC-V32,MIPS32,x86作为源ISA进行分析,并将影响目标代码质量的因素总结成3点:1)目标寄存器的使用. 一方面,动态二进制翻译机制需要占用部分目标寄存器;另一方面,目标代码与运行时环境进行交互时也需要对目标寄存器进行保存和恢复. 2)源程序和动态二进制翻译器的地址空间存在差异. 为保证目标代码正确访问源程序的数据,需要对所有访存进行段式地址转换. 3)源ISA与目标ISA存在语义差异. 语义差异过大会导致翻译程序需要将1条源指令翻译成若干条目标指令,从而降低目标代码的执行效率.
为解决这3个问题,本文针对动态二进制翻译的翻译质量提出了若干优化方法:
1)为优化目标寄存器的使用,本文提出一套兼容应用程序二进制接口(application binary interface,ABI)的目标寄存器分配方案,将常用的源寄存器分配在静态的目标寄存器中,减少由运行时环境交互引入的状态保存和恢复开销;
2)为解决因源程序和动态二进制翻译器的地址空间差异引入的开销,本文提出一种基于位置无关可执行(position-independent executable,PIE)文件的虚拟地址空间复用方法,借助PIE可加载到任意地址的特性,消除段式地址转换引入的开销;
3)为减少源ISA与目标ISA间的语义差异,本文运用B扩展(位操作扩展)[3]和P扩展(DSP定点运算扩展)[4]中的指令来实现若干条简单目标指令的功能,提升目标代码的质量.
本文在一个新的动态二进制翻译程序DBT-FEMU中实现这些优化方法,在FPGA(field programmable gate array)中通过DBT-FEMU和QEMU-i386分別将x86源程序翻译成RISC-V64目标程序并运行. 评估数据显示,在运行SPEC CPU2006的整数基准程序时,与QEMU-i386相比,DBT-FEMU翻译出的目标程序所执行的动态指令数平均减少57%,平均性能达到QEMU-i386的4.12倍.
1. 背 景
1.1 动态二进制翻译介绍
动态二进制翻译技术主要涉及3个程序:源程序(source program)是翻译过程的输入;目标程序(target program)是翻译过程的输出,其ISA通常与本地环境的ISA相同,可直接在本地环境运行;翻译程序(translation program)是执行翻译操作的主体,负责读入源程序并输出目标程序. 源程序的指令称为源指令(source instruction),目标程序的指令称为目标指令(target instruction).
图1展示了动态二进制翻译的基本工作流程. 在翻译过程中,源程序的指令以基本块(basic block)为单位划分. 对于即将执行的基本块,翻译程序首先检查该基本块是否已被翻译. 若否,翻译程序首先将该基本块中的源指令翻译成行为等价的目标指令;若是,翻译程序将直接取出该基本块的翻译结果. 接下来翻译程序将把执行控制权交给翻译后的目标指令. 执行该基本块之后,翻译程序将分析源程序的下一个基本块. 此过程将循环进行.
与将源代码编译成目标指令并直接在目标机器上运行相比,通过动态二进制翻译技术运行源程序的运行效率一般有所下降. 影响运行效率的原因主要有3点:1)翻译程序翻译的速度. 由于动态二进制翻译技术需要在运行时刻进行翻译,故翻译的时间开销会算入程序运行时间,若翻译耗时过长,将降低程序运行的效率. 2)目标指令的质量. 翻译程序翻译出目标指令之后,将执行这些目标指令,若目标指令质量较低,则需执行更多指令,从而降低程序运行的效率. 3)维护二进制翻译机制所需开销. 动态二进制翻译技术需要在翻译程序和目标程序间来回切换执行,同时需要正确处理翻译程序和目标程序的地址空间,还要正确维护源基本块和目标基本块的映射关系. 在这一系列开销中,有的体现为翻译过程的开销,有的体现为额外数量的目标指令,有的则体现为支持目标程序运行时环境的开销.
1.2 RISC-V B扩展和RISC-V P扩展介绍
RISC-V B扩展由若干扩展组件组成,旨在缩减代码大小、提升性能和节约功耗. B扩展中的大部分指令具有通用性,但小部分指令在某些特定领域中更有用. 因此B扩展以若干个较小的子扩展组成,根据功能和使用场景对子扩展进行分组. 每个子扩展包含一些作用相近的指令,故通常共享相同的硬件逻辑. 这些子扩展覆盖的功能包括地址生成(Zba子扩展)、基础位操作(Zbb子扩展)、无进位乘法(Zbc子扩展)、单比特操作(Zbs子扩展)、交叉排列(Zbkx子扩展)和面向密码算法的位操作(Zbkb子扩展).
RISC-V P扩展旨在提升数字信号处理(digital signal processing,DSP)算法在RISC-V处理器上的处理能力,这些算法覆盖了传感器融合、伺服电机控制、音频编解码、语音合成和编码、视频解码、医学成像、计算机视觉、嵌入式控制、机器人、人机接口等领域. 通过添加RISC-V P扩展,RISC-V处理器运行上述DSP应用程序时可降低功耗并提升性能. 具体地,RISC-V P扩展通过引入面向整数以及8b,16b,32b定点数据类型的单指令多数据(single instruction multiple data,SIMD)指令来实现上述优化. 与其他 SIMD 指令不同,RISC-V P扩展使用通用寄存器而不是专用寄存器来执行SIMD操作,对嵌入式应用具有更好的效果. 此外,RISC-V P扩展还包括一些用于定点运算的非SIMD指令.
2. 相关工作
2.1 传统的动态二进制翻译器
动态二进制翻译技术在2000年前后是一个研究热点. 一个经典的工作是Transmeta公司通过动态二进制翻译技术运行x86的Windows生态系统. Transmeta公司的处理器是顺序的超长指令字(very long instruction word,VLIW)架构,其上运行专门开发的代码变换软件(code morphing software,CMS),通过软硬件协同实现x86架构的兼容性[5]. CMS由解释器、运行时系统和动态二进制翻译器组成. CMS的解释器通过记录x86指令的执行频率和一些启发性指标,为后续的翻译优化过程提供指导. 这种做法与Shade软件[6]类似,但CMS的翻译开销比Shade大很多,生成的代码质量也高很多. 在软硬件协同设计方面,CMS和硬件处理器协同实现一套“推测执行−检查恢复−自适应重翻译”机制[7]. 具体地,CMS首先进行激进的推测,包括假设不发生异常,假设没有内存映射输入输出(memory-mapped I/O,MMIO)的访存,假设访存操作没有重名,假设不存在自修改代码. 在这些假设的前提下,CMS可生成高度优化的推测执行代码. 然后处理器执行代码时检查这些假设是否成立,若不成立,则回滚到最近一次提交的状态并进行解释,来保证程序正确执行. CMS也会统计回滚频率,若回滚操作频繁发生,将在激进程度较低的假设下重新翻译代码,以减少回滚操作的开销. CMS中包含的解释器可模拟用户模式和系统模式的操作,同时CMS支持从初始版本到最新多媒体指令的所有x86指令,故对x86指令的兼容性高于同期的动态二进制翻译器.
同期还有不少著名的动态二进制翻译器. DEC公司的FX!32是一个程序分析导向的动态二进制翻译器[8]. 其他的动态二进制翻译系统还有IBM公司的Daisy和BOA[9-10]. 一些系统结合了解释与动态二进制翻译. 例如,Java HotSpot客户端编译器包含Java虚拟机(Java virtual machine,JVM)解释器和即时编译器,以实现机器代码性能与编译速度之间的平衡[11]. HP公司的Aries模拟器结合了代码的快速解释与动态翻译,在IA-64系统上通过HP-UX透明并正确地执行PA-RISC应用程序[12]. 此外,也有一些机器自适应的动态二进制翻译器可根据机器特性规范及其ISA来支持不同的源和目标机器的二进制翻译,例如UQDBT[13]和Walkabout/Yirr-Ma框架[14].
2.2 QEMU
QEMU[15]是一个开源的ISA模拟器,可通过动态二进制翻译模拟处理器行为,并为机器提供不同的硬件和设备模型,使其运行于各种客户操作系统. QEMU还支持运行Linux用户级程序,甚至允许将编译成一种ISA的应用程序运行在另一种ISA的处理器上. QEMU支持多种ISA的模拟,包括x86、MIPS64(支持到第6版)、SPARC、ARM、SuperH、PowerPC、ETRAX CRIS、MicroBlaze和RISC-V.
QEMU支持多种源ISA和多种目标ISA,这是通过QEMU中的目标代码生成器TCG实现的. 具体地,TCG将QEMU的动态二进制翻译过程划分成2部分:1)将源程序以基本块为单位翻译成TCG指令,其中TCG指令是一种机器无关的中间表示;2)通过目标代码生成器TCG将这些TCG指令编译成目标代码. 通过对过程的划分,QEMU可对TCG指令进行优化,如活跃变量分析、可达性分析、消除冗余数据移动等. QEMU从0.10.0版本引入TCG,消除了早期版本中dyngen模块依赖特定版本GCC编译器的缺陷[16],方便QEMU在运行时刻与代码生成和其他任务交互(如支持插件等).
QEMU支持将x86源程序翻译成RISC-V64目标程序,但翻译质量较低. 据测试,运行SPEC CPU2006整数基准程序的test输入时,QEMU将源程序从x86翻译到RISC-V64后, 目标程序的平均运行效率只有本地的8.04%.
一些面向QEMU的优化工作包括通过信息静态预处理方法优化源程序的库函数调用 [17];通过对目标处理器的指令缓存和数据缓存的访问进行动态负载均衡调度,缓解QEMU产生的目标代码对缓存的压力,从而提升目标程序执行的效率[18].
2.3 面向RISC-V的动态二进制翻译器
2015年后,学术界开始围绕RISC-V开展动态二进制翻译的研究工作. Rv8[19]利用ISA、ABI和当前的x86-64微结构特征,将31个RISC-V源寄存器更合理地映射到16个x86-64目标寄存器. 同时Rv8还利用行为复杂的指令提升目标代码密度,并将微操作融合成复杂指令,生成最少数量的目标微结构微操作. Ilbeyi等人[20]为ISA模拟器生成器Pydgin添加RISC-V支持,方便用户生成一个易于个性化的动态二进制翻译引擎. R2VM[21]利用二进制翻译来实现周期精确的全系统快速模拟,支持运行时刻在功能模式和时序模式之间按需切换. 但这些动态二进制翻译程序都是将RISC-V64源程序翻译成x86-64目标程序,而本文探究的是将x86源程序翻译成RISC-V64目标程序的翻译质量.
2.4 RISC-V B扩展和RISC-V P扩展的相关工作
目前RISC-V B扩展标准已经冻结,近年来学术界也有一些研究工作围绕RISC-V B扩展开展. Marshall等人[22-23]受到RISC-V B扩展的启发,介绍了第1个完整的32b RISC-V加密扩展的开源实现. Babu等人[24]实现了RISC-V B扩展,并从代码密度和速度提升2个方面对位操作指令进行了量化分析,结果显示,某些程序采用RISC-V B扩展后,运行效率提升28%,同时代码长度降低20%. 而对于RISC-V P扩展,虽然其标准目前尚未完全冻结,但也有一些研究工作围绕RISC-V P扩展开展. 例如Chen等人[25]提出了一个端到端系统栈,通过在TVM和LLVM上支持RISC-V P扩展指令,使RISC-V架构可高效运行机器学习模型. 与上述研究工作不同,本工作期望通过RISC-V B扩展和RISC-V P扩展提升动态二进制翻译的目标代码质量.
3. 动态二进制翻译的目标代码质量分析
为保证正确运行目标代码,在不同ISA间进行动态二进制翻译,通常需要翻译出多条目标指令. 本文以RISC-V64作为目标ISA,按照语义差异由小到大的顺序,讨论从其他ISA翻译到RISC-V64时影响目标代码质量的因素,为动态二进制翻译的代码质量优化提供依据.
3.1 RISC-V64作为源ISA
为简单起见,本文首先讨论RISC-V64作为源ISA的情况,即将RISC-V64源程序通过二进制翻译技术翻译到相同的目标指令并执行. 在这种情况下,由于源ISA和目标ISA完全相同,故运行目标代码的额外开销主要源于动态二进制翻译机制的固有开销. 具体地,本文对常见整数指令进行分类,并分别讨论动态二进制翻译在翻译相应类型指令时引入的开销.
整数计算指令只会在寄存器间进行计算,包括算术运算指令、逻辑运算指令、移位指令、立即数加载指令. 但在动态二进制翻译机制中,为保证运行时环境的正确性,并非所有目标寄存器都可直接分配给目标代码使用. 如gp寄存器用于存放指向全局偏移量表(global offset table,GOT)的指针,供运行时环境的动态链接机制使用,覆盖它将导致相关功能出错. 故即使源ISA与目标ISA完全相同,动态二进制翻译的机制仍需占用部分目标寄存器,使部分源寄存器只能分配到目标内存中. 若源程序读取这部分源寄存器,则需额外翻译一条目标访存指令,将源寄存器的值从目标内存读入临时寄存器;若源程序写入这部分源寄存器,也需额外翻译一条目标访存指令,将访存数据从临时寄存器写回源寄存器对应的目标内存中.
对于访存指令,因源程序的地址空间与动态二进制翻译器的地址空间不同,动态二进制翻译器会在其地址空间中分配一段连续的内存区间供源程序访问,如图2所示. 为了让翻译出的目标访存指令访问到正确的内存位置,还需额外翻译出1条加法指令进行段式地址转换,对源程序的访存地址加上该内存区间的基地址,使其结果落在该内存区间内.
对于控制转移指令,由于源指令长度与目标指令长度不存在明确对应关系,故翻译程序须正确维护每个基本块的源地址和目标地址间的映射关系. 源程序执行控制转移指令时,需通过源地址查询该映射关系,得到目标地址并跳转. 对于直接跳转指令(如jal和beq等),可以通过块链接技术(block chaining)[15]节省查询开销. 但因目标指令中跳转范围有限(如RISC-V64中beq指令跳转范围是±4KB),若跳转距离较远,则需通过额外1或2条目标指令将跳转目标地址装载到临时寄存器中,再通过间接跳转指令进行跳转.
除上述指令的翻译外,调用运行时环境的辅助函数也会引入开销. 具体地,函数调用需遵循ABI规范的调用约定(calling convention),其中规定了每个寄存器由何者保存(调用者或被调用者). 因此,若目标代码调用运行环境的辅助函数时,希望某由调用者保存的目标寄存器不被破坏,则需在调用前把该目标寄存器的值保存到栈上,并从辅助函数返回后恢复该寄存器.
3.2 RISC-V32作为源ISA
RISC-V32是RISC-V64的子集,大部分RISC-V32指令均可翻译成一条RISC-V64指令. 但因ABI规范中定义的数据模型(data model)的差异,部分情况下需翻译出额外的目标指令. 具体地,RISC-V32采用ILP32数据模型,即整数、长整数、指针类型变量的长度均为32 b;而RISC-V64采用LP64数据模型,即整数类型变量的长度为32 b,长整数、指针类型变量的长度均为64 b,同时其ABI规范的调用约定规定,32 b数据以符号扩展的形式在64 b寄存器中存储[26-27]. 故目标访存指令访存时,可能因访存地址的高32 b存放了符号扩展的结果,使其落在0~4 GB外,触发非法访问异常,如图3所示. 为解决此问题,翻译程序需在目标访存指令前生成额外的目标指令,对访存有效地址合规化,即对访存地址的高32 b清零,保证访存有效地址位于0~4 GB内.
3.3 MIPS32作为源ISA
与将RISC-V32作为源ISA的情况相比,翻译程序还需为另外2种情况翻译出额外的目标指令:1)对于行为稍复杂的源指令,需多条目标指令组合实现其功能,如MIPS32的nor指令需翻译成or和xori这2条RISC-V64指令,而MIPS32的条件传输指令movz则需翻译成8条RISC-V64指令;2)MIPS32的I型指令中的立即数长度为16b,但因RISC-V64指令中的立即数为12b有符号数,其表示范围为−2048~+2047,故若源指令的立即数大于2047,则翻译程序需翻译出额外的目标指令用于装载立即数.
3.4 x86作为源ISA
因x86更复杂,故有更多因素影响动态二进制翻译的目标代码质量:1)与MIPS32的复杂指令类似,翻译程序需将x86的复杂指令翻译出多条目标指令来完成其功能,如bswap指令用于对源寄存器按字节反向排序. 特别地,x86支持多种寻址方式,其中最复杂的是相对基址变址寻址,如mov $0x1,−0x2000(%ecx,%ebx,4),其有效地址需通过计算ECX+EBX×4−0x2000得到,故翻译程序需为该源指令额外翻译出3条目标指令用于计算有效地址. 2)x86通过标志寄存器EFLAGS存储某些指令执行的结果(如算术比较指令cmp),并在后续指令中读出标志来决定如何执行该指令(如条件跳转指令je). RISC-V64不支持标志寄存器,故需通过较多目标指令维护EFLAGS寄存器的状态. 一般通过条件码惰性求值(lazy condition code evaluation)技术[15]优化冗余的条件码计算,以减少目标指令. 3)x86通用寄存器的组织方式类似C语言的联合体,可通过字节和半字方式读写通用寄存器的低位,如图4所示. 但RISC-V64的通用寄存器仅支持整体读写,要支持x86通用寄存器的特性,需通过多条目标指令读出目标寄存器的一部分,对读出结果与待写入数据进行拼接,最后将拼接结果整体写入目标寄存器.
3.5 翻译质量分析案例
如图5所示,在RISC-V64平台上运行的QEMU-i386将1条采用基址变址寻址方式的x86源指令翻译成8条RISC-V64目标指令. 由于QEMU采用简单的基本块内数据流分析技术,可对多条x86源指令翻译出的RISC-V64目标指令进行优化,故本案例中,在RISC-V64目标指令①前,EDX源寄存器的值已被读入s3目标寄存器. 基于该前提,QEMU-i386翻译出的8条RISC-V64目标指令说明为:①从目标内存中读取变址寄存器EBX的值到临时寄存器s5中;②通过逻辑左移操作将EBX的值左移1 b,计算EBX×2;③从目标内存中读取基址寄存器EBP的值到临时寄存器s7中;④将基址与变址相加,计算访存的有效地址,即EBP+EBX×2;⑤将④计算出的有效地址逻辑左移32 b;⑥将⑤的结果逻辑右移32 b,⑤⑥这2步用于对访存地址合规化,得到合法的32 b有效地址;⑦对该合法的有效地址进行段式地址转换,加上源程序的内存在动态二进制翻译器中的基地址(提前存放在目标寄存器s1中),计算出目标程序需访问的内存地址;⑧把DX寄存器的值写入该内存地址.
从图5案例可见,翻译出的8条目标指令中只有目标指令⑧反映出该x86源指令本质的写入内存操作,其余目标指令均因动态二进制翻译而被额外引入. 具体地:1)指令①和指令③的引入是由于QEMU-i386把部分源寄存器(包括EBP和EBX)分配到目标内存,需通过额外的目标访存指令访问. 2)指令②和指令④的引入是由于x86的编程模型与RISC-V64存在较大差异,此处体现在寻址模式的差异,RISC-V64需通过指令②和指令④实现x86基址变址寻址方式. 3)指令⑤和指令⑥的引入是由于ABI规范中数据模型的差异,具体地,x86是32 b的ISA,采用ILP32数据模型,其指针长度为32 b,只能访问0~4GB的地址空间;而RISC-V64是64 b的ISA,采用LP64数据模型,其指针长度为64 b,可访问4 GB以上的地址空间. 故通过RISC-V64目标指令计算出访存地址后,还需通过指令⑤和指令⑥对访存地址合规化,即将地址的高32位清零,保证访存地址位于0~4 GB内. 4)指令⑦的引入是由于源程序的地址空间与QEMU-i386不同,需加上提前存放在目标寄存器s1中的基地址进行段式地址转换.
4. 动态二进制翻译代码质量优化方法
针对上述动态二进制翻译代码质量分析结果,本文提出若干方法提升动态二进制翻译的代码质量,如表1所示. 其中块链接技术和条件码惰性求值技术已被广泛应用于动态二进制翻译领域[7].
表 1 动态二进制翻译代码质量优化方法总览Table 1. Summary of Code Quality Optimization Methods for Dynamic Binary Translation源ISA 影响翻译质量的原因 翻译质量下降的表现 优化方法 RISC-V64 对于整数计算指令,部分源寄存器需分配到内存 需翻译出额外的目标访存指令访问源寄存器 兼容RISC-V64 ABI的目标寄存器分配方案 对于访存指令,源程序和翻译程序的地址空间不一致 需翻译出额外一条加法指令进行段式地址转换 基于PIE的虚拟地址空间复用方法 对于控制转移指令,源指令长度与目标指令长度不存在明确对应关系 需正确维护每个基本块的源地址和目标地址间的映射关系 块链接技术[15] RISC-V32 数据模型的差异 需翻译出额外的目标指令对访存有效地址合规化 基于RISC-V B扩展指令的地址合规化方法 MIPS32 行为复杂的源指令 需翻译出多条目标指令 基于RISC-V B扩展指令的复杂指令优化方法 立即数大于2 047 需翻译出额外的目标指令用于加载立即数 暂无优化方法 x86 复杂寻址模式 需翻译出2条或3条目标指令用于计算有效地址 基于RISC-V B扩展指令的有效地址计算方法 维护EFLAGS寄存器 需翻译出较多指令 条件码惰性求值技术[15] 源寄存器的字节和半字访问 需通过多条指令读出和写入目标寄存器 基于RISC-V B扩展指令的x86寄存器访问方法 4.1 兼容RISC-V64 ABI的目标寄存器分配方案
QEMU-i386默认不将任何x86源寄存器分配到RISC-V64目标寄存器中,而是将其分配在目标内存中,需通过访存指令访问,并通过数据流分析技术对目标寄存器使用情况进行动态分析,优化冗余的访存指令. 因RISC-V64有32个通用寄存器,远多于x86的8个通用寄存器,故可将这8个源通用寄存器均静态地分配到RISC-V64的目标通用寄存器中,以消除因访问源通用寄存器而引入的目标访存指令.
因翻译后的目标程序会与翻译程序提供的运行时环境交互,如调用辅助函数、处理系统调用,故可根据RISC-V64的调用约定规范更合理地分配x86源寄存器,实现按需保存寄存器. 本文采用的寄存器分配方案如表2所示.
表 2 兼容RISC-V64 ABI的目标寄存器分配方案Table 2. Target Register Allocation Scheme Compatible with RISC-V64 ABI目标
寄存器分配方案 目标
寄存器分配方案 zero 不分配 a6 临时寄存器 ra 空闲 a7 临时寄存器 sp 源ESP寄存器 s2 源EAX寄存器 gp 不分配 s3 源ECX寄存器 tp 不分配 s4 源EDX寄存器 t0 临时寄存器 s5 源EBX寄存器 t1 临时寄存器 s6 源ESI寄存器 t2 临时寄存器 s7 源EDI寄存器 s0/fp 源EBP寄存器 s8 条件码惰性求值专用寄存器 s1 0~31b掩码 s9 条件码惰性求值专用寄存器 a0 空闲 s10 条件码惰性求值专用寄存器 a1 空闲 s11 全局指针 a2 空闲 t3 临时寄存器 a3 临时寄存器 t4 临时寄存器 a4 临时寄存器 t5 0~15b 掩码 a5 临时寄存器 t6 8~15b掩码的取反 此分配方案的说明为:1)x86的8个源寄存器被分配到RISC-V64的sp,s0和s2~s7中,在调用约定规范中,这些目标寄存器均为被调用者保存,若被调用者无需使用这些寄存器,则无需保存,达到按需保存寄存器的效果. 2)因条件码惰性求值所用寄存器的生存期可能跨越不同基本块,故将其分配到s8,s9,s10,亦可借助调用约定规范实现按需保存寄存器的效果. 3)s11存放用于和运行时环境交互的全局指针,其作用类似于指向GOT的指针. 具体地,该全局指针指向内存中预先分配的一张表,该表用于分配不常用的变量(如EFLAGS中的DF标志)以及运行时环境提供的辅助函数的地址,通过全局指针,翻译后的目标程序可方便地访问表中内容. 4)因RISC-V64的寄存器数量较多,故可将翻译过程所用临时寄存器静态分配到固定的目标寄存器中,从而无需在翻译程序中实现目标寄存器的动态分配,既简化了翻译程序的实现,又提升了翻译速度. 此外,本方案将t0~t4以及a3~a7用作翻译过程中的临时变量,根据调用约定规范,虽然这些目标寄存器在函数调用过程中可能被覆盖,但若临时变量的生存期不会跨越1条源指令,则目标程序无需保存相应寄存器. 5)翻译程序可在目标寄存器中静态分配若干常用的常数提升翻译质量,如长度分别为8 b,16 b,32 b的掩码,借助这些掩码可方便实现x86通用寄存器的字节和半字访问,具体方法将在4.6节介绍. 6)目标寄存器zero,gp,tp不向目标程序分配,其中zero寄存器恒为0,不适合分配;gp和tp分别用于存放翻译程序的全局指针和线程指针,破坏它们将导致翻译程序运行错误. 7)a0~a2及ra为空闲,翻译程序未使用.
4.2 基于PIE的虚拟地址空间复用方法
为优化因源程序和动态二进制翻译器的地址空间差异引入的开销,本文利用了PIE和虚拟地址空间的特性. 具体地,动态二进制翻译器可将源程序的代码和数据加载到与源程序自身虚拟地址相同的内存位置,以消除源程序和动态二进制翻译地址空间的差异. 此后,段式地址转换所需加上的偏移量为0,故无需翻译出加法指令,使目标程序直接通过源程序虚拟地址空间中的地址进行访存时,亦可正确访问加载的内存位置.
但若加载源程序时,其内存位置已被动态二进制翻译器所使用,加载过程将破坏动态二进制翻译器. 为解决此问题,本文将动态二进制翻译器自身编译成PIE,此后操作系统可将PIE加载到任意内存位置正确运行. 目前本地环境通常为64 b,其虚拟地址空间远大于4 GB(如RISC-V64支持 Sv39分页机制,默认的虚拟地址空间至少为512 GB),操作系统通常将PIE加载到位于4 GB以上的动态段(dynamic segment);而32 b的源ISA只支持32 b的虚拟地址空间,故按照上述加载方案,源程序均会被加载到0~4 GB的内存范围;对于64 b的源ISA,虽然其虚拟地址空间多于4 GB,但根据ABI规范,源程序的起始地址同样位于0~4 GB. 综上,源程序的加载过程均不会破坏动态二进制翻译器,从而保证优化方法正确工作.
4.3 基于RISC-V B扩展指令的地址合规化方法
为优化访存地址合规化操作,需考虑如何高效进行“对64 b寄存器的高32位清0”的操作,以保证访存地址位于0~4 GB范围. QEMU-i386对该寄存器左移32 b,将原高32 b移出,再将结果逻辑右移32 b,以实现地址的合规化. 此方法需花费2条目标指令.
为优化访存地址合规化操作,可预先在某目标寄存器中存放低32 b的掩码,即0x00000000ffffffff,再将此掩码与需合规化的目标寄存器进行与操作. 因可在翻译程序初始化阶段设置该掩码,故翻译程序只需额外翻译出1条and目标指令,与QEMU-i386采用的方法相比可节省1条目标指令. 但该方法需占用1个目标寄存器存放掩码. 为进一步节省该目标寄存器,可利用RISC-V B扩展中的add.uw指令. 具体地,目标指令add.uw r, r, x0可对目标寄存器r的0~31 b 进行0扩展.
可进一步利用编译优化技术中的数据流分析技术节省冗余的合规化操作. 具体地,采用数据流分析技术可分析每条指令执行后其目标寄存器是否已满足“高32 b为0”的条件,得知执行访存指令前地址是否已合规化. 若是,则无需生成用于合规化的目标指令.
4.4 基于RISC-V B扩展指令的复杂指令优化方法
一些源指令的行为较复杂,如x86中的bswap指令需对源寄存器按字节反向排序. 若仅翻译到RISC-V64的基础ISA,将花费约10条目标指令;若使用RISC-V B扩展中的rev8指令实现该功能,则可大幅度提升翻译质量. 类似情况还有置位计数指令(如x86中的popcnt指令)、前导0和尾随0计数指令、循环移位指令等,皆可采用RISC-V B扩展中行为相同的指令作为目标指令.
4.5 基于RISC-V B扩展指令的有效地址计算方法
为优化有效地址计算,需考虑如何高效计算“基址+变址×比例因子”. QEMU-i386先通过移位指令计算“变址×比例因子”,再与基址相加得到有效地址. 此方法需花费2条目标指令.
为优化上述操作,可采用RISC-V B扩展中的sh1add,sh2add,sh3add指令直接计算“基址+变址×比例因子”. 上述指令在加法前分別对变址寄存器的值左移1 b,2 b,3 b,即分别乘以2,4,8,故可节省1条用于移位的目标指令.
4.6 基于RISC-V B扩展指令的x86寄存器访问方法
读取x86寄存器的字节和半字需抽取该寄存器部分数据到另一寄存器的低位. 对于半字读取,QEMU-i386对该寄存器左移16 b,移出高16 b,再对结果的低32 b逻辑右移16 b,从而把原来的16~63 b清0,实现抽取0~15 b的效果. 此方法需花费2条目标指令. 为优化上述操作,可预先在某目标寄存器中存放低16 b的掩码,即0x000000000000ffff,再将此掩码与代抽取寄存器进行与操作得到其低16 b,此方法只需花费1条目标指令. 为进一步节省该目标寄存器,可利用RISC-V B扩展中的zext.h指令. 具体地,目标指令zext.h rd, rs可对寄存器rs的低16 b进行0扩展并写入寄存器rd.
对于字节读取,又分从0~7 b读取(如AL寄存器)和从8~15 b读取(如AH寄存器)2种情况. 从0~7 b读取的情况较简单,其掩码为0x00000000000000ff,可通过12 b有符号数表示,故可通过目标指令andi rd, rs, 0xff实现,无需进一步优化. 要从8~15 b读取,则需先对寄存器右移8 b,再借助上述目标指令抽取结果的低8 b,共计2条目标指令. 为进一步优化,可利用RISC-V B扩展中的xperm.b指令. 如图6(a)所示,指令xperm.b rd, rs1, rs2根据寄存器rs2中的索引向量对寄存器rs1中的值以字节为单位查找并重组,若索引向量中的元素大于7,则结果向量中相应位置为0. 故可通过目标指令序列li r, 0xffffffffffffff01; xperm.b rd, rs, r实现“从寄存器rs读取8~15 b到寄存器rd”的功能. 具体地,0xffffffffffffff01为xperm.b所用索引向量,其功能为“将寄存器rs中索引为0x01的字节写入寄存器rd的第0字节,并将rd其余字节清0”. 将该索引向量预先存放到某目标寄存器,可节省用于加载立即数的指令li,从而通过一条xperm.b指令读取x86寄存器8~15 b的字节.
写入操作更复杂,因为写入x86寄存器的字节和半字要求其他字节保持不变. 以半字写入操作为例,需先将写入目标的0~15 b清0,再将待写入数据的16~63 b清0,最后对二者进行或操作,QEMU-i386为该过程翻译出5条目标指令. 为优化此过程,可利用RISC-V B扩展中pack和xperm.b指令,其中pack指令的行为如图6(b)所示. 首先通过pack指令把写入目标的0~31 b和待写入数据的0~31 b拼接起来,再借助合适的索引向量让xperm.b指令从拼接结果中选择正确的字节并重组,得到写入操作的结果. 通过pack指令拼接后,写入目标的数据位于拼接结果的第2字节(从0开始计数,下同)和第3字节,待写入数据位于拼接结果的第4字节和第5字节,故令索引向量为0xffffffff03020504. 同理可实现0~7 b的写入和8~15 b的写入,索引向量分别为0xffffffff03020104和0xffffffff03020400. 将索引向量预先存放到某目标寄存器,可通过2条目标指令实现x86寄存器的字节和半字写入操作.
若采用RISC-V P扩展,则可通过1条目标指令实现x86寄存器的字节和半字写入操作. 对于字节写入操作,可通过insb指令把待写入字节插入到写入目标中的正确位置;而对于半字写入操作,可通过pktb16 rd, rs1, rs2指令将rs1的16~31 b与rs2的0~15 b进行拼接. 但RISC-V P扩展的标准规范仍未完全冻结,其指令语义还可能变化.
5. 实验评估
5.1 目标指令数量评估
本文首先在模拟器上评估翻译出的RISC-V64指令数量. 本文选择Spike模拟器[28]作为RISC-V64模拟器,它被RISC-V基金会指定为RISC-V指令行为的标准参考实现. 本文在Spike模拟器的基础上新增了一个动态二进制翻译模块,得到DBT-Spike. DBT-Spike可在运行时刻从内存中读出x86指令并译码,然后生成RISC-V64目标指令并执行. DBT-Spike还为用户态模式提供运行时环境的支持,包括加载x86程序以及系统调用的捕获和转发.
本文选择SPEC CPU2006的整数基准程序,使用编译目标为i686-linux-gnu的GCC 10.2.1编译基准程序,编译选项为-O2和-static,其中使用-static是因为DBT-Spike暂不支持加载动态链接的程序. 该编译目标将编译出静态链接的32 b x86程序,这些程序将会以用户态模式在DBT-Spike上运行,DBT-Spike将统计执行的RISC-V64指令数量,从而体现动态二进制翻译技术的翻译质量. 本文采用test输入规模来运行SPEC CPU2006的整数基准程序. 实验评估不采用浮点基准程序,一方面是因为QEMU通过纯软件模拟方法翻译浮点指令,难以准确统计其动态目标指令数量;另一方面,本文的优化技术主要针对整数指令的翻译.
图7展示依次添加各项优化技术后,DBT-Spike通过动态二进制翻译方式执行基准程序所花费的动态目标指令数量,其中以QEMU-i386的动态目标指令数量作为归一化的基准,数值越小表示优化效果越好. 具体地,在这一基准上,“兼容RISC-V64 ABI 的目标寄存器分配方案”平均节省41%的动态目标指令数量,对于483.xalancbmk甚至可节省48%的动态目标指令数量. 在此基础上采用“基于PIE的虚拟地址空间复用方法”,可平均节省总计48%的动态目标指令数量. 进一步优化地址合规化,则可平均节省总计56%的动态目标指令数量. 继续对复杂指令、有效地址计算方法和x86寄存器访问方式进行优化后,最终可平均节省总计57%的动态目标指令数量,说明这3种优化技术在选定的基准程序上的优化效果不明显. 分析后发现,这是因为在基准程序的热点基本块中,复杂指令、复杂寻址模式以及x86字节和半字访问频率较低. 以复杂指令为例,占比最多的是400.perlbench的pack输入集,其复杂指令占源程序动态指令数的比例达到0.13%;对于大部分基准程序,该比例均小于0.0001%.
5.2 性能评估
本文在现场可编程门阵列(field programmable gate array,FPGA)平台上评估动态二进制翻译优化技术的性能. 为此,本文采用开源乱序超标量RISC-V处理器BOOM[29]作为目标处理器,并使用LargeBOOM的配置,其流水线的具体配置如表3所示. LargeBOOM还分别配备32 KB一级指令缓存和32 KB一级数据缓存,以及1 MB的二级联合缓存. 此外,本文在其流水线中实现了扩展指令. 目标处理器被综合并下载到Xilinx zu19eg FPGA[30] 中,主频为80 MHz. 为缓解FPGA中内存主频比CPU主频高的问题,本文在访存通路上额外添加90周期延迟,以得到更接近真实芯片场景的性能数据.
表 3 LargeBOOM流水线配置Table 3. Pipeline Configuration of LargeBOOM参数 取值 参数 取值 单次取指数量 8 整数寄存器数量 100 单次译码指令数量 3 浮点寄存器数量 96 ROB项数 96 读访存队列项数 24 整数队列项数 16 写访存队列项数 24 浮点队列项数 32 最大分支数量 16 访存队列项数 24 指令缓冲区项数 24 为在目标处理器上评估本文提出的动态二进制翻译优化技术,本文将DBT-Spike修改成翻译程序DBT-FEMU. DBT-FEMU在翻译出目标指令后,将切换到执行模式,并跳转到目标指令执行;而在遇到未翻译的基本块时,将切换到翻译模式对基本块进行翻译. 同时,DBT-FEMU实现了块链接技术和条件码惰性求值技术.
本节用于性能评估的基准程序及其编译方法与5.1节相同. 同样的x86基准程序将运行在DBT-FEMU和QEMU-i386 6.2.0中,二者均可将x86指令翻译为RISC-V64指令,并在相同的目标处理器上运行. 此外,目标处理器上将启动RISC-V64版本的Linux 5.6.0操作系统内核,并运行Debian 12发行版,DBT-FEMU和QEMU-i386将在该发行版上运行,系统层次如图8所示:
图9展示了QEMU-i386和DBT-FEMU运行基准程序的性能. 考虑总体性能,QEMU-i386的平均运行效率是本地的8.04%;而DBT-FEMU的平均运行效率达到本地的33.54%,是QEMU-i386的4.17倍. 其中,执行429.mcf时,DBT-FEMU的效率甚至达到本地运行效率的1.12倍. 这是因为429.mcf的核心数据中包含指针,在RISC-V64的本地程序中,429.mcf大小是x86程序的2倍,因此x86程序的工作集比RISC-V64本地程序小,对目标处理器数据缓存的压力也更小. 此外,执行456.hmmer时,DBT-FEMU的效率是QEMU-i386的6.90倍,这是因为虽然456.hmmer属于整数基准程序,但其运行过程中需执行不少浮点指令. 据统计,执行x86的456.hmmer,其动态浮点指令的比例达到所有动态指令的3.30%,而对其他整数基准程序来说,该比例不足1%. 故456.hmmer放大了QEMU-i386执行浮点指令较慢的效果,使执行456.hmmer时DBT-FEMU相对QEMU-i386的效率高于执行其他基准程序.
考虑优化技术点,以QEMU-i386作为基线, “兼容RISC-V64 ABI的目标寄存器分配方案”平均贡献了2.64倍的性能提升,因为该技术直接将源寄存器分配到目标寄存器,优化了冗余的目标访存指令. 在此基础上,优化段式地址转换可额外提升5.98%的性能;继续优化地址合规化可再次提升5.39%的性能. 但优化复杂指令几乎未带来性能提升(小于 0.01%),这是因为复杂指令的占比很低. 在此基础上,优化有效地址的计算可额外提升2.44%的性能;若继续对x86寄存器的字节和半字访问进行优化,则性能只提升0.01%,这是因为在热点基本块中x86寄存器的字节和半字访问频率较低.
总体而言,与寄存器分配方案的优化相比,其他优化技术只优化了整数计算指令. 而与访存指令相比,目标处理器执行整数计算指令的开销较小,因此带来的性能提升不如寄存器分配方案的优化明显,但对于翻译质量的提升仍然有重要意义.
6. 总 结
本文以RISC-V64作为目标ISA,分析了当RISC-V64,RISC-V32,MIPS32,x86分别作为源ISA时,影响动态二进制翻译技术翻译质量的因素. 针对该因素,本文分别提出相应的优化方法,并借助RISC-V B扩展和RISC-V P扩展中的部分指令提升翻译质量. 评估数据显示,在运行SPEC CPU2006的整数基准程序时,本文优化方法可使目标程序所执行动态指令数平均减少57%,平均性能达到QEMU-i386的4.12倍.
作者贡献声明:余子濠提出了文章总体思路,实现部分优化技术,分析数据,撰写和修订论文;陈璐负责实现扩展指令、运行实验、统计数据和修订论文;孙凝晖和包云岗负责指导论文撰写和论文审阅.
-
表 1 动态二进制翻译代码质量优化方法总览
Table 1 Summary of Code Quality Optimization Methods for Dynamic Binary Translation
源ISA 影响翻译质量的原因 翻译质量下降的表现 优化方法 RISC-V64 对于整数计算指令,部分源寄存器需分配到内存 需翻译出额外的目标访存指令访问源寄存器 兼容RISC-V64 ABI的目标寄存器分配方案 对于访存指令,源程序和翻译程序的地址空间不一致 需翻译出额外一条加法指令进行段式地址转换 基于PIE的虚拟地址空间复用方法 对于控制转移指令,源指令长度与目标指令长度不存在明确对应关系 需正确维护每个基本块的源地址和目标地址间的映射关系 块链接技术[15] RISC-V32 数据模型的差异 需翻译出额外的目标指令对访存有效地址合规化 基于RISC-V B扩展指令的地址合规化方法 MIPS32 行为复杂的源指令 需翻译出多条目标指令 基于RISC-V B扩展指令的复杂指令优化方法 立即数大于2 047 需翻译出额外的目标指令用于加载立即数 暂无优化方法 x86 复杂寻址模式 需翻译出2条或3条目标指令用于计算有效地址 基于RISC-V B扩展指令的有效地址计算方法 维护EFLAGS寄存器 需翻译出较多指令 条件码惰性求值技术[15] 源寄存器的字节和半字访问 需通过多条指令读出和写入目标寄存器 基于RISC-V B扩展指令的x86寄存器访问方法 表 2 兼容RISC-V64 ABI的目标寄存器分配方案
Table 2 Target Register Allocation Scheme Compatible with RISC-V64 ABI
目标
寄存器分配方案 目标
寄存器分配方案 zero 不分配 a6 临时寄存器 ra 空闲 a7 临时寄存器 sp 源ESP寄存器 s2 源EAX寄存器 gp 不分配 s3 源ECX寄存器 tp 不分配 s4 源EDX寄存器 t0 临时寄存器 s5 源EBX寄存器 t1 临时寄存器 s6 源ESI寄存器 t2 临时寄存器 s7 源EDI寄存器 s0/fp 源EBP寄存器 s8 条件码惰性求值专用寄存器 s1 0~31b掩码 s9 条件码惰性求值专用寄存器 a0 空闲 s10 条件码惰性求值专用寄存器 a1 空闲 s11 全局指针 a2 空闲 t3 临时寄存器 a3 临时寄存器 t4 临时寄存器 a4 临时寄存器 t5 0~15b 掩码 a5 临时寄存器 t6 8~15b掩码的取反 表 3 LargeBOOM流水线配置
Table 3 Pipeline Configuration of LargeBOOM
参数 取值 参数 取值 单次取指数量 8 整数寄存器数量 100 单次译码指令数量 3 浮点寄存器数量 96 ROB项数 96 读访存队列项数 24 整数队列项数 16 写访存队列项数 24 浮点队列项数 32 最大分支数量 16 访存队列项数 24 指令缓冲区项数 24 -
[1] Debian Community. RISC-V port of Debian [EB/OL]. (2022-03-24)[2022-04-11].https://wiki.debian.org/RISC-V
[2] Henning J. SPEC CPU2006 benchmark descriptions[J]. ACM SIGARCH Computer Architecture News, 2006, 34(4): 1−17 doi: 10.1145/1186736.1186737
[3] RISC-V Community. RISC-V bit-manipulation ISA-extensions [EB/OL]. (2022-01-21)[2022-04-11].https://github.com/riscv/riscv-bitmanip
[4] RISC-V Community. RISC-V "P" extension proposal [EB/OL]. (2022-03-30)[2022-04-11].https://github.com/riscv/riscv-p-spec
[5] Klaiber A. The technology behind Crusoe processors [R/OL]. Santa Clara, CA: Transmeta Corporation, 2000[2022-04-11]. http://www.cs.ucf.edu/~lboloni/Teaching/EEL5708_2004/slides/paper_aklaiber_19jan00.pdf
[6] Cmelik B, Keppel D. Shade: A fast instruction-set simulator for execution profiling [C] //Proc of the 1994 ACM SIGMETRICS Conf on Measurement and Modeling of Computer Systems. New York: ACM, 1994: 128−137
[7] Dehnert C, Grant K, Banning P, et al. The transmeta code morphing software: Using speculation, recovery, and adaptive retranslation to address real-life challenges [C] //Proc of the 2003 Int Symp on Code Generation and Optimization. Piscataway, NJ: IEEE, 2003: 15−24
[8] Chernoff A, Herdeg M, Hookway R, et al. Fx! 32: A profile-directed binary translator[J]. IEEE Micro, 1998, 18(2): 56−64 doi: 10.1109/40.671403
[9] Ebcioğlu K, Altman E. Daisy: Dynamic compilation for 100% architectural compatibility [C] //Proc of the 24th Annual Int Symp on Computer Architecture. New York: ACM, 1997: 26−37
[10] Gschwind M, Altman E, Sathaye S, et al. Dynamic and transparent binary translation[J]. Computer, 2000, 33(3): 54−59 doi: 10.1109/2.825696
[11] Kotzmann T, Wimmer C, Mössenböck H, et al. Design of the Java hotspot™ client compiler for Java 6[J]. ACM Transactions on Architecture and Code Optimization, 2008, 5(1): 1−32
[12] Zheng C, Thompson C. PA-RISC to IA-64: Transparent execution, no recompilation[J]. Computer, 2000, 33(3): 47−52 doi: 10.1109/2.825695
[13] Ung D, Cifuentes C. Machine-adaptable dynamic binary translation[J]. ACM SIGPLAN Notices, 2000, 35(7): 41−51 doi: 10.1145/351403.351414
[14] Tröger J. Specification-driven dynamic binary translation [D]. Brisbane, Australia: Queensland University of Technology, 2005
[15] Bellard F. QEMU, a fast and portable dynamic translator [C] //Proc of the 2nd USENIX Annual Technical Conf. Berkeley, CA: USENIX Association, 2005: 41−46
[16] Anthony L. Announce: Release 0.10. 0 of QEMU [EB/OL]. (2009-03-04)[2022-04-11].https://lists.gnu.org/archive/html/qemu-devel/2009-03/msg00154.html
[17] 傅立国,庞建民,王军,等. 动态二进制翻译中库函数处理的优化[J]. 计算机研究与发展,2019,56(8):1783−1791 doi: 10.7544/issn1000-1239.2019.20170871 Fu Liguo, Pang Janmin, Wang Jun, et al. Optimization of library function disposing in dynamic binary translation[J]. Journal of Computer Research and Development, 2019, 56(8): 1783−1791 (in Chinese) doi: 10.7544/issn1000-1239.2019.20170871
[18] 李战辉,刘畅,孟建熠,等. 基于高速缓存负荷均衡的动态二进制翻译研究[J]. 计算机研究与发展,2015,52(9):2105−2113 doi: 10.7544/issn1000-1239.2015.20140220 Li Zhanhui, Liu Chang, Meng Jianyi, et al. Cache load balancing oriented dynamic binary translation[J]. Journal of Computer Research and Development, 2015, 52(9): 2105−2113 (in Chinese) doi: 10.7544/issn1000-1239.2015.20140220
[19] Clark M, Bruce H. Rv8: A high performance RISC-V to x86 binary translator [C/OL] //Proc of the 1st Workshop on Computer Architecture Research with RISC-V (CARRV). 2017[2022-04-11].https://anarch128.org/~mjc/rv8-carrv.pdf
[20] Ilbeyi B, Derek L, Christopher B. Pydgin for RISC-V: A fast and productive instruction-set simulator [C/OL]//Proc of the 3rd RISC-V Workshop. 2016[2022-04-11].https://people.ece.cornell.edu/berkin/ilbeyi-pydgin-riscv2016.pdf
[21] Guo Xuan, Mullins R. Accelerate cycle-level full-system simulation of multi-core RISC-V systems with binary translation [J]. arXiv preprint, arXiv: 2005.11357, 2020
[22] Marshall B, Daniel P, Thinh P. Implementing the draft RISC-V scalar cryptography extensions [C/OL] //Proc of the 2020 Hardware and Architectural Support for Security and Privacy. New York: ACM, 2020[2022-04-11].https://dl.acm.org/doi/abs/10.1145/3458903.3458904
[23] Marshall B, Daniel P, Thinh P. A lightweight ISE for ChaCha on RISC-V [C] //Proc of the 32nd IEEE Int Conf on Application-specific Systems, Architectures and Processors (ASAP). Piscataway, NJ: IEEE, 2021: 25−32
[24] Babu S, Snehashri S, Deepa S, et al. Evaluation of bit manipulation instructions in optimization of size and speed in RISC-V [C] //Proc of the 34th Int Conf on VLSI Design (VLSID). Piscataway, NJ: IEEE, 2021: 54−59
[25] Chen Y, Hui-Hsin L, Chia-Hsuan C, et al. Experiments and optimizations for TVM on RISC-V architectures with P extension [C/OL] //Proc of the 2020 Int Symp on VLSI Design, Automation and Test (VLSI-DAT). Piscataway, NJ: IEEE, 2020[2022-01-11].https://ieeexplore.ieee.org/abstract/document/9196477/
[26] RISC-V Community. RISC-V calling conventions [EB/OL]. (2022-04-01)[2022-04-11].https://github.com/riscv-non-isa/riscv-elf-psabi-doc/blob/master/riscv-cc.adoc
[27] Waterman A, Lee Y, Patterson D, et al. The RISC-V instruction set manual, volume I: User-level ISA, version 2, UCB/EECS-2011−62 [R]. Berkeley, CA: University of California, Berkeley, 2011
[28] RISC-V Community. Spike RISC-V ISA simulator [EB/OL]. (2022-04-09)[2022-04-11].https://github.com/riscv-software-src/riscv-isa-sim
[29] Zhao J, Korpan B, Gonzalez A, et al. Sonicboom: The 3rd generation Berkeley out-of-order machine [C/OL] //Proc of the 4th Workshop on Computer Architecture Research with RISC-V (CARRV). 2020[2022-04-11]. http://people.eecs.berkeley.edu/~krste/papers/SonicBOOM-CARRV2020.pdf
[30] Xilinx. Zynq UltraScale+ MPSoC [EB/OL]. (2022-04-11)[2022-04-11].https://www.xilinx.com/products/silicon-devices/soc/zynq-ultrascale-mpsoc.html
-
期刊类型引用(1)
1. 龚桃,杨晓霞,李怡洁. 融合用户活跃度的上下文感知兴趣点推荐算法. 应用科技. 2024(04): 91-99 . 百度学术
其他类型引用(6)