当前,千行百业数字化转型步伐加快,对算力提出了更高的要求,与此同时,行业应用的多样性也带来了数据和算力的多样性。
在此背景下,华为通过构建鲲鹏计算产业,拥抱多样性计算新时代。围绕“硬件开放、软件开源、使能伙伴、发展人才”的策略,鲲鹏生态已交出了一份高分答卷。不过当前,鲲鹏生态发展仍面临诸多挑战。其中,应用软件的迁移尤为关键。为了帮助开发人员更快熟悉鲲鹏平台,更好地完成基于传统架构的应用服务迁移工作,鲲鹏发布了开发使能套件 DevKit,提供覆盖代码扫描、迁移、编译、调优等研发全流程。
在 2021 年 5 月 29 日 QCon 2021 北京站上,华为鲲鹏编译技术专家乐永年作为“鲲鹏平台软件迁移和调优实践”专题出品人兼讲师,携手薛永辉、魏伟、吕研冬博士三位华为技术专家为开发者深度解读鲲鹏一站式开发套件 DevKit 的工具套件和关键技术。
1鲲鹏 DevKit 中汇编翻译特性的应用和实现
编译器无法编译源码中其他平台的汇编代码,因此如何高效识别 x86 中的汇编代码并快速迁移到鲲鹏平台上,是鲲鹏生态快速建设和拓展亟需解决的一个技术课题。
华为鲲鹏编译技术专家乐永年表示,在具体解决思路上,首先需要提供高效汇编翻译的能力;其次,针对用户汇编代码的使用情况,有重点的解决汇编翻译;最后,帮助用户维持项目中的源码,从而提供源码级的高可维护性。
基于此,鲲鹏汇编总体设计方案为“W+ 二”。其中,“W”由四个步骤完成,分别是汇编注解、局部异构平台反编译、编译优化和代码生成。汇编注解解决了汇编样式多样的问题,局部异构平台反编译解决平台差异问题,代码质量由编译器的编译优化和代码生成完成。“二”是两条快速翻译路径,一条是基于规则的快速指令翻译,用于简单嵌入汇编翻译,另一条是编译器里基于向量化语义函数的 SIMD 指令翻译。
通过这个方案,鲲鹏 DevKit 中的代码迁移工具能快速实现 x86 汇编代码到鲲鹏平台的自动迁移,保障应用迁移高效率完成。总的来说,“W+ 二”方案做到了“能用则用、需改尽改、当快则快、曲折前行”,沿着问题本身的逻辑,利用对现有的技术的改造和增删,完成最终的翻译。
在介绍具体的解决方案外,乐永年还分享了汇编代码翻译中的几个细节问题。比如在汇编代码的识别上,如果用传统的方式去查找,会漏掉很多汇编代码,因此需要使用编译器的语法能力,如 LLVM 的 Clang-Tidy 工具框架,通过在源代码里生成的抽象语法树,找到汇编代码并进行自动翻译,用语法解析的方式避免代码漏扫,从而精准地识别需要迁移的汇编代码。
在嵌入汇编的翻译问题上,对于简单的嵌入汇编,可以通过扩展检查规则,把嵌入汇编的语法植入,查找嵌入汇编对应的语法元素,然后进行翻译。至于复杂的汇编,虽然情况各有不同,但也可以一键翻译成为鲲鹏的汇编代码。
最后乐永年表示,在未来,鲲鹏 DevKit 还会根据用户的需要,不断地优化汇编翻译能力,具体包括指令语义的众筹、更多场景的支持以及新硬件指令支持。
2鲲鹏加速库在业务性能调优中的应用
在开发过程中,加速库(即高性能软件库)的意义不言而喻。具体来说,加速库的意义体现在以下两个方面:
第一,通过加速库开发,可以实现计算效率的极大提升。加速库通过改进软件实现流程或算法,从而充分利用芯片计算能力,提升代码执行效率,使用户获得更好的性价比。
第二,加速库是系统工程重要的组成部分。IT 系统是多组件、不可分割的,任何一个组成部分的改进对于整体性都会带来改进,而加速库在其实的提升作用更加重要。
总的来说,加速库是应用软件性能调优的最佳实践方法之一,也是解决方案的基石。
华为鲲鹏数学库架构师薛永辉表示,要想做好加速库,首先需要熟悉硬件平台的能力,再配合扎实的软件技术栈,通过有效利用编译器技术和工具链能力进行构建。在开发加速库的过程中,要先识别出来瓶颈在哪里,其次进行算法优化设计,再基于优化方案完成编码,最后再通过相应的工具评估加速库是否能够达到性能要求。加速库开发是一个循环往复的有趣过程。
基于鲲鹏微架构的加速技术,华为构建了鲲鹏加速库。薛永辉介绍说,鲲鹏基于行业常用的软件库,通过软硬协同、算法创新,打破性能瓶颈,充分释放鲲鹏处理器的澎湃算力。目前已经覆盖了压缩库、加解密库、系统库、媒体库、数学库和存储库等常用的基础软件库,为鲲鹏应用提供极致的性能保障。
硬件加速库方面,鲲鹏加速引擎基于华为自研 UACCE 加速器内核框架,通过 UIO,池化,分块等技术,提供最佳能力,且 100% 继承 OpenSSL 和 Zlib 接口,应用层代码逻辑无需调整,使用简单。在优化效果上,Web 应用使用 KAE 硬加速 Nginx,相比主流加速卡性能提升 35%;大数据使用硬加速库启用数据安全加解密,CPU 性能损耗小于 5%;分布式存储使用硬加速库,混合读写(7:3)带宽性能最高提升 40%。在未来芯片发展的过程中,鲲鹏硬件加速库也会根据市场需求进一步研发更多更好的功能。
软件加速库方面,薛永辉重点介绍了如何通过软件编码提升软件性能的几个技巧,如通过解决 IO(访存)瓶颈、改善流水线、算法优化提升性能等,此外,还有一些其他的常见优化技巧,如指令重排、循环展开、标量替换、循环分块、强度削弱、重复利用。
目前,DevKit 加速库插件支持加速函数一键识别、智能联想,支撑应用快速集成鲲鹏高性能软件库,为应用迁移后的性能保驾护航。
3鲲鹏编译优化技术探索与软件优化实践
毕昇编译器是一种 Linux 下针对鲲鹏处理器的高性能编译器,于 2020 年正式发布上线。它基于开源 LLVM 10.0.1 版本开发,并进行了优化和改进,同时将 flang 作为默认的 Fortran 语言前端编译器。除支持 LLVM 通用功能和优化外,毕昇编译器还做了以下增强:
- 高性能编译算法。编译深度优化,增强多核并行化,自动矢量化等,大幅提升指令和数据吞吐量。
- 加速指令集。结合 NEON/SVE 等内嵌指令技术,深度优化指令编译和运行时库,发挥鲲鹏架构最佳表现。
- AI 迭代调优。内置 AI 自学习模型,自动优化编译配置,迭代提升程序性能,完成最优编译。
华为毕昇编译器架构师魏伟表示,毕昇编译器结合鲲鹏架构特点,针对不同场景,不同应用特点,使用不同的编译优化手段,通过深度优化指令编译,引入或增强优化算法等,发挥鲲鹏极致算力。
会上,魏伟还分享了毕昇编译器的几个优化技术,如:
- 循环优化。循环优化是编译器中极为重要的一个优化手段,具有极为广泛及多样化的优化措施。编译器通过不同的优化方法来提高循环的性能。
- 结构体内存布局优化。基于全程序优化来提高缓存利用率,优化的主要手段是将结构体数组转换为数组结构体。
- 结构体指针压缩优化。通过将指针成员由 64bits 压缩至 32bits,减小每个结构体 node 的内存体积。这一概念同结构体内存布局优化有些类似,目的都是改善访存局部性,提升缓存利用率。
- 自动向量化。毕昇编译器重点优化了循环矢量化及 SLP 矢量化,充分保持程序局部性,高效提升计算密集型场景的性能。
- Pipeline 优化。编译器在做后端基于硬件流水线的优化,在特定场景下可以带来很多收益。
- Autotuner。其引入了基于 ML 的自动搜索技术,可以节省调优时间。
效果方面,毕昇编译器与鲲鹏芯片协同,通过编译器技术充分发挥芯片的性能,提升鲲鹏硬件平台上业务的性能体验。基于鲲鹏上编译器优化,SPEC2017 性能比 gcc 平均高 20% 以上。
据魏伟介绍,毕昇编译器 1.3.3 版本将于今年 6 月 30 日正式发布,新版本支持基于 Structure Peeling 的特性增强及指针压缩优化,完善 Fortran2003/2008 语言特性,同时新增大量优化特性,增强与完善 Autotuner 特性,改善调优时间。
4ExaGear:动态二进制翻译技术原理及应用实践
ExaGear 是华为自主可控的动态二进制翻译软件,通过利用动态二进制翻译技术,结合动态二进制优化能力,能够稳定支持无源码的 x86 和 ARM32 存量业务运行在鲲鹏平台上。具体实现上,ExaGear 将 guest 应用的 x86 或 ARM32 指令翻译成 ARM64 指令,并模拟 guest 应用调用的操作系统 API。
简单来说,ExaGear 是一种“中间件”软件解决方案,位于 guest 应用程序和 ARM Linux OS 之间。它主要具有以下几方面优势:
- 代码 0 修改。直接加载被翻译执行的二进制应用程序文件,用户无需重新编译或修改二进制应用程序,无需对业务应用进行额外的二次开发,最小化业务迁移成本。
- 业务无损。经过翻译执行的业务逻辑与原生业务行为一致,保证翻译过程自身透明性,翻译工具无需解释业务逻辑,不直接处理用户数据。
- 性能领先。集成高性能编译技术,实现一种指令集到另一种指令集的跨指令体系结构实时转换,识别热点指令并在线深度优化热点指令翻译过程,达到指令翻译性能业界领先。
华为二进制翻译技术专家吕研冬博士表示,开发者使用 ExaGear,通过无源码应用迁移,大幅降低了存量业务部署门槛,让用户以最低的人力和时间成本平滑迁移业务,实现了应用业务快速迁移到鲲鹏。
四位华为技术专家为开发者们详细解读了鲲鹏一站式开发套件 DevKit 的的各大使能工具,与会者不仅了解了鲲鹏平台软件迁移过程中的关键技术,也收获了应用调优上的相应技巧。
围绕着硬件使能、基础使能、应用使能和开发使能层持续投入,华为通过全栈开放开源,构建鲲鹏计算生态。未来,华为将会把更多优秀的技术推向市场,为企业和开发者提供完备、易用和高效的工具链,加速鲲鹏生态繁荣和产业成功。
点个在看少个 bug 👇