Page 129 - 《软件学报》2024年第6期
P. 129
谢汶兵 等: 二进制翻译技术综述 2705
寄存器, 可见有效提升寄存器利用率可以提升二进制翻译效率. 在指令翻译时, 研究者致力研究各种寄存器单元镜
像映射设置策略, 如表 7 给出了二进制翻译中常用寄存器镜像映射策略和各自的优劣势.
表 7 二进制翻译中常用的寄存器映射策略
寄存器镜 映射手段 优势 劣势 代表性的翻
像映射 译系统
虚拟内存 使用一片连续内存区域模拟寄存器, 在目标 消除不同平台间寄存器 引发大量的访存操作 QEMU [13]
映射 平台重新分配寄存器访问内存区域 的使用差异
在区域内直接映射源和目标平台物理寄存 [46]
局部寄存 器. 局部区域入口和出口处保存与恢复被映 减少了内存访问操作. 对于基本块较短的控制密集型 Bintrans
器映射 实现较为灵活 程序效果不理想 Harmonia [53]
射的寄存器
寄存器全 对源程序中涉及的寄存器做源平台和目标 引入中间变量较少. 减 寄存器被定向使用, 容易引发寄 HBT [134]
局映射 平台寄存器全局映射 少了内存访问操作 存器访问冲突
寄存器映射方法有效缓解了访存压力, 然而, 源平台和目标平台的物理寄存器在数量、使用方法上存在较大
差异, 很难有一种寄存器映射策略满足翻译系统的全部设计需求. 针对源平台寄存器数量多于目标平台的情况, 文
4.3.3 指令并行化
献 [135] 提出将目标平台向量寄存器的低位与源平台寄存器进行映射, 缓解目标平台寄存器数量不足的问题. 此
外, 一些研究者提出根据不同算法确定寄存器优先级, 以保证寄存器资源的利用率. 文献 [162] 对基本块内中间指
令的寄存器需求次数进行排序, 优先为排序靠前的变量分配寄存器. 文献 [53] 和文献 [82] 对代码映射区域进行访
存频率排序, 提出优先对引发高频率访存的代码区域执行寄存器映射, 保证了寄存器映射资源的利用率最大化. 文
献 [163] 根据程序对不同寄存器的使用频率确定寄存器分配需求优先级, 并在寄存器分配过程中根据优先级动态
的调整分配顺序. 此外, Fu 等人 [87] 引入启发式寄存器匹配算法和用于性能上界估计的穷举搜索算法来指导寄存器
的优先级, 选择最佳的寄存器映射配置.
除了在源平台与目标平台之间进行部分寄存器映射, 二进制翻译在生成目标代码时还涉及目标平台生成代码
的物理寄存器分配. 一种优秀的寄存器映射策略应该尽可能地将程序变量保存在寄存器中, 减少对内存的访问. 为
了提高二进制翻译中寄存器分配效率, 文献 [142] 在 QEMU 后端增加了线性扫描寄存器分配算法, 很好地权衡了
目标平台的寄存器分配效果与分配效率之间的关系. 文延华等人 [143] 提出分段映射和特殊寄存器功能剪裁相结合
的寄存器分配方法, 提升了寄存器使用的灵活性.
4.3.2 中间代码优化
基于中间表示转换的指令翻译方法降低了翻译难度, 同时也引入了大量的冗余指令. 通过对中间表示开展优
化, 可以有效降低代码膨胀率. 李男等人 [18] 提出基于模式匹配算法替换中间次优代码段. 文献 [66] 通过构建函数
控制流与合并基本块, 为循环展开、构造跟踪和函数内联提供优化机会. 文献 [164] 将源平台内存地址空间映射
到翻译器的同一地址空间, 减少了访存查询和地址代换的指令生成开销. 文献 [56] 挖掘目标平台指令之间的数据
依赖关系, 基于数据依赖图优化算术运算、访存和函数调用等冗余指令. Wu 等人 [165] 引入标志位指示来标识源平
台寄存器的模拟方式, 减少二进制翻译过程中基于内存模拟的指令数量. 除了传统的优化算法外, 也有研究致力于
将编译器优化技术应用于二进制翻译中. 文献 [34] 利用编译器的多面体优化来优化中间代码, 为自动向量化和热
点卸载等优化方向提供了可能. 然而, 中间代码优化属于一种局部性优化策略, 总体来看, 在翻译效率提升上, 该优
化很难有一个数量级的提升.
随着多核处理器的普及与并行编程技术的发展, 利用二进制翻译技术发挥目标平台的硬件算力来提升数据并
行性成为新的热点.
(1) 向量指令翻译重组
向量指令强大的并行能力可以降低冗余指令获取、解码、数据依赖检查和结果写回等开销, 当前已在各类处
理器中得到了广泛支持, 例如 x86 平台的 SSE/AVX、ARM 平台的 NEON、PowerPC 平台的 AltiVec、SW64 和
MIPS 平台的 SIMD 指令等. 向量指令在多媒体、2D/3D 图像和游戏应用中广泛使用. Wu 等人 [135] 统计了 SPEC2017、