微认证:鲲鹏软件迁移实践 —— C/C++ 代码迁移
【摘要】 微认证:鲲鹏软件迁移实践 —— C/C++ 代码迁移
C/C++ 代码迁移
1. 编译型语言源码——可执行程序过程介绍
- 编译型语言:典型的C/C++/Go语言,都属于编译型语言
- 编译型语言开发的程序在从x86处理器迁移到鲲鹏处理器时,必须经过重新编译才能运行
- 从源码到程序的过程:源码需要由编译、汇编器翻译成机器指令,再通过链接器链接库函数生成机器语言程序
C/C++代码需移植的原因?
- 架构差异:x86和鲲鹏处理器(aarch64)属于不同的架构(预处理阶段预编译宏可能有所差异,编译器有些编译选项争对不同的架构也可能有不同的设计)
- 指令集差异:x86--复杂指令集,鲲鹏处理器--精简指令集(汇编指令存在差异)
- 向量寄存器差异:x86和鲲鹏处理器使用向量寄存器不同,向量指令集也存在差异
2. C/C++代码编译构建过程
- C/C++代码工程主要包括两类文件:编译构建脚本、C/C++源码
- 可能涉及的移植项
- 编译构建脚本类文件
- 编译选项的移植(指定数据类型、生成代码特性、目标执行器架构、处理器硬件加速功能等)
- C/C++源码类文件
- 编译宏移植(用户自定义宏移植、编译器自定义宏移植)
- 编译器自带builtin函数移植
- 内联汇编移植
- SSE intrinsic函数移植(MMX/SSE类函数移植、AVX函数移植)
- 编译构建脚本类文件
编译构建过程
- 获取源码:通过github或第三方开源社区获取
- 准备编译环境:安装编译器gcc等
- 使用源码中的 CMakeLists.txt 或 configure 脚本生成 makefile
- 执行 makefile 编译可执行程序
- 替换依赖库:重编译或替换依赖x86平台的so 库
- 将可执行程序安装部署到生产或测试系统
configure 脚本也常由源码中的 autogen.sh 或 bootstrap.sh 脚本执行后产生
3. C/C++代码迁移典型移植类问题
3.1 代码迁移——编译脚本、编译选项移植
3.2 代码迁移——数据类型、编译宏移植
3.3 代码迁移——builtin函数移植
3.4 代码迁移——内联汇编函数移植
3.5 代码迁移——SSE intrinsic函数移植
-
SIMD(Single Instruction Multi Data)是一种单指令处理多数据流的并行处理技术,能够在批量数据操作时进行向量化运算加速,具有较高的执行效率,在多媒体处理、矩阵运算等场景都有广泛的应用
-
SSE(Intel 的SIMD 扩展指令集的简称)
-
NEON(基于SIMD思想的 ARM 技术)
-
3.5.1 代码迁移——SSE intrinsic函数移植(MMX/SSE)
3.5.2 代码迁移——SSE intrinsic函数移植(AVX)
3.5.3 代码迁移——SSE intrinsic函数移植方法
4. 迁移工具——Porting Advisor 初步代码扫描
- Porting Advisor 是一款华为鲲鹏代码迁移工具,针对C/C++代码进行扫描分析,检查用户C/C++代码中需移植修改的MakeFile编译文件、X86汇编及SSE intrinsic函数,并知道用户如何移植
- 鲲鹏开发套件 —— Porting Advisor:鲲鹏代码迁移工具
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)