从应用迁移到平台微认证:山西鲲鹏训练营技术干货深度解读

2020 年 9 月 01 日

从应用迁移到平台微认证:山西鲲鹏训练营技术干货深度解读


8 月 27 日,华为 DevRun 开发者沙龙来到太原,在山西转型综合改革示范区管委会一层西厅会议室举办了“山西鲲鹏开发训练营”活动。本次鲲鹏开发训练营是在山西省工信厅和山西综改示范区管委会创新发展部的指导下,由山西鲲鹏生态创新中心举办的鲲鹏技术赋能活动。训练营主要分为鲲鹏生态介绍、鲲鹏应用代码迁移指导、C/C++和 Java 代码迁移沙箱实践及微认证几大环节。


鲲鹏生态概况介绍


山西鲲鹏生态创新中心 COO 于超为与会者介绍了鲲鹏生态的发展现状。于超提到,今天的人类社会正在迎来第四次工业革命,其代表性产业就是智能技术。在这一领域,华为鲲鹏芯片以 ARM 技术路线为主,在高性能计算、安全可靠和开放生态方面持续演进。鲲鹏架构在大数据、数据库、云服务、分布式存储和原生应用等场景已经有了规模化商业应用。华为鲲鹏秉持硬件开放、软件开源、使能合作伙伴的理念,为各行业提供“鲲鹏芯片+昇腾 AI”的多样化算力支撑,建设鲲鹏计算产业生态。



目前,全国已有 800 多家厂商和 2000 多个方案通过了鲲鹏生态认证。华为已与全国各省市政府部门合作,建设了 18 个鲲鹏生态创新中心。今年 7 月刚刚落成的山西鲲鹏生态创新中心是山西省信创产业“一号工程”中的重要环节,旨在为参加鲲鹏生态的企业和人员提供各种专业化服务,共同推进基于鲲鹏生态研发的企业应用创新及软件项目孵化活动。通过山西鲲鹏生态创新中心的技术支持,可以全面发展山西省鲲鹏计算产业市场,提升山西本地企业的竞争力,共同打造山西省的信创产业生态和创新高地。


未来 3-5 年,华为还计划将 15 亿美元投入高校的鲲鹏生态建设,与高等院校合作编制鲲鹏技术教材,共建师资团队、实验室和实训基地,开展职业认证培训考试等,从高校开始培养优秀的鲲鹏产业人才。


鲲鹏代码迁移指导


软件迁移是鲲鹏生态应用中的重头环节。本期训练营上,鲲鹏计算行业资深专家刘坤带来了鲲鹏软件迁移深度课程。


鲲鹏软件迁移概述


计算机应用程序使用高级编程语言写好代码后,会通过编译器编译成汇编语言,再生成二进制机器码。所谓 CPU 指令集架构是芯片底层和上层程序之间的桥梁,后者转化为指令序列,通过指令集架构中的指令执行。


鲲鹏处理器采用的是与 x86 指令集架构完全不同的 ARMv8 指令集,因此程序从 x86 平台向鲲鹏平台迁移时必须重新编译。一般情况下,软件迁移过程包括五大步骤:迁移准备、迁移分析、编译迁移、性能调优和测试认证。其中最重要的步骤是编译迁移。


  • 迁移准备:主要收集底层硬件和上层软件信息,准备编译环境(鲲鹏服务器或者OpenLab线上环境)。

  • 迁移分析:分析应用软件栈,包括其使用的语言、底层OS、中间件、依赖项、编译器、运行环境等。

  • 编译迁移:这一步分为两类,第一类是代码迁移,例如C/C++这类编译型语言,或Java/Python这类解释型语言的代码迁移;第二类是软件包,主要是RPM包和jar包的迁移。

  • 性能调优:迁移完成后通过优化工作实现预期的性能目标。

  • 测试认证:通过测试和认证工作确保迁移质量,不达标时要寻找原因再做调优。


为帮助开发人员降低应用的迁移门槛,华为还开发了鲲鹏软件迁移套件,主要有分析扫描工具、迁移工具和性能调优工具三大类别。


C/C++代码迁移


C/C++属于编译型语言,源码编译成可执行文件时要经过几个步骤:首先是预处理,处理一些头文件信息;然后生成预编译文件,再编译成汇编代码;之后经过汇编过程生成目标二进制文件,最后通过链接过程加入 SO 等链接,生成可执行文件。由于 x86 与鲲鹏的指令集架构、寄存器和扩展指令集(SIMD)等底层属性都不同,两者的汇编代码是不一样的,因此跨平台应用移植就需要编译迁移。


C/C++代码工程一般分为两类:编译构建脚本(如 makefile、Configure 等),和源码部分。前者迁移时主要涉及编译选项的变化,后者要涉及编译宏移植、builtin 函数、内联汇编、SIMD 等。实际应用迁移中不一定要触及所有层面,有些应用只需源码直接编译,或者修改一两个编译选项即可。应用迁移时首先获取源码,然后准备编译环境,生成 Makefile 文件,对依赖的 SO 库也做迁移处理,最后安装部署。


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


1.编译选项移植。


例如应用编译成 64 位时,x86 平台上使用 m64 选项,鲲鹏上则是 mabi=lp64,根据编译文档将有架构差异的编译选项对等替换即可。


2.编译宏移植。


编译宏是用来识别架构平台并选择对应代码分支的工具。编译器自带的编译宏在 x86 下只有两个,到鲲鹏平台时直接替换即可;用户自定义的编译宏也只需根据自己的写法自定义替换。但编译宏替换后,如果没有 ARM 对应的源码分支,就需要实现对应的功能。


3.builtin 函数移植。


builtin 函数是编译器内部实现的函数,需要迁移的不多,主要关注 CRC32 校验值计算的几个函数。


4.内联汇编移植。


内联汇编移植时有两种方法,一种是通过汇编指令一对一替换,关键在于指令到指令的替换思想;另一种是通过 builtin 函数替换,根据指令的功能选择对应的 builtin 函数。


5.SIMD 指令迁移。


SSE、AVX 都是 x86 平台的 SIMD 指令,SIMD 是单指令多数据流的简称,可用来加快计算速度。鲲鹏平台也有自己的 SIMD 指令,名为 Neon。x86 平台下的 SIMD 指令迁移到鲲鹏平台时,只需找到对应的函数替换实现即可。实践中一般不会逐条迁移,更推荐采用开源工程的移植途径。例如华为开源了一个工程,其中实现了大部分 SIMD 指令的替换。实践移植时,只需将开源头文件放到应用目录下引用即可无感知迁移,非常方便。



开源工程无法覆盖到的特殊指令需要手动替换,此时就需要搜索代码的实现原理进行替换,这一步可以请华为的工程师帮助。



为了简化应用迁移工作,华为还开发了 Porting Advisor 工具。它首先会扫描编译构建脚本源码,识别迁移可能涉及的问题;然后根据已有的迁移问题数据库对检测出来的问题给出指导,避免重复工作。前文提到的各类移植问题大都能在工具给出的迁移报告中有对应,按照指导操作即可。


Java/Python 代码迁移


Java/Python 是解释型语言,涉及的移植问题并不多见。Java 应用开发时,安装完 JDK 后用 JDK 填码,通过 Java 编译器编译生成字节码文件,根据需要打包一些资源库生成 jar 包,然后上传环境部署运行。Java 应用迁移时主要有两个步骤:


  • 重新安装JDK,例如x86下的Oracle JDK在鲲鹏平台上不支持,推荐使用OpenJDK替换。经典版本直接从软件源安装即可,也可以自行编译JDK源码。

  • SO库需要重编译。通过Porting Advisor工具扫描jar包,找出x86平台的SO库,之后对其进行移植生成鲲鹏平台的SO,再重新打包即可。


Python 代码移植的情况类似,也包括运行环境和 SO 库的迁移。运行环境的迁移没有难点,SO 库的迁移与 Java 的步骤是一样的。


Maven 软件仓构建


Maven 是常用的开源软件构建工具。Maven 仓库主要存放 jar 包,包括本地、远程和中央仓库三种类型。远程仓库是企业内部或第三方组织搭建的服务器,中央仓库是 Maven 团队自己设置的仓库。


Maven 仓库默认的 jar 包搜索顺序是本地-远程-中央,找到需要的 jar 包就拉取下来执行构建。但如果拉取下来的是包含 x86 平台依赖项的 jar 包,在鲲鹏平台上构建运行就会出错,还需要再分析扫描、打包编译等操作,过程比较繁琐。



为了简化操作,华为开发了鲲鹏专属的 Maven 仓库,包含常见的 jar 包移植版本。开发人员只需将 Maven 仓库的 XMR 配置文件改为优先搜索鲲鹏 Maven 仓就能快速找到鲲鹏平台的对应 jar 包,精简迁移过程,减少 Java 迁移的工作量。



以 Hive 编译实例为例,使用迁移工具扫描,发现应用中有四个带 x86 依赖项的 jar 包,那么配置好 Maven 仓之后就可以拉取对应的鲲鹏平台 jar 包,编译通过就可以完成移植了。


RPM 软件包迁移


RPM 是 Linux 下常用的软件包类型。RPM 包移植时本质上是移植一些二进制文件,将 x86 依赖的文件替换为鲲鹏平台的。移植时首先寻找有没有对应鲲鹏平台的 RPM 包,从以下渠道尝试获取:


  • 操作系统的本地源;

  • 操作系统的远端源;

  • 华为云鲲鹏镜像(包含很多鲲鹏平台上打好的RPM包);

  • x86下才有的RPM包可以拆开重构,将SO、二进制文件全部替换再打包;

  • 所有途径都失败,则下载源码重新编译。


RPM 包重构时,主要有扫描、编译、打包和验证几个步骤。扫描找出 x86 依赖项,依赖项有对应的 jar 包实现就直接替换,否则就用源码编译。之后替换打包再做验证。Porting Advisor 迁移工具提供了 RPM 包重构模块,可以充分利用鲲鹏 Maven 仓,自动扫描并找到已有的 jar 包替换实现进行替代。但如果是 SO 文件的差异就需要手动处理。


开发人员进行迁移工作时,可以参考鲲鹏社区、鲲鹏小智助手和开发者公众号三个渠道的资源。鲲鹏社区中有 24 小时答疑,还有丰富的迁移、性能调优文档以及很多问题的问答资料;鲲鹏小智助手可以方便地获取鲲鹏平台下具体的迁移问题指导;开发者公众号会定期发布一些技术资料。


迁移沙箱实践和微认证


沙箱实践


训练营的理论迁移课程结束后,还为现场小伙伴们安排了沙箱实践环节。沙箱环境是在线对外开放的,感兴趣的开发人员也可以自行联网尝试。


沙箱操作主要分三步:



  • 注册华为云账号,过程需要实名认证;

  • 华为云平台有OpenLab虚拟实验室,其中有四个沙箱实践:C/C++、Java、软件包和Maven仓。

  • 选定对应沙箱即可开始实验,云端会分配一个虚拟机,可以完成编译操作。开发人员可以根据网页上的实验手册与指导完成实验。


微认证


云端实验室有一个微认证模块,其中分为鲲鹏软件迁移与性能调优两门课程。购买认证后可以先学习课程、完成自测和实验,最后参加考试。考试需要实名认证,考试过程中还需要调用摄像头抓拍防止作弊,内容包括判断、单选和多选形式。通过考试后就会在线发放微认证证书。



本期训练营涉及的相关社区资源链接汇总如下:



2020 年 9 月 01 日 12:33511

评论

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

字节总监首发1121道LeetCode算法刷题笔记(含答案)

Crud的程序员

程序员 面试 算法 字节 面试刷题

话题讨论 | 那些年奇葩的面试经历

三号无名指

话题讨论

移动端技术方案设计的经验总结

张明云

android 架构 移动应用 架构师 技术方案

详解TCP IP网络协议栈底层原理到徒手实现

赖猫

c++ Linux 编程 程序 网络协议栈

史上最优美的Android原生UI框架XUI使用指南

android UI 框架开发

架构词典:SLA

lidaobing

架构 SLA

史上最实用的Android切片应用库XAOP使用指南

android aop 开源项目 框架

default-servlet-handler不生效原因,springmvc静态资源拦截方案比较

叫练

springmvc 静态资源拦截 default-servlet-handler 资源配置不生效

网络入门模拟器:Cisco Packet Tracer

网络技术平台

开源软件联盟PostgreSQL分会投稿指南

PostgreSQLChina

数据库 postgresql 软件 投稿

京东T8Java架构师总结整理的《15w字的Java面试手册》,涵盖了大厂所有主流技术面试题及答案!

Java成神之路

Java 程序员 架构 面试 编程语言

二本毕业、两年Javacrud经验,面试阿里侥幸通过成功拿到P6级offer,分享面经!

Java成神之路

Java 程序员 架构 面试 编程语言

我把Github上最牛b的Java教程和实战项目整合成了一个PDF文档

Java成神之路

Java 程序员 架构 面试 编程语言

史上最好用的Android全量版本更新库XUpdate使用指南

android UI 框架开发 xupdate

为什么说区块链完全去中心化做不到且没有意义

CECBC区块链专委会

区块链 去中心化

从构建小系统到架构分布式大系统,Spring Boot2的精髓全在这里了

Java成神之路

Java 程序员 架构 面试 编程语言

Java对IPv6的支持详解:支持情况、相关API、演示代码等

JackJiang

Java 网络编程 ipv6 ipv4

面试被问线程安全怎么保障,我的回答让面试官眼前一亮

996小迁

Java 学习 架构 面试 笔记

腾讯云区块链总经理李力:产业区块链的四大发展趋势

CECBC区块链专委会

区块链 大数据

天啊!怎么会有人把Spring Cloud微服务架构讲得这么透彻?

Java成神之路

Java 程序员 架构 面试 编程语言

一文搞懂RESTful API

bigsai

RESTful Rest

Flutter Plugin插件开发填坑指南

flutter 经验分享

技术博客,从零到数万访问,这两年我都做了什么

android 博客 经验分享

如何在高速发展中等一等老人 银行数字化服务显温度

CECBC区块链专委会

银行 养老服务

架构师训练营第12周作业

邓昀垚

roblox 杂记

katichar

Gemini双子新约软件系统开发|Gemini双子新约APP开发

开發I852946OIIO

系统开发

我是因为这个才选择当程序员的,那么你呢?

Java架构师迁哥

深入理解Git的实现原理

程序员小灰

c++ git Linux 项目管理 架构师

史上最全的开源项目创作指南

开源 经验分享

架构师训练营第 12 周总结

邓昀垚

从应用迁移到平台微认证:山西鲲鹏训练营技术干货深度解读-InfoQ