铛铛铛~软挑课堂干货分享时间!

本期为你带来

《鲲鹏芯片代码移植参考手册(一)》

a171d031d6d2f7f48fbe7f2780b20a40.gif 3d8abc445e4bbca245736a57f7f5a354.png

简介

1.编程语言简介

按照翻译方式的不同,高级语言通常可以分为两类:一类是编译翻译,一类是解释翻译,分别对应着编译型语言和解释型语言。 

编译型语言

典型的如C、C++语言,都属于编译型语言,源代码到执行的过程概括如图1-1所示。C/C++编译好的程序是机器指令,由操作系统加载到存储器(一般为内存)后由CPU直接执行。

图1-1 编译型语言执行过程

7e3d1dd0214087942f562beda3d420c4.png

解释型语言

典型的如Java、Python语言,都属于解释型语言,源代码到执行的过程概括如图1-2所示。Java/Python编译好的程序是平台无关的字节码,由虚拟机解释执行,虚拟机完成平台差异的屏蔽。

图1-2 解释型语言执行过程

1638af6e1014fbb0016a1be8bdcbfa38.png

2.基于编译型语言开发的应用程序

基于编译型语言开发的应用程序,例如C/C++语言应用程序,其编译后得到可执行程序,可执行程序执行时依赖的指令是CPU架构相关的。因此,基于x86架构编译的C/C++语言应用程序,无法直接在TaiShan服务器运行,需要进行移植编译,移植编译过程中遇到的问题可以参考第2、3章提供的方法解决。

3.基于解释型语言开发的应用程序

基于解释型语言开发的应用程序,是CPU架构不相关的,例如Java、Python,将这类应用程序移植到TaiShan服务器,无需修改和重新编译,按照与x86一致的方式部署和运行应用程序即可。Java应用程序jar包内,可能包含基于C/C++语言开发的so库文件,这类so库需要移植编译,移植编译so库遇到的问题可以参考第2、3章提供的方法解决,使用编译得到的so库重新打包jar包。

a171d031d6d2f7f48fbe7f2780b20a40.gif 3d8abc445e4bbca245736a57f7f5a354.png

准备工作

C/C++程序移植需要安装编译器,推荐使用gcc7.3及以上版本(最低不低于4.8.5),下载安装参考链接:

gcc7.3版本下载地址:

http://ftp.gnu.org/gnu/gcc/gcc-7.3.0/

安装步骤参考:

https://gcc.gnu.org/install/

a171d031d6d2f7f48fbe7f2780b20a40.gif 3d8abc445e4bbca245736a57f7f5a354.png

移植相关问题处理

1.编译脚本移植类问题

1.1 -m64编译选项

现象描述

告警信息:

gcc: error: unrecognized command line option ‘-m64’

可能原因

-m64是x86 64位应用编译选项,m64选项设置int为32bits及long、指针为64 bits,为AMD的x86 64架构生成代码。在ARM64平台无法支持。

处理步骤

将ARM64平台对应的编译选项设置为-mabi=lp64。

1.2 char数据类型的符号

现象描述

告警信息:

warning: comparison is always false due to limitedrange of data type

可能原因

char变量在不同CPU架构下默认符号不一致,在x86架构下为signed char,在ARM64平台为unsigned char,移植时需要指定char变量为signed char。

处理步骤

在编译选项中加入“-fsigned-char”选项,指定ARM64平台下的char为有符号数。

2.源码修改类问题

2.1 代码中汇编指令需要重写

现象描述

ARM的汇编语言与x86完全不同,需要重写,涉及使用嵌入汇编的代码,都需要针对ARM进行配套修改。

处理步骤

需要重新实现汇编代码段。

示例:

在x86架构下:

dbfc712baa72f4440450f333bdc89e48.png

在ARM64平台下,使用gcc内置函数实现:

921afa5283c533950ad69696df33e765.png

2.2替换x86 CRC32汇编指令

现象描述

编译错误:

unknown mnemonic `crc32q' -- `crc32q (x3),x2'或operand 1 should be an integer register -- `crc32b (x1),x0'

或unrecognized command line option ‘-msse4.2’。

可能原因

x86使用的是crc32b、crc32w、crc32l、 crc32q汇编指令完成CRC32C校验值计算功能,而ARM64平台使用crc32cb、crc32ch、crc32cw、crc32cx 4个汇编指令完成CRC32C校验值计算功能。

处理步骤

请使用crc32cb、crc32ch、crc32cw、crc32cx取代x86的CRC32系列汇编指令,替换方法如表3-1所示,并在编译时添加编译参数-march=armv8+crc。

表2-1 替换方法

1f0e735af608180e96c750b25f64fe6b.png

示例:

在x86下的实现:

3b53b48a410b7c4f5e07a749058d2702.png

在ARM64平台下的实现:

77229cbde94f84624904b852978a6df6.png

2.3替换x86 bswap汇编指令

现象描述

编译报错:

Error: unknown mnemonic `bswap' -- `bswap x3'。

可能原因

bswap是x86的字节序反序指令,需替换为ARM64的rev指令。

处理步骤

x86指令实现的bswap如下:

184cdbd8f218346e2f2bb903248c331b.png

替换为ARM64指令后如下:

31a0a64d3e365059fb3dfc9f9b5057dc.png

2.4替换x86 rep汇编指令

现象描述

编译报错:

unknown mnemonic `rep` -- `rep`。

可能原因

rep为x86的重复执行指令,需替换为ARM64的rept指令。

处理步骤

修改方法参考如下:

X86实现样例:

3a187c37b663e668acdbc0c8f2b33c9a.png

TaiShan实现样例,本样例实现空指令,参数n为循环次数:

3e322956808cde53883dffd61993054b.png

2.5快速移植内联SSE/SSE2应用

现象描述

部分应用采用了gcc封装的用SSE/SSE2实现的函数,但是gcc目前没有提供对应的ARM64平台版本,需要实现对应函数。

处理步骤

目前已有开源代码实现了部分ARM64平台的函数,代码下载地址:https://github.com/open-estuary/sse2neon.git。

步骤一

将下载项目中的SSE2NEON.h文件拷贝到待移植项目中。

步骤二

在源文件中删除如下代码。

39d02305d3525fd6fa75a9bd44a4de2b.png

步骤三

在源代码中包含头文件SSE2NEON.h。

下期预告

《鲲鹏芯片代码移植参考手册(二)》

请准备好你们的小板凳

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐