写点什么

从鲲鹏创新应用大赛到软件迁移细节,读完这篇文章全掌握

文喆

  • 2020-08-05
  • 本文字数:5115 字

    阅读完需:约 17 分钟

从鲲鹏创新应用大赛到软件迁移细节,读完这篇文章全掌握

7 月 29 日,【鲲鹏凌粤,展翅鹏城·鲲鹏应用创新大赛 2020·深圳赛区宣讲会】通过线上直播的形式成功举办。此次宣讲会上,不仅有来自鲲鹏产业源头创新中心的专家们向广大开发者讲解深圳赛区赛题、赛制以及更多的参赛技巧,来自华为鲲鹏的计算专家们也向开发者在线解读了鲲鹏生态的发展和软件迁移所涉及的技术细节。


当前,鲲鹏计算产业进入了高速成长期, 深圳作为鲲鹏计算产业的示范区正加快鲲鹏生态体系建设,目前已建立了 1 个基地、2 个分中心以及全国首个鲲鹏云学院,同时认证了 261 家企业。通过在优势场景上进行的深度合作,鲲鹏也为政府金融、运营商、电力、互联网等广大行业提供着基于鲲鹏计算平台的基础设施搭建和解决方案。

开源共建鲲鹏生态

随着应用移动化与数据多样性的迸发,多样性算力需求日益提升,基于 ARM 架构来设计的鲲鹏,早早便看到了未来计算产业的发展之路。目前,鲲鹏生态已扩大至基于鲲鹏处理器构建的全栈 IT 基础设施、行业应用及服务,包括鲲鹏服务器、云服务、存储、操作系统、中间件、虚拟化、数据库等。



在上图的鲲鹏基础生态汇总中,鲲鹏体系中的软件生态基本支持所有主流软件,如:Web 支持 Nginx、Apache、Tomcat;中间件支持 Memcached、Redis、Kafka;数据库支持 MySQL、Mariadb、PostgreSQL;大数据支持 Hadoop、Hive、HBase;编译工具支持 Ruby、Perl、Python;开发工具支持 Open SDK;操作系统支持 EulerOS、Ubuntu、中标麒麟 OS 等。


秉持着“硬件开放、软件开源、使能伙伴”的初心,华为将自己在服务器操作系统领域的长期积累开放出来,希望通过 openEuler 与国内主流操作系统厂商共建共享 Linux 操作系统生态。而在工具链层面,鲲鹏则提供了完善的代码迁移、优化加速,编译工具,同时联合各大开源社区,实现了常见的基础软件和中间件对鲲鹏的支持,方便开发者做应用开发和应用迁移。而这一系列开放开源的操作,也反向推动着鲲鹏计算产业生态的发展。

鲲鹏云服务,开启多元新架构

华为云鲲鹏云服务涵盖裸机、虚拟机、容器等多形态,具有多核高并发的优势特点,在鲲鹏云服务使用上,提供了和 x86 一致的使用体验,开发者使用鲲鹏上的云服务也不会产生任何的阻碍。



鲲鹏云提供了弹性云服务器 ECS、裸金属服务器 BMS 等计算服务,开发者可通过云硬盘来为 ECS、BMS 等计算服务提供持久性块存储;在容器服务方面,提供了鲲鹏 Kubernetes 容器、鲲鹏 Serverless 容器,支持 x86 和鲲鹏节点的混合管理,兼容 K8s 和 Docker 原生接口具有 4 大优势:


1、多平台自适应混部:支持同一容器集群对 x86 和鲲鹏节点进行混合管理;根据节点 CPU 架构,自动拉取相应平台的容器镜像,实现应用从 x86 架构的自动适配、跨平台弹性扩容、分批次迁移;


2、高性能:鲲鹏容器底层采用 NUMA 架构,在芯片的负载均衡方面占有优势,通过 NUMA 自动亲和优化使性能有非常明显的提升;鲲鹏 Serverless 容器提供鲲鹏容器秒级发放,Volcano 支持鲲鹏集群发放速度达 1000 容器/秒;


3、应用无感迁移:一键式从源码到多平台容器镜像版本的构建、 部署、发布能力 快速将原有的 x86 应用迁移到鲲鹏平台;


4、极速 AI 容器:Volcano 支持 MindSpore、Tensorflow 等 多种 AI 训练框架,提供练任务算力灵活调度分配,支持 AI 任务的调度亲和优化,多任务并行资源优化;


在提升鲲鹏云服务交付能力上,鲲鹏技术专家讲解到,后续不论是私有云还是公有云,都将基于统一的擎天架构实现软硬件协同,然后通过华为云瑶光智慧云脑去进行统一的调度,打通公有云与私有云,实现两云之间的平滑迁移。

鲲鹏软件迁移指南

因为鲲鹏与 x86 使用的指令集存在差异,使得软件需要经过重新编译才能迁移至鲲鹏平台,通过大量项目和经验总结,会上专家讲解了软件鲲鹏迁移需要注意的 5 个步骤。



软件迁移 5 步骤:


  1. 迁移准备 – 收集软件栈信息,准备迁移环境

  2. 在这个阶段,主要收集硬件和软件信息。硬件方面的信息主要是收集芯片和服务器的型号,从而方便提供配置性能差不多的鲲鹏服务器;其次是收集软件栈信息,主要分为操作系统、虚拟机、中间件、编译器、上层依赖的开源软件、商业软件、业务软件等信息。

  3. 迁移分析 – 分析软件栈,指定迁移策略

  4. 迁移分析要做的,就是对收集到的信息和软件栈做初步分析,判断是否真正需要迁移,评估迁移的工作量。


对开源软件来说,直接下载在 ARM 上已经被编译好的包,或者自行下载原码进行编译就可以了。自研软件的迁移则需要注意语言类型的差异,编译型语言需要重新编译之后才能运行在新环境上,不过对于解释型的语言来说只要更换所依赖的虚拟机就可以。对于商用软件,可以通过联系厂商获取它对应 ARM 架构下的软件版本,如果没有的话就需要寻找有类似功能的软件做替换。此外像运行环境、虚拟机、编译器和操作系统这些也是要进行替换,可以直接去华为云鲲鹏论坛内有软件仓库下载由鲲鹏官方所做的经过验证的版本。


  1. 编译迁移 – 软件编译打包,验证基本功能

  2. 在这一阶段,涉及到代码迁移和软件包迁移两种场景。对代码的迁移,不同语言要做不同的修改,像 C/C++ 这种编译性语言需要重新进行编译,因为涉及到指令级,跟指令级相关性比较大,所以在编译脚本、代码都需要做出修改,但是对纯解释性语言开发的应用来说,它们的程序代码是不需要修改的。


对于软件包迁移来说,首先需要扫描该软件包是否存在依赖库或者依赖的可执行程序,这些库和可执行程序如果是用 C 语言写的是需要重新编译的,编译之后重新把软件包打包即可。


  1. 性能调优 – 利用五步法优化软件性能

  2. 在迁移完成之后需要对性能进行调优,有【建立基准 - 压力测试 - 确定瓶颈 - 实施优化 - 确认效果】五个步骤。


建立调优基准,该基准根据当前的硬件配置、组网、测试模型来做综合评估,以建立合理的条有目标;其次在调优目标建立后,通过压测工具对软件或系统进行加压,在加压过程中暴露性能瓶颈,确定瓶颈之后对瓶颈进行优化;第四,注意在优化过程中要及时记录,因为优化并不一定是正向的,出现负向优化时需要及时回退;最后在优化措施实施完成后,需要重新启动压力测试工具以确认优化效果。


  1. 测试与认证 – 保证商用上线,共建鲲鹏生态

  2. 在性能调优环节结束后,需要做一些压力测试、长稳测试,使软件能够达到商用的目标,最后实现规模上线。此外也可以拿软件和系统到鲲鹏上做鲲鹏展翅认证,其可以扩展应用的软件使用空间并能够加入鲲鹏生态。


了解完鲲鹏迁移的五步法,最后看一下华为鲲鹏开发套件,因为在迁移过程中可能会涉及到怎么进行代码迁移、怎么进行性能调优一系列的问题,为此华为开发了一系列的开发套件,帮助开发者完成分析、迁移和调优的过程。



在迁移分析阶段,推出了分析扫描工具 Kunpeng Dependency Advisor 帮助开发者扫描代码所链接的一些依赖库,进行代码初步的评估;在编译迁移阶段,推出了代码迁移工具 Kunpeng Porting Advisor,帮助开发者扫描构建脚本和源码,给出完善的移植指导;在性能调优阶段,推出了性能优化工具 Kunpeng Tuning Kit,能够做全景资源的监控,针对其中可能出现的热点函数进行监控生成相应的火焰图,帮助开发者分析相应的热点,给出业务化指导意见,帮助开发者更好的做好性能调优。以上就是鲲鹏软件迁移的概述。

C/C++ 代码迁移法则全掌握

C/C++是非常典型的编译型语言,编译型语言所开发的程序从 x86 平台移植到鲲鹏平台时一般都需要重新编译才能运行。编译构建脚本类文件在迁移过程中,一般会涉及到编译选项的移植,源码类文件会涉及到编译宏,另外可能还会有编译器自带的 Builtin 函数的移植、SSE intrinsic 函数移植等。



在 C/C++ 代码编译构建过程有一般涉及六大步骤:


1、首先是获取源码,可以通过 GitHub 等开源社区来获取;


2、其次需要选择所需的编译环境,就是安装编译器 gcc 等;


3、之后根据源码的编译脚本生成 Makefile 文件,再用 Makefile 编译生成可持续文件;


4、执行行 makefile 编译可执行程序;


5、如果这部分代码之中有依赖 x86 平台的 SO 库,那么这部分的依赖库是需要重新编译替换的;


6、在编译完成之后进行安装部署,之后进入到实际的系统之中进行测试;


典型的移植类问题


在对编译构建的流程有基本理解后,就需要深入了解实际迁移过程中所涉及到的各种移植项。


1、编译脚本和编译选项的移植



以上图为例,其中 x86 下 -m64 代码的主要功能是将应用程序编译为 64 位,对应到鲲鹏上是用 -mabi=lp64 的编译选项。上文有提到这编译选项需要在脚本中修改,对应的 Cmakelists 里有可能存在 add_defin 等多种定义方式。


再看常用的数据类型移植,众所周知 x86 平台上默认的 char 类型是一种有符号的类型,对应到鲲鹏上则是无符号类型。因此在移植过程中需要显示定义并将 char 类型定义为有符号。一种方法是在源代码里加上 signed char,但是缺点是可能改不全从而引发一些不可预知的问题。另一种方法是直接用 fsigned-char 来修改,在不同架构下差异化的编译选项也可以通过 gcc 文档进行查询。


2、编译宏移植



编译宏的作用就是让编译器知道编译哪些分支代码能够在不同架构下达到最优性能。如何对编译宏下面的代码实现移植 x86 代码上有些编译器自带自定义宏,比如 smd 属性相关的宏在 x86 上是 SSE 开头的宏,对应到鲲鹏平台上就需要自定义它的编译宏和所相对应的分支。


3、Builtin 函数移植



通过上图可以看到在 x86 平台上其和在鲲鹏平台上是类似的,从命名来看有差异的地方就只存在于架构。


Builtin 函数是编译器自带的函数,其在实际迁移项目中相当常见,主要是 crc32 校验值的计算。需要移植的普通 builtin 函数实际并不多,大部分需移植的 builtin 函数集中在 SSE intrinsic 函数内。


4、内联汇编函数的移植



上图列举了将字节序进行反序的例子,比如 0X56781314 反序输出的是 0X14137856,x86 上对应的是 bswap 指令,鲲鹏对应的是 rev 指令,其它有些操作和寄存器都是基于内联汇编的语法规则进行替换的。上图的另一个例子是 Builtin 函数,列举了内联汇编转换用鲲鹏上面的 Builtin 函数做替换的例子。比如 popcount 是对二进制数里面的 1 进行计数,对应到鲲鹏平台上所替换的是 popcountll。


5、SSE intrinsic 函数移植(SIMD 技术简介)



SIMD(Single Instruction Multi Data) 是一种单指令处理多数据流的并行处理技术,能够在批量数据操作时进行向量 化运算加速,具有较高的执行效率,在多媒体处理、矩阵运算等场景都有广泛的应用。


Intel 的 SIMD 扩展指令统称 SSE,主要分为三类,MMX 是 64 位寄存器,SSE 到 SSE4 是 28 位的,三是 AVX256 和 AVX512。鲲鹏基于 SIMD 的技术发展比较成熟,现在有些基于开源量的 NEON 库主要是在图象处理和视频处理层面。


6、SSE intrinsic 函数移植(MMX/SSE)



以上图为例,针对 MMX 指令,x86 上用的是 -m64 的向量做加法运算,对应到鲲鹏上是 int32×2 然后再做加法运算,类似于常用的 C 函数规则;针对 SSE 指令,从内存中加载 4 个单精度浮点数据到寄存器,x86 是 load,对应到鲲鹏用的是 vld1q。


7、SSE intrinsic 函数移植方法



以上就是 C/C++代码的主要内容,这部分主要是从 C/C++代码的编译原理及构建流程开始介绍,重点是对其中的移植类进行讲解分析,让大家了解到这七类移植问题。比如编译选项移植、编译宏移植、builtin 函数移植、内联汇编移植、SSE intrinsic 函数移植。在实际的迁移过程中,如果遇到相应的一些问题可以对号入座,找到对应的所属的移植项。

鲲鹏应用创新大赛 2020·深圳赛区邀您乘风破浪

鲲鹏应用创新大赛 2020 火热进行中!现面向全产业开发者开放报名通道,共同打造鲲鹏全栈解决方案,实现技术与商业创新应用。参赛队伍需基于鲲鹏计算技术构建产品与解决方案,包含华为云鲲鹏云服务、鲲鹏主板、鲲鹏服务器等产品,打造各个不同场景的软硬件解决方案。此次大赛本次采用的是 13 个创新中心+一个线上通道模式的运作,大赛整体分为创新区域赛、全国半决赛、全国总决赛的方式。


作为 13 大赛区的之一,深圳赛区设置了 5 个赛道,分别为“金融行业创新解决方案”、“数字政府创新解决方案”、“大数据创新解决方案”、“ARM 原生创新应用”和“开放命题”,参赛参队伍可以基于以上赛道打造各个不同场景的软硬件解决方案。获胜队伍将由深圳区域赛推送至全国半决赛再到全国总决赛。


参赛队伍要取得好成绩,需要注意以下几点:


1、选好作品,解决方案应该足够成熟、应用广泛、有鲜明特色;


2、软件适配鲲鹏平台时要改造彻底,并根据鲲鹏架构做针对性改进和创新;


3、需要准备完整的测试报告,展示报告中要清晰展示方案的架构、功能、价值、前景和优势等要素。


深圳赛区在将 8 月 21 日进行线下评比,奖项设置丰厚,除了 50 万元现金激励还有多种附加权益等你来拿,报名截至日期为 8 月 15 日,还没报名参加的小伙伴速来了解报名~点击链接参与报名 &了解更多赛事详情


2020-08-05 23:071690

评论

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

spring-boot-devtools 快速重启的秘密

4ye

Java spring 程序员 后端 签约计划第二季

一文读懂敏捷开发的发布策略

华为云开发者联盟

DevOps 运维 敏捷 开发 发布策略

使用HTML+CSS制作逼真的红色开关

海拥(haiyong.site)

CSS html 大前端 Demo 签约计划第二季

面试官:final、finally、finalize 有什么区别?

王磊

java面试

【死磕Java并发】-----J.U.C之深入分析CAS

chenssy

11月日更 死磕 Java 死磕 Java 并发

元宇宙是人类文明不可避免的一次内卷

CECBC

OpenELB 进入 CNCF Sandbox,让私有化环境对外暴露服务更简单

青云技术社区

云计算 云原生

AOP 插件就这?上手不用两分钟!!

4ye

Java spring 程序员 后端 签约计划第二季

从1天到10分钟的超越,华为云DRS在背后做了这些

华为云开发者联盟

数据库 数据 报表 华为云DRS 在线交易

Python Qt GUI设计:QClipboard剪贴数据类(基础篇—19)

不脱发的程序猿

Python PyQt GUI设计 QClipboard 剪贴板

架构训练营 - 模块五

Geek_9de3de

架构实战营

架构训练营 - 模块六

Geek_9de3de

架构实战营

Spring AOP内功修炼

4ye

Java spring 程序员 后端 签约计划第二季

GitHub上星标39.9k+的开源类库,忍不住分享下

沉默王二

Java

面试官:说一下final关键字和final的4种用法?

王磊

激发数字新活力 打造发展新优势

CECBC

微信程序开发系列教程(一)开发环境搭建

汪子熙

JavaScript node.js 微信 11月日更 微信开发

Python量化数据仓库搭建系列3:数据落库代码封装

恒生LIGHT云社区

量化投资 量化交易 量化

面试官:int和Integer有什么区别?为什么要有包装类?

王磊

中国首批区块链订单融资缘何落地雄安?

CECBC

在线文本并集计算工具

入门小站

工具

使用JDK自带的VisualVM进行Java程序的性能分析

汪子熙

Java jdk 性能 性能调试 11月日更

「Oracle」Oracle数据库基本概念

恒生LIGHT云社区

数据库 oracle

[Pulsar] 消息的消费

Zike Yang

Apache Pulsar 11月日更

DDD领域驱动设计落地实践系列:战略设计和战术设计

慕枫技术笔记

Java 后端 签约计划第二季

Rust 元宇宙 7—— 异步和消息

Miracle

rust 异步 元宇宙

12.04 Serverless Meetup 深圳站 | Call 你来参加

阿里巴巴云原生

阿里云 Serverless 云原生 活动

如何用JavaScript实现2+2=5?

汪子熙

JavaScript 大前端 语音识别 语音合成 11月日更

使用ES6编写一个超简单的搜索算法

吴脑的键客

JavaScript 大前端

29 K8S之ReplicaSet控制器

穿过生命散发芬芳

k8s 11月日更

架构营模块五作业

GTiger

从鲲鹏创新应用大赛到软件迁移细节,读完这篇文章全掌握_开源_InfoQ精选文章