百年之前,孙中山先生有言:“人既尽其才,则百事俱举;百事举矣,则富强不足谋也。”百年之后,战火已然远去,而全世界在文化、科技等各个领域上的追逐争夺从未停息,信息科学、通讯技术、生物科学等一系列科学技术的角逐是智能时代下的“新战场”。“战火”在不同的世界燃起,而始终未曾改变的是,人才和技术始终是决定竞争力的关键因素。
“新战场”下,国产技术在 5G、云计算、大数据、人工智能等领域表现十分突出,但盛况之下暗流汹涌,我国的计算生态并不乐观。科技场上的一派繁荣之下,传统计算基础设施的成本投入居高不下,芯片产品的竞争力也还不能够完全适配市场需求。要实现进一步的突破,继续保持平稳快速的发展,技术进阶和人才储备缺一不可。
作为国产信息技术领域的领航者,华为鲲鹏始终坚持硬件开放、软件开源、使能伙伴的信条。多年来,鲲鹏致力打造一个从底层硬件到终端软件全面覆盖的国产化生态体系,突破传统计算框架与计算平台,开源操作系统、数据库、数据虚拟化引擎,全方位支撑软件伙伴打造商业化的解决方案,为国产计算技术持续高速发展保驾护航。
技术的进阶离不开其背后海量人才的支撑,华为鲲鹏也牢记着这一法则。为了满足鲲鹏产业发展对人才的需求,激发创新潜力,培养鲲鹏产业发展所需的基于鲲鹏生态的软件适配、迁移、软件开发、解决方案孵化等研发能力,加速构建以鲲鹏为底座的覆盖全产业链的千亿级计算产业,鲲鹏计算产业生态重庆中心与华为技术有限公司联合,面向重庆 ICT 行业企业从业人员举办了「鲲鹏应用创新大赛 2020•重庆赛区」活动。
激发行业创新、促进人才培养、加速产业融合是本次「鲲鹏应用创新大赛 2020」的宗旨。在「鲲鹏应用创新大赛 2020•重庆赛区」宣讲会上,来自鲲鹏的专家现场向大家详细介绍了本次应用创新大赛内容及奖项设置,并对鲲鹏软件性能调优、软件迁移等技术进行了讲解,吸引全产业开发者共同打造鲲鹏全栈解决方案,实现技术与商业创新应用。
1.鲲鹏展翅·智耀山城
「鲲鹏应用大赛 2020」已于 7 月 1 日正式启动,分北京、重庆、福建、广州、广西、河南、湖南、江苏、陕西、深圳、四川、天津、浙江 13 个本地赛区和 1 个全国综合赛区,13 个区域赛结束后,各赛区金奖团队将参加全国总决赛。大赛总奖金池为 500 万,获奖作品将被推荐至华为客户及其合作伙伴,参赛企业将能够拓展更多业务合作可能,金奖作品还有机会在 2020 华为全联接大会进行展示。
重庆赛区赛事由鲲鹏重庆创新中心承办,7 月 10 日起接受报名,至 8 月 18 日截止提交参赛方案,8 月 21 日将进行重庆赛区决赛,最终获奖情况将会在 9 月中旬重庆智博会上同步进行颁奖。重庆赛区参赛选手可从数字政府创新解决方案、大数据创新解决方案、开放命题三个赛题中任选其一。
重庆赛区的组队要求主要有三点:
1、参赛人员需要在报名系统组队,队伍名称格式:公司名称+赛题编号(A/B/C);
2、所有参赛人员必须注册华为云大赛平台账号,奖项名单按照报名登记的团队信息所含账号为准,如果团队成员未在华为云注册账号,将被认为是无效队员,不会纳入团队名单;
3、代表报名需要提供公司授权函(提交作品时打包上传即可),队伍总人数不超过 5 人。
除组队要求外,还有四点参赛要求:
1、参赛作品必须有 demo 演示;
2、参赛作品要在作品提交截止时间之前(8 月 7 日)完成鲲鹏认证流程的发起和完成兼容性测试并在线输出测试报告,并把测试报告(或兼容性认证证书)与参赛作品一起提交;
3、参赛作品拥有商业实战案例,或者作品正在商用/试商用过程中,将会成为加分项;
4、具有独特的产品、技术或者商业模式,对项目拥有自主知识产权。
三个赛道公设金奖一名,银奖一名,铜奖一名。获奖团队将会被推送参加全国大赛,还有现金和云资源等丰厚奖金领取。
2.鲲鹏软件性能调优
效率和性能是我们在计算中一直不懈追求的,尤其是现在人工智能、大数据、云计算等技术的发展对计算效率和性能的要求越来越高,而进行软件性能调优后,在算法不变的情况下,能够使性能达到数万倍的提升,这也就是要进行软件调优的原因。
性能调优有 CPU/内存,磁盘,网卡,应用 4 个方向。
CPU/内存
基于鲲鹏处理器可进行软件加速和硬件加速。
软件加速又可以分为两类,分别是编译优化和 NUMA-Aware 亲和性优化。
在编译器优化中,他基于鲲鹏处理器微架构结构,包含了指令布局优化、内存布局优化、循环优化这几个方面。CPU 在指令中,是一个多流线的模式,而如果指令间存在相互依赖的话,就会出现阻塞的情况,一旦阻塞则会大大降低整体的并行度。在这一环节要实现优化,则就是要提升指令的并行度和数据的命中率。
NUMA 是为解决内存访问带宽限制而出现的一种结构,它有效的解决了在 SMP 系统中核数扩展受内存总线限制的问题。要充分发挥 NUMA 的性能,就需要克服内存访问速度不匀速的挑战。NUMA-Aware 亲和性资源规划让内存能够访问最短路径,有效克服了内存访问速度不均匀的问题,最大可能的发挥了 NUMA 性能。
硬加速以硬件加速引擎为代表。基于鲲鹏技术针对四类业务构建了 9 大加速库,覆盖基础加速、压缩加速、加解密加速、多媒体加速等多种情景,能够有效实现软件硬件加速互补。
磁盘
文件系统决定了磁盘加载到内存过程速度的快慢。文件系统是硬盘到内存之间沟通的桥梁,信息从本地磁盘或者网络存储中读入内存,必须经过文件系统进行相关的标注,完成相关调度,再加载到内存之中。
而磁盘预取能够充分利用磁盘的带宽。开启磁盘预取后,CPU 在读取数据时,可能会将周围的数据一并读取加载,这样就会减少相关的一些 I/O 请求,使磁盘带宽得到充分利用。
网卡
网卡中断产生的频率会影响应用的吞吐和延迟。当一个数据包到达网卡时,网卡叫收集数据包并产生一个中断,由于 CPU 会优先处理中断,搁置其他业务,在这种情况下其他的业务就会出现阻塞。而在处理过程中,如果花在中断上的时间变高,那么应用处理数据的时间就会变少,数据包的延迟会比较低;. 反之,数据包的延迟则会上升,但应用处理的时间就会更多,也就是说低中断就伴随着高吞吐,低时延则伴随着高中断。在数据库 TPCC 测试模型中降低网卡中断可以提升吞吐,结果显示,通过降低网卡中断频率可以带来约 10%的吞吐提升,但同时会造成 20%左右的延迟。如果对延时的要求不高,可以这么操作,如果对时延要求比较高,就不建议这么操作。
应用
软件调优的本质是充分发挥硬件的性能,在多核场景中,我们考虑通过提升并发数来达到提高利用率的目的。但在实际的业务场景中来看,例如在有锁的业务模型中,在等锁上。消耗了很多时间片,应用处理的时间相对来说反而较少,这样性能不升反降。不过可以通过推进无锁编程、大锁变小锁、原子操作指令等方式的应用,减少资源抢占,提升并发,在 Cache 中也可采取减小 CacheLine 的大小、分别放置读写频繁的变量的方式,充分发挥多核性能优势。
鲲鹏性能调优十板斧
鲲鹏性能调优十板斧从四大调优方向提供了不同的方案策略,助力开发者实现轻松调优。
CPU/内存:调整内存页大小、CPU 预取、修改线程调度策略。
磁盘:脏数据刷新、异步文件操作(libaio)、文件系统参数。
网卡:网卡多队列、开启网卡 TSO、开启网卡 CSUM。
应用:优化编译选项、文件缓存机制、缓存执行结果、NEON 指令加速
2.工具套件与技术支持
鲲鹏社区
鲲鹏社区是一个在线资源整合平台,能够为开发者提供 400+迁移实践相关文档、200+主流软件下载、答疑交流论坛和鲲鹏计算兼容性认证查询和证书获取服务。
对开发者来说,鲲鹏社区中最常用的 4 个功能分别是鲲鹏文档、鲲鹏软件、鲲鹏论坛和鲲鹏查询。开发者在开发中遇到任何问题时,可以通过鲲鹏社区进行查询或者发起提问,鲲鹏专家一般可在两小时内进行解答,完成问题闭环。
鲲鹏小智
鲲鹏小智是一个智能服务机器人,能够对兼容性软件查询、镜像包查询、汇编指令查询等问题进行智能问答。目前鲲鹏小智可以就兼容软件查询、镜像包查询、汇编指令查询、项目经验案例检索、常用工具一键访问、故障问题查询六大模块在网页上直接进行回答。
华为鲲鹏开发套件
华为鲲鹏开发套件包括分析扫描工具、代码迁移工具、性能优化工具三大套件。
分析扫描工具:分析扫描工具,主要是对软件包或者安装包进行分析,查找软件包或安装包中有哪些依赖需要做迁移。分析扫描工具能够提升软件移植分析的效率和准确率,协助开发者快速完成迁移。
代码迁移工具:在鲲鹏平台上,不支持某些运行语言、编译选项以及接口,代码迁移工具能够协助开发者扫描出输入文件的源码工具,并输出报告,指示开发者哪些内容需要做迁移。
性能优化工具:性能优化工具(Tuning Kit)能够对系统性能数据进行采集和分析,协助开发者找到自己应用的瓶颈,针对相关问题进行针对性的优化。
兼容软件查询
兼容软件查询工具,包括对开源软件、商业软件、操作系统、软件的查询。方便开发者获取需求软件的名称、下载地址、兼容信息等一系列内容。
3.鲲鹏软件迁移
C/C++代码迁移
对于像 C、C++等典型的编译型语言来说,要从 x86 平台迁移到鲲鹏平台时,一般都需要重新编译。编译构建脚本类文件在迁移过程中会涉及到编译选项的移植,而源码类文件则会涉及到编译宏,以及编译器自带的 Builtin 函数、SSE intrinsic 函数等内容的移植。
在 C/C++ 代码编译构建过程有六大步骤,首先是获取源码,可以通过 GitHub 等开源社区来获取;其次需要选择所需的编译环境,就是安装编译器 gcc 等;之后根据源码的编译脚本生成 Makefile 文件,再用 Makefile 编译生成可持续文件。如果这部分代码之中有依赖 x86 平台的 SO 库,那么这部分的依赖库是需要重新编译替换的。在编译完成之后进行安装部署,之后进入到实际的系统之中进行测试。
Java/Python 代码迁移
对于 Java、Python 这样解释性语言写的程序,它们涉及到的迁移与编译型语言大有不同。
从上图中可以看到 Java 的技术架构和源码运行过程。对 Java 而言,在实现迁移的过程中,涉及修改的部分首先就是 JDK,因为 JDK 有一些 C 的代码,而且在 JDK 层屏蔽了很多跟指令级相关的内容,所以需要对 JDK 层进行替换;第二个修改点就是 SO 库,SO 库可能是由解释性语言编译的,它们跟指令集的关系十分密切,需要重新编译才能运行;除此之外,还需注意在程序运行中的错误,这类问题或许并非迁移造成,但因为关乎运行性能也需多加注意。
Python 的运行过程和 Java 类似,在编译修改上也是类似的,也是需要从编译环境和 SO 库两大方面入手修改。Python 迁移的关键步骤有以下几点,首先分析依赖性,并且要关注远程仓库源;第三要对 SO 包进行,确保 SO 包能正常获取并使用,如果是 X86 的 SO 包,则需要重新编译;第三就是 SO 包要确定是兼容的版本,能直接使用。
Maven 仓软件构建
Maven 的作用就是把所有的开源软件编辑成一个 jar 包放在 Maven 仓库上面,需要时直接在 Maven 上调用,这也叫作 jar 的依赖管理。在构建 jar 包的过程中,首先需要查询本地仓库,本地仓库如果找不到就去远程仓找,第三步需要编译实现,并且验证该版本在鲲鹏上是否可用,如果不可用,则需要重新编译这个包,然后替换到本地的仓库,再重新构建,编译出可使用的版本。
鲲鹏 Maven 仓实质是一个远程仓,里有各种各样适用于鲲鹏平台的 jar 包,基于 Maven 仓的构建过程,在本地仓没有找到合适的 jar 包时,就到鲲鹏的远程仓找,下载出来就是在鲲鹏平台可以使用的 jar 包,无需重复校验、编译,就可以得到一个鲲鹏上可以用的版本包。这一过程能够大大简化 Maven 软件构建流程,有效提升开发效率。
软件包迁移
在应用程序里面不可避免存在一些二进制或者 SO 库,它们和 C、指令集都密切相关,因此要实现迁移软件包部分也做一些程序编译和替换。软件包的迁移需要扫描、编译、打包、验证四个步骤。
软件包迁移过程中,首先下载 X86 软件包,利用 Dependency Advisor 工具进行扫描。然后再鲲鹏上重新编译 X86 依赖文件,为了减少劳动,在这一步骤,首先优先从鲲鹏 Maven 仓上查找文件,如果鲲鹏 Maven 仓中未找到,则在鲲鹏上重新编译依赖文件。第三步时在鲲鹏上小红心生成 rpm 包,首先得到 rpm 包对应的 spec 文件,然后解压 X86 rpm,再把包替换成 X86 依赖文件,最后打包生成新的 rpm 包。最后一个步骤是验证,需要重新扫描,确认是否还有 X86 依赖文件,如果存在,则继续编译打包,直到没有 X86 依赖文件存在。
4.写在最后
人才积蓄力量,技术创造未来。智能时代的大幕刚刚拉开,计算力量决定着科技的走向,而技术的比拼究其根源无外乎皆是人才的较量。作为后浪的你,准备好加入这场战斗了吗?鲲鹏与你一同创造计算世界的下一站光辉。
评论