目录

  • 鲲鹏软件迁移概述
    • 为什么要做软件迁移
      • 计算技术栈与程序执行过程
      • 鲲鹏处理器与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函数移植)

绿盟赛—鲲鹏软件迁移实践-编程知识网

  1. 获取源码:通过github或第三方开源社区获取
  2. 准备编译环境:安装编译器gcc等
  3. 使用源码中的Makelists.txt或configure脚本生成makefile
  4. 执行makefile编译可执行程序
  5. 替换依赖库:重编译或替换依赖X86平台的so库
  6. 将可执行程序安装部署到生产或测试系统

说明: 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组件为例
  1. Impala源码下载及扫描分析
    绿盟赛—鲲鹏软件迁移实践-编程知识网
  2. 扫描报告解读及运用
    绿盟赛—鲲鹏软件迁移实践-编程知识网

本章总结

  • 本章简要介绍:了C/C+ +代码的编译原理及构建流程,重点对典型迁移类问题及方法进行详细介绍。
    最后引入Porting Advisor开发工具,帮助学员快速、高效的完成C/C+ +代码迁移。
  • 核心类移植项及迁移方法:
  1. 编译选项移植:关注平台差异项(用好编译器官方文档)
  2. 编译宏移植:区分编译器/用户自定义宏移植
  3. builtin函数移植:关注常用builtin函数替换
  4. 内联汇编移植:识别核心汇编指令,用好汇编指令/builtin函数替换
  5. SSE intrinsic函数移植:开源工程、官网指导手册相结合

Java/Python代码迁移

Java代码迁移

从源码到可执行案例

绿盟赛—鲲鹏软件迁移实践-编程知识网

安装合适的JDK版本

绿盟赛—鲲鹏软件迁移实践-编程知识网

包含SO库调用的jar包迁移方法

绿盟赛—鲲鹏软件迁移实践-编程知识网

设置JVM参数,稳定快速的运行程序

绿盟赛—鲲鹏软件迁移实践-编程知识网

案例分析

源码编译、安装OpenJDK9

绿盟赛—鲲鹏软件迁移实践-编程知识网

netty-all-4.1.34.Final.jar迁移

绿盟赛—鲲鹏软件迁移实践-编程知识网
绿盟赛—鲲鹏软件迁移实践-编程知识网

JVM参数设置,解决服务挂死问题

绿盟赛—鲲鹏软件迁移实践-编程知识网

Java迁移小结

  1. 改动点:安装JDK版本
  • 通过yum安装
  • 源码编译安装
  1. 引用的SO库需重新编译
  2. 根据业务实际情况,调整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远程仓库。
配置方法

  1. 编辑配置文件
    ${maven.home}/conf/settings.xml
  2. 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