微认证:鲲鹏软件迁移实践 —— C/C++ 代码迁移

举报
ruochen 发表于 2021/02/23 17:53:15 2021/02/23
【摘要】 微认证:鲲鹏软件迁移实践 —— 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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。