软硬协同优化 (3):动态二进制翻译技术原理及应用
发表于 2023/11/01
0
背景
过去十几年间,Arm架构处理器由于其卓越的能效优势,在移动计算领域已经成为无可争议的王者。与此同时,在追求极致性能的传统计算领域,Arm处理器也正在向x86处理器发起进攻。亚马逊云Gravation处理器、华为鲲鹏920处理器、英伟达Grace CPU,这些高性能处理器的出现证明了Arm架构同样具有高性能计算的发展潜力。
尽管目前大量的计算平台开始采用Arm架构,由于历史惯性,现有大多数计算平台仍然使用x86芯片,并且运行着许多基于x86架构的软件。这些软件在x86架构上运行良好,并且很多都是非常重要的软件。然而,Arm服务器由于指令集架构不同,无法直接运行x86软件。这也造成了Arm服务器的生态问题:对于使用Arm服务器的用户,如果用户原先有一些x86软件,他们是否能在Arm平台上运行这些软件呢?
对于这个问题,如果这些应用程序的源代码是可用的,那么可以进行手动移植,对源代码进行一些性能优化,使其能够在Arm服务器上运行。这需要对x86的代码进行修改和重新编译,以适应Arm服务器。然而,实际上有很多用户由于各种历史原因,并没有应用程序的源代码,无法进行重新编译或修改,但是他们仍然希望能够使用Arm架构服务器。在这种情况下,动态二进制翻译技术就派上了用场。这种技术可以将x86指令动态地转换为Arm指令,从而使得原本只能在x86平台上运行的应用程序能够在Arm64服务器上顺利运行。
通过动态二进制翻译技术,可以实现在不同指令集架构之间的兼容性,无论是否有源代码,都可以让用户在Arm服务器上运行x86软件。这为用户提供了更大的灵活性和选择性,使他们能够充分利用先进的Arm计算平台的性能和功能。
业界方案
当前二进制翻译是业界解决跨芯片体系软件兼容问题必选方案。
1. Intel Houdini Arm→x86
在移动芯片领域,Intel曾经面临着一个重大的挑战:绝大多数安卓应用和游戏都是针对Arm架构开发的,而Intel的移动芯片采用的是x86架构。这种指令集的差异导致了软件生态的不兼容性,使得许多Arm应用无法在Intel芯片上运行。
为了解决这一问题,Intel推出了Houdini Arm→x86二进制指令翻译框架[1]。该框架的关键技术在于将Arm指令动态地翻译成x86指令,从而实现Arm应用在x86架构上的运行。通过这种翻译技术,Intel的x86芯片得以兼容运行Arm开发的安卓应用。
这项技术的应用效果非常显著。它使得Intel移动芯片能够顺利运行原本只能在Arm架构上工作的安卓应用和游戏,大大扩展了Intel芯片的兼容性和可用性。然而,随着Intel芯片战略的调整,x86芯片退出了移动市场。
2. 微软/高通 Win 10系统x86→Arm
为了满足在Arm平台运行Windows系统的需求,微软和高通合作推出了Win 10系统x86→Arm方案[2]。该方案的关键在于将现有的Windows-x86软件生态直接移植到高通的Arm64芯片平台上。通过x86→Arm的二进制指令翻译技术,使得Arm架构的Win10笔记本能够运行原本只能在x86架构上工作的大部分32位Windows应用。这项技术的应用效果非常显著。Arm架构的Win10笔记本用户可以享受到更广泛的软件选择,无需担心兼容性问题。
目前,Win11的Arm64版本也已经引入了模拟器,使得x86_64的应用程序也能在Arm架构上运行。这意味着更多的应用程序可以无缝迁移到Arm平台,进一步提升了Arm设备的兼容性和可用性。
这些案例展示了动态二进制指令翻译技术在解决不同指令集架构之间兼容性问题上的潜力和应用前景。它为芯片制造商提供了一种有效的方式来克服软件生态的挑战,为用户提供更广泛的应用选择和更好的使用体验。
ExaGear介绍
ExaGear是华为自主可控的动态二进制翻译软件[3],它提供了一种解决方案,可以将x86(32/64-bit)或Arm32指令翻译成Arm64指令,并模拟guest应用调用的操作系统API,使得原本在Linux x86(32/64-bit)或Arm32上运行的程序能够在Arm64的服务器上执行。
作为一种中间件软件解决方案,ExaGear位于guest应用程序和Arm Linux操作系统之间。它利用二进制转换技术,在运行时将guest应用程序动态翻译为AArch64兼容的指令,从而实现在Arm64平台上运行。
场景一:Windows应用ExaGear提供支持Windows应用在AArch64平台上的转码运行的解决方案。需要注意的是,这种方案高度依赖于Wine,因此兼容性风险较高。它只能针对特定场景解决逐个应用的兼容性问题。ExaGear本身并不提供Wine组件,而是通过与Wine的集成来实现Windows应用在AArch64平台上的运行。
场景二:Android应用ExaGear支持Android A32应用在AArch64平台上的转码运行。这需要重新编译内核以启用兼容层。通过这种方案,Android A32应用可以在Arm64平台上得到支持和运行,扩大了应用的兼容性和可用性。
ExaGear的存在为Arm64平台带来了更广泛的软件支持,使得原本只能在x86架构或Arm32上运行的程序能够无缝地迁移到Arm64架构的服务器上。这对于提升Arm服务器的可用性和灵活性具有重要意义。随着ExaGear的不断发展和改进,我们可以预见到更多跨架构的兼容性解决方案的出现,为用户提供更好的体验和更广泛的应用选择。
ExaGear技术原理
首先,ExaGear会将guest应用加载到内存中。然后,它会查找到guest应用的入口点,并从程序的入口点开始分析。它会检查第一个Basic Block对应的指令,从第一个指令开始分析到第一个分支指令之前的代码。在这个过程中,ExaGear会判断指令序列是否已经被翻译过。
如果指令序列还没有被翻译过,ExaGear会快速进行一级的反应,将其翻译成目标架构的指令。完成翻译后,它将这些指令放置在一个称为Arm代码池的区域中,即整个翻译后的代码区域。
在程序执行过程中,如果之前翻译过的代码块再次执行,ExaGear会去Arm代码池查找对应的翻译后的代码。一旦找到,它将继续执行该代码块,并查找下一个代码块的位置。
这个过程会一直重复,直到整个程序执行完成。在这个过程中,需要注意的是为了实现代码的快速执行,ExaGear采用了两个翻译过程。一个是快速翻译,另一个是Level 2翻译。
Level 2 翻译是通过单独的进程进行的,该进程与主进程并行工作,采集运行时的热点代码。由于这个独立进程不会对原始进程产生任何影响,因此可以花费更多的时间进行深度优化,而不会对主进程的性能产生负面影响。这样做的好处是,可以进行更深层次的优化,从而极大地提升程序的性能。
优化后的代码会被重新注入到Arm代码池中,替换掉之前的快速翻译版本。在后续程序的执行过程中,所有的热点代码将使用这个新的优化版本,从而显著提升程序的运行效率。
通过这种转码技术原理,ExaGear能够将原本在不同架构上运行的程序转换为目标架构的指令,实现跨平台的运行。同时,通过基于Level 2的翻译和深度优化,ExaGear能够提供极致的性能提升,提高程序的执行效率。
ExaGear性能
通过使用Benchmark测试,我们可以对比经过ExaGear指令翻译的x86程序与原生AArch64程序之间的性能差异。
在当前情况下,经过优化后的AArch64本地程序能够达到原生性能的90%以上。这意味着在使用ExaGear进行指令翻译后,程序的性能损失相对较小。
ExaGear适用场景
无源码存量业务的情况下,建议使用ExaGear结合华为鲲鹏Arm64计算平台进行迁移。由于无源码可用,ExaGear提供了一种便捷的解决方案,可以将现有的存量业务迁移到鲲鹏平台上运行。这种方式可以避免源码迁移的复杂性,同时利用鲲鹏算力的优势来提升性能。
然而,对于CPU计算密集型的应用,无法避免地会出现明显的性能损耗。在这种情况下,建议尽量采用源码迁移的方式。通过将源码重新编译为适用于鲲鹏平台的指令集,可以最大程度地减少转码过程中的性能损耗,从而提升应用的性能。
对于单线程应用,由于无需考虑内存模型转换的问题,ExaGear的性能损耗较低。因此,可以较为放心地使用ExaGear进行指令翻译,而无需过多担心性能下降的影响。
而对于多线程应用,可以充分发挥鲲鹏平台的多核优势,以提升端到端性能,从而抵消转码过程中的性能损耗。通过充分利用鲲鹏平台的多核处理能力,可以在一定程度上弥补由于指令翻译带来的性能损耗,从而保持较高的性能水平。
综上所述,根据不同的业务场景,可以选择合适的迁移方案。对于无源码存量业务,ExaGear结合鲲鹏算力是一种便捷的解决方案;而对于CPU计算密集型应用,源码迁移可能是更好的选择。同时,对于单线程应用和多线程应用,可以根据具体情况进行性能优化,以达到更好的性能表现。
参考
(1)Intel Houdini :https://github.com/woachk/houdini
(2)微软/高通 Win系统x86→Arm方案:https://learn.microsoft.com/en-us/windows/arm/overview
(3)鲲鹏开发者套件Exagear: https://www.hikunpeng.com/developer/devkit/exagear
本页内容