为什么必须将代码从x86迁移到ARM,这篇文章给你答案( 三 )

为什么必须将代码从x86迁移到ARM,这篇文章给你答案。5.测试与认证:压力测试长稳测试规模商用

调优结束之后,接下来就要把功能运力、长稳运力以及性能运力都跑一遍,达到一个商用的标准,就可以筹备上线了 。 此外也可以将软件和系统进行鲲鹏展翅认证,其可以扩展应用的软件使用空间并能够加入鲲鹏生态 。

不同语言的迁移注意事项

实际上,像Java、Python、Perl这种跨平台的开发语言,它的迁移的技术难度相对来说是比较低的,主要是因为Java有一个JBM,Python中存在一个解释器,它们屏蔽了大部分的平台架构上的差异 。 与之相反,C和C++的难度相对来说要高一些,原因是如内敛函数还有x86加速的一些指令,无法支持像微软这种闭源的开发架构 。

典型的如C/C++/Go语言,都属于编译型语言 。 编译型语言开发的程序在从x86处理器迁移到鲲鹏处理器时,必须经过重新编译才能运行 。 如下图所示,源码需要由编译器、汇编器翻译成机器指令,再通过链接器链接库函数才能生成机器语言程序 。


为什么必须将代码从x86迁移到ARM,这篇文章给你答案

----为什么必须将代码从x86迁移到ARM , 这篇文章给你答案//----

接下来就是C/C++代码的编译构建了,这个过程一共分为六步:

获取源码:通过github或第三方开源社区获取

准备编译环境:安装编译器gcc等

使用源码中的CMakeLists.txt或configure脚本生成makefile

执行makefile编译可执行程序

替换依赖库:重编译或替换依赖x86平台的so库

将可执行程序安装部署到生产或测试系统

既然是最为复杂的,C/C++语言的迁移问题也是涉猎最广泛的,主要涉及到七类问题:

编译脚本和编译选项的移植:以x86下-m64代码为例,其主要功能是将应用程序编译为64位,对应到鲲鹏上是用-mabi=lp64的编译选项,此类编译选项需要在脚本中修改;此外,x86平台上默认的char类型是一种有符号的类型,对应到鲲鹏上则是无符号类型,在移植过程中需要显示定义并将char类型定义为有符号,方法一是在源代码里加上signedchar,方法二是直接用fsigned-char来修改 。

编译宏的移植:编译宏的作用就是让编译器知道编译哪些分支代码能够在不同架构下达到最优性能 。 如何对编译宏下面的代码实现移植?86代码上有些编译器自带自定义宏,比如smd属性相关的宏在x86上是SSE开头的宏,对应到鲲鹏平台上就需要自定义它的编译宏和所相对应的分支 。

Builtin函数移植:Builtin函数是编译器自带的函数,其在实际迁移项目中相当常见,主要是crc32校验值的计算 。 需要移植的普通builtin函数实际并不多,大部分需移植的builtin函数集中在SSEintrinsic函数内 。

内联汇编函数的移植:第一种是指令替换,x86上对应的是bswap指令,鲲鹏对应的是rev指令,其它有些操作和寄存器都是基于内联汇编的语法规则进行替换的 。 第二种是Builtin函数的替换,以x86的指令popcnt为例,比如popcount是对二进制数里面的1进行计数,对应到鯤鹏平台上所替换的是popcountll 。


推荐阅读