阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

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

王强

  • 2020-07-16
  • 本文字数:4083 字

    阅读完需:约 13 分钟

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

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 软件仓,帮助开发者快速移植。为了让项目在编译时优先搜索这个仓,需要对搜索顺序做配置。


软件包迁移

常见的应用程序包含多种类型的文件,可用 rpm 来打包。rpm 包移植到鲲鹏平台时,需要将 SO、二进制文件等都替换为鲲鹏平台的对应文件。



无法获取支持鲲鹏平台的 rpm 包时,就需要对 x86 包进行重构或下载源码自行编译安装。


在重构 rpm 包时主要分为四个阶段:



这个过程可以使用鲲鹏的 Porting Advisor 开发工具辅助。它可以自动扫描软件包,自动从 Maven 软件仓下载依赖项并打包。但如果 Maven 上没有所需的依赖项,则依旧需要手动编译和打包。

2020 鲲鹏应用创新大赛介绍

由鲲鹏产业源头创新中心举办的 2020 年鲲鹏应用创新大赛正在进行中,此次大赛旨在培养鲲鹏产业发展所需的,基于鲲鹏生态的软件适配、迁移、软件开发、解决方案孵化等研发能力,实现技术与商业创新,为全球企业用户创造更多高价值应用产品与解决方案。


本次大赛面向具备软件开发背景和解决方案的企业参赛者,同一家企业允许多个不同解决方案的团队报名参赛。每支队伍人数不超过 5 人。


本次大赛为区域赛与全国决赛两级赛制,7 大赛题同步进行,决赛中每个赛题将分别评选出 1 个金奖方案及 2 个银奖方案,奖金池总计 500 万元。7 大赛题包括大数据创新解决方案、数字政府创新解决方案、openEuler 商业应用迁移、ARM 原生创新应用、金融行业创新解决方案、openEuler 开源系统迁移和开放命题。


比赛时间安排如下,参赛信息可访问https://www.huaweicloud.com/kunpeng/activity/kunpeng_competition20.html具体了解。


公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

2020-07-16 19:022562

评论

发布
暂无评论
发现更多内容

前端设计模式——桥接模式

EquatorCoco

前端 桥接模式

语音房源码搭建技术分享之降噪功能详解

山东布谷科技

软件开发 源码搭建 语音房源码 语音房

EMAS热修复Sophix适配App加固的技术方案

移动研发平台EMAS

阿里云EMAS 移动热修复 app热修复 app加固

软件测试/测试开发丨函数式编程学习笔记

测试人

Python 程序员 软件测试 函数式

国内首批!腾讯云EdgeOne通过信通院边缘计算最新评估

Geek_2d6073

Spring容器获取Bean的9种方式 | 京东云技术团队

京东科技开发者

spring Spring Boot bean 企业号 7 月 PK 榜

把LangChain跑起来的3个方法 | 京东云技术团队

京东科技开发者

人工智能 LLM langchain 企业号 7 月 PK 榜

融云观察:社交大佬发家史,模仿才是终极成功学密码?

融云 RongCloud

微信 网络 通信 社交 场景

构建松耦合和高内聚的软件系统:重要性和实践原则

2756

高内聚 架构设计原则 #微服务

inBuilder今日分享丨系统集成系列之异构接入

inBuilder低代码平台

集成

技术分享| 融合通讯的架构介绍

anyRTC开发者

音视频 MCU mesh SFU 融合通讯

HarmonyOS极客松“上分秘籍”! 高手们顶峰相见!

HarmonyOS开发者

HarmonyOS

中国信通院联合腾讯安全发布《数据安全治理与实践白皮书》

Geek_2d6073

Net DB Web多级缓存的实现

不在线第一只蜗牛

HTTP net web api

早8人的效率工具六件套

树上有只程序猿

JMeter 并发压力测试指南:从设置到结果分析

Liam

Jmeter 性能测试 接口测试 API 测试工具

ChatGPT越来越火,大厂体验设计师纷纷“毕业”?

博文视点Broadview

荣登榜首!云起无垠领榜“CCIA潜力之星”

云起无垠

分布式事务的几种实现方式 | 京东云技术团队

京东科技开发者

事务 分布式, 企业号 7 月 PK 榜

可信数据库大会,不见不散!

KaiwuDB

KaiwuDB 2023可信数据库发展大会

腾讯云DSQL-C MYSQL 版本测评

i查拉图斯特拉如是说

MySQL sql 腾讯云

Python案例分析|21点扑克牌游戏 | 社区征文

TiAmo

Python 数据分析 年中技术盘点 21点扑克游戏

对线面试官-Redis(五 为什么这么快为什么能抗住高并发)

派大星

Java 面试题

ReentrantLock源码解析 | 京东云技术团队

京东科技开发者

线程 企业号 7 月 PK 榜 并发问题

实战一个自己用的node-cli

互联网工科生

Vue Node cli

为了娃的暑期课,老父亲竟然用上了阿里云高大上的 Serverless FaaS!!!

WuKongCoder

云计算 阿里云 Serverless

请把这6个效率神器给我焊在电脑上

伤感汤姆布利柏

码住!ChatGPT的五大开源替代方案

这我可不懂

人工智能 工具 ChatGPT

Linux Bash Shell 中变量的 5 个易错点

快乐非自愿限量之名

Linux 变量 教程 教程分享

得物社区推荐精排模型演进

得物技术

推荐系统 排序 算法、

乘上腾飞的翅膀——华为鲲鹏生态入门指南_语言 & 开发_InfoQ精选文章