注册

从鲲鹏创新应用大赛到软件迁移细节


来源:凤凰网广东综合

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

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 步骤:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

在迁移分析阶段,推出了分析扫描工具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 日

[责任编辑:罗嘉铭]

  • 好文
  • 钦佩
  • 喜欢
  • 泪奔
  • 可爱
  • 思考

热点推荐

专题推介

凤凰新闻 天天有料
分享到: