首页 > 资讯 > 正文

鲲鹏展翅锦官城,助力开发者掌握迁移法则

2020-07-23 11:02:05 来源: 阅读:-
评论(0 收藏(0

7 月 11 日,由华为鲲鹏举办的 19 城鲲鹏创新中心开发者创享日·四川省鲲鹏生态创新专场技术沙龙在线上如期与开发者们见面。在四川场进行的线上分享中,华为智能计算产品线刘坤、华为鲲鹏计算的软件工程师覃璐瑶分别就鲲鹏软件迁移中 C/C++ 代码迁移以及 Maven 软件仓构建相关的知识点进行了详细讲解,帮助开发者及合作伙伴迅速定位软件迁移存在的坑点、难点及破局之道。

同时,在四川鲲鹏生态创新中心专家发布的 2020 鲲鹏应用创新大赛计划下,四川高校人才培养计划也再次进行了升级——高校参赛队伍可与开发者队伍同台竞技,全面提升自身基于鲲鹏生态的软件适配、迁移、软件开发等能力,成为未来所需的全能型人才。

点击查看,观看线上课程完整回放。

鲲鹏软件迁移概述及 C/C++ 代码迁移

本次线上活动分享伊始,华为智能计算产品线的刘坤和线上的朋友们分享了鲲鹏软件迁移概述和 C/C++ 代码的迁移。

左图是计算技术栈,上层是用高级源编写的应用程序,通过编译器之后生成汇编语言及二进制机器码。中间层是指令集架构,它是软件和硬件的桥梁——上层编译生成的二进制机器码,需要通过调用相应的指令集序列在硬件平台上进行执行。右图是程序执行过程,高级语言通过编译器编译生成汇编语言,通过汇编器进一步编译生成机器码。
鲲鹏展翅锦官城,助力开发者掌握迁移法则
华为在长期项目迁移过程中,总结出迁移过程的五个步骤:

第一,迁移的准备。这个过程主要做信息的收集以及编译环境的准备。主要收集硬件和软件信息,收集完成之后,即要申请 OpenLab 远程编译环境资源,帮助完成迁移。

第二,迁移的分析。这个步骤主要分析软件栈和制定迁移的策略。开源软件可以通过获取开源的代码进行重新编译,获取对应的 aarch64,鲲鹏处理器能支持的软件包进行安装。自研软件可以分为编译型语言和解释型语言,编译型语言主要是对 C/C++/Go 类编译语言重新编译。

第三,编译迁移。编译迁移分为两类,一类代码的迁移,一类是软件包的迁移。代码的迁移,分为编译型语言和解释型语言。编译型语言修改点涉及到代码的修改,编译脚本、编译选项的修改,包括内联汇编的修改,重写 SSE 指令等。解释型语言,主要是 Java 虚拟机和 Python 解释器的安装,还有对应 JDK 版本的迁移。软件包迁移这块主要是对 rpm 包进行结果重构,包括扫描软件包所依赖的依赖项,对这些依赖库获取源码进行重新编译打包。

第四,性能调优,这块基于指标数据进行针对性的调优。我们在实践过程中总结了性能调优的几个方法:1)建立基准,根据当前硬件配置和测试模型制定调优的目标;2)通过压力工具对测试系统进行压测;3)确认当前的效果是否达到预期性能的指标,并不断进行调优,优化软件性能。

第五,进行测试与认证,经过功能测试、性能测试、长稳测试等最后保证可规模化商用。

当然,在很多开发者实践迁移过程中,可能会遇到代码分析,迁移调优等一系列的问题,因此华为开发了一整套的鲲鹏开发套件,帮助开发者完成分析迁移调优的过程。第一,华为在迁移分析阶段推出了分析扫描工具,帮助开发者扫描代码所依赖的依赖库,进行代码初步的评估。第二,在迁移过程中推出代码迁移工具,帮助开发者扫描构建脚本及源码。第三,在性能调优阶段推出性能优化工具,帮助开发者做全景资源监控,针对其中可能出现的热点函数进行监控,生成相应的火焰图分析相应热点。

在接下来的分享中,刘坤还着重介绍了 C/C++ 代码的迁移。

编译型语言 C/C++/Go 都是典型的编译型语言,将编译型语言开发程序从 X86 处理器迁移到鲲鹏处理器,通常需要经过重新编译才能正常运行。而 C/C++ 代码需要移植的原因主要有三个:第一,架构差异:X86 和“鲲鹏”架构是不同的架构,鲲鹏架构上的差异,导致编译过程中部分编译选项需要基于平台重新进行指令设计。第二,指令集差异:X86 架构下是复杂的指令集,鲲鹏处理器是精简指令集,只有在 Test.C 源码中写类型汇编,并对类型汇编指令修改移植后,才能完成编译;第三,相量计存器和相量指令集的差异。

这里将列举 C/C++ 迁移的三种典型移植类问题。

第一类是编译脚本里编译选项的移植。我们推荐的移植方法是通过编译构建脚本,编译选项进行指定,这样可以避免开发者逐一修改进行代码过程中出现漏掉的问题。

第二类是编译宏的移植。编译宏移植分为两类,一是 GCC 编译器自定义宏和用户自定义编译宏,二是 MI、SSE 属性相关的编译器自定义宏,在鲲鹏处理器中需要自己对相关语义含义的编译宏进行替换,此外还需要实现编译宏中对应的代码分支功能,在鲲鹏中可以通过 RMV8 自定义。

第三类是内联汇编函数移植。内联汇编中的规则相对比较简单,其中的核心迁移点是核心的迁移指令。内联汇编的迁移主要两种方法,第一个是汇编指令替换进行移植,鲲鹏处理器的 rev 指令完成功能。第二个是通过 builtin 函数方式进行替换,核心替换点是 Popcnt 指令。

在实践迁移、移植的过程中,华为也提供了一套迁移工具,帮助开发者们更好地完成迁移。这套工具名为 Porting Advisor(代码迁移工具),它能对 C/C++ 代码进行扫描分析,对其中的编译构建脚本,包括前面提到的一些移植类的问题,如 X86 内联汇编、SSE intrinsic 函数扫描等等,为迁移提供分析报告和指导意见。Porting Advisor 工具使用比较简单,主要分三步:第一步是环境的部署和 Porting Advisor 安装,安装之后准备需要迁移的源码。第二步主要通过 Porting Advisor 进行工程分析扫描,扫描编译构建脚本、X86 汇编、包括 SSE intrinsic 函数的识别。第三步是生成分析报告,这个分析报告将提供需要移植的移植项以及对移植的修改建议。
鲲鹏展翅锦官城,助力开发者掌握迁移法则

鲲鹏软件仓构建及软件包迁移

  • Java/Python 运行过程所涉及的迁移改动点及处理方法

在接下来的分享中,华为鲲鹏计算的软件工程师覃璐瑶为大家介绍了 Java/Python 运行过程中可能涉及的迁移改动点及处理方法、典型场景的迁移方法以及如何独立完成 Java/Python 代码的迁移。

Java 源码移植过程如下图右侧所示,主要包含如下几个核心环节:
1)安装 JDK;
2)将 Java 源码通过 Java 编译器编译成.class 文件;
3)如果调用 C 语言的.so 库,则需要把.class 文件和.so 库共同打包到.jar 包部署运行。

对应的,这个流程在鲲鹏上的迁移改动点也是三项:
1)安装鲲鹏上能够支持的 JDK;
2)将要调用的.so 要替换成 aarch64 版本;
3)在部署运行时可能会涉及部分 JVM 参数的修改或设置。
鲲鹏展翅锦官城,助力开发者掌握迁移法则
首先介绍第一个改动点——安装 JDK。为了确保生产环境更加注重稳定性,我们推荐大家在安装的 JDK 版本时使用成熟稳定的高版本 JDK,比如鲲鹏已经适配的 OpenJDK。高版本的 JDK 对老版本的问题会进行修复和改进,对新版本的 JDK 会新增一些特性,这样能使编程更加方便简洁,同时,OpenJDK 也可以直接通过 yum 安装使用。当然,部分开发者可能会需要使用到某个特定版本的 JDK,这个时候需要通过源码编译部署得到。

第二个改动点——对包含.so 库的.jar 包的迁移。它的迁移步骤是这样的:1)通过 Dependency Advisor 工具分析扫描 jar 包;2) 识别出所依赖的 .so 库;3)下载.so 库源码;4)安装编译环境如 Maven、GCC;5)设置编译选项 -fsigned-char;6)编译 aarch64 版本的.so 库;7)替换.so 库;8)重新打包 jar 包。通过这几个步骤,得到的 jar 包是可以在鲲鹏平台上运行的。

接着分享一下第三个迁移改动点——设置 JVM 参数。为了保证程序稳定快速的运行,我们总结了三个经验和两个差异。在释放堆空间,年轻代、老年代、永久代所占空间堆空间大小方面,我们总结的 3 个经验如下图上侧所列。在调整线程栈大小和设置参数调整 CodeCache 大小上,我们总结的 2 个差异如下图右侧所列。
鲲鹏展翅锦官城,助力开发者掌握迁移法则
接下来分享的内容是 Python 代码迁移,其步骤和 Java 代码迁移类似:1)先安装 Python 环境;2)进行 Python 源码编辑,通过 Python 编译器把源码变成.pyc 自解码,如果代码里面调用含 C 代码模块或者纯 C 代码模块,则需要把这部分代码编译成.so,然后生成模块;3)将自解码和模块放到 Python 解释器进行运行。

那么对应这个流程,在鲲鹏上的代码迁移改动点主要有两点:
第一,Python 版本。建议大家将 Python 环境升级到 Python3.X;
第二,对于 C 代码编译生成的.so 库,需要将其替换成 aarch64 的版本,这两个是 Python 代码主要的迁移改动点。

  • Maven 软件仓库的构建

Java 项目中,依赖管理已经成为项目构建自动化工具的主要部分。Maven 作为 Apache 下面纯 Java 开发的开源项目,可以对 Java 项目进行构建、依赖管理。

Maven 软件仓库主要分为三大类:
一是本地仓库,本地仓库默认存储在本机用户的.m2 文件下;
二是远程仓库,其一般是一些国内的镜像或者公司搭建的私服,可以加快.jar 包下载的速度;
三是中央仓库,其是 Maven 团队维护的.jar 包仓库。

三个软件仓库在使用时的调用顺序是:
1)本地仓库搜索,如找到则直接返回,如果未找到则去远程仓库进行搜索;
2)如在远程仓库对应搜索到,相关组件则会被下载到本地仓库,如没有搜索到则会启动中央仓库;
3)如果中央仓库也没有找到,它会在前台打印错误信息。

Maven 软件仓大部分.jar 包无法在鲲鹏上直接使用,而是需要在鲲鹏平台上重新编译,在这个背景下华为组建了鲲鹏 Maven 软件仓,Maven 软件仓里放置的全部是经过迁移的、可以在鲲鹏上直接使用的.jar 包。那么如何在编译的过程中配置优先搜索到鲲鹏的 Maven 软件仓呢?

大家可以把鲲鹏的 Maven 软件仓库放到首位,以便 Maven 构建的时候优先下载鲲鹏平台的 jar 包,由于鲲鹏平台的 Maven 仓只放了 ARM 软件 jar 包,因而 jar 包可能并不全,因此可以配置第二个 Maven 远程仓库,当鲲鹏 Maven 远程仓没有检索结果时,会进行下一个 Maven 远程仓库搜索。Maven 的配置方法是:打开 Maven 安装目录下的 setting.xml 文件,并在 profiles 标签下增加鲲鹏的 Maven 软件仓。

Maven 仓的软件构建流程是:查询本地仓库中是否有依赖的 jar 包,没有则会从鲲鹏远程仓库下载相应组建并保存到本地,在获得依赖组件之后进行编译构建,构建得到 rpm 包。整体构建流程如下图所示。

总的来说,使用鲲鹏 Maven 软件仓,可以大大简化开发者们在迁移中的流程。

  • rpm 软件包迁移

大家常见的 Linux 发行版主要分为两类,一个是 RedHat 系列,一个是 Debian 系列,在 RedHat 系列中软件包的格式是 rpm,Debian 系列中软件包的格式是 deb。

rpm 包的迁移过程是:
1)首先要将 X86 的 rpm 包扫描,识别到其中的有 X86 依赖的文件;
2)通过扫描,可以知道哪些文件需要迁移,这时需要下载对应的源码进行编译。如果能在鲲鹏的 Maven 软件仓上找到.jar 包就可以直接下载和使用,找不到则需要在鲲鹏平台上重新编译;
3)对这些文件进行打包,解压 X86 的 rpm 包,并且将 X86 的依赖文件替换成前面生成鲲鹏平台的 rpm 包或者 jar 包,然后进行重新打包,打包完成之后对它进行验证(使用 Dependency Advisor 工具进行扫描),扫描是不是含有 X86 依赖文件,最后对它进行安装验证,验证能否在鲲鹏平台正常运行。经过这个流程,大家可以把 X86rpm 包重构成鲲鹏的 rpm 包。

在上一节刘坤老师的分享中,为大家介绍了 Porting Advisor 工具。在加速 rpm 包重构的过程中,Porting Advisor 工具也扮演了重要的作用。它能实现自动扫描,自动从鲲鹏 Maven 软件仓下载依赖文件,并且自动打包。如果依赖文件能在鲲鹏 Maven 软件仓上找到,那么 Porting Advisor 可以自动实现扫描编译加打包的过程,最后只需要进行验证就可以了。如果依赖文件无法在鲲鹏的 Maven 软件仓上找到,则需要手动进行编译打包。

全面提升鲲鹏迁移及开发能力,这场大赛你不容错过

在本次线上主讲“鲲鹏软件迁移”的课程中,来自四川鲲鹏生态创新中心的专家也在最后,向大家介绍了 2020 鲲鹏应用创新大赛的赛题和奖项设置,旨在吸引全产业开发者或高校人才,全面提升鲲鹏产业发展所需的、开发者需要的基于鲲鹏生态的软件适配、迁移、软件开发等能力,联动产学研界共同打造鲲鹏全站的解决方案,实现技术与商业的创新应用。

同时,在这个过程中,四川省也将全面在高校人才培养上倾注更多的力量,全面启动人才培养系列课程。此前,首期鲲鹏计算 HCIA 在线孵化营在蓉启动,四川鲲鹏生态创新中心也在通过与省内高校、科研院所以及培训机构的合作,打造全国高校计算人才培养的样板点,推动产教融合,助力四川计算产业复合型人才的培养。

本次 2020 鲲鹏应用创新大赛,也同样为高校组学生提供了一次展示自己的绝佳舞台——高校组可与企业组同台竞技。本次大赛共由 7 个赛题和 13 个赛区构成。每个赛题方向将设有一个金奖,金奖将获得 20 万的奖金 +10 万的云资源,银奖是 10 万奖金 +5 万云资源。此外,获奖团队还可以联合举办专场鲲鹏技术沙龙,专设议题推广获奖团队方案。同时为获奖方案将制作宣传视频,基于华为多渠道进行曝光,金奖作品还有机会在 2020 年华为全联接大会上进行展示。同时,获奖方案有机会在四川鲲鹏生态创新中心进行展示,获奖团队有机会参与成都市级的双创活动。


推荐阅读:视网膜屏