星期

2020年07月20日

乘上腾飞的翅膀——华为鲲鹏生态入门指南

2020-07-20 18:03:05 来源:互联网 阅读:-

21 世纪第二个十年末,当 ARM 架构的东风由移动计算产业开始吹向传统的服务器和云端市场时,华为公司开发的鲲鹏计算平台也应运而生,凭借优异的硬件性能与功耗表现和生机勃勃的生态建设势头,成为了挑战 x86 服务器霸权的领军力量之一。

作为服务器行业的新生力量,年轻的鲲鹏生态一方面吸引了广大开发者和用户的好奇与关注,另一方面也让习惯了传统 x86 平台的程序员和工程师倍感陌生。缺乏对鲲鹏计算产业的了解,想要加入其中却不知从何下手,是大多数开发人员面对鲲鹏生态时最常遇到的问题。

为此,华为举办了一系列社区建设活动,帮助广大开发者尽快熟悉和上手鲲鹏计算平台,加入鲲鹏社区的大家庭。7 月 11 日,华为在全国 18 城同时举办鲲鹏开发者创享日,为鲲鹏生态建设进一步添砖加瓦。其中,太原站的活动主题就围绕鲲鹏生态概况和鲲鹏平台软件迁移两大热门主题展开,为与会者送上了干货满满的分享课程。

以下内容经由 InfoQ 编辑整理自开发者创享日太原会场的课程。

华为鲲鹏生态介绍

新基建是 2020 年国内经济领域最热门的话题之一。在新基建的概念中,算力增长将成为 GDP 增长的重要拉动力量。在这样的背景下,华为公司凭借雄厚的技术力量和产业势能,正在面向全球打造基于鲲鹏平台的计算产业。鲲鹏计算产业包括了芯片、计算、操作系统、中间件、加速库、工具链、整机、组件等诸多环节,旨在形成端到端的高水平产业竞争力。

鲲鹏计算产业的商业策略主旨是硬件开放,软件开源,使能合作伙伴。如今,鲲鹏生态已经与近 800 家伙伴合作,完成了超过 2000 个解决方案认证,并发展出近 9 万名开发者,建设了 16 家生态创新中心,联合了 65 所 985、211 院校部署人才培训基地。在线上,鲲鹏社区已经集成 400 余篇文档、汇聚 200 多个兼容包,还提供了一系列课程和开发资源。在线下的创新中心与线上的社区论坛,来自华为的高水平专家随时与开发者进行技术交流,响应各类技术问题。

全国各地省份也纷纷与华为公司合作,希望基于鲲鹏发展本地的数字经济。已经落地或筹划中的区域合作项目规模从数十亿到千亿级别不等,从东部发达省份到西部新兴省份都有布局。

今天,年轻的鲲鹏生态已经展现出了巨大的发展潜力。鲲鹏社区建设如火如荼,合作伙伴数量众多,整个生态的参与者都从中看到了宝贵的发展机遇。华为希望与全球合作伙伴共同成长,构建一个忠于梦想,成就不凡的平台,共赢计算新时代。

鲲鹏软件迁移指南

鲲鹏软件迁移概述

计算机是由软件和硬件组成的,硬件底层是包含大量晶体管的芯片,而上层的软件就是用高级语言编写的应用程序。高级语言通过编译器编译成汇编语言,再通过汇编器生成机器码。机器码主要包括指令和数据,而指令则与底层芯片的设计高度相关,不同的平台有着不同的指令集,如 x86、Power、ARMv8 等等。

鲲鹏芯片所使用的 ARMv8 指令集与 Intel、AMD 的芯片所使用的 x86 指令集区别很大,下面就是一个例子:

乘上腾飞的翅膀——华为鲲鹏生态入门指南

由于指令集层面的差异,因此在 x86 平台上运行的应用程序转移到鲲鹏平台上时就需要重新编译,整个过程就叫做软件迁移。

根据过往的经验总结,软件迁移可以归纳为迁移准备、迁移分析、编译迁移(包括代码和软件包迁移、性能调优、测试和认证五大步骤。

  • 迁移准备:主要收集软硬件信息,包括芯片和服务器资料,操作系统、中间件、编译器、业务软件等信息。接下来,鲲鹏开发者可以申请 openlab 远程编译环境来为迁移做准备。

  • 迁移分析:主要分析软件栈,制定迁移策略。分析过程分为业务软件和运行环境的展开分析两大类。

  • 编译迁移:这一步主要分为两类,分别是代码迁移和软件包迁移。

  • 性能调优:性能调优主要使用五步法处理。

  • 测试与认证:测试环节主要涉及功能测试、性能测试、场景稳定性测试等,保证迁移完成后的软件可以满足规模化生产环境的各项指标。华为还提供了鲲鹏展翅认证计划,为完成迁移工作的合作伙伴提供认证服务。

典型案例

首先是一个华为内部项目,约 450 万行代码规模,以 C、C++ 为主,还有一些 Java 和 Python 代码,依赖库 140 多个。迁移过程中涉及了汇编指令迁移】选项修改、数据流修改等操作,还做了代码归一和构建脚本归一,以及一系列性能调优,最后在鲲鹏平台上取得了与 x86 原平台持平的性能表现。

第二个案例是华为某互联网合作伙伴的一个核心应用的迁移。应用以 C 和 C++ 为主,源码文件 520 多行,需要移植 55 个依赖库,39 个编译问题,最后修改了 195 行代码。这个项目的分析和编译准备阶段用时一月多,代码移植则用时两月,包括对一些依赖库的替换和重编译工作。最后的性能调优用时两月,获得了比移植前更好的性能结果。

第三个案例是金融行业信息系统的整体切换案例。

乘上腾飞的翅膀——华为鲲鹏生态入门指南

这个案例的重点是替换了很多无法找到 ARM 对应版本的业务软件,测试场景也繁多复杂。相比典型的迁移过程,这个案例更多涉及软件技术栈的整体迭代更新。

在鲲鹏软件的迁移过程中,代码分析、编译迁移、性能调优等场景都需要对应的工具来协助。华为为此开发了一系列开发套件,帮助开发者完成整个迁移任务。套件中包括分析扫描工具、代码迁移工具、性能优化工具等。这些工具具备一定的智能化水平,并针对鲲鹏平台的特性做了针对性的设计和优化,可以最大程度减少开发人员的负担。

C 和 C++ 代码迁移

C、C++ 和 go 都是典型的编译型语言。这种语言开发的程序需要经过针对硬件平台的编译后才能在对应平台上运行。当 x86 平台的 C/C++ 程序要向鲲鹏平台迁移时,由于两种平台底层的指令集差异,针对 x86 平台编译生成的二进制文件是无法直接在鲲鹏平台运行的。具体而言,两边的编译选项、汇编代码和向量指令集都会有差异。

乘上腾飞的翅膀——华为鲲鹏生态入门指南

C/C++ 代码的编译构建过程

C/C++ 代码工程主要包括下图中的两类文件:
乘上腾飞的翅膀——华为鲲鹏生态入门指南
需要注意,不同的项目需要编译移植的部分是不同的,有些项目可能无需修改代码即可直接编译通过,有些只需要简单的编译选项调整,其他项目就可能要对代码做较大改动。

C/C++ 代码的编译构建可参考以下流程:

乘上腾飞的翅膀——华为鲲鹏生态入门指南

C/C++ 代码迁移的典型移植问题

1. 编译脚本和编译选项移植
不同平台都有自己最合适的编译选项,在移植时就要找出这些特定选项进行修改,以最大程度发挥平台性能。

2. 编译宏移植
相同的代码片断在不同平台下可能会存在不同分支,需要尽量发挥不同平台的性能优势。但是对于编译器来说,如何才能得知要编译哪些分支代码呢?这就是编译宏的作用。

3.builtin 函数移植
Builtin 函数是编译器自定义的函数。以 crc32 校验值的计算为例,x86 下面是 _builtin_ia32 的形式,鲲鹏下面替换为 _aarch64_ 形式即可。

4. 内联汇编函数的移植

乘上腾飞的翅膀——华为鲲鹏生态入门指南

上图列举了将字节序进行反序的例子,比如 0X56781314 反序输出的是 0X14137856,x86 上对应的是 bswap 指令,鯤鹏对应的是 rev 指令,两者之间主要是内联汇编规则存在差异。这种迁移就是替换汇编指令的方法。

另一个方法是 builtin 函数替换,比如 popcnt 对应到鯤鹏平台上就是 popcountll。

5.SSE intrinsic 函数移植
这里首先要了解 SIMD 技术。SIMD 是一种单指令处理多数据流的并行处理技术,能够在批量数据操作时进行向量化加速,具有较高的执行效率,应用比较广泛。x86 平台的 SIMD 扩展指令集分为 MMX、SSE 和 AVX 几类,位宽从 64-512 位。鲲鹏平台的 SIMD 指令集是 NEON,也有一些开源库可用。而 intrinsic 是编译器自定义的一些 c 函数,我们调用 c 函数接口就可以使用底层的 SIMD 功能。

迁移过程中,一般使用 AVXtoNeon 和 SSEtoNeon 两个开源工程来迁移 intrinsic 函数。如果存在它们没能覆盖的部分就需要手动替换。

最后,华为还提供了 Porting Advisor 迁移工具来简化迁移过程。

乘上腾飞的翅膀——华为鲲鹏生态入门指南

Java、Python 代码迁移

Java 的代码迁移过程如下:
乘上腾飞的翅膀——华为鲲鹏生态入门指南

向鲲鹏平台迁移 Java 程序时,第一步是选择合适的 JDK 来安装。

乘上腾飞的翅膀——华为鲲鹏生态入门指南

第二步是迁移包含 SO 库的 jar 包。

乘上腾飞的翅膀——华为鲲鹏生态入门指南

这里需要对包含 x86 的 SO 库进行重编译,然后替换 SO 库,重新打包 jar 包。

最后是设置 JVM 参数来保证程序稳定快速运行。

乘上腾飞的翅膀——华为鲲鹏生态入门指南

JVM 参数要根据业务实际情况来灵活调整。

Python 的代码迁移过程如下:

乘上腾飞的翅膀——华为鲲鹏生态入门指南

Python 代码向鲲鹏平台迁移时,首先要将环境升级到 Python 3.x,其次要将 C 编译生成的 SO 库替换为 aarch64 版本,这是两大改动点。

Python 的环境升级很简单,主要针对含 C 或全 C 模块的迁移,核心都是对调用的 SO 库进行重编译,过程如下:

乘上腾飞的翅膀——华为鲲鹏生态入门指南

构建 Maven 软件仓库

Maven 是主流的 Java 开发工具之一,它有本地仓库、远程仓库和中央仓库三类软件仓。

乘上腾飞的翅膀——华为鲲鹏生态入门指南

远程软件仓一般基于 x86 架构,下载的 jar 包无法直接用在鲲鹏平台上。此时需要扫描软件依赖库,找出对应的 SO 库进行重编译和替换,之后重新构建项目直至不包含 x86 依赖项。

华为使用积累的 jar 包移植构建了鲲鹏的 Maven 软件仓,帮助开发者快速移植。为了让项目在编译时优先搜索这个仓,需要对搜索顺序做配置。

乘上腾飞的翅膀——华为鲲鹏生态入门指南


推荐阅读:华硕灵珑