Processing math: 100%
  • 中国精品科技期刊
  • CCF推荐A类中文期刊
  • 计算领域高质量科技期刊T1类
高级检索

SIMD-RVV动态二进制翻译优化:冗余设置消除与混合翻译驱动的跨架构编程模型适配

赖远明, 李亚龙, 胡瀚之, 谢梦瑶, 王喆, 武成岗

赖远明, 李亚龙, 胡瀚之, 谢梦瑶, 王喆, 武成岗. SIMD-RVV动态二进制翻译优化:冗余设置消除与混合翻译驱动的跨架构编程模型适配[J]. 计算机研究与发展. DOI: 10.7544/issn1000-1239.202550135
引用本文: 赖远明, 李亚龙, 胡瀚之, 谢梦瑶, 王喆, 武成岗. SIMD-RVV动态二进制翻译优化:冗余设置消除与混合翻译驱动的跨架构编程模型适配[J]. 计算机研究与发展. DOI: 10.7544/issn1000-1239.202550135
Lai Yuanming, Li Yalong, Hu Hanzhi, Xie Mengyao, Wang Zhe, Wu Chenggang. SIMD-RVV Dynamic Binary Translation Optimization: Redundant Configuration Elimination and Hybrid Translation-Driven Cross-Architecture Programming Model Adaptation[J]. Journal of Computer Research and Development. DOI: 10.7544/issn1000-1239.202550135
Citation: Lai Yuanming, Li Yalong, Hu Hanzhi, Xie Mengyao, Wang Zhe, Wu Chenggang. SIMD-RVV Dynamic Binary Translation Optimization: Redundant Configuration Elimination and Hybrid Translation-Driven Cross-Architecture Programming Model Adaptation[J]. Journal of Computer Research and Development. DOI: 10.7544/issn1000-1239.202550135
赖远明, 李亚龙, 胡瀚之, 谢梦瑶, 王喆, 武成岗. SIMD-RVV动态二进制翻译优化:冗余设置消除与混合翻译驱动的跨架构编程模型适配[J]. 计算机研究与发展. CSTR: 32373.14.issn1000-1239.202550135
引用本文: 赖远明, 李亚龙, 胡瀚之, 谢梦瑶, 王喆, 武成岗. SIMD-RVV动态二进制翻译优化:冗余设置消除与混合翻译驱动的跨架构编程模型适配[J]. 计算机研究与发展. CSTR: 32373.14.issn1000-1239.202550135
Lai Yuanming, Li Yalong, Hu Hanzhi, Xie Mengyao, Wang Zhe, Wu Chenggang. SIMD-RVV Dynamic Binary Translation Optimization: Redundant Configuration Elimination and Hybrid Translation-Driven Cross-Architecture Programming Model Adaptation[J]. Journal of Computer Research and Development. CSTR: 32373.14.issn1000-1239.202550135
Citation: Lai Yuanming, Li Yalong, Hu Hanzhi, Xie Mengyao, Wang Zhe, Wu Chenggang. SIMD-RVV Dynamic Binary Translation Optimization: Redundant Configuration Elimination and Hybrid Translation-Driven Cross-Architecture Programming Model Adaptation[J]. Journal of Computer Research and Development. CSTR: 32373.14.issn1000-1239.202550135

SIMD-RVV动态二进制翻译优化:冗余设置消除与混合翻译驱动的跨架构编程模型适配

详细信息
    作者简介:

    赖远明: 1991年生. 博士研究生,主要研究方向是二进制翻译、计算机系统安全和代码混淆

    李亚龙: 2000年生. 硕士研究生. 主要研究方向为二进制翻译优化、RISC-V体系结构

    胡瀚之: 1999年生. 硕士研究生. 主要研究方向为二进制翻译优化,编译优化

    谢梦瑶: 1992年生,博士,副研究员,硕士生导师. 主要研究方向为计算机系统结构、系统安全

    王喆: 1990年生. 博士,副研究员,硕士生导师,CCF会员. 主要研究领域为计算机系统安全、操作系统和体系结构

    武成岗: 1969年生. 博士,研究员,博士生导师,CCF杰出会员. 主要研究领域为二进制翻译,编译优化、计算机系统安全

    通讯作者:

    王喆 (wangzhe12@ict.ac.cn

  • 中图分类号: TP314

SIMD-RVV Dynamic Binary Translation Optimization: Redundant Configuration Elimination and Hybrid Translation-Driven Cross-Architecture Programming Model Adaptation

More Information
    Author Bio:

    Lai Yuanming: born in 1991. PhD candidate. His main research interests include binary translation, computer systems security, and code obfuscation. (laiyuanming@ict.ac.cn)

    Li Yalong: born in 2000. Master candidate. His main research interests include binary translation optimization and RISC-V architecture. (li2542369686@163.com)

    Hu Hanzhi: born in 1999. Master candidate. His main research interests include binary translator optimization and compiler optimization. (huhanzhi22s@ict.ac.cn)

    Xie Mengyao: born in 1992. PhD, Associate professor, master supervisor. Her main research interests include computer system architecture and system security

    Wang Zhe: born in 1990. PhD, associate Professor, master supervisor. Member of CCF. His main research interests include computer systems security, operating systems, and computer architecture

    Wu Chenggang: born in 1969. PhD, professor, PhD supervisor. Distinguished member of CCF. His main research interests include binary translation, compiler optimization, and computer systems security. (wucg@ict.ac.cn)

  • 摘要:

    RISC-V因其开源和模块化设计等特性,已在嵌入式领域取得显著成功,并逐步向高性能计算(HPC)领域拓展. 面向HPC的RISC-V硬件(如Sophon SG2042多核处理器)已展现出与X86/ARM竞品相当的性能水平,但不完善的软件生态,是阻碍其发展的最大障碍之一. 我们开发了面向RISC-V的进程级动态二进制翻译器RVBT,用于将成熟的X86软件生态移植到RISC-V平台,加速RISC-V在HPC领域的应用进程. 针对HPC程序广泛依赖SIMD指令的特性,聚焦于解决SIMD与RVV间显著的编程模型差异导致的翻译性能瓶颈问题,提出了3项创新的优化方案. X86 SIMD将数据类型硬编码于操作码,而RVV需动态配置vtype和掩码寄存器,这导致直接翻译产生了大量冗余操作,严重拉低了翻译运行的效率. 通过充分利用程序数据类型的局部性,优化方案可删除跨架构适配编程模型导致的冗余设置,混合使用浮点扩展和向量扩展翻译SIMD指令并按需同步数据,大幅提升了SIMD指令的翻译运行效率. 这三项优化方案具备通用性,也适用于ARM平台的SIMD到RVV的翻译. 实验表明,以SPEC CPU 2006作为测试集,优化方案对csrr、vsetvl、vsetvli指令的平均动态消除率分别达到了100%,100%和56.31%,在浮点测试集上,掩码设置操作的平均动态消除率达到了74.66%,数据的平均动态同步率为67.35%. 优化后的RVBT在整点和浮点测试集上的平均运行效率达到了本地执行的47.39%和40.06%,相比优化前的加速比分别为1.21和8.31,并远超QEMU的18.84%和4.81%,展现出了应用于部分HPC场景的潜力.

    Abstract:

    RISC-V, renowned for its open-source nature and modular design, has achieved remarkable success in embedded systems and is progressively expanding into the high-performance computing (HPC) domain. While RISC-V hardware tailored for HPC, such as the Sophon SG2042 multi-core processors, has demonstrated performance level comparable to X86/ARM counterparts, its underdeveloped software ecosystem remains a critical barrier to broader adoption. To address this challenge, we developed RVBT, a process-level dynamic binary translator for RISC-V, designed to bridge the software gap by efficiently porting the mature X86 ecosystem to RISC-V platforms, thereby accelerating RISC-V’s integration into HPC applications. Focusing on the pervasive use of SIMD instructions in HPC programs, this study tackles the inefficiencies arising from fundamental differences in programming models between X86 SIMD and RISC-V Vector (RVV) extensions. Specifically, X86 SIMD hardcodes data types within opcodes, whereas RVV dynamically configures vtype and mask registers, leading to redundant operations during direct translation. To overcome this, we propose three innovative optimizations to achieve: 1) Redundancy elimination via data type locality. By leveraging the locality of data types in adjacent SIMD operations, we statically analyze and remove redundant configurations of vtype (achieving 100% dynamic elimination rates for csrr and vsetvl, and 56.31% for vsetvli) and mask settings (74.66% elimination rate in floating-point benchmarks). 2) Hybrid translation with on-demand synchronization. We decouple scalar and vectorized floating-point operations, translating X86 SIMD scalar double-precision instructions to RISC-V’s floating-point extensions and reserving RVV for vectorized operations. Data synchronization between scalar and vector registers is optimized through defuse analysis, achieving a 67.35% dynamic synchronization reduction in floating-point benchmarks. Experimental results on SPEC CPU 2006 demonstrate significant improvements on the optimized RVBT achieves 47.39% and 40.06% of native execution efficiency for integer and floating-point benchmarks, respectively, representing speedups of 1.21× and 8.31× over the unoptimized version. RVBT vastly outperforms QEMU (18.84% and 4.81% for integer and floating-point), with floating-point efficiency surpassing QEMU by 8.33 times, highlighting its potential for deployment in certain HPC scenarios. Crucially, these optimizations are architecture-agnostic: The methodology of exploiting data type locality, hybrid instruction translation, and adaptive synchronization apply equally to ARM SIMD (e.g., NEON) to RVV translation, offering a universal framework for cross-ISA binary compatibility. This work provides a pivotal technical foundation for breaking the software ecosystem deadlock and advancing RISC-V’s role in HPC.

  • 作为开源指令集架构的典型代表,RISC-V(reduced instruction set computer - v)自2010年诞生以来,凭借其模块化设计、可扩展性及免授权费等特性[1],迅速获得了学术界和产业界的广泛关注. 在2022年,RISC-V处理器累计出货量就已经突破了100亿颗[2],预计2025年将达到624亿颗[3]. RISC-V早期主要应用于嵌入式领域,但近年来其在高性能计算(HPC)领域的潜力逐渐显现,研究人员开始探索和推动它在该领域上的应用[4-5]. 已有多项研究表明RISC-V在高性能计算上已具备一定的成熟度:西班牙巴塞罗纳超算中心尝试基于RISC-V指令集设计软硬协同设计的超级计算机[6],Monte Cimone[7]项目建成了第一个完全可运行且支持基础高性能计算软件栈的RISC-V集群. 产业界也尝试在高性能计算场景中使用RISC-V处理器. 2019年在阿里云数据中心部署的玄铁910处理器验证了RISC-V在加速特定应用和云计算场景上的可行性[8]. 2023年发布的Sophon SG2042 64核处理器在计算密集型任务中已展现出与X86/ARM竞品相当的性能水平[9]. 基于RISC-V的高性能处理器正在高速发展[9-13].

    然而,RISC-V在HPC领域的推广面临显著的软件生态瓶颈[2]. 尽管主流Linux发行版(Ubuntu、Fedora等)和国产操作系统(麒麟、欧拉、龙蜥等)已提供了基础支持,但在关键应用层(如Docker、Kubernetes)和基础软件(如MongoDB、TiDB)的适配上仍存在明显的滞后[14-16],对编译器和常用办公软件的支持也经历了漫长的时间,亟需快速改善软件生态的解决方案[7-8,17].

    上述生态困境源于新架构普遍面临的市场壁垒. ARM架构在移动端和嵌入式市场占据重要地位,X86架构则是个人计算和服务器环境的默认标准,这些成熟架构的市场惯性为RISC-V的进入设置了显著的障碍[18],导致开发者不愿意冒着巨大的风险为RISC-V开发应用软件. 而软件生态的缺失又抑制了用户采购和使用的意愿. 两个因素互相制约,甚至产生恶性循环,导致市场份额和软件生态共演化衰退,严重阻碍了RISC-V在HPC领域的发展.

    动态二进制翻译技术为破解这一困境提供了新思路,可快速实现X86/ARM丰富软件生态向RISC-V平台的移植[19-25]. 为此,我们开发了进程级的二进制翻译器RVBT系统,它能将X86应用程序翻译到RISC-V平台执行. RVBT在翻译SPEC CPU 2006的整点测试集时,平均运行效率能达到本地执行的39.04%,显著优于QEMU[26]的18.84%. 但在浮点测试集上仅能达到本地执行的4.82%,与QEMU处于相当水平,但与其自身在整点测试集上的性能表现相差了8.10倍. 经分析后发现,浮点测试集大量使用SIMD(single instruction multiple data)指令,而RVBT翻译SIMD指令生成的代码运行效率很低,是主要的性能瓶颈. RVBT使用RISC-V的RVV扩展翻译SIMD指令. RVV和SIMD都具备数据级并行的能力,在预期中能实现高效的翻译. 对这一反直觉的现象进行深入分析后,我们观察到3个现象:

    1)SIMD扩展和RVV扩展在编程模型上具有显著差异,前者将数据位宽和操作的数据个数编码于操作码中,而后者通过vtype寄存器以及掩码寄存器(mask register)动态配置. 频繁设置数据类型的开销非常大,是翻译执行的性能不及预期的一个关键原因.

    2)X86使用SIMD的指令和寄存器执行标量浮点运算,而RISC-V则使用独立的浮点扩展实现,这比使用RVV实现更加高效. RVBT将SIMD指令都翻译成了RVV指令,使得X86上的标量浮点运算在RISC-V平台上是使用RVV指令来实现翻译的. 这是翻译执行的性能不及预期的另一个关键原因.

    3)代码操作的数据类型具有局部性这一特性未被有效利用. 相临近的SIMD指令处理的数据类型往往是相同的,在翻译这些SIMD指令时使用的vtype和掩码是一样的. 利用这一特性可以为RVBT设计优化方案,提高翻译代码质量和运行效率.

    基于上述3点观察,本文聚焦于将X86平台上的SIMD指令翻译到RISC-V平台执行的性能瓶颈问题,提出了SetVType、SetMask和SD2Float三项创新的优化方案. SetVType和SetMask优化通过静态分析代码,找到冗余的vtype和掩码设置操作,并将其删除,以减少指令膨胀,提高翻译的本地码的质量. 以SPEC CPU 2006作为测试集,SetVType优化对csrr,vsetvl和vsetvli指令的动态消除率分别达到了100%、100%和56.31%,在整点和浮点测试集上,对vsetvli指令的平均动态消除率分别达到了48.88%和62.62%. SetMask优化主要用于优化浮点运算,在浮点测试集上对掩码设置的平均动态消除率达到了74.66%. SD2Float优化使用混合翻译策略,将用于双精度标量浮点计算和打包浮点计算的SIMD指令分别翻译成RISC-V标量浮点计算指令和RVV指令,并通过分析X86汇编代码中SIMD寄存器的定值-引用关系,仅按需在浮点寄存器和向量寄存器之间同步数据,减少数据同步操作发生的频率. 在浮点测试集上,将平均静态和动态同步率分别削减到了55.61%和67.35%.

    实验表明,上述优化方案能显著提升RVBT的性能. SetVType和SetMask优化减少了大量冗余的vtype和掩码设置. SD2Float在使用更高效的指令进行翻译的同时,优化了大量数据同步操作. 同时实施上述优化后,以SPEC CPU 2006作为测试集,在全测试集、整点测试集和浮点测试集上,RVBT翻译执行的平均效率可分别达到本地执行的43.05%、47.39%和40.06%,相对优化前的平均加速比分别为3.64、1.21和8.31. 本文的优化方案将浮点操作的翻译运行效率提升到了接近翻译整点操作的水平. 作为对比,QEMU在SPEC CPU 2006全测试集、整点测试集和浮点测试集上的平均运行效率分别为本地的8.64%、18.84%和4.81%. 优化后的RVBT在翻译整点和浮点操作上的性能表现均显著优于QEMU.

    综上,本文为RISC-V软件生态建设提供了高效的二进制兼容解决方案,对推动RISC-V开源架构在HPC领域的应用和发展具有重要的实用价值,具体贡献有4点:

    1)提出了SetVType和SetMask优化方案,用于消除SIMD指令翻译成RVV指令时冗余的vtype和掩码设置操作,以减小因SIMD和RVV在编程模型上的巨大差异带来的性能开销,显著提升了本地码的质量和翻译执行的效率.

    2)提出了SD2Float优化方案,使用RISC-V平台上效率更高的浮点指令来翻译SIMD指令中的标量双精度浮点操作,使用RVV翻译其它浮点操作,并通过静态分析实现了浮点寄存器和向量寄存器之间的按需数据同步. 这种混合的翻译方案提升了翻译浮点操作的效率.

    3)以X86-64为源平台,以RISC-V-64为目标平台,实现了3项优化,解决了数个技术挑战,并通过实验验证了这些优化能显著提升SIMD指令的翻译运行效率,特别是浮点操作的翻译运行效率.

    4)提出的3项优化在将SIMD指令翻译成RISC-V的RVV指令这一场景中是通用的. 不仅适用于X86到RISC-V平台的翻译,也适用于ARM等平台到RISC-V平台的翻译.

    RVBT系统是我们设计实现的一款面向RISC-V平台的动态二进制翻译系统,可将X86-64 Linux平台上的应用程序翻译到RISC-V-64 Linux平台上执行. 所有的动态二进制翻译系统在运行时都是在执行反汇编-翻译-优化-执行这一循环[27],RVBT也是如此,其系统架构如图1所示. RVBT首先对X86二进制代码进行反汇编,得到IR1,随后对IR1进行分析,为后续的代码翻译和优化生成辅助信息. IR1是X86汇编代码的结构化表示. 对IR1中的代码进行逐条翻译后便得到IR2. 开发动态二进制翻译系统的工作量非常大,为了增加软件的可维护性和鲁棒性,系统设计和实现通常遵循软件工程上的模块化设计理念,动态二进制翻译器对每条源平台的指令进行独立翻译,不考虑指令的上下文. 这是二进制翻译器普遍的设计选择. RVBT也遵循这样的设计. IR2是接近RISC-V汇编代码的中间表示,其中也包含我们自定义的指令,以及还未进行寄存器分配时的临时寄存器占位符(图1代码中的temp0). 对IR2进行优化和汇编后即得到可执行的RISC-V本地码.

    图  1  RVBT架构
    Figure  1.  Architecture of RVBT

    通过上下文切换可实现动态二进制翻译系统的控制器和X86程序的目标平台二进制代码(也称本地码)之间的交替执行,如图1所示. 当控制器获得执行权时,X86程序本地码的执行处于被挂起状态. 此时,二进制翻译系统能对执行过程中新发现的X86代码块进行翻译,也能重新调整此前已经翻译好的本地码. 在这一过程中,翻译器可以对IR1和IR2代码进行分析并实施代码优化. 分析可分为动态分析和静态分析. 其中,静态分析不依赖于X86程序的执行,而动态分析则依赖动态收集的X86程序的运行状态信息. 比如,在IR1或者IR2上判断前一条指令定值的寄存器是否被后一条指令使用,仅需要进行静态分析即可完成. 判断哪条执行路径是热代码,则需要进行动态分析.

    代码分析和优化是在动态二进制翻译系统翻译执行X86程序的过程中进行的. 因此,系统翻译执行X86程序的时间包括动态二进制翻译系统初始化的时间,翻译和优化代码的时间,以及X86程序本地码的运行时间. 代码分析和优化能提升翻译出来的本地码的质量,进而提升性能. 假设完成代码分析和优化本身所需要的时长为t1,Δt为执行优化后的X86程序本地码节省的时间. 当t1小于Δt时,意味着代码分析和优化能带来性能提升. 反之,则说明代码分析和优化本身的开销过大,会拖累翻译执行的性能.

    为了提升翻译执行的效率,RVBT做了寄存器分配优化,将X86的通用寄存器固定映射到RISC-V的通用寄存器,将SIMD寄存器固定映射到RVV的向量寄存器. 比如,将rax和rcx寄存器分别映射到a7和a3寄存器上,将xmm0和xmm1寄存器分别映射到v8和v10. X86属于CISC(complex instruction set computing)指令集,指令的语义相对复杂,往往需要使用多条RISC-V指令来翻译一条X86指令. 用于保存中间计算结果的RISC-V寄存器被称为临时寄存器. RVBT对临时寄存器进行动态分配,必要时需要将其溢出到内存中暂存. 通用寄存器t3、t4、t5和t6,向量寄存器v0-v6被用作临时寄存器. 同时,在RVV编程模型中,向量寄存器v0还有一个特殊用途,它被用作向量指令的掩码寄存器. 此外,RVBT还实现了标志位运算优化、基本块链接优化等动态二进制翻译器常用的优化技术以提升性能.

    X86的SIMD扩展和RISC-V的RVV扩展具有近似的功能,都具备使用一条指令处理多个数据元素的能力,可实现数据级并行,以加速程序的运行. 但二者的编程模型具有显著差异. SIMD和RVV扩展的寄存器都可以同时容纳多个数据,比如4个32位整数,或者2个64位整数,并通过一条指令操作寄存器中的数据. 不同的是,SIMD指令将其操作的数据元素类型(即位宽)编码到了指令操作码中,而RVV指令如何操作寄存器中的数据则通过向量类型寄存器(vector type register,Vtype)来控制. 在RVV 0.7.1版本中,vtype的第2到第4个bit用于表示向量寄存器中单个数据元素的位宽,也被称为sew(standard element width). 在本文中,设置vtype和设置sew表达相同的含义,为表述方便会交替使用. 当sew被设置为e64时,表示向量寄存器中每个数据元素的位宽是64位,当被设置为e32时,则表示位宽为32位. RVV提供了vsetvli、vsetvl和csrr这3条指令用于操作vtype寄存器. 其中vsetvli指令使用立即数指定sew,而vsetvl则使用寄存器指定. csrr指令的作用是将当前的sew状态读取到寄存器中,它与vsetvl配对使用可以实现sew的保存和恢复功能.

    图2所示,对于一次性计算2个64位整数相加和4个32位整数相加这2个加法功能,X86分别使用paddq和paddd指令完成,而RVV都使用vadd. vv指令. RVV通过使用vsetvli设置分别将sew设置为e64和e32,让vadd. vv实现了上述2种向量加法. 体现SIMD和RVV上述不同设计理念的一个现象是,SIMD指令扩展包含的指令数量远多于RVV扩展.

    图  2  SIMD和RVV编程模型的差异
    Figure  2.  Difference between programming Models of SIMD and RVV

    根据SIMD指令操作的数据类型的不同,我们将其分成5类,如表1所示. 其中,SS和SD指令用于标量浮点操作,SS指令只操作xmm寄存器的低32位,而SD指令则只操作xmm寄存器的低64位. RVV通过为指令设置掩码来达到只操作向量寄存器中某一个分量元素的目的. 向量寄存器v0被RVV用作掩码寄存器,它的位宽和其它向量寄存器是一样的. 以图1中IR2的代码为例,其中第3行和第4行将v0的低64位设置为1,高64位设置为0,在sew为e64时,这样的设置让第5行的vfadd. vv仅操作v10和v8的第一个分量元素,即保存于低64位的数据元素. 如果将v0的低64位置为0,高64位置为1,则vfadd. vv就只操作v10和v8的第2个分量元素,即高64位. 除了作为掩码寄存器,v0也能像其它向量寄存器一样用于各种算术运算中.

    表  1  SIMD指令的分类
    Table  1.  Classification of SIMD Instructions
    类型操作数类型操作的元素个数指令示例
    SS标量单精度浮点1个ADDSS
    SD标量双精度浮点1个ADDSD
    PS打包单精度浮点4个ADDPS
    PD打包双精度浮点2个ADDPD
    PI打包整点指令多个PADDD
    下载: 导出CSV 
    | 显示表格

    考虑到RVV指令的功能与SIMD有相似之处,RVBT将SIMD指令翻译成RVV指令. 翻译过程可概括为3步:1)设置sew;2)若是翻译SD或SS指令,则设置掩码;3)选择对应语义的RVV指令翻译SIMD指令的语义. 如图1所示,翻译器独立地将每条IR1指令生成对应的IR2指令序列,IR2中的第2~5条指令是在翻译IR1的第2条指令,IR2中第6~7条指令是在翻译IR1的第3条指令.

    翻译表1中的5类SIMD指令都需要设置sew,翻译SS,SD指令和部分PD及PS指令时还需要设置掩码. 显然,当SIMD指令操作的元素位宽相同时,sew的设置就是相同的,比如翻译SD,PD类型和操作64位整型的PI指令时,使用的sew都是e64. 当指令只操作向量寄存器的同一个分量元素时,比如都只操作低32位,那么翻译时设置的mask是相同的. 如图1所示,IR2指令序列中第2和第6条指令都将sew设置为e64,结合指令上下文分析可知,第6条指令是对sew的冗余设置,可以删去. 设置掩码的操作也存在类似的情况. 设置sew和mask开销都很大. 执行csrr,vsetvl和vsetvli指令分别需要16,12和2个时钟周期. RISC-V的I型指令和U型指令能分别编码最多12位和20位的立即数. 受此影响,设置不同的mask值,可能需要不同的指令序列,时间开销也不同,大约为30~40个时钟周期. 远远大于单独执行一条向量加法指令vfadd. vv所需的0.58个周期.

    为了提升翻译执行的效率,本文提出了SetVType和SetMask优化,充分利用数据类型具有局部性这一程序特征,分别消除冗余的sew和掩码设置操作,精简代码,提升本地码的质量.

    X86平台可使用浮点栈和SSE指令实现标量浮点操作. 编译器在生成面向现代CPU的代码时,普遍选择使用SSE指令(即表1中的SS和SD指令)以获得更好的性能. 比如使用addsd指令实现两个双精度浮点数相加. 这样一来,X86平台上标量浮点和打包浮点操作就都使用SIMD扩展的指令和寄存器.

    在RISC-V平台上,标量浮点操作的实现与X86平台有明显区别. RISC-V有专门的浮点扩展,并专门设计了32个独立的浮点寄存器. 经测试后发现,在RISC-V平台上使用浮点扩展指令实现标量浮点计算比使用RVV指令更加高效. 因此,RISC-V平台上的GCC使用浮点扩展指令来完成标量浮点计算.

    RVBT将SIMD指令都翻译成了RVV指令,使得X86上通过SSE指令实现的标量浮点运算被翻译成了RISC-V的RVV指令. 通过实测发现,如果将X86上的标量浮点操作翻译成RISC-V的浮点指令,能获得更高的翻译运行效率,如表2所示. 但如果将SIMD中的打包浮点操作也翻译成RISC-V的浮点指令,则翻译运行效率会下降.

    表  2  标量浮点的不同翻译方案所需的时钟周期数
    Table  2.  The Number of Clock Cycles Required for Different Translation Schemes of Scalar Floating-Point
    指令翻向量翻浮点翻浮点&同步
    mulsd xmm1, xmm244.170.5847.74
    sqrtsd xmm1, xmm261.2919.0864.73
    subsd xmm1, xmm244.150.5846.82
    addsd xmm1, xmm244.20.5846.78
    divsd xmm1, xmm262.1519.0964.75
    maxsd xmm1,xmm245.150.5746.73
    minsd xmm1,xmm245.150.5946.71
    下载: 导出CSV 
    | 显示表格

    本文提出SD2Float优化,将SD类型的标量浮点操作翻译成RISC-V的浮点指令,与此同时,其它SIMD指令依然翻译成RVV指令. 这种混合的翻译方式能充分利用RVV数据级并行的特性和浮点扩展高效的标量浮点计算能力. RISC-V的浮点寄存器和向量寄存器是两组独立的寄存器,而在X86平台上,标量浮点和打包浮点运算都使用xmm寄存器. 这就意味着需要在RVV的向量寄存器和浮点扩展的浮点寄存器之间同步数据. 如表2所示,加上数据同步操作之后,就失去了把SD类型的指令翻译成RISC-V的浮点指令的性能优势. 我们观察到,数据类型具有局部性,在一个代码块中,程序往往操作相同的数据类型. 充分利用这一特性就不需要为每一条指令都发射同步指令.

    为了实现按需同步,SD2Float优化在IR1上通过静态分析确定SIMD指令之间的定值-引用关系,在翻译过程中仅在需要进行数据同步时才发射数据同步指令.

    在X86平台上,SIMD指令被真实世界中的程序广泛使用,特别是在面向高性能计算场景的应用软件中,比如深度学习算法[28-29]、大模型推理算法[30-33]、多媒体应用等. OpenCV[34]和FFmpeg[35]等库使用SIMD指令来优化其核心算法,以获得更好的性能表现. 据统计,多媒体应用中25%的指令是SIMD指令[36]. Gedit、GoogleV8、VisualStudio等9款X86典型应用中,SIMD指令的平均占比为3.1%[22]. Ubuntu Linux 16.04 APT仓库中,含有二进制程序的包里,99%的包都使用了SIMD扩展指令. SSE是使用最广泛的SIMD扩展指令,在高性能计算等场景中大量存在. 大部分较为常用的SSE指令操作的都是浮点类型的数据[37]. 在动态二进制翻译中,浮点操作的翻译普遍性能较低,这限制了该技术的应用场景,是一个核心痛点问题[38]. 提升SIMD指令的翻译运行效率,能大幅提升翻译浮点操作的性能,扩展翻译器的适用场景,对提升二进制翻译器的实用性非常有价值.

    动态二进制翻译技术的演进可追溯至20世纪80年代[73]. 经过几十年的发展,已经有很多翻译器被研发出来,但以RISC-V为目标架构的并不多见. 以QEMU、Box86/64[39]和DBT-FEMU[40]为代表的几款翻译器能将X86应用翻译到RISC-V上运行,但没有针对SIMD指令进行优化. DBT-FEMU聚焦在优化整点指令的翻译上,QEMU和Box86/64使用标量指令模拟向量语义,来完成对SIMD指令的翻译. 过往对SIMD指令的翻译优化研究主要聚焦在X86和ARM这两个平台上. 研究方向主要是如何高效利用目标平台上位宽更长的SIMD寄存器资源,如何更好地进行向量化等.

    X86上的SIMD和RISC-V平台上的RVV因编程模型的巨大差异导致翻译效率不高这一问题还没有被关注和研究. SIMD是在高性能计算场景中被广泛使用的性能加速基础设施. RISC-V作为高性能计算领域的新入局者面临软件生态不完善的困境. 研发一款能将SIMD指令高效翻译到RISC-V平台,起到助推RISC-V软件生态建设和发展作用的动态二进制翻译器显得尤为有价值.

    静态消除冗余的sew设置操作的挑战在于消除vsetvl指令对静态数据流分析的阻碍,持续跟踪程序对sew的设置. RVV的vsetvli和vsetvl指令都能修改sew的状态. 区别在于vsetvli对sew的设置编码在立即数中,能直接从代码上读出它会将sew设置为何值. 而vsetvl指令的操作数是寄存器,完整的汇编指令格式是vsetvl rd, rs1, rs2. 该指令执行后,其第二个源操作数rs2中保存的值将被设置为新的sew. 显然,通过静态分析该指令无法直接读出寄存器rs2的值. 因此,vsetvl指令会阻碍静态分析追踪代码对sew的设置过程.

    一个直接的方案是进行逆向的数据流分析,回溯该寄存器的定值过程. 但这样做开销较大. 本文通过分析vsetvl指令的使用场景,以先验知识确定其寄存器操作数rs2的数值来源于执行路径上前一条vsevli指令,进而高效地将其删除或替换.

    静态消除冗余的掩码设置操作的挑战在于定位掩码操作和捕获掩码状态的变化. 静态确定每次掩码设置将掩码寄存器v0修改为何值,是通过静态分析消除冗余的掩码设置的前提. 设置掩码是将立即数传送到向量寄存器v0的过程. 向量寄存器的位宽远超单条RISC-V指令能编码的最大立即数的位宽. 因此设置掩码通常需要使用多条RISC-V指令来完成. 设置不同的掩码值,用到的指令序列是不一样的. 同样的掩码值,也可以通过不同的指令序列来设置. 另外,掩码寄存器v0和其它向量寄存器一样,还被用于各类算术运算. 这意味着要通过静态分析确定对掩码的设置,需要在众多对v0寄存器进行定值的代码片段中识别出哪些是掩码设置,哪些是普通的算术运算. 这种方案既难以保证精确识别,容易导致正确性问题,还需要进行大量的定值引用分析,开销很大. 如果进行非常保守的分析,则仅能消除少量的掩码设置,对性能提升的帮助很小.

    SetMask优化将掩码设置分为3个阶段来解决上述问题:伪指令占位、冗余设置删除和掩码设置指令序列发射. 我们在IR2上设计了一条伪指令set_mask,它包含2个立即数操作数,分别表示掩码的高64位和低64位. 翻译IR1时,使用该伪指令在IR2的指令序列中标记何处需要进行掩码设置. 省去了在优化阶段识别掩码设置指令序列的步骤,同时确定掩码值也不再需要对v0进行定值引用分析. 优化阶段将删除冗余的set_mask伪指令. 第3阶段则是将剩余的set_mask伪指令发射成对应的RISC-V指令序列.

    SIMD指令的混合翻译方案面临的挑战在于降低浮点寄存器和向量寄存器之间数据同步开销. X86上标量浮点和打包浮点运算都使用xmm寄存器,而RISC-V的浮点寄存器和向量寄存器是两套独立的寄存器. 为了提升性能RVBT将X86源平台的寄存器和RISC-V目标平台上的寄存器进行了映射. 在混合翻译方案中,整个xmm将被映射到RVV的向量寄存器,同时,它的低64位将被映射到浮点寄存器. 也就是说,xmm寄存器的低64位被同时映射到了2个RISC-V寄存器上. 当翻译成浮点和翻译成向量的SIMD指令交替出现时,就可能要在浮点和向量寄存器之间进行数据同步才能保证正确性.

    图1中IR1的代码为例,第2条指令执行后xmm1的低64位被定值了,第3条指令同时使用了xmm1寄存器的高64位和低64位. 在混合翻译方案中,第2条指令被翻译成RISC-V的浮点指令. 假设xmm1的低64位映射到RISC-V的浮点寄存器fa1. 当翻译的本地码执行后,计算结果就保存在了浮点寄存器fa1中. 但xmm1的低64位还被映射到了向量寄存器v10的低64位中,而浮点指令不会更新v10. 此时,浮点寄存器fa1和向量寄存器v10的高64位组合起来表达的才是X86程序的正确执行状态. 后续第3条指令被翻译成RVV向量指令,指令执行时将使用向量寄存器v10的高64位和低64位. 这将引发错误,因为上一条指令的执行结果没有被更新到v10的低64位中. 需要在执行第3条指令的翻译前,先把fa1的值同步到v10的低64位,才能维护X86指令的定值-引用关系. 如果混合翻译里每条指令执行后都进行浮点和向量寄存器之间的数据同步,就无法获得性能上的提升.

    SD2Float优化利用程序中数据类型的局部性特征,通过定值引用分析,只进行必要的数据同步,在充分发挥出RISC-V浮点扩展和RVV向量扩展各自性能优势的同时,降低数据同步带来的性能开销,提升翻译执行X86浮点操作的效率.

    以较低的性能开销实现静态代码分析和优化是本文3项优化方案面临的共同挑战. 影响动态二进制翻译系统运行效率的一大因素是代码翻译和优化上的开销[40-41]. 因此,设计优化机制时必须非常谨慎,实施优化操作本身带来的开销必须得到控制,否则优化就难以带来性能提升. 一方面,本文通过控制分析范围减小静态分析的开销,以TB(translation block)为SetVType和SetMask优化的分析单元,以函数内的执行路径为SD2Float优化的分析单元. 这三项优化都利用了程序数据类型具有局部性这一特征,持续扩大分析范围带来的性能增益是递减的,同时会增大静态分析的开销. 另一方面,本文通过翻译器运行机制上的先验知识来减少对静态数据流分析的依赖,比如根据vsetvl指令的使用场景,设计低开销的指令消除和转换算法,以及用自定义的伪指令标记掩码设置操作,从而避免进行代码模式分析和匹配.

    SetVType优化在IR2上以TB为单元实施优化. 通过对IR2进行静态代码分析,完成3个关键操作:1)消除csrr和vsetvl指令;2)如果一条vsetvli指令直接支配的所有指令都是不受sew影响的指令,则删除该vsetvli指令;3)删除冗余设置sew的vsetvli指令. 指令A直接支配(immediately dominant)指令B是指指令A支配指令B,且AB之间的控制流上不存在其他的A指令. 将静态代码分析控制在单个TB中,能降低分析的复杂度,尽可能减小静态分析带来的性能开销. IR1上TB的控制流结构简单,具有单入单出的特点. 将IR1的一个TB翻译成IR2后,控制流中可能存分支跳转,比如IR2使用分支跳转指令来翻译IR1中的条件设置(conditional set)指令. 但在IR2中,TB的控制流依然是相对简单的,相当比例的TB依然是没有分支的.

    为了尽可能多地消除vsetvli指令,SetVType优化首先对阻碍分析的csrr和vsetvl指令进行删除或替换. RVBT使用csrr和vsetvl指令对的目的只有1个,先用csrr指令保存sew的状态,然后使用vsetvli指令修改sew,最后使用vsetvl指令恢复先前保存的sew. 出于模块化设计,RVBT将设置掩码、从内存中加载数据等公共操作封装成API函数,供所有编写翻译函数的开发人员使用. 在软件工程和软件设计角度,这些API函数不应该感知调用点的上下文. 当它要进行向量操作时,需要完成如下操作序列:使用csrr指令保存调用者的sew → 使用vsetvli指令设置新sew → 完成向量操作 → 恢复调用者的sew. 这样就能让API的使用者不必关心调用API后向量执行环境是否发生了改变. 在RVBT发射的本地码中,csrr和vsetvl指令总是成对出现的.

    RVBT在翻译每一条SIMD指令时,都使用vsetvli指令为其设置对应的sew. 这就意味着每一对csrr-vsetvl都必然和一条vsetvli指令关联. 这条vsetvli指令可能出现在csrr-vsetvl指令对之前,也可能在它之后,这取决于翻译函数的开发人员是如何排布指令顺序的. 我们设计了算法1用于消除csrr和vsetvl指令. 当一个TB中存在不被vsetvli指令支配的csrr-vsetvl指令对时,我们直接将其删除. 对于该TB来说这是一次无效的sew保存和恢复操作. 如果一条vsetvli直接支配了一个csrr-vsetvl指令对,则删除csrr指令,并使用该vsetvli指令替换vsetvl指令. vsetvli直接支配一个csrr-vsetvl指令对,意味着该vsetvli指令和该csrr-vsetvl指令对之间不存在其它vsetvli指令. 替换vsetvl的目的有两个. 一是为后续消除vsetvli指令做准备. 二是执行vsetvli的开销远小于vsetvl. 执行vsetvli指令需要2个时钟周期,而vsetvl则需要12个,相差6倍. 即使后续优化无法删除用于替换vsetvl的vsetvli指令,也能获得性能上的提升.

    RVV中每条指令的执行都依赖于sew. 但有的指令在不同的sew下执行结果是一样的,表3列出了3类执行结果不受sew影响的指令. 这意味着如果被一条vsetvli直接支配的所有指令都是不受sew影响的,该vsetvli指令可以被删除. 我们使用算法2来实现这一操作.

    表  3  不受sew影响的指令类
    Table  3.  Instruction Categories Not Unaffected by SEW
    类型指令功能指令示例
    仅操作标量add a0, a1, a2
    向量寄存器间数据移动vmv.vv v2, v3, v4
    向量位操作vxor.vv v2, v3, v4
    下载: 导出CSV 
    | 显示表格

    通过上述两项操作后,IR2上与sew设置相关的指令就只剩下vsetvli了. 此时,通过分析该指令的操作数就能获得每一处对sew的设置都会将其调整到什么状态. SetVType使用前向数据流分析来确定哪些vsetvli指令可以被删除,数据流方程见式(1)~(4),在SetMask优化中,也将使用这套数据流方程进行静态分析. 在SetVType优化中,使用这组数据流方程分析TB内的所有vsetvli指令,在SetMask优化中则分析set_mask伪指令. 处理每条vsetvli指令前,要判断在该指令之前,对sew的既往设置是否依然可用. 若既往的sew设置是不可用的,则说明该vsetvli指令必须被保留. 若既往的设置依然可用,则需要比较该vsetvli指令设置的sew与既往设置的是否一致. 如果是一致的,则说明该vsetvli指令的设置是冗余的,可以被删除,否则应该被保留.

    算法1. csrr-vsetvl指令对消除算法.

    输入:待优化的TB

    输出:无.

    procedure convert_vsetvl (TB&tb):

    ② foreach csrr-vsetvl pair in tb do

    ③  vli←get the immediate dominant vsetvli of    the pair

    ④  delete csrr

    ⑤  if vli is not null then

    ⑥   replace vsetvl with vli

    ⑦  else

    ⑧   delete vsetvl

    ⑨  end if

    ⑩ end for

    end procedure

    删除冗余vsetvli指令的实现如算法3所示. RVBT的翻译器在生成IR2时,如果代码中的控制流含有分支,则一定会生成label来标记分支跳转指令的目标. 若在遍历TB的指令时遇到了label,说明下一条指令是跳转指令的跳转目标. 此时,根据式(2),获取各个前驱中直接支配当前label的vsetvli指令对sew的设置情况. 当label处没有可用的sew设置时,通过算法3的行15标记无可用的sew状态. 每当分析到vsetvli指令时,都根据式(4)判断该指令能否被消除,对应算法3的行6伪代码.

    经过SetVType的三步优化操作,IR2上不再含有开销很大的csrr和vsetvl指令,同时大量的vsetvli指令也被消除.

    算法2. 无效的sew设置删除算法.

    输入:待优化的TB;

    输出:无.

    procedure del_useless_vli (TB&tb):

    ② foreach vsetvli inst vli in tb do

    ③  L←get inst list L immediately dominanted by   vli

    ④  if all inst in L are sew unaffected isntrctions   then

    ⑤   delete vli

    ⑥ end for

    end procedure

    算法3. 冗余sew设置消除算法.

    输入:待优化的TB;

    输出:无.

    procedure del_repetitive_vli (TB&tb):

    ② pre_sew ← −1

    ③ foreach inst in tb do

    ④  if inst is vsetvli (sew) then

    ⑤   if sew == pre_sew then

    ⑥    delete vli

    ⑦   else

    ⑧    pre_sewsew

    ⑨   end if

    ⑩  end if

    ⑪  if inst is label then

    ⑫   if inst’s immediate pred sews are the same    then

    ⑬    pre_sew ← pred sew

    ⑭   else

    ⑮    pre_sew ← −1

    ⑯   end if

    ⑰  end if

    ⑱ end for

    end procedure

    Statein(entry)=ϕ (1)
    Statein(S)=Spred(S)Stateout(S) (2)
    Stateout(S)=Gen(S)(Statein(S)Kill(S)) (3)
    Statein(S)?=Stateout(S) (4)

    SetMask优化将翻译过程中的掩码设置分成3阶段实现:伪指令占位、冗余设置删除和掩码设置指令序列发射. 在基线版RVBT的设计中,翻译函数在将IR1翻译成IR2的过程中,设置掩码的操作会被立即发射成IR2的指令序列. SetMask优化提供了用于占位的伪指令set_mask. 在翻译IR1时,如果进行掩码值已知的掩码设置,则通过发射一条set_mask (hi, lo)伪指令进行占位,其中hi和lo是两个立即数,分别表示掩码的高低64位. 如果一个TB中发射了set_mask伪指令,那么该TB在动态分配临时寄存器时就不会考虑v0,避免给后续的静态分析带来干扰,同时也保证删除冗余的掩码设置后,程序不会因为v0寄存器被其它操作再次定值而运行出错.

    在翻译IR1的过程中有2类掩码设置. 一类是静态可确定掩码值的设置,比如翻译addsd指令时需要将掩码高64位设置为0,低64位设置为1. 另一类是静态不确定掩码值的设置. 比如在翻译X86指令vblendvpd时就会遇到这类情况. 该指令的语义是根据掩码操作数(第1个操作数)中各个数据元素的最高位是否为1,来决定是从第2个还是从第3个操作数中选择对应的数据元素存入目的操作数中. 指令vblendvpd的翻译如图3所示,行4代码是设置掩码寄存器v0,但掩码的值是通过将v8中的元素右移63位得到,静态是未知的. 这种情况不能发射set_mask伪指令进行占位,必须即刻发射设置对应掩码的RISC-V指令. 在第2阶段的静态分析中,我们将对这种情况进行保守处理,认为掩码设置的数据流无法被继续跟踪下去了.

    图  3  掩码值静态未知的掩码设置
    Figure  3.  Mask setting with unknown mask value in static

    优化的第2阶段是借助静态数据流分析来删除IR2上冗余的掩码设置. 为实现轻量级的静态分析,降低分析开销,我们以TB为单元进行分析并删除冗余的掩码设置. 数据流分析过程中使用的数据流方程和SetVType优化类似,见式(1)~(4). 不同之处在于分析的指令由vsetvli变为set_mask伪指令. 算法4实现了第2阶段的数据流分析和冗余设置删除过程,其中第行4~7伪代码用于处理掩码值未知的掩码设置.

    优化的第3阶段实现在emit (mask)函数中,该函数在算法4的行13被调用,用于为无法删除的掩码设置伪指令set_mask发射RISC-V指令序列. 受RISC-V指令能直接编码的立即数的最大位宽限制,设置掩码通常需要使用一组指令来完成. 这个设置可以概括为一个通用的指令序列模版:加载立即数设置掩码值的一部分比特位,进行位移操作,继续加载立即数,并与此前设置好的比特位结合,反复上述操作数次,直到掩码值的所有比特位都被设置好. 我们对5个常用的掩码值的设置进行了定制优化,以能获得更好的性能,如图4所示.

    图  4  掩码设置的定制指令序列和通用模版指令序列性能对比
    Figure  4.  Performance comparison between custom instruction sequence and general template instruction sequence for mask settings

    SetMask优化能删除大量冗余的掩码设置,提升本地码质量,从而提升翻译执行的效率.

    算法4. 冗余掩码设置消除算法.

    输入:待优化的TB;

    输出:无.

    procedure del_repetitive_mask (TB&tb):

    ② pre_mask ← (−1, −1)

    ③ foreach inst in tb do:

    ④  if register v0 is defined by inst then

    ⑤   pre_mask ← (−1, −1)

    ⑥   continue

    ⑦  end if

    ⑧  if inst is a set_mask (mask) pseudo-inst then

    ⑨   if mask == pre_mask then

    ⑩    delete inst

    ⑪   else

    ⑫    pre_maskmask

    ⑬    emit (mask)

    ⑭   end if

    ⑮  end if

    ⑯  if inst is a label then

    ⑰   if inst’s immediate pred masks are the same    then

    ⑱    pre_maskinst’s pred mask

    ⑲   else

    ⑳    pre_mask ← (−1, −1)

    ㉑   end if

    ㉒  end if

    ㉓ end for

    end procedure

    面向现代CPU的X86代码中,标量浮点和打包浮点计算都是使用SIMD指令实现的. SD2Float优化旨在将X86的双精度标量浮点操作(即表1中SD类型的指令)翻译为RISC-V的浮点操作,将其他浮点操作翻译成RVV向量操作. 这种混合的翻译方法能充分利用RISC-V浮点扩展和RVV扩展各自的性能优势. 在消除不必要的数据同步后能提升翻译执行的效率.

    SD2Float优化提供的混合翻译机制由分析阶段和翻译阶段组成. 在分析阶段,通过在IR1上分析浮点操作相关的SIMD指令对所有xmm寄存器的定值-引用关系,为这些指令生成数据同步的信息. 在随后的翻译阶段,翻译器的翻译函数根据分析阶段提供的信息按需发射数据同步的指令,在浮点寄存器和向量寄存器之间进行数据同步.

    我们将浮点操作相关的SIMD指令分为两类,一类会被翻译为RISC-V浮点指令,称为sfp指令,另一类会被翻译为RVV向量指令,称为svec指令. 在图5所示的IR1代码中,addsd指令是sfp指令,addpd则是svec指令. 触发RISC-V浮点和向量寄存器之间发生数据同步的条件是,一类指令对xmm寄存器低64位的定值被另一类指令引用了. 数据同步的方向取决于定值操作是由哪一类指令完成的. 若sfp指令的定值被svec指令引用,则数据从浮点寄存器同步到向量寄存器的低64位,即sync_fp_to_vec操作. 反之,则从向量寄存器的低64位同步到浮点寄存器,即sync_vec_to_fp操作.

    图  5  sfp、svec混合序列翻译示例
    Figure  5.  Example for SFP, SVEC mixed sequence translation

    根据指令类型和语义,把对xmm的定值行为分为3类:高64位向量定值(vec_def_hi)、低64位向量定值(vec_def_lo)和低64位浮点定值(fp_def_lo). 对xmm的引用行为也可以分为3类:高64位向量引用(vec_use_hi)、低64位向量引用(vec_use_lo)和低64位浮点引用(fp_use_lo). 执行sfp指令可能发生fp_def_lo和fp_use_lo操作,而执行svec指令则可能发生vec_def_hi、vec_def_lo、vec_use_hi和vec_use_lo操作. 当vec_def_lo操作产生的定值被fp_use_lo操作引用时,将触发sync_vec_to_fp数据同步,当fp_def_lo操作产生的定值被vec_use_lo操作引用时,将触发sync_fp_to_vec数据同步.

    图5所示的IR1代码为例,第2行代码中sfp指令(addsd)定值了xmm3低64位,即发生了fp_def_lo. 第4行代码中的svec指令(addpd)引用了xmm3,即发生了vec_use_lo和vec_use_hi. 但是翻译第2行代码时不需要发射数据同步指令,因为第2行sfp指令的定值被其后的第3行代码注销了. 而第3行代码对xmm3的fp_def_lo操作定值了xmm3的低64位,且在第4行被svec指令的vec_use_lo操作引用了. 所以,翻译第3行代码时需要发射RISC-V浮点寄存器向向量寄存器同步数据的指令,即IR2上的第4行伪代码sync_fp_to_vec(fa3, v14). 同理,在翻译IR1的第5行代码时,则需要进行另一个方向的数据同步.

    IN[i]=use[i](OUT[i]def[i]) (5)
    OUT[B]=ssucc(B)IN[s] (6)
    IN[B]=useB(OUT[B]defB) (7)

    算法5. 按需同步数据的分析算法.

    说明:TB. xmm_recent_use的所有域在创建时被初始化为全1,TB的is_analyzing和is_analyzed域被初始化为false,inst. sync_to_fp和inst. sync_to_vec都被初始化为0.

    输入:待分析的TB;

    输出:TB. xmm_recent_use.

    procedure sync_analysis (TB&tb):

    ② if tb. is_analyzing then

    ③  return tb. xmm_recent_use

    ④ if tb. is_analyzed then

    ⑤  return tb. xmm_recent_use

    ⑥ tb. is_analyzingtrue

    ⑦ all succ_use fileds0

    ⑧ foreach succ in tb’s succ tbs do

    ⑨  succ_use ∪= sync_analysis(succ)//recursive   call

    ⑩ tb. xmm_recent_usesucc_use

    ⑪ insttb. tail

    ⑫ while inst in tb do

    ⑬  foreach opnd in inst’s all xmm oprands do

    ⑭   if opnd is dest oprand then

    ⑮    if need sync to fp then

    ⑯     inst. sync_to_fp ← 1

    ⑰    if need sync to vec then

    ⑱     inst. sync_to_vec ← 1

    ⑲    kill tb. xmm_recent_use[opnd]

    ⑳   end if

    ㉑   update tb. xmm_recent_use[opnd]

    ㉒  end for

    ㉓  instinst. pre

    ㉔ end while

    ㉕ is_analyzingfalse, is_analyzedture

    ㉖ return tb. xmm_recent_use

    end procedure

    为了实现上述按需同步数据的方案,我们设计了算法5,在IR1上对16个xmm寄存器发起后向数据流分析,该分析和活跃变量分析的过程类似. 分析过程中,算法为IR1每一条SIMD指令记录下将来翻译它时是否需要发射数据同步指令,以及数据同步的方向,对应算法的行⑮~⑱伪代码. 算法将动态维护一张名为xmm_recent_use的表,该表被现实为TB类的成员变量,包含16行,每一行对应一个xmm寄存器. 它记录了算法分析到当前的程序点上时,在其后续控制流上对各个xmm寄存器是否存在vec_use_hi、vec_use_lo和fp_use_lo操作. 算法每分析一条指令都对xmm_recent_use进行更新,更新时遵循式(5)所示的数据流转换方程,对应算法的行19和行21伪代码.

    SD2Float按需同步数据的分析将单次分析限定在函数内的可达路径范围内,跨TB的数据流分析遵循式(6)和式(7)所描述的数据流方程,实现如算法5行⑧~⑨伪代码所示. 这样的设计选择是为了让分析更加轻量化,同时,尽可能避免为了维护正确性而进行保守处理,引入不必要的数据同步操作. 按需的数据同步策略需要考虑性能和正确性两个因素. 在正确性方面,少了必要的数据同步会导致程序运行出错. 性能方面,数据同步次数越少,静态分析复杂度越低,则越有利于提升性能. 在分析到达分析范围的边界时,如果无法确定一个定值是否在后续的控制流中被引用,就需要保守处理,默认它会被引用. 以图5为例,如果以TB为分析单位,那么翻译IR1的第7行代码时,需要将数据从xmm4映射的RVV向量寄存器v16同步到其映射的浮点寄存器fa4上. 因为仅分析TB内的代码,无法确定第7行发生的vec_def_lo的定值是否会在后续的控制流中被fp_use_lo操作引用,只能保守地认为需要数据同步. 这样会导致过多不必要的数据同步,拖累性能.

    如果从起始TB出发,将能发现的代码都纳入一次分析中,则分析的开销过大,特别是程序的启动会变得更加缓慢. 数据同步能够被避免,是因为数据类型具有局部性. 代码中出现连续的sfp指令或svec指令时,数据同步将显著减少. 从这点上看,分析范围的持续扩大,并不能稳步提升数据同步操作的消除数量,进而难以持续带来性能上的增益.

    将单次分析限定在函数内的一条可达路径范围内,意味着我们需要处理3种情况:成环的路径、函数调用和函数返回. 相当于处理3种代码边界. 当发现成环的路径时,说明对代码的探索来到了这一次逆向数据流分析的起点,此时我们保守地认为,在该程序点上,所有xmm寄存器都同时被vec_use_hi、vec_use_lo和fp_use_lo三个操作引用. 处理方式如算法5的第3行伪代码所示,因为TB类在初始化时将其xmm_recent_use的所有域都初始化1,所以直接将xmm_recent_use返回即可. 在处理函数调用和函数返回方面,我们借助System-V的调用约定进行保守处理,即认为call指令对xmm0-xmm7有vec_use_hi、vec_use_lo的引用,ret指令对xmm0-xmm1有vec_use_hi、vec_use_lo的引用.

    本文提出和实现的3项性能优化方案旨在提升动态二进制翻译器RVBT在翻译执行包含大量SIMD指令的X86应用时的运行效率,让其成为一个面向RISC-V平台的高性能动态二进制翻译器.

    我们将在RISC-V平台上运行开启所有优化后的RVBT,并翻译执行测试集的X86-64版本可执行文件,统计运行时间. 通过与RISC-V原生版测试集的运行时间对比,获得RVBT相对本地执行的运行效率. 这能一定程度上反应优化后的RVBT是否有潜力成为一个高性能的动态二进制翻译器. 同时,我们还将与QEMU、未加优化的基线版本RVBT进行横向性能对比,以评估本文提出的优化带来的性能提升.

    我们还将评估各项优化单独开启对RVBT性能提升带来的贡献. 对于SetVType优化,我们统计了csrr、vsetvl以及vsetvli指令的静态和动态消除率,以评估其消除冗余sew设置的能力. 对于SetMask优化,我们统计了掩码设置操作的静态和动态消除率. 式(8)(9)定义了某个操作的静态和动态消除率是如何计算的. 对于SD2Float优化,我们统计了静态和动态同步率,定义见式(10)(11),以反应混合翻译中数据同步发生的频率,评估分析算法的能力.

    op=opopop (8)
    op=opopop (9)
    =sfp (10)
    =sfp (11)

    我们使用SPEC CPU 2006基准测试集作为评估RVBT正确性和性能的测试集. 我们先在X86-64服务器上使用GCC 7.5.5编译测试集,得到测试集在X86-64源平台上动态链接的可执行文件. 为了让编译器在指令选择过程中进行自动向量化,尽可能多地使用SIMD指令,编译时使用-O3编译优化选项. 在64位的RISC-V实验平台上,使用系统自带的GCC 13.1.1编译器,同样采用-O3编译优化选项编译测试集,得到动态链接的目标平台原生可执行文件. 通过分别运行基线版本的RVBT、优化后的RVBT和QEMU来翻译执行源平台测试用例,以及直接运行目标平台原生测试用例,对比它们的执行时间,以评估RVBT的性能表现,以及各项优化方案对RVBT性能提升的贡献.

    正确性是二进制翻译器的基础验证指标. SPEC CPU 2006测试集使用了C、C++和Fortran三种编程语言,代码量非常大,包含了丰富的语言特性和语法现象. 其测试用例是真实世界的大型复杂应用程序,比如编译器(gcc)、语音识别程序(sphinx3)等,涵盖了多种典型应用场景,非常具有代表性. 该测试集提供了运行测试用例的脚本,以及各个测试用例正确运行后的标准输出结果. 用户使用脚本运行测试用例后,脚本会自动地将测试用例该次的运行结果与标准输出进行对比,以验证测试用例的运行是否正确. 若测试用例运行正确,脚本将给出其运行时间. 因此,该测试集可用于评估RVBT系统的正确性和性能. 若RVBT能正确翻译执行SPEC CPU 2006测试集,则很大程度上说明本文的翻译方法和优化方法是正确的.

    QEMU是最具代表性的开源二进制翻译器之一. 在翻译SIMD指令上,它选择了和RVBT不同的技术路线,即使用目标平台的标量指令模拟源平台的SIMD指令. 而RVBT则使用RISC-V平台上同样具有单指令多数据流功能的向量扩展来翻译SIMD指令. QEMU的一大设计目标是支持多平台,但更高的翻译运行效率也同样是其核心追求,它在TCG-IR上进行了各种优化以生成更高质量的本地码,进而提升性能. 本文与QEMU进行横向对比的目的在于评估RVBT的基线性能水平,并以RVBT的基线性能为基准,评估本文提出的优化方案. 这样能更加客观地评估优化方案带来的性能提升效果. 同时,优化后的RVBT与QEMU的性能对比也在一定程度上展示了两种翻译SIMD指令的技术路线在性能上的差异,体现了RISC-V向量扩展在提升SIMD指令翻译效率上的潜力.

    在测试时,我们使用QEMU最新的稳定版本9.0.0,并基于Capstone 5.0.3库对测试集进行反汇编和分析. 在运行SPEC CPU 2006的所有测试用例时均将采用ref输入集. 该输入集是被SPEC认证的用于发布正式测试结果的输入集. 相比于test和train输入集,ref输入集的数据规模最大,能覆盖测试用例中的极端分支,适合用于压力测试,在获得更稳定且客观的性能数据的同时,也能充分地测试RVBT的正确性.

    本文的RISC-V实验平台为Milk-V Pioneer主机. 该主机搭载的Sophon SG2042 CPU是一款基于平头哥C920的高性能RISC-V处理器. 它支持RISC-V v0.7.1版本的向量扩展(即RVV 0.7.1),拥有128 GB内存,其详细硬件配置如表4所示. 主机上运行了RISC-V 64位版本的Fedora 38 发行版操作系统,使用Linux 6.1.31内核. 实验的系统软硬件栈如图6所示.

    表  4  实验平台硬件配置
    Table  4.  Hardware Configurations of Experiment Platform
    硬件 配置
    CPU Sophon SG2042
    核心数:64核
    主频:2 GHz
    L1d Cache:64 KB
    L1i Cache:64 KB
    L2 Cache:1MB/Cluster
    L3 Cache:64 MB System Cache
    向量扩展:RVV 0.7.1
    内存 128 GB DDR4 RAM
    下载: 导出CSV 
    | 显示表格
    图  6  实验平台软硬件栈
    Figure  6.  Software and hardware stack of experiment platform

    经实验验证,RVBT在本文的实验平台上正确翻译执行了X86-64平台上SPEC CPU 2006测试集. 考虑到该测试集包含了真实世界的大型复杂应用程序,对它的支持验证了RVBT系统的正确性.

    RVBT在开启本文提出的所有优化后,性能得到了显著提升,在SPEC CPU 2006测试集上,运行效率平均可达到本地运行的43.05%,如图7所示. 未开启优化的RVBT基线版本运行效率平均只达到本地运行的11.81%,而QEMU的运行效率更低,平均仅有本地运行的8.64%. 优化后的RVBT相对其基线版本的平均加速比为3.64,相对QEMU的平均加速比为4.98.

    图  7  全优化的RVBT与基线RVBT及QEMU的性能表现
    Figure  7.  Performance of full optimized RVBT, Baseline RVBT and QEMU

    本文的优化方案在SPEC CPU 2006浮点测试集上获得了更为显著的性能提升. 如图7所示,在浮点测试集上,RVBT的运行效率平均可达到本地运行的40.06%,翻译执行433. milc、437. leslie3d、450. soplex、459. GemsFDTD和470. lbm等5个测试用例的运行效率都超过了本地性能的50%. 而未施加本文优化的RVBT基线版本的平均运行效率只有本地运行的4.82%. QEMU的平均运行效率和RVBT基线版本相当,仅为本地运行的4.81%. 在SPEC CPU 2006浮点测试集上,开启所有优化后的RVBT相对其基线性能的最大、最小和平均加速比分别为24.17,2.61,8.31,相对QEMU的最大、最小和平均加速比分别为17.74,4.69,8.33.

    在整点测试集上,本文提出的优化方案也能获得可观的性能提升. 如图7所示,在整点测试集上,RVBT的运行效率平均可达到本地运行的47.39%. RVBT基线版本的平均运行效率为本地运行的39.04%,而QEMU的平均运行效率仅为本地运行的18.84%. 在整点测试集上,开启所有优化后的RVBT相对其基线性能的平均加速比为1.21,相对QEMU的平均加速比为2.52. 开启优化的RVBT和QEMU翻译运行429. mcf都获得了最高的运行的效率,RVBT可以达到本地性能的97.90%,而QEMU只能达到本地性能的40.14%. RVBT仅在翻译400. perlbench、445. gobmk和458. sjeng这3个测试用例时效率低于本地性能的30%,翻译其它的9个测试用例的效率均高于本地性能的30%. 而QEMU仅翻译429. mcf、456. hmmer、462. libquantum和473. astar这4个测试用例的效率高于本地性能的30%.

    翻译浮点操作的运行效率低下是跨指令集的动态二进制翻译器普遍面临的挑战之一,这严重阻碍了该技术用于翻译运行人工智能、科学计算、图形系统和多媒体等含有密集浮点操作的应用程序[38]. 基线版本的RVBT翻译浮点测试集的效率比其翻译整点测试集慢了8.10倍,而在开启本文提出的3项优化方案后,只慢1.18倍. 作为对比,QEMU翻译浮点测试集的效率比其翻译整点测试集慢了3.91倍. 本文提出的优化方案有效提升了翻译浮点操作的运行效率,有助于拓宽动态二进制翻译器的应用场景. 经过优化后,RVBT在性能上全面超越了QEMU,相比其优化前的基线版本,性能也有大幅提升,充分说明了本文提出的三项优化方案的有效性.

    各项优化单独开启的RVBT以及QEMU相对基线RVBT的加速比如图8所示. 从图中可观察到2个现象:1)在整点测试集上,3项优化带来的性能提升都相对有限,在浮点测试集上,3项优化都能带来了显著的性能提升;2)SetVType优化带来的性能提升最为明显. 这和测试集上的指令构成以及各项优化本身的特点有关.

    图  8  各项优化单独开启与基线RVBT及QEMU的性能表现
    Figure  8.  Performance of each optimized individual turn-on and baseline RVBT and QEMU is compared.

    我们对测试集的X86-64源平台测试用例进行反汇编,并统计了各个测试用例中SIMD指令的占比,如图9所示. 在SPEC CPU 2006整个测试集中,SIMD指令的平均占比为9.68%. 但在整点测试集和浮点测试集中的占比差异非常大. 其中,在整点测试集中的平均占比仅为3.31%,而在浮点测试集中占比高达21.62%,二者相差了6.53倍. 这解释了为什么本文提出的优化方案在浮点测试集上获得了更显著的性能提升. 另外,3项优化方案中,只有SetVType优化对所有的SIMD指令都具有优化效果,所以单独开启时对性能提升最为显著.

    图  9  SPEC CPU 2006测试程序中SIMD指令的静态占比
    Figure  9.  Static ratio of SIMD instructions in SPEC CPU 2006

    单独开启SetVType优化后,RVBT在SPEC CPU 2006测试集上的运行效率可达到本地运行的36.29%,相对基线版的RVBT和QEMU的平均加速比分别为3.07和4.2,对csrr、vsetvl和vsetvli指令的动态消除率分别达到了100%、100%和56.31%.

    翻译函数将SS、SD、PS、PD和PI类型的SIMD指令翻译成RISC-V向量指令时,均需要设置vtype寄存器. 因此,SetVType优化对所有类型的SIMD指令的翻译均具有优化效果.

    在整点测试集上,虽然SIMD指令占比较低,但开启优化后依然能获得一定的性能提升,让RVBT的运行效率达到本地运行的47.21%,相对基线版本的RVBT和QEMU的平均加速比为分别为1.21和2.51.

    在浮点测试集上,SetVType优化可以大幅提升RVBT的性能,让其运行效率达到本地运行的29.79%,对基线版本的RVBT的最小、最大和平均加速比分别为2.38,10.42和6.18. 翻译执行437. leslie3d的运行效率相比基线版本提高了8.48倍,达到了本地性能的91.16%. 与QEMU相比,获得的最小、最大和平均加速比分别为4.01、12.98、6.19.

    我们统计了优化开启后vsetvli、vsetvl和csrr指令的静态消除率和动态消除率. 经过SetVType优化后,vsetvl和csrr指令在测试集的所有测试用例中均被完全消除,静态和动态消除率都是100%. 经实验测定,执行vsetvl和csrr指令需要28个时钟周期,而执行一条向量加法指令只需要0.58个时钟周期. 所以,消除冗余的vsetvl和csrr指令非常有必要.

    在整点测试集上,vsetvli的平均静态消除率和平均动态消除率分别为44.20%和48.88%,在浮点测试集上分别为51.72%和62.62%,如图10所示. 动态指令消除率和性能提升的幅度是正相关的. 这一定程度上解释了为什么SetVType优化在浮点测试集上能获得了比整点测试集更大的性能提升.

    图  10  SetVType优化的动静态指令消除率
    Figure  10.  Static and dynamic instruction eliminate rate of SetVType optimization

    单独开启SetMask优化后,RVBT在SPEC CPU 2006浮点测试集上获得了性能提升,对基线版本的RVBT平均加速比为1.76. 该优化能消除冗余的掩码寄存器设置指令序列. 对掩码寄存器的设置主要是在翻译SS和SD类型指令时引入的. 浮点基准测试程序中包含大量这两种指令,平均占比达到了15.33%,在470. lbm上甚至达到了46.73%. 实施SetMask优化后,掩码设置操作的静态和动态平均消除率分别为85.73%和74.66%,如图11所示. 翻译执行浮点测试集时,在掩码设置操作被大量消除后,性能获得了明显的提升.

    图  11  SetMask优化的动静态指令消除率
    Figure  11.  Static and dynamic instruction eliminate rate of SetMask optimization

    在整点测试集上,SetMask是否开启对性能几乎没有影响. 在整点基准测试程序的指令中,SS和SD类型的指令占比非常小,平均占比仅为1.07%. 尽管SetMask优化在整点测试集上对掩码设置的静态和动态平均消除率达到了55.87%和18.33%,但受限于可优化的指令总体量太小,没有带来性能提升. 得益于该优化很小的分析开销,RVBT开启该优化后,在整点测试集上也几乎没有观察到性能下降的现象.

    单独开启SD2Float优化后,RVBT可以在SPEC CPU 2006浮点测试集上获得较大的性能提升,相对基线版RVBT的平均加速比为2.27.SD2Float优化针对的是SD类型的SIMD指令. 该类型的指令在整点测试集上的平均占比仅为0.57%,体量太小,使得SD2Float优化在整点测试集上平均仅能获得2%的性能提升. 在整个测试集上对RVBT基线的平均加速比为1.61.

    SD2Float优化能提升RVBT运行效率的关键在于降低寄存器之间的数据同步频率. 我们使用静态和动态同步率来反应SD2Float优化中的数据同步频率,它们的定义如式(10)和式(11)所示. 在浮点测试集中,SD2Float优化平均的静态和动态同步率分别为55.61%和67.35%,如图12所示. 动态同步率最低的基准测试程序是454.calculix,仅为13.66%,说明本文的按需数据同步算法有效降低了数据同步频率. 在整点测试集,静态和动态同步率都要高出许多. 但整点测试集中浮点操作相关的指令占比非常少,高同步率下引入的同步指令执行次数相比于总的指令执行次数而言,绝对数量也就非常小,所以对性能的影响很小.

    图  12  SD2Float优化的动静态同步率
    Figure  12.  Static and dynamic synchronization rate of SD2Float optimization

    在整点测试集中,有个别测试用例的动态同步率非常高. 产生高动态同步率的原因是同步指令被发射在一个循环内,而引发同步的SD指令在循环外. 如图13所示,图13(a)是一段C语言代码,图13(b)是其对应的X86-64汇编代码,其中图13(a)的第8和第9行代码对应图13(b)的第9行汇编代码,图13(a)中的第11行代码对应图13(b)的第12行汇编代码. 图13(b)被RVBT翻译成了图13(c)所示的RISC-V汇编代码. 在分析图13(b)的第9行代码时,SD2Float优化的数据同步算法发现addpd指令定义了xmm1寄存器的低64位,同时第14行的addsd指令使用了该寄存器的低64位,即第9行代码对xmm1的定义被第14行代码引用了. 由于addpd和addsd指令分别被翻译成了RISC-V的向量指令和浮点指令. 所以,在将addpd指令翻译成vfaddd指令后,还必须将映射xmm1的向量寄存器v8中的值同步到浮点寄存器fa1中,如图13(c)的第9和第10两行代码所示. 当图13(c)的代码执行时,同步指令位于循环中,将执行100次,而引起同步的指令addsd在循环外,只执行1次,动态同步率为10000%. 在上述例子中,若将同步指令放到循环结构之外,就能大幅降低数据同步的开销. 这有赖于循环结构的分析识别和优化,不在本文的探讨范围之内.

    图  13  高同步率代码片段示例
    Figure  13.  Example for high synchronization rate code

    本文针对SIMD指令跨架构翻译为向量指令面临的编程模型适配问题,基于程序局部性特征提出了3项优化方案,并将它们实现在了X86到RISC-V平台的动态二进制翻译器中. 这三项优化方案是架构无关的,具备跨架构的适应性. 不同架构处理器的SIMD扩展具有较大的差异. 在跨架构的二进制翻译中,若源平台的SIMD扩展是将其指令操作的数据元素类型和个数硬编码到指令操作码中,且目标平台的向量扩展是动态配置其指令操作的数据元素类型和个数,则适用本文的SetVType和SetMask优化. 若标量浮点操作和SIMD操作在源平台共用一套寄存器,而在目标平台使用两套独立的寄存器,则适用本文的SD2Float优化. 将ARM平台的NEON指令翻译为RISC-V的向量指令是适用本文3项优化方案的一个典型例子.

    QEMU使用目标平台的标量指令模拟源平台的SIMD指令. 已经有相关研究通过在QEMU中添加向量TCG-IR,以实现对目标平台上单指令多数据流硬件资源的利用,进而提升翻译性能[60,68-69]. 本文提出的3项优化方案和上述优化方案是正交的. 若翻译的源平台和目标平台符合本文优化方案的适用条件,则可将本文的优化方案应用到QEMU中. 其它选择将源平台SIMD指令翻译为目标平台向量指令的二进制翻译器,也可使用本文提出的优化方案.

    二进制翻译技术能将一种体系结构的二进制代码转换成另一种体系结构的二进制代码,实现在二进制层面进行跨平台软件迁移[19-20],可以用于遗产代码迁移和实现不同架构之间的软件通用[21,23-24]. 早在上世纪90年代,微软就已经推出了商业用的二进制翻译器FX!32[42]. 随着新硬件架构的不断推出,二进制翻译技术被广泛用于将成熟架构上的软件移植到新架构上运行,以迅速弥补新架构上的软件生态空缺.

    经过多年的发展,已经有大量的二进制翻译器被开发出来[22]. 但支持以RISC-V作为目标平台的动态二进制翻译器还比较少见,以QEMU、Box86/64[39]和DBT-FEMU[40]为代表的翻译器能将X86代码翻译到RISC-V平台,其中QEMU和Box86/64是开源的. 这三款翻译器的侧重点不同,QEMU追求多平台,首先将源平台的二进制程序翻译成其中间表示TCG-IR,在对中间表示进行优化后再将其转换成目标平台的代码. 通过增加一层平台无关的TCG-IR,QEMU在多源平台和多目标平台支持上具有优势,但因为使用内存模拟目标平台的寄存器,使用标量指令模拟SIMD指令的语义等原因,QEMU翻译质量较低[40],性能较差[43]. Box86/64支持以ARM和RISC-V作为目标平台,对X86程序进行动态二进制翻译. 它主要依赖函数库本地化技术来提升性能,通过直接使用RISC-V原生的glibc等动态库,减少翻译执行的代码量[22],同时通过JIT引擎提升性能[2]. DBT-FEMU主要利用了RISC-V的B扩展和P扩展对整点操作的翻译进行优化,在SPEC CPU 2006测试集的整点测试集上,平均翻译效率能达到本地执行的33.54%. 和上述支持RISC-V平台的翻译器相比,RVBT在性能上表现得非常有竞争力.

    动态二进制翻译系统普遍面临性能瓶颈,特别是在跨指令集架构进行翻译时容易发生性能衰减,且源架构和目标架构的差异越大,性能下降越明显[27,44]. 而性能是跨指令集的动态二进制翻译系统取得成功的关键因素[45],因此有大量关于提升翻译性能的研究. 源架构与目标架构之间的差异会导致翻译出来的本地码出现严重的指令膨胀[2,27]. 因此,一个重要的优化方向是消除冗余操作,比如标志位优化[2,25,46-48]遵循的就是这一思想,通过程序分析等技术消除冗余的标志位设置,缓解代码膨胀问题. RVBT在将SIMD指令翻译成RVV指令时,也观察到了指令膨胀的现象. 本文的一个重点优化方向是利用程序中数据类型的局部性特征消除冗余的sew和掩码设置,缓解因SIMD与RVV在编程模型上的显著差异导致的指令膨胀问题. 优化方案的指导思想都是消除冗余操作,但解决的问题不一样. 同时,RVBT中也集成了上述部分标志位优化技术.

    不同平台上的SIMD扩展在设计和实现上呈现持续分化的趋势[49],普遍存在差异,这为跨平台的SIMD指令翻译带来了挑战[50]. 过往对SIMD指令的翻译优化研究主要聚焦在X86和ARM这两个平台上,集中在X86-X86[51-52]、ARM-X86[53-54,49]以及ARM-ARM[55-60]的翻译中,早期也有研究探索X86到Itanium(IA64)上的SIMD翻译优化[61]. 主要研究如何充分利用目标平台上的SIMD计算资源来提升性能,比如动态向量化等. 而X86上的SIMD和RISC-V平台上的RVV因编程模型的巨大差异导致翻译效率不高这一问题还没有被关注和研究.

    SIMD技术在不断发展,新推出的SIMD硬件具有更强大的计算能力. 但面向旧SIMD硬件的遗产代码往往无法利用新硬件来提升性能. 同架构上SIMD指令的翻译优化主要是为了让遗产代码能充分利用新平台上更加强大的SIMD硬件资源,比如利用新平台上位宽更长的寄存器,优化技术包括循环信息重建、动态向量化等[51-52,55].

    跨架构SIMD翻译优化的核心思想是充分利用目标平台上的SIMD资源,弥合跨平台SIMD的语义鸿沟,比如在目标平台上寻找语义与源平台接近的指令进行翻译[56-57,62],探索更好的寄存器映射[61]和分配方案,以及动态向量化[63-65]等优化思路. Li 等人[61]在将X86程序翻译到Itanium平台时研究了在目标平台寄存器支持的数据类型比源平台寄存器支持的更少时,如何将一个源平台寄存器映射到多个目标平台寄存器. 文献[49, 5152, 52, 5859]研究了在目标平台寄存器位宽比源平台的更长时,如何通过更好的寄存器分配和指令合并等方法获得更好的性能. Wang 等人[72]还研究了将ARM的通用寄存器映射到X86的xmm寄存器上,以提升翻译性能. 还有一类研究先将源平台代码转成LLVM IR,通过LLVM的编译优化来选择目标平台的SIMD指令,达到使用目标平台SIMD进行加速的目的[43,54,56,66-67]. 针对QEMU使用标量指令模拟源平台SIMD指令导致翻译效率较低这一问题,文献[60, 6869]设计了向量 TCG-IR 来表示 SIMD 指令,并改进翻译SIMD的helper函数,文献[70]则将TCG-IR转成LLVM IR.

    本文充分利用目标平台上同样具备数据级并行功能的RISC-V RVV扩展来翻译X86的SIMD指令,强调对目标平台上硬件资源的充分利用. 同时,通过冗余操作消除和混合翻译,弥合两个平台在编程模型上的语义鸿沟,实现性能提升.

    二进制翻译在处理浮点操作时普遍性能较低,提升性能的方法一般是使用目标平台的浮点计算单元替代软件模拟的翻译[38]. 文献[44]通过动态的浮点寄存器分配来提升性能,文献[71]则针对X86的浮点栈提出了扩展虚拟栈(extending virtual stack)处理方案,让源平台的浮点寄存器可以直接映射到目标平台的浮点寄存器中. 本文使用了混合的翻译方法,同时使用RISC-V的RVV扩展和浮点扩展来翻译SIMD中的浮点运算操作,即使用RISC-V的浮点扩展翻译双精度标量浮点运算,使用RVV扩展翻译打包浮点运算等其它浮点操作,并通过静态分析实现按需的数据同步以提升翻译运行的效率.

    RISC-V在高性能计算(HPC)领域的崛起面临软件生态滞后的关键挑战,而动态二进制翻译(DBT)技术为跨架构移植X86/ARM成熟的软件生态提供了高效路径. 本文揭示了SIMD指令翻译至RVV时遭遇性能瓶颈的根源在于两者在编程模型上存在显著差异. 针对这一问题,本文提出了三项创新的优化方案,充分利用代码操作的数据类型具有局部性这一特点,通过消除翻译过程中的冗余操作,降低混合翻译浮点操作所需的数据同步频率,系统性地提升了SIMD到RVV的翻译效率. 特别是将翻译浮点操作的效率提升到了接近翻译整点操作的水平. 这为RISC-V在HPC场景的软件生态突破提供了一种可能的解决方案. 实验显示,经过本文优化后,翻译器获得了显著的性能提升,翻译运行SPEC CPU 2006的整点和浮点测试集时,平均运行效率分别达到了本地执行的47.39%和40.06%,远超QEMU的18.84%和4.81%. 相对优化前的加速比分别达到了1.21和8.31,相对QEMU的加速比则分别达到了2.52和8.33.

    作者贡献声明:赖远明是论文工作的主要完成人,提出、设计和实现了本文的3项优化方案,并分析实验结果,撰写和修改论文. 李亚龙和胡瀚之参与了优化方案的编码实现,运行了部分实验. 谢梦瑶对优化方案的实现细节提出了改进建议. 王喆对优化方案的设计提出了建议,并修改论文. 武成岗为论文的撰写提供了建议和指导.

  • 图  1   RVBT架构

    Figure  1.   Architecture of RVBT

    图  2   SIMD和RVV编程模型的差异

    Figure  2.   Difference between programming Models of SIMD and RVV

    图  3   掩码值静态未知的掩码设置

    Figure  3.   Mask setting with unknown mask value in static

    图  4   掩码设置的定制指令序列和通用模版指令序列性能对比

    Figure  4.   Performance comparison between custom instruction sequence and general template instruction sequence for mask settings

    图  5   sfp、svec混合序列翻译示例

    Figure  5.   Example for SFP, SVEC mixed sequence translation

    图  6   实验平台软硬件栈

    Figure  6.   Software and hardware stack of experiment platform

    图  7   全优化的RVBT与基线RVBT及QEMU的性能表现

    Figure  7.   Performance of full optimized RVBT, Baseline RVBT and QEMU

    图  8   各项优化单独开启与基线RVBT及QEMU的性能表现

    Figure  8.   Performance of each optimized individual turn-on and baseline RVBT and QEMU is compared.

    图  9   SPEC CPU 2006测试程序中SIMD指令的静态占比

    Figure  9.   Static ratio of SIMD instructions in SPEC CPU 2006

    图  10   SetVType优化的动静态指令消除率

    Figure  10.   Static and dynamic instruction eliminate rate of SetVType optimization

    图  11   SetMask优化的动静态指令消除率

    Figure  11.   Static and dynamic instruction eliminate rate of SetMask optimization

    图  12   SD2Float优化的动静态同步率

    Figure  12.   Static and dynamic synchronization rate of SD2Float optimization

    图  13   高同步率代码片段示例

    Figure  13.   Example for high synchronization rate code

    表  1   SIMD指令的分类

    Table  1   Classification of SIMD Instructions

    类型操作数类型操作的元素个数指令示例
    SS标量单精度浮点1个ADDSS
    SD标量双精度浮点1个ADDSD
    PS打包单精度浮点4个ADDPS
    PD打包双精度浮点2个ADDPD
    PI打包整点指令多个PADDD
    下载: 导出CSV

    表  2   标量浮点的不同翻译方案所需的时钟周期数

    Table  2   The Number of Clock Cycles Required for Different Translation Schemes of Scalar Floating-Point

    指令翻向量翻浮点翻浮点&同步
    mulsd xmm1, xmm244.170.5847.74
    sqrtsd xmm1, xmm261.2919.0864.73
    subsd xmm1, xmm244.150.5846.82
    addsd xmm1, xmm244.20.5846.78
    divsd xmm1, xmm262.1519.0964.75
    maxsd xmm1,xmm245.150.5746.73
    minsd xmm1,xmm245.150.5946.71
    下载: 导出CSV

    表  3   不受sew影响的指令类

    Table  3   Instruction Categories Not Unaffected by SEW

    类型指令功能指令示例
    仅操作标量add a0, a1, a2
    向量寄存器间数据移动vmv.vv v2, v3, v4
    向量位操作vxor.vv v2, v3, v4
    下载: 导出CSV

    表  4   实验平台硬件配置

    Table  4   Hardware Configurations of Experiment Platform

    硬件 配置
    CPU Sophon SG2042
    核心数:64核
    主频:2 GHz
    L1d Cache:64 KB
    L1i Cache:64 KB
    L2 Cache:1MB/Cluster
    L3 Cache:64 MB System Cache
    向量扩展:RVV 0.7.1
    内存 128 GB DDR4 RAM
    下载: 导出CSV
  • [1]

    Waterman A, Lee Y, Patterson D A, et al. The RISC-V instruction set manual, volume I: user-level ISA, version 2.0[J]. EECS Department, University of California, Berkeley, Tech. Rep. UCB/EECS−2014−54, 2014: 4

    [2]

    Li Chunqiang, Liu Zhiwei, Shang Yunhai, et al. A hardware non-invasive mapping method for condition bits in binary translation[J]. Electronics, 2023, 12(14): 3014 doi: 10.3390/electronics12143014

    [3]

    RISC-V International. There Will Be 62.4 Billion RISC-V Processor Cores in Operation by 2025[EB/OL]. (2020-04-02)[2024-11-12]. https://riscv.org/ecosystem-news/2020/04/there-will-be-62-4-billion-risc-v-processor-cores-in-operation-by-2025-francois-gauthier-lembarque

    [4]

    Weaver D, McIntosh-Smith S. An empirical comparison of the RISC-V and AArch64 instruction sets[C]//Proc of the SC’23 Workshops of the Int Conf on High Performance Computing, Network, Storage, and Analysis. New York, NY, USA: ACM, 2023: 1557−1565

    [5]

    Xi Wang, Leidel J D, Williams B, et al. Xbgas: a global address space extension on RISC-V for high performance computing[C]//Proc of 2021 IEEE Int Parallel and Distributed Processing Symposium (IPDPS). Piscataway, NJ: IEEE, 2021: 454−463

    [6]

    Borja Perez, Alexander Fell, John D. Davis. Coyote: an open source simulation tool to enable RISC-V in HPC[C]//Proc of 2021 Design, Automation & Test in Europe Conference & Exhibition (DATE). Piscataway, NJ: IEEE, 2021: 130−135

    [7]

    Andrea Bartolini, Federico Ficarelli, Emanuele Parisi, et al. Monte cimone: paving the road for the first generation of RISC-V high-performance computers[C]//Proc of 2022 IEEE 35th Int System-on-Chip Conference (SOCC). Piscataway, NJ: IEEE, 2022: 1−6

    [8]

    Chen Chen, Xiang Xiaoyan, Liu Chang, et al. Xuantie−910: A commercial multi-core 12-stage pipeline out-of-order 64-bit high performance RISC-V processor with vector extension: industrial product[C]//Proc of 2020 ACM/IEEE 47th Annual Int Symp on Computer Architecture (ISCA). Piscataway, NJ: IEEE, 2020: 52−64

    [9]

    Nick Brown, Maurice Jamieson. Performance characterisation of the 64-core sg2042 RISC-V CPU for HPC[C]//Proc of Int Conf on High Performance Computing. Berlin: Springer, 2025: 354−367

    [10] 北京开源芯片研究院. 2024中关村论坛10项重大科技成果——第三代“香山”开源高性能RISC-V处理器核对外发布. [EB/OL]. (2024-04-25)[2024-11-12]. https://www.bosc.ac.cn/newsinfo/7105467.html?templateId=564439
    [11]

    Nick Brown, Maurice Jamieson, Joseph Lee, et al. Is RISC-V ready for HPC prime-time: evaluating the 64-core sophon sg2042 RISC-V CPU[C]//Proc of the SC’23 Workshops of the Int Conf on High Performance Computing, Network, Storage, and Analysis. New York: ACM, 2023: 1566−1574

    [12]

    Sophon. Milk-V Pioneer Board. [EB/OL]. [2024-11-12]. https://sophon-static.sophon.cn/product/introduce/pioneerBoard.html

    [13] Xuantie. 如意BOOK甲辰版. [EB/OL]. [2024-11-12]. https://www.xrvm.cn/product/xuantie/4321312678808195072
    [14]

    Vedran Dakić, Leo Mršić, Zdravko Kunić, et al. Evaluating ARM and RISC-V architectures for high-performance computing with docker and kubernetes[J]. Electronics, 2024, 13(17): 3494 doi: 10.3390/electronics13173494

    [15]

    Ramon Canal, Stefano Di Carlo, Dimitris Gizopoulos, et al. Vitamin-V: expanding open-source RISC-V cloud environments[J]. arXiv preprint, arXiv: 2407.00052, 2024

    [16]

    Ramon Canal, Cristiano Chenet, Angelos Arelakis, et al. Vitamin-V: virtual environment and tool-boxing for trustworthy development of RISC-V based cloud services[C]//Proc of the 26th Euromicro Conf on Digital System Design (DSD). Piscataway, NJ: IEEE, 2023: 302−308

    [17]

    Nick Brown. RISC-V for HPC: Where we are and where we need to go[J]. arXiv preprint, arXiv: 2406.12398, 2024

    [18]

    Jasmina Saidova. RISC-V architecture and its role in the near future[J]. Journal of Advanced Scientific Research (ISSN: 0976−9595), 2024, 5(9

    [19] 陈龙,武成岗,谢海斌,等. 二进制翻译中解析多目标分支语句的图匹配方法[J]. 计算机研究与发展,2008,45(10):1789−1798

    Chen Long, Wu ChenggangG, Xie HaibinB, et al. Graph matching method for parsing multi-target branching sentences in binary translation[J]. Journal of Computer Research and Development, 2008, 45(10): 1789−1798 (in Chinese)

    [20] 杨浩,唐锋,谢海斌,等. 二进制翻译中的库函数处理[J]. 计算机研究与发展,2006,43(12):2174−2179

    Yang Hao, Tang Feng, Xie Haibin, et al. Library function processing in binary translation[J]. Journal of Computer Research and Development, 2006, 43(12): 2174−2179 (in Chinese).

    [21] 唐锋,武成岗,张兆庆,等. 二进制翻译应用级异常处理[J]. 计算机研究与发展,2006,43(12):2166−2173

    Tang Feng, Wu Chenggang, Zhang Zhaoqing, et al. Binary translation application level exception handling[J]. Journal of Computer Research and Development, 2006, 43(12): 2166−2173 (in Chinese).

    [22] 谢汶兵,田雪,漆锋滨,等. 二进制翻译技术综述[J]. 软件学报,2024,35(6):2687−2723

    Xie Wenbing, Tian Xue, Qi Fengbin, et al. A review of binary translation technology[J]. Ruan Jian Xue Bao/Jouinal of Software, 2024, 35(6): 2687−2723 (in Chinese)

    [23]

    Li Jianjun, Wu Chenggang, Hsu Wei-Chung. Efficient and effective misaligned data access handling in a dynamic binary translation system[J]. ACM Transactions on Architecture and Code Optimization, 2011, 8(2): 1−29

    [24]

    Li Jianjun, Wu Chenggang, Hsu Wei-Chung. An evaluation of misaligned data access handling mechanisms in dynamic binary translation systems[C]//Proc of 2009 Int Symp on Code Generation and Optimization. Piscataway, NJ: IEEE, 2009: 180−189

    [25] 唐锋,武成岗,冯晓兵,等. 基于动态反馈的标志位线性分析算法[J]. 软件学报,2007(7):1603−1611

    Tang Feng, Wu Chenggang, Feng Xiaobing, et al. Marker linear analysis algorithm based on dynamic feedback[J]. Jouinal of Software, 2007(7): 1603−1611 (in Chinese)

    [26]

    Fabrice Bellard. QEMU, a fast and portable dynamic translator[C]//Proc of Usenix Annual Technical Conf, Freenix Track. Berkeley, CA: USENIX Association, 2005, 41(46): 10−5555

    [27]

    Xie Benyi, Yan Yue, Yan Chenghao, et al. An instruction inflation analyzing framework for dynamic binary translators[J]. ACM Transactions on Architecture and Code Optimization, 2024, 21(2): 1−25

    [28]

    Evangelos Georganas, Sasikanth Avancha, Kunal Banerjee, et al. Anatomy of high-performance deep learning convolutions on SIMD architectures[C]//Proc of SC18: Int Conf for High Performance Computing, Networking, Storage and Analysis. Piscataway, NJ: IEEE, 2018: 830−841

    [29]

    Zhang Jiyuan, Franz Franchetti, Tze Meng Low. High performance zero-memory overhead direct convolutions[C/OL]//Proc of Intl Conf on Machine Learning. 2018[2024-11-12]. https://proceedings.mlr.press/v80/zhang18d.html

    [30]

    Daon Park, Bernhard Egger. Improving throughput-oriented LLM inference with cpu computations[C]//Proc of the 2024 Int Conf on Parallel Architectures and Compilation Techniques. New York: ACM, 2024: 233−245

    [31]

    Haihao Shen, Hanwen Chang, Bo Dong, et al. Efficient LLM inference on cpus[J]. arXiv preprint, arXiv: 2311.00502, 2023

    [32]

    Haihao Shen, Hengyu Meng, Bo Dong, et al. An efficient sparse inference software accelerator for transformer-based language models on cpus[J]. arXiv preprint, arXiv: 2306.16601, 2023

    [33]

    Xuanlin Jiang, Yang Zhou, Shiyi Cao, et al. Neo: Saving GPU memory crisis with CPU offloading for online LLM inference[J]. arXiv preprint, arXiv: 2411.01142, 2024

    [34]

    Gary Bradski. The opencv library[J]. Dr. Dobb’s Journal: Software Tools for the Professional Programmer, 2000, 25(11): 120−123

    [35]

    Suramya Tomar. Converting video formats with ffmpeg[J]. Linux Journal, 2006, 2006(146): 10

    [36]

    Shuja J, Gani A, ur Rehman M H, et al. Towards native code offloading based mcc frameworks for multimedia applications: A survey[J]. Journal of Network and Computer Applications, 2016, 75: 335−354 doi: 10.1016/j.jnca.2016.08.021

    [37]

    Amogh Akshintala, Bhushan Jain, Chia-Che Tsai, et al. X86−64 instruction usage among c/c++ applications[C]//Proc of the 12th ACM Int Conf on Systems and Storage. New York: ACM, 2019: 68−79

    [38]

    Emilio G. Cota, Luca P. Carloni. Cross-ISA machine instrumentation using fast and scalable dynamic binary translation[C]//Proc of the 15th ACM SIGPLAN/SIGOPS Int Conf on Virtual Execution Environments. New York: ACM, 2019: 74−87

    [39]

    PtitSeb. Box64[EB/OL]. [2024-11-12]. https://github.com/ptitSeb/box64

    [40] 余子濠,陈璐,孙凝晖,等. 以RISC-V为目标的动态二进制翻译代码质量优化方法[J]. 计算机研究与发展,2023,60(10):2322−2334 doi: 10.7544/issn1000-1239.202220296

    Yu Zihao, Chen Lu, Shun Ninghui, et al. Dynamic binary translation code quality optimization method targeting RISC-V[J]. Journal of Computer Research and Development, 2023, 60(10): 2322−2334 (in Chinese). doi: 10.7544/issn1000-1239.202220296

    [41]

    Zhaoxin Yang, Xuehai Chen, Liangpu Wang, et al. MFHBT: hybrid binary translation system with multi-stage feedback powered by LLVM[C]//Proc of Int Symp on Advanced Parallel Processing Technologies. Berlin: Springer, 2023: 310−325

    [42]

    A Chernoff, R Hookway. DIGITAL FX! 32 running 32-Bit x86 applications on Alpha NT[C]//Proc of Large-Scale System Administration of Windows NT Workshop (Large-Scale System Administration of Windows NT Workshop). Berkeley, CA: USENIX Associatio, 1997

    [43]

    Fu Sheng-Yu, Hong Ding-Yong, Liu Yu-Ping, et al. Efficient and retargetable SIMD translation in a dynamic binary translator[J]. Software: Practice and Experience, 2018, 48(6): 1312−1330 doi: 10.1002/spe.2573

    [44]

    Amanieu D’Antras, Cosmin Gorgovan, Jim Garside, et al. Low overhead dynamic binary translation on ARM[C]//Proc of the 38th ACM SIGPLAN Conf on Programming Language Design and Implementation. New York: ACM, 2017: 333−346

    [45]

    Hong Ding-Yong, Fu Sheng-Yu, Liu Yu-Ping, et al. Exploiting longer SIMD lanes in dynamic binary translation[C]//Proc of 2016 IEEE 22nd Int Conf on Parallel and Distributed Systems (ICPADS). Piscataway, NJ: IEEE, 2016: 853−860

    [46] 马湘宁,武成岗,唐锋,等. 二进制翻译中的标志位优化技术[J]. 计算机研究与发展,2005,42(2):329−337 doi: 10.1360/crad20050222

    Ma Xiangning, Wu Chenggang, Tang Feng, et al. Flag bit optimization technology in binary translation[J]. Journal of Computer Research and Development, 2005, 42(2): 329−337 (in Chinese). doi: 10.1360/crad20050222

    [47] 王文文,武成岗,白童心,等. 二进制翻译中标志位的模式化翻译方法[J]. 计算机研究与发展,2014,51(10):2336−2347

    Wang Wenwen, Wu Chenggang, Bai Tongxin, et al. Patterned translation method of flag bits in binary translation[J]. Journal of Computer Research and Development, 2014, 51(10): 2336−2347 (in Chinese)

    [48]

    Hongqing Zeng, Min Xie, Yong Dong, et al. Efficient condition code emulation for dynamic binary translation systems[C]//Proc of 3rd Int Symp on Computer Engineering and Intelligent Communications (ISCEIC 2022). Bellingham, WA: SPIE, 2023, 12462: 421−432

    [49]

    Liu Yu-Ping, Hong Ding-Yong, Wu Jan-Jan, et al. Exploiting SIMD asymmetry in ARM-to-X86 dynamic binary translation[J]. ACM Transactions on Architecture and Code Optimization, 2019, 16(1): 1−24

    [50]

    Junaid Shuja, Abdullah Gani, Kwangman Ko, et al. SIMDOM: A framework for SIMD instruction translation and offloading in heterogeneous mobile architectures[J]. Transactions on Emerging Telecommunications Technologies, 2018, 29(4): e3174 doi: 10.1002/ett.3174

    [51]

    Nabil Hallou, Erven Rohou, Philippe Clauss, et al. Dynamic re-vectorization of binary code[C]//Proc of 2015 Int Conf on Embedded Computer Systems: Architectures, Modeling, and Simulation (SAMOS). Piscataway, NJ: IEEE, 2015: 228−237

    [52]

    Nabil Hallou, Erven Rohou & Philippe Clauss. Runtime vectorization transformations of binary code[J]. International Journal of Parallel Programming, 2017, 45: 1536−1565 doi: 10.1007/s10766-016-0480-z

    [53]

    Wu Jin, Dong Jian, Fang Ruili, et al. Effective exploitation of SIMD resources in cross-ISA virtualization[C]//Proc of the 17th ACM SIGPLAN/SIGOPS Int Conf on Virtual Execution Environments. New York: ACM, 2021: 84−97

    [54]

    Liu Yuping, Hong Dingyong, Wu Jan-Jan, et al. Exploiting asymmetric SIMD register configurations in ARM-to-X86 dynamic binary translation[C]//Proc of 2017 26th Int Conf on Parallel Architectures and Compilation Techniques (PACT). Piscataway, NJ: IEEE, 2017: 343−355

    [55]

    Lin Chih-Min, Fu Sheng-Yu, Hong Ding-Yong, et al. Exploiting vector processing in dynamic binary translation[C]//Proc of the 48th Int Conf on Parallel Processing. New York: ACM, 2019: 1−10

    [56]

    Fu Shengyu, Hong Dingyong, Liu Yuping, et al. Dynamic translation of structured loads/stores and register mapping for architectures with SIMD extensions[C]//Proc of the 18th ACM SIGPLAN/SIGBED Conf on Languages, Compilers, and Tools for Embedded Systems. New York: ACM, 2017: 31−40

    [57]

    Fu Sheng-Yu, Hong Ding-Yong, Liu Yu-Ping, et al. Optimizing data permutations in structured loads/stores translation and SIMD register mapping for a cross-ISA dynamic binary translator[J]. Journal of Systems Architecture, 2019, 98: 173−190 doi: 10.1016/j.sysarc.2019.07.008

    [58]

    Hong Ding-Yong, Fu Sheng-Yu, Liu Yu-Ping, et al. Exploiting longer SIMD lanes in dynamic binary translation[C]//Proc of 2016 IEEE 22nd Int Conf on Parallel and Distributed Systems (ICPADS). Piscataway, NJ: IEEE, 2016: 853−860

    [59]

    Hong Ding-Yong, Liu Yu-Ping, Fu Sheng-Yu, et al. Improving SIMD parallelism via dynamic binary translation[J]. ACM Transactions on Embedded Computing Systems, 2018, 17(3): 1−27

    [60]

    Luc Michel, Nicolas Fournel, Frédéric Pétrot. Speeding-up SIMD instructions dynamic binary translation in embedded processor simulation[C]//Proc of 2011 Design, Automation & Test in Europe. Piscataway, NJ: IEEE, 2011: 1−4

    [61]

    Li Jianhui, Zhang Qi, Xu Shu, et al. Optimizing dynamic binary translation for SIMD instructions[C]//Proc of Int Symp on Code Generation and Optimization (CGO’06). Piscataway, NJ: IEEE, 2006: 12−280

    [62]

    Nathan Clark, Amir Hormati, Sami Yehia, et al. Liquid SIMD: abstracting SIMD hardware using lightweight dynamic mapping[C]//Proc of 2007 IEEE 13th Int Symp on High Performance Computer Architecture. Piscataway, NJ: IEEE, 2007: 216−227

    [63]

    Zhou Ruoyu, George Wort, Márton Erdős, et al. The janus triad: Exploiting parallelism through dynamic binary modification[C]//Proc of the 15th ACM SIGPLAN/SIGOPS Int Conf on Virtual Execution Environments. New York: ACM, 2019: 88−100

    [64]

    Takashi Nakamura, Satoshi Miki, Shuichi Oikawa. Automatic vectorization by runtime binary translation[C]//Proc of 2011 2nd Int Conf on networking and computing. Piscataway, NJ: IEEE, 2011: 87−94

    [65]

    Michael Guilherme Jordan, Tiago Knorst, Julio Vicenzi, et al. Boosting SIMD benefits through a run-time and energy efficient dlp detection[C]//Proc of 2019 Design, Automation & Test in Europe Conf & Exhibition (DATE). Piscataway, NJ: IEEE, 2019: 722−727

    [66]

    Shen Bor-Yeh, Chen Jiunn-Yeu, Hsu Wei-Chung, et al. LLBT: An LLVM-based static binary translator[C]//Proc of the 2012 Int Conf on Compilers, Architectures and Synthesis for Embedded Systems. New York ACM, 2012: 51−60

    [67]

    Martin Fink. Translating X86 Binaries to LLVM Intermediate Representation[D/OL]. 2022[2024-11-12]. https://dse.in.tum.de/wp-content/uploads/2022/01/translating_x86_binaries_into_llvm_intermediate_representation.pdf

    [68]

    Fu Sheng-Yu, Wu Jan-Jan, Hsu Wei-Chung. Improving SIMD code generation in QEMU[C]//Proc of 2015 Design, Automation & Test in Europe Conference & Exhibition (DATE). Piscataway, NJ: IEEE, 2015: 1233−1236

    [69]

    Fu Sheng-Yu, Hong Ding-Yong, Wu Jan-Jan, et al. SIMD code translation in an enhanced hqemu[C]//Proc of 2015 IEEE 21st Int Conf on Parallel and Distributed Systems (ICPADS). Piscataway, NJ: IEEE, 2015: 507−514

    [70]

    Hong Ding-Yong, Hsu Chun-Chen, Yew Pen-Chung, et al. HQEMU: A multi-threaded and retargetable dynamic binary translator on multicores[C]//Proc of the 10th Int Symp on Code Generation and Optimization. New York: ACM, 2012: 104−113

    [71] 谢海斌,武成岗,崔慧敏,等. 二进制翻译中的 X86 浮点栈处理[J]. 计算机研究与发展,2007,44(11):1946−1954 doi: 10.1360/crad20071119

    Xie Haibin, Wu Chenggang, Cui Huimin, et al. X86 floating point stack processing in binary translation[J]. Journal of Computer Research and Development, 2007, 44(11): 1946−1954 (in Chinese). doi: 10.1360/crad20071119

    [72]

    Wu Jin, Dong Jian, Fang Ruili, et al. Effective exploitation of SIMD resources in cross-ISA virtualization[C]//Proc of the 17th ACM SIGPLAN/SIGOPS Int Conf on Virtual Execution Environments. New York: ACM, 2021: 84−97

    [73]

    E. R. Altman, D. Kaeli, Y. Sheffer. Welcome to the opportunities of binary translation[J]. Computer, 2000, 33(3): 40−45

图(13)  /  表(4)
计量
  • 文章访问数:  51
  • HTML全文浏览量:  15
  • PDF下载量:  20
  • 被引次数: 0
出版历程
  • 收稿日期:  2025-02-28
  • 修回日期:  2025-04-08
  • 网络出版日期:  2025-04-16

目录

/

返回文章
返回