摘要:山西鲲鹏开发训练营主要分为鲲鹏生态介绍、鲲鹏应用代码迁移指导、C/C++和 Java 代码迁移沙箱实践及微认证几大环节。
8 月 27 日,华为 DevRun 开发者沙龙来到太原,在山西转型综合改革示范区管委会一层西厅会议室举办了“山西鲲鹏开发训练营”活动。本次鲲鹏开发训练营是在山西省工信厅和山西综改示范区管委会创新发展部的指导下,由山西鲲鹏生态创新中心举办的鲲鹏技术赋能活动。训练营主要分为鲲鹏生态介绍、鲲鹏应用代码迁移指导、C/C++和 Java 代码迁移沙箱实践及微认证几大环节。
鲲鹏生态概况介绍
山西鲲鹏生态创新中心COO于超为与会者介绍了鲲鹏生态的发展现状。于超提到,今天的人类社会正在迎来第四次工业革命,其代表性产业就是智能技术。在这一领域,华为鲲鹏芯片以 ARM 技术路线为主,在高性能计算、安全可靠和开放生态方面持续演进。鲲鹏架构在大数据、数据库、云服务、分布式存储和原生应用等场景已经有了规模化商业应用。华为鲲鹏秉持硬件开放、软件开源、使能合作伙伴的理念,为各行业提供“鲲鹏芯片+昇腾 AI”的多样化算力支撑,建设鲲鹏计算产业生态。
目前,全国已有 800 多家厂商和 2000 多个方案通过了鲲鹏生态认证。华为已与全国各省市政府部门合作,建设了 18 个鲲鹏生态创新中心。今年 7 月刚刚落成的山西鲲鹏生态创新中心是山西省信创产业“一号工程”中的重要环节,旨在为参加鲲鹏生态的企业和人员提供各种专业化服务,共同推进基于鲲鹏生态研发的企业应用创新及软件项目孵化活动。通过山西鲲鹏生态创新中心的技术支持,可以全面发展山西省鲲鹏计算产业市场,提升山西本地企业的竞争力,共同打造山西省的信创产业生态和创新高地。
未来 3-5 年,华为还计划将 15 亿美元投入高校的鲲鹏生态建设,与高等院校合作编制鲲鹏技术教材,共建师资团队、实验室和实训基地,开展职业认证培训考试等,从高校开始培养优秀的鲲鹏产业人才。
鲲鹏代码迁移指导
软件迁移是鲲鹏生态应用中的重头环节。本期训练营上,鲲鹏计算行业资深专家刘坤带来了鲲鹏软件迁移深度课程。
鲲鹏软件迁移概述
计算机应用程序使用高级编程语言写好代码后,会通过编译器编译成汇编语言,再生成二进制机器码。所谓 CPU 指令集架构是芯片底层和上层程序之间的桥梁,后者转化为指令序列,通过指令集架构中的指令执行。
鲲鹏处理器采用的是与 x86 指令集架构完全不同的 ARMv8 指令集,因此程序从 x86 平台向鲲鹏平台迁移时必须重新编译。一般情况下,软件迁移过程包括五大步骤:迁移准备、迁移分析、编译迁移、性能调优和测试认证。其中最重要的步骤是编译迁移。
迁移准备:主要收集底层硬件和上层软件信息,准备编译环境(鲲鹏服务器或者OpenLab线上环境)。
迁移分析:分析应用软件栈,包括其使用的语言、底层OS、中间件、依赖项、编译器、运行环境等。
编译迁移:这一步分为两类,第一类是代码迁移,例如C/C++这类编译型语言,或Java/Python这类解释型语言的代码迁移;第二类是软件包,主要是RPM包和jar包的迁移。
性能调优:迁移完成后通过优化工作实现预期的性能目标。
测试认证:通过测试和认证工作确保迁移质量,不达标时要寻找原因再做调优。
为帮助开发人员降低应用的迁移门槛,华为还开发了鲲鹏软件迁移套件,主要有分析扫描工具、迁移工具和性能调优工具三大类别。
C/C++代码迁移
C/C++属于编译型语言,源码编译成可执行文件时要经过几个步骤:首先是预处理,处理一些头文件信息;然后生成预编译文件,再编译成汇编代码;之后经过汇编过程生成目标二进制文件,最后通过链接过程加入 SO 等链接,生成可执行文件。由于 x86 与鲲鹏的指令集架构、寄存器和扩展指令集(SIMD)等底层属性都不同,两者的汇编代码是不一样的,因此跨平台应用移植就需要编译迁移。
C/C++代码工程一般分为两类:编译构建脚本(如 makefile、Configure 等),和源码部分。前者迁移时主要涉及编译选项的变化,后者要涉及编译宏移植、builtin 函数、内联汇编、SIMD 等。实际应用迁移中不一定要触及所有层面,有些应用只需源码直接编译,或者修改一两个编译选项即可。应用迁移时首先获取源码,然后准备编译环境,生成 Makefile 文件,对依赖的 SO 库也做迁移处理,最后安装部署。
C/C++代码迁移中的典型问题
1.编译选项移植。
例如应用编译成 64 位时,x86 平台上使用 m64 选项,鲲鹏上则是 mabi=lp64,根据编译文档将有架构差异的编译选项对等替换即可。
2.编译宏移植。
编译宏是用来识别架构平台并选择对应代码分支的工具。编译器自带的编译宏在 x86 下只有两个,到鲲鹏平台时直接替换即可;用户自定义的编译宏也只需根据自己的写法自定义替换。但编译宏替换后,如果没有 ARM 对应的源码分支,就需要实现对应的功能。
3.builtin 函数移植。
builtin 函数是编译器内部实现的函数,需要迁移的不多,主要关注 CRC32 校验值计算的几个函数。
4.内联汇编移植。
内联汇编移植时有两种方法,一种是通过汇编指令一对一替换,关键在于指令到指令的替换思想;另一种是通过 builtin 函数替换,根据指令的功能选择对应的 builtin 函数。
5.SIMD 指令迁移。
SSE、AVX 都是 x86 平台的 SIMD 指令,SIMD 是单指令多数据流的简称,可用来加快计算速度。鲲鹏平台也有自己的 SIMD 指令,名为 Neon。x86 平台下的 SIMD 指令迁移到鲲鹏平台时,只需找到对应的函数替换实现即可。实践中一般不会逐条迁移,更推荐采用开源工程的移植途径。例如华为开源了一个工程,其中实现了大部分 SIMD 指令的替换。实践移植时,只需将开源头文件放到应用目录下引用即可无感知迁移,非常方便。
开源工程无法覆盖到的特殊指令需要手动替换,此时就需要搜索代码的实现原理进行替换,这一步可以请华为的工程师帮助。
为了简化应用迁移工作,华为还开发了 Porting Advisor 工具。它首先会扫描编译构建脚本源码,识别迁移可能涉及的问题;然后根据已有的迁移问题数据库对检测出来的问题给出指导,避免重复工作。前文提到的各类移植问题大都能在工具给出的迁移报告中有对应,按照指导操作即可。
Java/Python 代码迁移
Java/Python 是解释型语言,涉及的移植问题并不多见。Java 应用开发时,安装完 JDK 后用 JDK 填码,通过 Java 编译器编译生成字节码文件,根据需要打包一些资源库生成 jar 包,然后上传环境部署运行。Java 应用迁移时主要有两个步骤:
重新安装JDK,例如x86下的Oracle JDK在鲲鹏平台上不支持,推荐使用OpenJDK替换。经典版本直接从软件源安装即可,也可以自行编译JDK源码。
SO库需要重编译。通过Porting Advisor工具扫描jar包,找出x86平台的SO库,之后对其进行移植生成鲲鹏平台的SO,再重新打包即可。
Python 代码移植的情况类似,也包括运行环境和 SO 库的迁移。运行环境的迁移没有难点,SO 库的迁移与 Java 的步骤是一样的。
Maven 软件仓构建
Maven 是常用的开源软件构建工具。Maven 仓库主要存放 jar 包,包括本地、远程和中央仓库三种类型。远程仓库是企业内部或第三方组织搭建的服务器,中央仓库是 Maven 团队自己设置的仓库。
Maven 仓库默认的 jar 包搜索顺序是本地-远程-中央,找到需要的 jar 包就拉取下来执行构建。但如果拉取下来的是包含 x86 平台依赖项的 jar 包,在鲲鹏平台上构建运行就会出错,还需要再分析扫描、打包编译等操作,过程比较繁琐。
为了简化操作,华为开发了鲲鹏专属的 Maven 仓库,包含常见的 jar 包移植版本。开发人员只需将 Maven 仓库的 XMR 配置文件改为优先搜索鲲鹏 Maven 仓就能快速找到鲲鹏平台的对应 jar 包,精简迁移过程,减少 Java 迁移的工作量。
以 Hive 编译实例为例,使用迁移工具扫描,发现应用中有四个带 x86 依赖项的 jar 包,那么配置好 Maven 仓之后就可以拉取对应的鲲鹏平台 jar 包,编译通过就可以完成移植了。
RPM 软件包迁移
RPM 是 Linux 下常用的软件包类型。RPM 包移植时本质上是移植一些二进制文件,将 x86 依赖的文件替换为鲲鹏平台的。移植时首先寻找有没有对应鲲鹏平台的 RPM 包,从以下渠道尝试获取:
操作系统的本地源;
操作系统的远端源;
华为云鲲鹏镜像(包含很多鲲鹏平台上打好的RPM包);
x86下才有的RPM包可以拆开重构,将SO、二进制文件全部替换再打包;
所有途径都失败,则下载源码重新编译。
RPM 包重构时,主要有扫描、编译、打包和验证几个步骤。扫描找出 x86 依赖项,依赖项有对应的 jar 包实现就直接替换,否则就用源码编译。之后替换打包再做验证。Porting Advisor 迁移工具提供了 RPM 包重构模块,可以充分利用鲲鹏 Maven 仓,自动扫描并找到已有的 jar 包替换实现进行替代。但如果是 SO 文件的差异就需要手动处理。
开发人员进行迁移工作时,可以参考鲲鹏社区、鲲鹏小智助手和开发者公众号三个渠道的资源。鲲鹏社区中有 24 小时答疑,还有丰富的迁移、性能调优文档以及很多问题的问答资料;鲲鹏小智助手可以方便地获取鲲鹏平台下具体的迁移问题指导;开发者公众号会定期发布一些技术资料。
迁移沙箱实践和微认证
沙箱实践
训练营的理论迁移课程结束后,还为现场小伙伴们安排了沙箱实践环节。沙箱环境是在线对外开放的,感兴趣的开发人员也可以自行联网尝试。
沙箱操作主要分三步:
注册华为云账号,过程需要实名认证;
华为云平台有OpenLab虚拟实验室,其中有四个沙箱实践:C/C++、Java、软件包和Maven仓。
选定对应沙箱即可开始实验,云端会分配一个虚拟机,可以完成编译操作。开发人员可以根据网页上的实验手册与指导完成实验。
微认证
云端实验室有一个微认证模块,其中分为鲲鹏软件迁移与性能调优两门课程。购买认证后可以先学习课程、完成自测和实验,最后参加考试。考试需要实名认证,考试过程中还需要调用摄像头抓拍防止作弊,内容包括判断、单选和多选形式。通过考试后就会在线发放微认证证书。
本期训练营涉及的相关社区资源链接汇总如下:
内联汇编规则参考:https://gcc.gnu.org/onlinedocs/gcc/Using-Assembly-Language-with-C.html#Using-Assembly-Language-with-C
不同架构下差异化GCC编译选项查询 (gcc7.3为例):https://gcc.gnu.org/onlinedocs/gcc-7.3.0/gcc/Submodel-Options.html#Submodel-Options
鲲鹏开发套件——Porting Advisor:https://www.huaweicloud.com/kunpeng/software/portingadvisor.html
鲲鹏Maven仓链接:https://mirrors.huaweicloud.com/kunpeng/maven/
鲲鹏社区:https://bbs.huaweicloud.com/forum/forum-923-1.html
鲲鹏小智助手:http://ic-openlabs.huawei.com/chat/#/
华为云端实验室:https://lab.huaweicloud.com/
微认证:https://edu.huaweicloud.com/certifications/
本文分享自华为云社区《【山西鲲鹏训练营】从应用迁移到平台微认证:技术干货深度解读》,原文作者:Sylvia cc 。