【云驻共创】鲲鹏devkit新版本推介会-4008云顶国际网站
数字经济时代,多元化的业务场景驱动计算架构向多样性发展,海量数据增长带来更高的计算要求,以鲲鹏为代表的先进算力在高并发处理和高性能协同计算等方面具备显著优势,已逐渐成为越来越多的行业和it基础设施的主流选择。为了加速行业应用创新,2019年鲲鹏面向伙伴和开发者提供了一站式开发套件devkit,从而实现海量应用到鲲鹏平台的快速迁移。2021年,devkit全新升级为devkit2.0,从加速应用迁移走向使能原生开发。devkit2.0已经于2021年12月31日正式上线。那么升级后的devkit2.0将提供哪些能力,如何帮助开发者更加便捷地在鲲鹏平台上开发高性能应用呢?devkit2.0研发团队的四位技术大咖将为我们解开这些疑惑。
一.devkit2.0:加速应用迁移,使能极简开发
华为devkit2.0项目经理马老师认为,从pc互联网时代到移动互联网时代,再到万物互联的智能时代,数据量呈爆炸式的指数级增长。文本,图片,语音及视频这些非结构化数据占比越来越高。而这些海量的数据,自然需要多样算力来匹配。例如cpu处理大数据,web场景是非常匹配的;但是对于图形,图像的处理则需要gpu来匹配;而日常中,图形图像的识别,智能搜索则需要基于ai的npu来处理。由此可以看出,业务场景的多样性,数据的多样化,促使我们的计算进入了多样性计算时代。
面对时代多样性计算的诉求,华为打造了基于鲲鹏的计算基座,重建了“鲲鹏 ”的新生态。目前,大量的伙伴和华为一起繁荣了华为的鲲鹏新生态,使得世界有了第二种算力选择。这种新生态要求开发者了解鲲鹏和传统x86平台的差别。那么这种区别具体体现在什么地方呢?其实最根本的区别则是鲲鹏和x86平台在指令集上是有差异的。x86平台是复杂指令集的,而鲲鹏是简洁指令集的。同样的代码,在不同的芯片加工下,会转变为不同的机器码。
为了很好的应对这种差异性,开发者亟需一套全流程的鲲鹏开发工具以及匹配资料,以解决学习,开发,测试及调优等遇到的各种问题。而此时,我们的鲲鹏devkit应运而生。
工欲善其事,必先利其器,开发工具对于提高开发者生产力至关重要。为此,华为非常重视开发套件,投入了大量的研发资源,3年磨一剑,不断提高能力。2020年,对于devkit1.0,华为团队开放性地研发了不同指令集的迁移和性能工具,用工具来解决代码迁移,提高迁移效率。2021年,华为团队新开发了devkit2.0,面向开发者全面升级,支持面向研发作业流的全流程的开发工具链,提供了鲲鹏亲和开发框架,原生编程语言和编译器,云上自动测试平台以及全场景性能优化。
鲲鹏开发框架助力开发者快速的学习和成长。在开发代码前,通过丰富的文档,课程,书籍和论坛,快速的掌握鲲鹏的知识。在开发者开发代码时,devkit提供了工程开发向导,提供了鲲鹏亲和的编译选项,鲲鹏加速库的自动部署安装。同时在开发过程中,鲲鹏通过启发式编程,智能提示。开发之后,鲲鹏提供了五类的静态检查工具进行鲲鹏亲和的分析。
鲲鹏迁移功能是它的传统强项,在近年,华为团队更是进一步加强了这个功能。软件评估让开发者在迁移前就可以清楚工作量,以此合理的安排计划。源代码迁移支持了绝大多数的操作系统和编程语言。软件包重构可以一键重建jar包和rpm包。而专项迁移则可以对于常见的开源软件一键编译构建,大大减少了工作量。
同时,鲲鹏也提供了高性能的编译器,例如毕昇编译器,它适合于高性能计算,金融等对于计算能力有较高要求的场景;毕昇jdk,则适合大数据应用,云计算,鲲鹏服务器的java应用;gcc for openouler适合计算能力要求不高的场景。
鲲鹏也提供了专业的云测服务,开放了openlap能力,免费提供远程实验室。实验室预装了所有的开发套件,让开发者可以快速上手。
在性能调优方面,鲲鹏提供了系统性能分析和java性能分析。其中系统性能分析提供了四大场景和八大维度的性能分析,结合了华为在鲲鹏方面的性能优化经验,给出了优化思路和建议,帮助开发者快速定位和修复问题。java性能分析方面,鲲鹏首创了java应用,jvm跨层的热点分析。
在系统诊断方面,提供了内存诊断,网络i/o诊断和存储诊断。
devkit2.0相比devkit1.0,得到了以进一步的加强,提供了更多的sdk,力求打造最佳的鲲鹏亲和原生开发体验。同时提供场景化的demo示例以及辅助开发功能,帮助开发者0成本的学习开发。
二.2人天软件快速迁移,鲲鹏应用极简开发方案详解
通过马老师的讲解,我们对升级后的devkit有了较全面的了解。那么开发者应该如何通过devkit2.0进行软件迁移和应用开发呢?鲲鹏技术专家张汝涛老师给出了他的答案。
鲲鹏开发套件devkit是一站式开发套件,能够帮助鲲鹏开发者进行极简开发。目前devkit在开发,编译调试,测试以及调优诊断等环节支撑用户的开发活动,提高开发效率。在开发环节,devkit可以对用户的历史源码进行跨平台迁移检查,帮助用户完成源码修改等操作。同时,用户在开发软件应用时,开发套件devkit可以对用户代码进行亲和性检查,根据鲲鹏架构的特点,对用户源码提供针对性修改建议,帮助开发者开发出在鲲鹏架构运行更优的应用。
现在devkit的软件迁移优化效率达到了2人天的应用,并且初步提供了对鲲鹏原生开发的支持。在编译调试环节,devkit提供了毕昇编译器和gcc for openouler,通过编译器提供架构差异,充分发挥鲲鹏架构优势,使用户应用获得更好的性能。devkit连通来了远程实验室,用户可以免费申请鲲鹏远程开发环境,在远程环境中完成软件的开发和运作。在调优环节,devkit向用户提供了分析系统,应用性能方法,用户可以根据场景选择性能分析模板,也可以选择不同的系统模块进行分析。除此之外,还提供了系统性能诊断方法,帮助用户诊断系统或应用中的疑难杂症。
鲲鹏开发套件devkit可以通过web浏览器来使用,也提供以插件的方式对主流ide的支持,例如vscode。devkit简单易用,对用户的使用习惯没有影响。
同时,devkit通过动态二进制翻译工具(exagear),实现用户x86应用无源码迁移到鲲鹏架构上,在用户无源码,无感知的情况下完成用户应用的快速迁移。
鲲鹏开发套件devkit的新版本在软件迁移方面,进行了进一步的功能增强,可以帮助用户检查java,python应用中使用的so库的兼容性,并提供修改建议。同时,devkit进一步增强了fortran程序的兼容性检查,提供了更丰富的跨架构迁移修改建议。
在新版本中,进一步丰富了专项软件迁移功能,支持了十亿款主流spc应用的快速迁移。在鲲鹏亲和分析方面,devkit支持程序运行模式检查,结构体字节对齐检查等功能,帮助用户更好地适配应用鲲鹏架构,产生更优的鲲鹏亲和代码。例如,在内存一致性问题中,通过静态检查源码,我们可以发现百分之八十的内存一致性问题,并提供修改建议。
鲲鹏开发套件devkit已经从帮助开发者快速迁移应用到鲲鹏架构,逐步向帮助开发者开发鲲鹏原生应用迈进。在鲲鹏亲和开发框架,原生编译器和编程语言,云上自动化测试平台和全场景性能调优等四个维度帮助开发者提高开发效率,开发出鲲鹏亲和应用。
为了进一步提高开发者的开发效率,鲲鹏开发套件推出了鲲鹏亲和开发框架。那么鲲鹏开发框架是如何提升鲲鹏应用开发效率的呢?华为专家通过广泛的调研,他们了解到开发者开发鲲鹏架构应用的痛点问题有很多。主要是开发者不知道鲲鹏架构应用的特点是什么,也不知道在应用中如何最大程度使用鲲鹏算力。针对这些痛点问题,鲲鹏开发套件推出了鲲鹏亲和开发框架,帮助开发者降低成本,降低学习难度,提高开发效率。
目前鲲鹏开发框架提供了鲲鹏应用开发引擎,代码亲和检查,编程辅助等多种功能,降低开发鲲鹏应用的难度,方便开发者使用鲲鹏架构提供的软硬协同的能力,提升开发效率。通过鲲鹏亲和开发框架,用户可以方便的获取线上实验资源,编程指南,优化指导手册等资料。通过简单快速的学习,赋能开发者鲲鹏架构应用的开发能力。通过鲲鹏亲和性检查,选择鲲鹏亲和的三方库,编译选项,运行环境等,屏蔽底层硬件差异,大大提高软件设计开发效率。
开发者可以在鲲鹏开发社区获取丰富的赋能材料,也可以看到丰富的鲲鹏开发指导文档,代码样例和实际案例,复制成功的经验。同时开发者可以在社区找到丰富的线上培训课程,实验沙箱,实践体会鲲鹏架构的开发过程。开发者也可以系统的去学习鲲鹏处理器的架构知识,建立系统完整的知识体系,占领技术的据高点。
开发者在开发鲲鹏亲和应用的过程中,可以使用鲲鹏亲和开发框架的启发式编程功能,以提高应用开发效率和质量。启发式编程提供了编程编码补全功能,可以帮助用户在编写构建文件时,智能联想鲲鹏亲和的宏定义和编译选项。在用户编译c和c 源码时,智能联想鲲鹏亲和的五大类加速库等api函数。开发者在编辑完构建文件时,还可以快速检查依赖文件的结构性,并提供获取方式。
目前,鲲鹏提供了超过20款linux版本的鲲鹏兼容性检查和获取途径。鲲鹏亲和开发框架还提供了亲和检查功能,帮助开发者在开发阶段使用更高效的鲲鹏加速库,检查应用软件的鲲鹏亲和性。它现在支持五类加速库函数的检查和优化,支持对原文件或者构建文件进行检查。
通过张老师的介绍,我们了解到devkit对开发者提供了很好的支持,努力提升鲲鹏应用的开发效率。从软件工程构建,到软件源码开发,再到软件编译构建,提供了全方位的检查辅助能力,帮助开发者快速上手,高速编程,打造极简开发过程。
3. 基于毕昇编译器实现鲲鹏架构下编译性能提升25%
编译型语言的应用迁移涉及大量的代码和指令修改,通常需要重新编译才能在鲲鹏平台上运行。为了应对这种情况,devkit提供一键式部署的全套编译软件,满足不同场景下的编译需求,并结合鲲鹏架构的优势,提升编译性能,让软件运行效率更高。那么devkit究竟如何提升编译性能的呢?华为毕昇编译器架构师魏伟老师给出了答案。
魏老师主要负责鲲鹏编译器的设计与开发以及面向鲲鹏架构下毕昇编译器的优化工作。魏老师介绍到devkit下面有3个编译器,第一个是毕昇编译器,第二个是毕昇jdk,第三个是面向通用场景的gcc for openeuler。为了让大家更深入的了解devkit,魏老师向我们深入的讲解了编译器的特点。
首先讲解的是毕昇编译器,该编译器是华为实验室针对鲲鹏等通用处理器架构场景,打造的高性能,高可信及其扩展的编译器工具链。它主要聚焦在高性能编译算法,同时针对鲲鹏处理器提供加速指令集的优化,集成了ai迭代调优器。
在2021年,毕昇编译器取得了最大的优化进展,同时也有许多重点优化技术。在毕昇编译器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语句块变成一个直观清晰的跳转分布语句块。
第五个优化技术点是浮点精度调优技术,它在一些hpc和一些超算场景上具有非常大的价值。因为在这些场景下,对很多数据的精度有很高的要求,例如单精度浮点,双精度浮点的应用,这些应用对结果的准确性都有非常严格的限制。典型的例子就是天气预报的应用,我们在天气预报和卫星云图上面就可以看到,它有各种各样的精度需求。而在这样一个精度要求高的应用面前,却有很多的因素会影响最后编译的结果,例如编译优化的等级,编译过程中引入各种各样的优化手段都会影响最后的精度结果,同时不同的架构和不同的指令集等因素也会带来一些精度的差异。为此毕昇编译器针对不同的场景提供了不同的精度优化手段。例如针对编译器,提供了很多不同的优化调优的选项。可以满足用户在不同场景下的不同的调优需求。大家可以根据自己项目的内容,去毕昇应用手册查看相应的调优参数设置内容。
而另一个编译器——毕昇jdk,在g1,gc垃圾回收器上引入了很多优化手段,主要是为了提升吞吐量,降低时延。鲲鹏处理器是基于numa架构的硬件架构。由于不同numa节点间的访存时延是不同的,所以毕昇jdk针对这种场景,就引入了g1,gc的优化,即针对这种跨numa节点的场景,引入了不同的算法,用来提升整个jvm的访存速度。鲲鹏在一些内存读写应用场景的测试下,可以为应用带来25%的性能提升。同时毕昇jdk在g1 full gc方面支持并行化,即通过多线程执行的方式来加速full gc的效率,为应用带来20%的性能提升。
毕昇jdk的第二个特性是基于鲲鹏架构,在大数据场景下带来了一定的性能提升。在鲲鹏架构下,毕昇jdk对kae加密解密模块提供了专门的支持,支持了众多的加解密算法。这些算法在https的测试上,相比原来能够带了好几倍的性能提升。同时,针对大数据场景下计算密集的产品,毕昇jdk在常用的库函数上进行了优化。
那么如此强大的毕昇jdk和毕昇编译器去哪里获取呢?开发者可以通过以下链接来下载相关的软件包和技术文档。在开发使用过程中有使用疑问,可以到论坛来提问,会有专人来答疑。
毕昇编译器2.1.0版本已经于去年年底正式发布,本小结所提到的新特性都包含在这个最新版当中,大家可以下载使用,为你的应用提提速。
还有一个好消息,毕昇c 第一个商用版本预计于2022年三年季度发布,敬请期待!
四.4大场景8大维度下的快速引导式性能调优和诊断
当应用出现性能瓶颈问题时,我们第一个想到的就是调优。目前业界有众多性能分析工具,但是存在数据无法共享,学习成本高,无法给出具体调优建议等问题,给开发者带来了不少麻烦。面对这些困境,devkit如何帮助开发者进行精准分析,全面调优,软硬件融合,释放最佳性能?华为鲲鹏性能分析技术专家金老师给出了详细的答案。
金老师认为当前的服务器性能对于应用场景具有十分重要的意义。例如大家在打游戏的时候,应该遇到过卡顿的情况。而随着你打游戏的时间越来越长,打游戏卡顿的现象越来越明显。这就是一个十分典型的性能问题。而在服务器领域中,性能问题会越发严重。首先是因为服务器领域承载着非常复杂的各行各业的应用,其次是服务器领域,我们需要保证它7x24小时的不间断运行,在此期间是无法重启的。
服务器性能瓶颈问题会关联到任何一个层次,包括底层的硬件,到操作系统,到中间件以及各种各样的库和上层的应用程序,牵一发而动全身。业内已经有很多的小工具来解决不同层次的瓶颈问题,包括linux的perl等。但这些工具只能分析单点的性能问题,没有工具能将这些数据整合起来,从全局的视角去分析这些性能瓶颈到底存在于哪一层次。
由此可以看出,对于服务器应用来说,我们需要的是系统性能调优。系统性能调优意味着我们需要了解底层的应用,操作系统以及上层应用软件的信息,分析各个部件运行的状态,并且调解各个模块之间交互的关系,从而实现性能的最大化。
性能分析工具背后承载的技术是非常复杂的。金老师主要讲解了两个场景,两个特性和它们背后实现的原理。第一个讲解内容是热点函数分析。所谓的热点函数,即那些执行时间长的函数。开发者通过优化热点函数,从而尽可能的提高应用整体性能。热点函数分析是通过热/冷火焰图展示函数的调用关系,发现优化路径,从而提供优化建议。
那么鲲鹏团队是如何实现热点函数分析的呢?主要是使用perf采集cpu cycles事件,采集到的事件越多,就可以定位到使用最多的函数。然后通过调用栈来构造火焰图,通过符号信息的展开,源代码的关联,就可以定位到热点函数对应的源代码。这样就可以让开发者知道热点函数是哪个,对应到哪一段源代码。
第二个讲解内容是微架构分析,它是一个底层的分析技术。微架构就是cpul内部的一个体系结构。鲲鹏团队使用了一个top-down模型来抽象微架构的一个体系结构,该模型分为四层,分别是retiring,bad speculation,frontend bound,backend_bound。其中backend_bound在真实调优过程中是非常普遍的,它的值如果太高,则意味着内存的带宽及访问的延迟非常高。开发者根据这些值去细化定位问题的出处,从而有效解决相关问题。
鲲鹏调优工具又把微架构分析通过进程,cpu等等的指标关联起来,然后就可以定位到函数,定位到微架构方面造成的瓶颈问题。
devkit还有其他的新特性,例如调优助手。华为鲲鹏团队在大量的调研后,发现有大量的性能调优,是可以通过一些比较快捷的方式获得显著的性能提升。例如,开发者可以调整一些系统的配置参数,分析出热点函数,以及使用事先准备好的加速库去替换等快捷方式来提高性能。根据这些结论,华为公司推出了调优助手,它结合了华为团队在真实业务里的调优知识,从而向用户提供优化建议,让开发者的应用整体上提升性能。
那么具体调优助手是如何在真实开发环境中使用的呢?我们来看3个小例子。
第一个是系统配置方面,当我们运行调优助手里面的系统配置功能的时候,即从上图可以看出,运行该功能后,小助手会告诉你当前是一个io密集型的应用,所以可以将哪些io参数缩小,以达到提升系统性能的功效。
第二个是热点函数的例子,助手对用户的程序做采样,分析出热点函数,然后将热点函数的模块和华为的知识库做匹配,如果这个模块是存在于知识库的,就会给出建议,让用户用华为已知的并且经过加速的库进行取代。达到提升性能的效果。
第三个是系统性能的例子,助手会检测当前系统的一些配置,然后给出建议,让开发者可以关闭一些影响系统性能的无关项。
devkit除了小助手,另外一个新特性是hpc分析。hpc就是超算,而超算分析和过往的单点的性能调优有不少的区别。
例如上面的一个例子,对openmp程序来说,它的最重要的性能指标就是线程之间的不平衡性。即当多个线程运行至并行区时,线程不会继续运行下去,会停留在并行区,等待其他线程执行完。这个时候就需要先识别出最晚到达的线程,对他们进行进一步优化,减少等待时间,提升应用的整体性能。
hpc分析的另外一个指标时mpi运行时指标,mpi就是多节点通讯的开销的指标。助手会将通讯的有关数据汇总给开发者,让开发者进行优化。
hpc分析也支持top-down模型,通过top-down分析,可以尽可能提高单点性能。提高的单点性能也会为提高集群的性能打好基础。
devkit还有第3个小特性,即系统诊断。主要提供3个维度的诊断,包括内存,网络io以及存储io。内存方面主要分析是否有内存泄漏,内存异常释放,内存越界等方面。网络io则是通过压测手段来监测网络是否有问题。存储io方面则是通过预设的业务模型,一些压测的手段给客户分析存储方面是否有问题。
五.总结
在当前这个互联网快速发展的阶段,人们对网络应用的要求越来越高,如何将应用做到低延迟,高吞吐,这具有重大的战略意义,对于企业的稳健发展也是有极大的好处,鲲鹏devkit以此为目标,不断精益求精,力求帮助更多的企业应用提高性能,占据有利地位。希望越来越多的企业携手鲲鹏devkit,打造高性能应用,实现华为,企业及网络用户的三方共赢。
本文整理自华为云社区【内容共创】活动第14期。
任务9.
- 点赞
- 收藏
- 关注作者
评论(0)