【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

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

文喆

  • 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 日,还没报名参加的小伙伴速来了解报名~点击链接参与报名 &了解更多赛事详情


公众号推荐:

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

2020-08-05 23:071471

评论

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

移动平台打造新生态 | 助力企业跨业务、一站式、全场景的系统建设

WorkPlus

都有哪些较好用的项目管理软件?

优秀

项目管理 项目管理软件

Java27岁了——一次争执引起的Java内卷生涯

写代码两年半

javase Java EE 6月月更

【Spring 学习笔记(一)】第一个Spring程序与IoC思想

倔强的牛角

6月月更

直播回顾 | 7000字干货,深析区块链+汽车供应链金融的应用价值

旺链科技

区块链 产业区块链 供应链金融

哈希游戏开发竞猜系统哈希值hash算法

薇電13242772558

哈希算法

样品管理系统解决方案

低代码小观

Lims LIMS实验室信息管理系统 LIMS系统

开始使用DOCKER COMPOSE V2

mengzyou

Docker DevOps Docker-compose

从零开始搭建vue-cli项目

小恺

6月月更

架构实战营模块七作业

天琪实刚亮

动态路由协议之RIP协议,最古老的距离矢量协议!

wljslmz

IP 网络工程师 动态路由 6月月更 路由协议

@全球开发者|首届云原生边缘计算峰会邀您共话

华为云开发者联盟

云原生 边缘计算 kubeedge

阿里云刘珅孜:云游戏带来的启发——端上创新

阿里云弹性计算

gpu 元宇宙 云游戏

企业知识管理体系怎么搭建和运营?

小炮

LabVIEW控制Arduino采集LM35温度传感器数值(基础篇—12)

不脱发的程序猿

单片机 LabVIEW Arduino LIAT 采集LM35温度传感器数值

天猫精灵语音技能单轮对话表达式的参数定义

Jerry Wang

人工智能 机器学习 聊天机器人 机器人 6月月更

函数节流和函数防抖和他们的区别

工边页字

JavaScript 性能优化 前端 6月月更

2022年中国新能源汽车换电市场发展洞察

易观分析

新能源汽车

【云服务器】云计算平台的架构是什么样的?

Finovy Cloud

云服务器 GPU服务器

OceanBase 成为信通院首批可信开源社区、可信开源项目

OceanBase 数据库

中国信通院 OceanBase 开源

盘点校招面试 HR 可能会问到的问题

宇宙之一粟

面试 校招 6月月更

当AI抄起了水表

华为云开发者联盟

人工智能 modelarts workflow 智能水务

科创人·神州数码集团CIO沈旸:最佳实践模式正在失灵,开源加速分布式创新

科创人

王者荣耀商城异地多活架构设计

流火

【高并发】在高并发环境下该如何构建应用级缓存?

冰河

并发编程 多线程 高并发 异步编程 6月月更

华为云GaussDB首席架构师冯柯:摘取皇冠上的明珠,华为云数据库的创新与探索

华为云开发者联盟

数据库 华为云 GaussDB 国产数据库

一篇文章带你彻底了解哈希表

武师叔

算法 哈希表 6月月更

应用流程挖掘,发现潜在RPA可实施的场景,助力银行优化业务流程

易观分析

RPA

架构实战营模块七 作业

库尔斯

架构实战营

中国标准走进国际视野,首个零信任国际标准的诞生往事

脑极体

Docker的安装及日常命令的使用

Geek_982ff5

6月月更

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