目录
- 鲲鹏软件迁移概述
-
- 为什么要做软件迁移
-
- 计算技术栈与程序执行过程
- 鲲鹏处理器与x86处理器的指令差异
- 软件迁移过程概述
-
- 五个步骤完成软件迁移
-
- 迁移准备——搜集软件栈信息,准备迁移环境
- 迁移分析——分析软件栈,制定迁移策略
- 编译迁移——软件编译打包,验证基本功能
- 性能调优——利用五步法优化软件性能
- 测试与认证——保障商用上线,共建鲲鹏生态
- 典型案例
-
- 华为内部项目:大型平台软件历时4个月完成规模商用
- 互联网行业伙伴快速实现软件迁移
- 金融行业核心系统整体切换案例
- 鲲鹏开发套件,使能开发者,加速算力升级
- C/C++代码迁移
-
- 编译性语言源码——可执行程序过程介绍
-
- 从源码到可执行程序——编译性语言
- C/C++代码编译构建过程
- C/C++代码迁移典型移植类问题
-
- 代码迁移——编译迁移、编译选项移植
- 代码迁移——编译迁移、编译宏移植
- 代码迁移——builtin函数移植
- 代码迁移——内联汇编函数移植
- 代码迁移——SSE intrinsic函数移植
-
- 代码迁移- SSE itrinsic函数移植(MMX/SSE)
- 代码迁移SSE intrinsic函数移植(AVX)
- 代码迁移一SSE intrinsic函数移植方法
- 迁移工具——Porting Advisor初步代码扫描
- 本章总结
- Java/Python代码迁移
-
- Java代码迁移
-
- 从源码到可执行案例
-
- 安装合适的JDK版本
- 包含SO库调用的jar包迁移方法
- 设置JVM参数,稳定快速的运行程序
- 案例分析
-
- 源码编译、安装OpenJDK9
- netty-all-4.1.34.Final.jar迁移
- JVM参数设置,解决服务挂死问题
- Java迁移小结
- Python代码迁移
-
- 从源码到可执行案例
- 典型迁移场景处理
-
- 升级Python版本
- 含C模块或全C模块的迁移
- 案例分析
-
- numpy-1.18.1模块迁移
- Maven仓软件构建
-
- Java构建工具
- Maven介绍
- Maven依赖管理
- Maven仓库分类
- Maven仓库搜索顺序
- Maven仓库软件构建流程
- 鲲鹏Maven
- 如何配置优先搜索鲲鹏Maven仓
- 鲲鹏Maven仓库软件构建流程
- Hive编译指导
- 鲲鹏Maven仓编译Hive
- 软件包迁移
-
- rpm介绍
-
- rpm软件包组成
- rpm软件包获取渠道
- 传统rpm重构流程
-
- 扫描
- 编译
- 打包(鲲鹏上重新生成rpm包)
- 验证
- rpm迁移
-
- 鲲鹏开发套件Porting Advisor
- Porting Advisor工具实现迁移自动化
- 环境准备
- Porting Advisor快速重构rpm包流程
- rpm迁移实例
鲲鹏软件迁移概述
为什么要做软件迁移
计算技术栈与程序执行过程
鲲鹏处理器与x86处理器的指令差异
int main(){int a = 1;int b = 2;int c = 0;c = a + b;return c;
}
软件迁移过程概述
五个步骤完成软件迁移
迁移准备——搜集软件栈信息,准备迁移环境
迁移分析——分析软件栈,制定迁移策略
编译迁移——软件编译打包,验证基本功能
性能调优——利用五步法优化软件性能
测试与认证——保障商用上线,共建鲲鹏生态
典型案例
华为内部项目:大型平台软件历时4个月完成规模商用
互联网行业伙伴快速实现软件迁移
金融行业核心系统整体切换案例
鲲鹏开发套件,使能开发者,加速算力升级
C/C++代码迁移
编译性语言源码——可执行程序过程介绍
从源码到可执行程序——编译性语言
- 编译性语言:典型的如C/C++/Go语言,都属于编译性语言。编译性语言开发的程序在从x86处理器迁移到鲲鹏处理器时,必须经过重新编译才能运行
- 从源码到程序的过程:源码需要由编译器、汇编器翻译成机器指令,再通过链接器链接库函数生成机器语言程序
C/C++代码需移植的原因: - 架构差异: x86和鲲鹏处理器(aarch64)属于不同的架构
- 指令集差异: x86–复杂指令集,鲲鹏处理器–精简指令集
- 向量寄存器差异: x86和鲲鹏处理器使用向量寄存器不同,向量指令集也存在差异
C/C++代码编译构建过程
** C/C++代码工程主要包括两类文件:**编译构建脚本、C/C++源码
可能设计的移植项
- 编译构建脚本类文件
编译选项的移植(指定数据类型、生成代码特性、目标执行器架构、处理器硬件加速功能等) - C/C++源码类文件
编译宏移植(用户自定义宏移植、编译器自定义宏移植)
编译器自带builtin函数移植
内联汇编移植
SSE intrinsic函数移植(MMX/SSE类函数移植、AVX函数移植)
- 获取源码:通过github或第三方开源社区获取
- 准备编译环境:安装编译器gcc等
- 使用源码中的Makelists.txt或configure脚本生成makefile
- 执行makefile编译可执行程序
- 替换依赖库:重编译或替换依赖X86平台的so库
- 将可执行程序安装部署到生产或测试系统
说明: configure脚本也常由源码中的autogen.sh或bootstrap.sh脚本执行后产生
C/C++代码迁移典型移植类问题
代码迁移——编译迁移、编译选项移植
- Cmakelists.txt文件修改
●add_ definitions( -Wall -mabi=lp64 -9)
●set(CMAKE_ CXX_ FL AGS “-Wall – mabi=lp64-g” )
●add_ compile_ options(-Wall -mabi=lp64 -9) - Makefile文件修改
cc/g++ -Wall -mabi=lp6A -9 -0…-…
链接: https://gcc.gnu.org/onlinedocs/gcc- 7.3.0/gcc/Submodel-Options.html#Submodel-Options
代码迁移——编译迁移、编译宏移植
代码迁移——builtin函数移植
代码迁移——内联汇编函数移植
内联汇编规则参考: https://gcc.gnu.org/onlinedocs/gcc/Using-Assembly-Language-with-C.html#Using-Assembly-Language-with-C
代码迁移——SSE intrinsic函数移植
- SIMD(Single Instruction Multi Data)是一 种单指令处理多数据流的并行处理技术,能够在批量数据操作时进行向量化运算加速,具有较高的执行效率,在多媒体处理、矩阵运算等场景都有广泛的应用。
代码迁移- SSE itrinsic函数移植(MMX/SSE)
代码迁移SSE intrinsic函数移植(AVX)
代码迁移一SSE intrinsic函数移植方法
➢方法1: 基于avx2neon.h、SSE2NEON.h开源文件移植
- 鲲鹏AvxToNeon开源 工程: https://github.com/kunpengcompute/AvxToNeon
- 包含SSE类intrinsic函数的NEON实现(字符串比较、crc32值计算、 popcnt计算等)
- 包含基础的AVX256、AVX512类intrinsic函数的NEON实现 (Load、 strore、 运算、移位等操作指令)
- 开源的SSE2NEON工程: https://github.com/DLTcollab/sse2neon/blob/master/sse2neon.h
- 主要实现SSE类intrinsic函数替换(整数、单浮点数据类型)
涵盖基础的load、strore、 set、 运算操作等指令的NEON实现
➢方法2: 手动替换移植 - SSE Intrinsics Guide网站: https://software.intel.com/sites/landingpage/IntrinsicsGuide/
- NEON Intrinsic Guide网站: https://developer.arm.com/architectures/instruction-sets/simd-isas/neon/intrinsics
- 在需移植文件中添加头文件 arm_ _neon.h
迁移工具——Porting Advisor初步代码扫描
- Porting Advisor是一 款华为鲲鹏代码迁移工具,针对C/C+ +代码进行扫描分析,检查用户C/C+ +代码中需移植修改的MakeFile编译文件、X86汇 编及SSE intrinsic函数,并指导用户如何移植。
- 鲲鹏开发套件- Porting Advisor:
https://www.huaweicloud.com/kunpeng/software/portingadvisor.html
➢以大数据中的Impala组件为例
本章总结
- 本章简要介绍:了C/C+ +代码的编译原理及构建流程,重点对典型迁移类问题及方法进行详细介绍。
最后引入Porting Advisor开发工具,帮助学员快速、高效的完成C/C+ +代码迁移。 - 核心类移植项及迁移方法:
- 编译选项移植:关注平台差异项(用好编译器官方文档)
- 编译宏移植:区分编译器/用户自定义宏移植
- builtin函数移植:关注常用builtin函数替换
- 内联汇编移植:识别核心汇编指令,用好汇编指令/builtin函数替换
- SSE intrinsic函数移植:开源工程、官网指导手册相结合
Java/Python代码迁移
Java代码迁移
从源码到可执行案例
安装合适的JDK版本
包含SO库调用的jar包迁移方法
设置JVM参数,稳定快速的运行程序
案例分析
源码编译、安装OpenJDK9
netty-all-4.1.34.Final.jar迁移
JVM参数设置,解决服务挂死问题
Java迁移小结
- 改动点:安装JDK版本
- 通过yum安装
- 源码编译安装
- 引用的SO库需重新编译
- 根据业务实际情况,调整JVM参数
Python代码迁移
从源码到可执行案例
典型迁移场景处理
升级Python版本
含C模块或全C模块的迁移
案例分析
numpy-1.18.1模块迁移
Maven仓软件构建
Java构建工具
Maven介绍
Maven是Apache下的一个纯Java开发的开源项目,基于项目对象模型(缩写: POM) ,可以对Java项目进行构建、依赖管理
- Maven官网链接: http://maven.apache.orgl
- Maven’下载链接: http://maven.apache.org/download.cgi
- Maven安装指导: http://maven.apache.org/install.html
Maven依赖管理
在Java世界中,可以用groupld、 artifactld、 version组成的Coordination (坐标)唯一标识一个依赖。
pom.xm|文件中一个典型的依赖引用如下图,Maven编译时会自动拼接路径和文件名, 去本地或远程仓查找。
Maven仓库分类
- 本地仓库
存储在本地磁盘,默认在${user.home}/.m2下 - 远程仓库
般使用国内镜像或者公司自己搭建私服,可以加快jar包下载速度。 - 中央仓库
Maven团队维护的jar包仓库:http://repo1.maven.org/maven2/
Maven仓库搜索顺序
Maven仓库软件构建流程
Maven软件构建关键流程:将X86依赖文件替换成Kunpeng依赖文件,重新构建,直到不包含X86依赖
鲲鹏Maven
Maven仓部分jar包依赖x86 so,无法在鲲鹏上直接使用,需要在鲲鹏上重新编译,部分jar包已编译好放在鲲鹏maven仓内,可以直接使用。
鲲鹏Maven链接: htps://mirrors.huaweicloud.com/kunpeng/maven/
如何配置优先搜索鲲鹏Maven仓
前面已了解Maven仓库搜索顺序,可以将鲲鹏Maven远程仓库放在首位,以便Maven优先下载鲲鹏平台jar包。由于鲲鹏Maven仓只放了arm相关jar,所以jar包不全,可以配置第二个Maven远程仓库,当鲲鹏Maven仓搜索不到时,会自动搜索下一个Maven远程仓库。
配置方法
- 编辑配置文件
${maven.home}/conf/settings.xml - profiles标签 下增加鲲鹏Maven仓
<profile>。。。<repositories><repository><id>kugpeng</id><url>https://mirrors.huaweicloud.com/kunpeng/maven/</url><releases><enabled>true </enabled></releases></repository><repository><id>huaweicloud</id><url>https://mirrors.huaweicloud.com/repository/maven/</url>。。。</repository></repositories>
</profles>
鲲鹏Maven仓库软件构建流程
Hive编译指导
以鲲鹏论坛hive 2.6.3为例(https://bbs huaweicloud.com/forum/thread-41221-1-1.html),此工程多个jar包含x86架构so,而此部分jar已经过适配并上传到鲲鹏maven仓,编译时只需优先搜索鲲鹏maven仓。
鲲鹏Maven仓编译Hive
软件包迁移
常见的Linux发行版主要分为两类:类RedHat系列和类Debian系列。 类RedHat系统中,软件包的格式是rpm;类Debian系统中,软件包的格式是deb。类RedHat系统提供了 rpm (全称是: RedHat Package Manager)命令来安装、卸载和升级rpm软件包;类Debian系统提供了dpkg命令来安装、卸载、升级deb软件包。
rpm介绍
rpm软件包组成
rpm软件包获取渠道
传统rpm重构流程
扫描
编译
打包(鲲鹏上重新生成rpm包)
验证
rpm迁移
鲲鹏开发套件Porting Advisor
- 智能计算开放实验室:http://ic-openlabs.huawei.com/openlab/
- 鲲鹏开发套件Porting Advisor:https://www.huaweicloud.com/kunpeng/software/portingadvisor.html
Porting Advisor工具实现迁移自动化
环境准备
Porting Advisor快速重构rpm包流程
rpm迁移实例
相关链接:
- 鲲鹏社区首页: https://www.huaweicloud.com/kunpeng/
- 鲲鹏软件栈: https://www.huaweicloud.com/kunpeng/software.html
- 鲲鹏伙伴计划: https://www.huaweicloud.com/kunpeng/partners.html
- 鲲鹏产品与云服务: https://www.huaweicloud.com/kunpeng/product.html
- 鲲鹏解决方案: https://www.huaweicloud.com/kunpeng/solution.html
- 鲲鹏论坛: https://bbs.huaweicloud.com/forum/forum-923-1.html
- 鲲鹏计算产业: https://e.huawei.com/cn/kunpeng