X86架构应用到鲲鹏处理器代码迁移指令集剖析
X86架构应用到鲲鹏处理器
代码迁移剖析
背景
近期的大数据项目需要使用ARM环境的服务器;为啥选择华为云呢,因为华为云鲲鹏服务器,具备多核高并发 特点,非常适合AI、大数据、HPC、云手机/云游戏等场景,满足了我们的需求。
二、代码迁移原因:
1、 购买华为云,鲲鹏计算服务器
2、 操作系统选择Centos7.6即可,配置“高IO 40G”即可
3、 公网选择“静态BGP”模式
4、 输入完毕root用户的密码之后,勾选“我已阅读同意”,点击“立即购买”即可
5、 为了测试和X86不同架构的区别,编辑一个demo02.c源代码文件,代码内容如下所示:
int main(void){ int a=1; int b=2; int c=0; c=a+b; return c; } |
6、 需要安装一下gcc编译器,然后查看版本:
yum install gcc gcc --version |
7、 然后使用gcc demo02.c编译源代码,编译完毕后会又a.out文件生成
8、 接下来需要安装反编译的软件包,指令如下所示:
yum install -y binutils |
安装完毕后,使用相关指令对a.out进行反编译
objdump -S a.out |
会得到199行的反编译代码
objdump -S a.out |wc -l |
9、 同样的操作,在X86服务器上,构建“第五步”到“第八步”的实践操作。
发现反编译后的代码是181行
10、 对鲲鹏处理器的指令分析
下面对main函数的代码逐行分析,同时对鲲鹏架构指令和寄存器进行简单介绍。
1) sub sp, sp, #0x10
sp寄存器保持栈顶位置,这里向下扩展了16字节,这16字节可以用来给后面的变量分配内存空间,栈默认最小扩展空间是16字节,每次扩展空间是16字节的整数倍。
2) mov w0, #0x1
把操作数1赋值给寄存器w0。
3) str w0, [sp,#12]
把w0寄存器的值传送到栈顶开始的第12字节对应的内存中。将给变量a赋值。
4) mov w0, #0x2
把操作数2赋值给寄存器w0。
5) str w0, [sp,#8]
把w0寄存器的值传送到栈顶开始的第8字节对应的内存中,将给变量b赋值。
6) str wzr, [sp,#4]
把零寄存器的值传送到栈顶开始的第4字节对应的内存中,将给变量c赋值。零寄存器的值总是0。
7) ldr w1, [sp,#12]
把栈顶开始的第12字节对应的内存数据传送给w1寄存器,把变量a读到寄存器w1。
8) ldr w0, [sp,#8]
同上,把变量b读到寄存器w0。
9) add w0, w1, w0
把w0和w1相加,存到w0寄存器中。
10) str w0, [sp,#4]
把寄存器w0的值写到变量c中。
11) ldr w0, [sp,#4]
把变量c中的值写回寄存器w0,w0用来作为返回值寄存器。
12) add sp, sp, #0x10
恢复栈空间,释放内存。
11、 对X86反编译的指令分析
对main函数的每行代码简要解释如下:
1) push %rbp
将调用函数的栈帧栈底地址入栈,即将bp寄存器的值压入调用栈中。
2) mov %rsp,%rbp
建立新的栈帧,将main函数的栈帧栈底地址放入bp寄存器中。sp和bp是两个指针寄存器,一般的函数调用都会使用上述两个指令。
把1传送给变量a(整型变量占用4字节,所以这里是-0x4)。
把2传送给变量b。
把0传送给变量c。
6) mov -0x8(%rbp),%eax
把变量b的值传送给eax寄存器。
7) mov -0x4(%rbp),%edx
把变量a的值传送给edx寄存器。
8) add %edx,%eax
edx和eax寄存器相加并存入eax寄存器。
9) mov %eax,-0xc(%rbp)
把eax寄存器的值传送给变量c。
10) mov -0xc(%rbp),%eax
把变量c的值传送给寄存器eax,eax作为返回值寄存器。
11) pop %rbp
恢复上一栈帧的bp。
12、 不同硬件底层需要迁移代码的原因
1)汇编代码角度:同样的C语言代码,在编译成不同架构下的程序后,得到的汇编代码是不同的
2)计算技术栈角度:
编译型语言:不同架构下指令集不同,导致依赖于指令集的二进制机器码、汇编语言都不同,所以同一段程序,在不同的架构下,需要最终编译成和架构相适应的二进制机器码。
解释型语言:理论上基本可以跨平台运行,但是实际情况比较复杂,有些Java应用会引用so库文件,这些so库文件很有可能是通过编译型语言例如C来编写的,这时候就要考虑so库文件的移植。
小结
原来的一些运行在X86上面的一些软件,我们迁移到鲲鹏平台上面。首先我们要评估这个软件是否可以迁移进行技术的可行性分析。这主要是为了提供是否需要做软件迁移的一个技术决策依据。我们要做具体的一个迁移工作。比如集成软件能够在鲲鹏平台上面正常的运行起来,保证功能是可用的。最后我们要做性能调优性能分析。保证迁移后的软件能够最大程度的亲和鲲鹏平台。
这些工作呢如果全部靠人工来做。那对于迁移和性能分析的人员来说,这种对技能和知识结构的要求是很高的。比如在迁移过程中,我们首先需要人工来检查道相关的的编译参数编写选项,例如函数汇编指令或者一些Java包,更有甚者可能还要进一步的识别。
由于平台差异性存在的这种内存不一致性。这个工作量是比较大的,那么对于工程师的门槛要求是比较高。
工欲善其事,必先利其器。从前面的介绍大家已经知道了开发工具对提升开发者生产力是多么的重要。
因此华为始终非常重视鲲鹏开发套件的开发和投入,在过去的三年时间里投入了大量的研发的人力和资源来做这个事情。为了不断的提升鲲鹏迁移的能力,华为提供了鲲鹏开发套件DevKit包括代码迁移,开发框架,调试服务、性能分析等一系列的工具。整个的这个性能损耗小于15%,开发者可以使用鲲鹏工具,帮助开发者加速应用迁移和提升,。
- 点赞
- 收藏
- 关注作者
评论(0)