【云驻共创】基于鲲鹏DevKit便捷开发高性能应用,助力开发效率提升15%
1、DevKit介绍
在各行业基于鲲鹏计算产业生态加速数字化转型的道路上,由传统架构向鲲鹏平台的软件迁移、以及基于鲲鹏平台的原生开发都是非常关键的环节。为了帮助开发人员更快熟悉鲲鹏平台,更加便捷、高效地完成不同计算平台之间的应用迁移,鲲鹏在2019年面向合作伙伴和广大开发者发布了一站式开发套件DevKit1.0,覆盖有源码与无源码两大场景下的无忧迁移:针对源码应用,提供代码迁移、编译调试、性能分析、系统诊断等工具套件,确保应用的快速迁移以及迁移之后的性能最佳;针对部分找不到源码的存量应用,通过动态二进制指令翻译软件ExaGear,“零代码”、“低损耗”的实现应用迁移。
2、DevKit2.0 加速应用迁移、使能极简开发
随着应用迁移的不断深入,越来越多的合作伙伴基于鲲鹏进行原生开发。如何高效的开发出鲲鹏平台亲和、发挥鲲鹏架构最大优势的新软件,成为了DevKit升级的核心,DevKit2.0也应运而生,面向全研发作业流程全新推出了鲲鹏亲和开发框架、性能优化后的毕昇编译器、毕昇C++语言、增强的云上自动化测试服务、全场景性能调优等能力,让开发者更便捷高效的基于鲲鹏进行原生开发。
2.1、Devkit,从“应用迁移”走向“原生开发”
随着DevKit新的特性和功能的发布,DevKit2.0的架构也完成了进一步升级。DevKit2.0目前已经全面覆盖了开发、编译调试、测试、调优&诊断环节,能够支撑开发者端到端的极简开发需求。
在开发阶段,鲲鹏亲和开发框架通过提供工程管理向导、启发式编程、代码亲和检查等多项原生开发能力,能将鲲鹏原生开发效率提升一倍。其中,工程管理向导涵盖了鲲鹏原生依赖包,让用户无需费力查找和评估,并推荐鲲鹏原生编译选项,让用户无需学习即可直接使用,同时集成鲲鹏亲和软件开发库,无需手工安装和配置;而启发式编程则会推荐鲲鹏原生加速函数,一键引入鲲鹏加速库,并智能联想、提示、补全鲲鹏亲和加速选项和参数。整体而言,鲲鹏亲和开发框架可以延续用户开发习惯,使其快速上手,并迅速识别缺陷代码,从而更好发挥鲲鹏架构优势。
鲲鹏开发框架助力开发者快速的学习和成长。在开发代码前,通过丰富的文档,课程,书籍和论坛,快速的掌握鲲鹏的知识。在开发者开发代码时,DevKit提供了工程开发向导,提供了鲲鹏亲和的编译选项,鲲鹏加速库的自动部署安装。同时在开发过程中,鲲鹏通过启发式编程,智能提示。开发之后,鲲鹏提供了五类的静态检查工具进行鲲鹏亲和的分析。
鲲鹏迁移功能是它的传统强项,在近年,华为团队更是进一步加强了这个功能。软件评估让开发者在迁移前就可以清楚工作量,以此合理的安排计划。源代码迁移支持了绝大多数的操作系统和编程语言。软件包重构可以一键重建jar包和RPM包。而专项迁移则可以对于常见的开源软件一键编译构建,大大减少了工作量。
同时,鲲鹏也提供了高性能的编译器,例如毕昇编译器,它适合于高性能计算,金融等对于计算能力有较高要求的场景;毕昇Jdk,则适合大数据应用,云计算,鲲鹏服务器的Java应用;GCC for openOuler适合计算能力要求不高的场景。
2.2、 性能调优功能
调优助手通过系统化组织和分析性能指标、热点函数、系统配置等信息,形成系统资源消耗链条,引导用户根据优化路径分析性能瓶颈,并针对每条优化路径给出优化建议和操作指导,以此实现快速调优。通过精准分析、全面调优,软硬件整合释放最佳性能。
2.3、系统诊断功能
系统诊断能够快速定位内存、网络、存储等部件的异常,提供内存泄漏诊断、内存消耗信息分析展示、OOM诊断能力、网络IO诊断能力、存储IO诊断能力,帮助用户识别出源代码中内存使用的问题点。
3、鲲鹏应用极简开发方案详解
3.1、鲲鹏开发套件Devkit极简开发
鲲鹏开发套件DevKit是一站式开发套件,能够帮助鲲鹏开发者进行极简开发。目前DevKit在开发,编译调试,测试以及调优诊断等环节支撑用户的开发活动,提高开发效率。在开发环节,DevKit可以对用户的历史源码进行跨平台迁移检查,帮助用户完成源码修改等操作。同时,用户在开发软件应用时,开发套件DevKit可以对用户代码进行亲和性检查,根据鲲鹏架构的特点,对用户源码提供针对性修改建议,帮助开发者开发出在鲲鹏架构运行更优的应用。
现在DevKit的软件迁移优化效率达到了2人天的应用,并且初步提供了对鲲鹏原生开发的支持。在编译调试环节,DevKit提供了毕昇编译器和GCC for openOuler,通过编译器提供架构差异,充分发挥鲲鹏架构优势,使用户应用获得更好的性能。DevKit连通来了远程实验室,用户可以免费申请鲲鹏远程开发环境,在远程环境中完成软件的开发和运作。在调优环节,DevKit向用户提供了分析系统,应用性能方法,用户可以根据场景选择性能分析模板,也可以选择不同的系统模块进行分析。除此之外,还提供了系统性能诊断方法,帮助用户诊断系统或应用中的疑难杂症。
鲲鹏开发套件DevKit可以通过web浏览器来使用,也提供以插件的方式对主流IDE的支持,例如VScode。DevKit简单易用,对用户的使用习惯没有影响。
3.2、代码迁移工具功能
鲲鹏代码迁移工具是一款可以简化客户应用迁移到基于鲲鹏916/920的服务器的过程的工具。工具仅支持x86 Linux到Kunpeng Linux的扫描与分析,不支持Windows软件代码的扫描、分析与迁移。
当客户有x86平台上源代码的软件要迁移到基于鲲鹏916/920的服务器上时,既可以使用该工具分析可迁移性和迁移投入,也可以使用该工具自动分析出需修改的代码内容,并指导用户如何修改。
鲲鹏代码迁移工具既解决了客户软件迁移评估分析过程中人工分析投入大、准确率低、整体效率低下的痛点,通过该工具能够自动分析并输出指导报告;也解决了用户代码兼容性人工排查困难、迁移经验欠缺、反复依赖编译调错定位等痛点。
3.3、Devkit2.0体验升级,从”应用迁移“到”原生开发“
鲲鹏开发套件DevKit的新版本在软件迁移方面,进行了进一步的功能增强,可以帮助用户检查Java,python应用中使用的so库的兼容性,并提供修改建议。同时,DevKit进一步增强了fortran程序的兼容性检查,提供了更丰富的跨架构迁移修改建议。
在新版本中,进一步丰富了专项软件迁移功能,支持了十亿款主流SPC应用的快速迁移。在鲲鹏亲和分析方面,DevKit支持程序运行模式检查,结构体字节对齐检查等功能,帮助用户更好地适配应用鲲鹏架构,产生更优的鲲鹏亲和代码。例如,在内存一致性问题中,通过静态检查源码,我们可以发现百分之八十的内存一致性问题,并提供修改建议。
3.4、鲲鹏开发框架提升鲲鹏应用开发效率
鲲鹏开发套件DevKit已经从帮助开发者快速迁移应用到鲲鹏架构,逐步向帮助开发者开发鲲鹏原生应用迈进。在鲲鹏亲和开发框架,原生编译器和编程语言,云上自动化测试平台和全场景性能调优等四个维度帮助开发者提高开发效率,开发出鲲鹏亲和应用。
开发者在开发鲲鹏亲和应用的过程中,可以使用鲲鹏亲和开发框架的启发式编程功能,以提高应用开发效率和质量。启发式编程提供了编程编码补全功能,可以帮助用户在编写构建文件时,智能联想鲲鹏亲和的宏定义和编译选项。在用户编译c和c++源码时,智能联想鲲鹏亲和的五大类加速库等API函数。开发者在编辑完构建文件时,还可以快速检查依赖文件的结构性,并提供获取方式。
目前,鲲鹏提供了超过20款Linux版本的鲲鹏兼容性检查和获取途径。鲲鹏亲和开发框架还提供了亲和检查功能,帮助开发者在开发阶段使用更高效的鲲鹏加速库,检查应用软件的鲲鹏亲和性。它现在支持五类加速库函数的检查和优化,支持对原文件或者构建文件进行检查。
4、 基于毕昇编译器实现鲲鹏架构下编译性能提升25%
4.1、毕昇编译器简介
毕昇编译器是华为编译器实验室针对鲲鹏等通用处理器架构场景,打造的一款高性能、高可信及易扩展的编译器工具链,增强和引入了多种编译优化技术,支持C/C++/Fortran等编程语言。
4.2、毕昇编译器优化技术
毕昇编译器取得了最大的优化进展,同时也有许多重点优化技术。在毕昇编译器1.3版本发布了一个新的跑分,相比GCC的开源编译器,有了将近20%的性能提升。在2021年年底,毕昇编译器发布了2.1.0版本,在原有基础上又进一步提升了性能,当前,相比业界开源的编译器,可以达到25%以上的性能提升。在2021年的版本上,华为重点引入了一些非常关键的优化,包括向量化的优化,内存和循环的优化,同时也在数据预取和精度调优等方面也有了极大的优化。
自动向量优化
在毕昇编译器自动向量优化——SLP矢量化增强等方面。鲲鹏处理器上面除了基本的浮点和定点功能外,还引入了向量硬件单元,毕昇编译器在其上面做了很多的优化增长,尤其是基于鲲鹏的向量指令集做了很多向量自动化的优化。自动向量化主要分为两类,第一类是循环向量化,第二类是基于基本块和基于非循环的SLP矢量化。毕昇编译器在SLP向量化上面做了很多的优化增长,主要是从算法维度扩展了SLP优化上本身节点内和跨节点的依赖分析。使得矢量指令集能够有一个更好的编译生成效果,给CV类应用和AI类应用带来很大的提升。
内存及循环优化
在内存及循环优化方面,鲲鹏主要给大家带来了基于数组数据流的优化分析。在2021年,毕昇编译器引入了很多的循环优化,例如Unroll and jam 优化,这个优化主要把外层循环展开,然后和内层循环做一个合并,使得其内层循环的并行化做进一步的加强。
数据软件预取
在数据软件预取方面,即插入一些预取指令,在内存中读取一些需要预取的数据。尤其针对一些内存访存密集的应用,这些应用会在访存中存在一些阻塞。所以软件预取是在硬件预取的基础上,针对程序中的代码,取得一些提前量的优化。开发者在计算提前量的时候,需要考虑循环的大小,硬件访存的硬件带来的迟延等现实因素。而毕昇编译器针对当前情况下的软件预取的配置参数做了很多的优化,尤其是引入了多种预取算法的实现,以及对多种不同的场景进行了一番覆盖。毕昇编译器引入了循环感知的一些预取算法,在由于硬件预取无法对所有的预取场景进行覆盖的情况下,对硬件预取进行了增强。
Jump Threading优化
从下面的图可以看出Jump Threading优化的原理主要是通过分析基本块间的控制流关系,合并一些基本块的跳转。同时毕昇编译器在有限状态机的场景下,针对Jump Threading进行了一个额外的增强,可以将原来复杂的switch语句块变成一个直观清晰的跳转分布语句块。
5、DevKit性能调优和诊断
鲲鹏性能分析是一个工具集,包含如下工具:
系统性能分析:针对基于鲲鹏处理器的服务器进行性能分析和优化,根据服务器的软硬件信息和性能数据,定位到系统瓶颈点及热点函数。
Java性能分析:针对TaiShan服务器上的Java程序进行性能分析和优化,定位程序瓶颈点。
系统诊断:通过分析系统运行指标,识别异常点。
调优助手:通过系统化组织和分析性能指标、热点函数、系统配置等信息,引导用户优化性能瓶颈,实现快速调优。
5.1、调优助手
鲲鹏性能分析工具是一个工具集,包含工具:调优助手、系统性能分析、Java性能分析和系统诊断。
调优助手工具通过系统化组织和分析性能指标、热点函数、系统配置等信息,形成系统资源消耗链条,引导用户根据优化路径分析性能瓶颈,并针对每条优化路径给出优化建议和操作指导,以此实现快速调优。
5.1.1、调优助手-系统配置
当我们运行调优助手里面的系统配置功能的时候,即从上图可以看出,运行该功能后,小助手会告诉你当前是一个IO密集型的应用,所以可以将哪些IO参数缩小,以达到提升系统性能的功效
5.1.2、调优助手-系统性能
在系统性能调优中,助手会检测当前系统的一些配置,然后给出建议,让开发者可以关闭一些影响系统性能的无关项。
5.1.3、调优助手-HPC分析
HPC分析的另外一个指标时MPI运行时指标,MPI就是多节点通讯的开销的指标。助手会将通讯的有关数据汇总给开发者,让开发者进行优化。
5.2、系统诊断
系统诊断分为内存诊断、网络IO诊断、存储IO诊断。
5.2.1、内存诊断
分析应用程序存在的内存泄漏点(包括内存未释放和异常释放),得出具体的泄漏信息,并支持关联出调用栈信息和源码。实时跟踪应用程序运行期间系统层、应用层、分配器层的内存消耗情况。分析发生OOM时的进程内存状态、系统内存状态和调用栈信息。
5.2.2、网络IO诊断
提供压测网络和诊断网络的能力。通过压测网络,获得网络最大能力,为网络IO性能优化提供基础参考数据;通过诊断网络,定位网络疑难问题,解决因网络配置和异常而导致的网络IO性能问题。
5.2.3、 存储IO诊断
压测存储IO,获得存储设备最大能力,包括:吞吐量、IOPS、时延等,并以此评估存储能力,为存储IO性能优化提供基础参考数据。
6、小结
目前鲲鹏DevKit已成功运用于运营商、数字政府、金融、互联网、HPC等众多行业,支撑近千家伙伴进行迁移适配和性能优化。未来,鲲鹏DevKit始终聚焦开发者的需求,持续优化开发者体验,帮助开发者更加便捷的基于鲲鹏平台进行极简开发,共同推动鲲鹏生态繁荣发展。
本文参与华为云社区【内容共创】活动第18期。
https://bbs.huaweicloud.cn/blogs/364560
任务2:基于鲲鹏DevKit便捷开发高性能应用,助力开发效率提升15%
- 点赞
- 收藏
- 关注作者
评论(0)