用户将软件从 x86 平台移植到华为鲲鹏平台时,由于平台间体系结构和指令集各不相同,这时就需要利用跨平台工具链对源代码进行重新构建,这中间就会碰到一些棘手的问题,比如编译器无法直接跨平台编译源代码工程中平台相关的汇编代码,又或者当用户把应用迁移到鲲鹏平台上之后,鲲鹏多核的优势却无法充分发挥。因此,如何把 x86 源代码中的汇编代码高效识别并迁移到鲲鹏平台上,同时保证迁移后的性能,是鲲鹏生态建设和拓展过程中急需解决的一个技术课题。
InfoQ 记者有幸在QCon 2021 全球软件开发大会上,就这个问题采访到了华为鲲鹏编译技术专家乐永年,他的主要研究方向是鲲鹏平台的编译技术和应用性能优化。
以下是视频采访的全部内容,为方便读者查看,视频下方也附上了文字内容。
- 3.0x
- 2.5x
- 2.0x
- 1.5x
- 1.25x
- 1.0x
- 0.75x
- 0.5x
InfoQ:乐老师您好,欢迎来到 QCon 并接受我们的采访,请您先自我介绍一下吧。
乐老师:好的,我的名字叫乐永年,加入华为之前我从事了 20 多年的软件开发工作,包括编译器、加速库以及软件的性能调优我都干过,目前我在华为鲲鹏担任编译器专家,从事鲲鹏开发套件相关的设计和架构工作。
InfoQ:您选择加入华为鲲鹏主要有哪些方面的考虑?
乐老师:刚才也提到了,我之前从事了相当多的软件开发工作。最近鲲鹏正在下一盘大棋,它实际上从硬件开放、从基础软件的开源、到面向生态开发者的DevKit开发套件以及鲲鹏应用使能套件BoostKit,全系列全栈投入,打造一个新的计算底座以及新的计算生态,让我觉得这里面有很多机会。我之前一直有一个梦想,我希望我做的产品能够为广大用户所使用,同时做的工作能够改变大众的生活,这样看的话鲲鹏对我来说是个理想的工作,能帮助我实现梦想,我也希望在鲲鹏这一块继续努力添砖加瓦。
InfoQ:那您现在在鲲鹏做的事情主要有哪些技术挑战?
乐老师:从大的角度来说,计算主要是通过算力来衡量,算力是数据处理的能力,它广泛存在于各个硬件设备里面,包括我们的手机,包括我们的 PC,包括我们的硬件服务器。从我们各领域角度来看,我们的数据中心,以及我们的高铁,行行业业方方面面都需要算力的支撑。但是随着最近大数据以及 AI 的蓬勃发展,原有的算力已经跟不上现有发展的需要,人民日益增长的物质文化需求满足不了了,所以我们需要从各个方面考虑,比如说我们的硬件,包括我们的硬件开放、软件开源,拧在一起,和我们的生态伙伴一起形成合力,打造新的生态,打造新的算力。这里有很多挑战,比如传统的摩尔定律,已经不能满足发展需要,原来的单一架构也不能满足算力的增长需要,这里我们要和生态同仁一起把这个新的生态、新的算力打造好。
InfoQ:您在会议上演讲主题是关于跨平台迁移的,那么从其他平台到华为鲲鹏的跨平台迁移过程中,有哪些技术难点?你们是怎么解决的?
乐老师:我们打造了 DevKit 这个面向开发者的开发套件,它提供了一站式全流程的工作方式,包含了迁移,包含了调优,也包含了编译以及诊断等一系列能力。在这里它主要解决两方面的问题。第一个是把应用从 X86 平台迁移到鲲鹏平台,同时保持迁移以后的性能,因此迁移在这里占了一个主要的地位。在这个迁移过程中有两套方案,针对不同的场景。一个就是有源码迁移,一个就是无源码迁移。
对于有源码迁移,这里碰到的挑战不少。首先,应用的语言多种多样。其次,编译的选项很复杂,很多编译的选项跟平台密切绑定,密切相关。第三个点就是在构建脚本里,很多构建脚本是动态执行的,这些都需要在开发套件里,通过代码迁移工具插件得到一个很好的解决。比如说这里的代码迁移工具插件能够提供八种语言的支持,同时这里需要提供一个静态的扫描,把用户和平台相关的一些编译选项提示出来,让用户修改。我们也在攻关的动态执行技术,能够让构建脚本在静态的方式下得到解释执行,把平台相关的问题都找到,这些是有源码迁移的难点。
对于无源码迁移也有不少挑战,比如说我们怎么保证迁移后的应用性能衰减尽量少,这里动态二进制的优化技术可以帮助我们把这个问题克服。
InfoQ:华为鲲鹏原生编译器毕昇是你们的产品,在设计这个编译器的过程中,有哪些有意思的技术难点?
乐老师:毕昇编译器是我们华为鲲鹏原生的编译器,它通过挖掘鲲鹏架构特点,提供最佳的代码质量,发挥鲲鹏原生性能优势,这里竞争力构筑的方向就是高性能。
对于服务器而言大概有这几个模块,第一块是 CPU,第二块是内存,第三块是存储 I/O,第四块网络 I/O,这四块是密切相关的,对性能最有影响。编译器主要影响第一和第二这两个部件,一个是 CPU,一个是内存,围绕这两个部件,我们绞尽脑汁想各种各样优化的手段,我们这里的毕昇编译器的架构师魏伟为此头发也慢慢变白了。
我这里具体展开讲一讲,对于 CPU 而言这里是比较传统的一种优化,对于鲲鹏特有的流水线架构,这里进行了指令调度优化。对于鲲鹏特有的 NEON 指令集,我们也开发了不少并行化和矢量化的优化技术,把 NEON 指令的能力给充分利用起来,这是传统优化。
对于内存而言,它实际上越来越成为性能的瓶颈,因为 CPU 的速度越来越快,但是内存的访存速度还是赶不上 CPU 发展的速度,我们在这里也开发了很多的优化手段,比如说我们对数组进行重排,同时对结构体进行布局的优化,通过一系列内存排布的优化大幅提升应用性能,除此之外我们还对鲲鹏本身的架构有针对性地对内存缓存的预取做了调整和增强,通过这些手段从 CPU 和内存的角度发挥硬件本身的能力,大幅提升了软件的性能。
InfoQ:刚才我们一直在谈性能的问题,我想深入了解一下,你们是怎么保证程序移植后的性能问题呢?在性能保障这方面有哪些措施?
乐老师:鲲鹏 DevKit 主要的工作,或者业务基本面,就是保证应用迁移,其次是保证应用迁移以后的性能得到维持,现在你这个问题就是关于性能维持方面。
性能维持肯定不能只是靠一两个手段,我们从全流程开发套件使用过程中,在每个阶段都要考虑性能,在代码迁移阶段,我们有加速库插件,它能够针对代码里面常用的热点函数,进行自动识别和智能联想,做到鲲鹏亲和加速库的函数的一键替换,这是第一个。
其次是在编译阶段,我们这里还有鲲鹏原生的毕昇编译器,能够挖掘架构本身特点,把我们应用的性能潜力充分发挥出来,这是第二个。
第三个是我们还有一个独特的专门针对性能的调优工具,叫做性能分析工具。这个性能分析工具能够提供场景化和全系统的分析能力。帮助用户查找应用中性能的瓶颈,提供专业化的性能调优的建议,这是第三点。
第四点是我们还打造了一个新的工具,这个工具就是异常诊断工具,这个异常诊断工具能够帮助用户诊断常见的性能异常,同时快速定位性能问题。
通过这四种工具在源码级别的优化,保证迁移以后的性能能够维持。
对于二进制代码没有源码的情况,我们这里还提供了动态二进制的翻译工具,这个翻译工具里面包含了大量的动态优化,能够把迁移过程中的的性能损耗降到最小,保证应用迁移后性能得到维持。
InfoQ:除了快速迁移汇编代码的技术,DevKit 在设计过程中还解决了哪些关键难题?
乐老师:我们还有无源码迁移的动态二进制翻译技术。实际上这两个问题是有点类似的,对于有源码的应用而言,有源码的代码里它有汇编,需要通过指令的翻译把原有的汇编代码变成在鲲鹏上的汇编代码,是种语言到语言的翻译。这是汇编代码范畴,和它对应的是指令。一个二进制应用程序,它没有源代码了,这时候我怎么在鲲鹏平台上很好地执行这个应用,这里用了一个类似的技术,叫动态二进制翻译技术,这个动态二进制翻译技术就是把一条条指令拆解出来,去动态地解释和执行,当然这个解释执行过程中性能肯定会有损耗,而且损耗还不少,所以在这个过程中会有大量的动态二进制优化技术在里面起作用,把性能损耗降到最少,保证迁移以后用户还可以使用这个应用。到目前为止,我们能够把性能损耗控制在 15%到 20%以内。
InfoQ:DevKit 在哪些领域和行业有成功的应用呢?
乐老师:DevKit 实际上跟鲲鹏平台密切相关,我们的鲲鹏平台在政府、金融、交通、电力各个领域都有非常不错的进展。在这里 DevKit 作为面向开发者使能的重要抓手,对于整个鲲鹏平台的拓展起了一个非常大的促进作用。到目前为止,我们鲲鹏的 DevKit,已经有五万开发用户,有三百多个合作伙伴,和我们一起打造鲲鹏的算力新生态。同时,这里打个广告,我们还有鲲鹏应用创新大赛,所有的参赛团队都会使用鲲鹏开发套件,打造他们的参赛作品,进行应用迁移、开发、调优和调试。
InfoQ:好的,谢谢乐老师。
评论