《云话鲲鹏之大咖来了》第9期:如何将90%的代码自动迁移到鲲鹏平台上
大家好,鲲鹏论坛《云话鲲鹏之大咖来了》第9期与大家见面啦!
科技前沿,探寻不怠,以责任、权威和专业,
《云话鲲鹏之大咖来了》将从#初识鲲鹏#、#探索鲲鹏#、#玩转鲲鹏#等不同的维度带领大家更深刻的认识和学习鲲鹏!
本期《云话鲲鹏之大咖来了》为大家邀请到的是一位新朋友:华为云.云享专家—“张老师”,本期我们将跟着这位大咖一起来学习如何将代码自动迁移到鲲鹏平台
上。
大咖简介
正文:如何将90%的代码自动迁移到鲲鹏平台上
大家好,今天要讲的主题是关于软件迁移,这是一个久远的话题,因为但凡牵扯到切换平台、CPU架构的变化,甚至一些语言版本的升级,都可能会面临到软件迁移的问题。今天我们就探讨一下软件移植过程的原理,以及如何进行软件迁移。
在软件移植的过程当中,如何帮助开发者提升效率,如何把华为沉淀下来的软件开发以及移植的经验反馈给开发者,帮助开发者加速软件开发的进度,降低成本,这是我们一直关注的问题,为此,我们还推出了鲲鹏的开发套件,帮助用户做软件的移植,以及做基于鲲鹏平台的性能加速。
其实一提到软件移植,如果是做了比较底层软件的话,大家可能会用到一些汇编这样的底层语言。它和机器的硬件架构强相关,当你在从一个平台切换到另外一个平台的时候,这些强相关的语言势必要进行一次代码移植,跟我们所采用的编程语言以及移植的平台环境强相关。当我们用汇编代码或者是用这种编译型语言的时候,就会面临着一些移植的问题和挑战,有些问题通过编译器能解决,有些问题特别是一些低阶的代码或者比较底层的代码,就要手工去查手册,然后去把它相应的转换成新平台所使用的机器码。
上图列出了鲲鹏处理器和x86处理器的指令差异,列了一个简单的两个数相加,两个int型相加的这样一个简单程序。通过GCC编译完之后,通过OMGD,就能看到指令的具体的格式形式以及相应的对应的汇编代码。可以看出,对应x86平台而言, X86是复杂指令集,鲲鹏是完全兼容Arm64架构的,指令集也是和Arm64精简指令集是完全兼容的。
这里讲一下背景,其实所谓的精简指令集和复杂指令集的区分是从上个世纪70年代开始的,IBM曾经做过一个研究,关于CPU如何去高效的运行,他们发现有些常用的指令或者是程序代码,常用的和不常用的有很大的差异,又因为集成电路的制程、工艺或器件的设计水平没有现在这么突飞猛进,就会想如何把CPU从硬件上设计简单一点,从软件上高效一点,所以就提出了精简指令集这个概念,其最大的特点就是它的指令宽度是相等的,每个指令执行的周期几乎也相同,它把很繁杂的事情做的尽可能的简单,然后用很多简单的操作去完成一件复杂的任务。
从相反的复杂指令集的,我们看一下x86下面的复杂指令集,它每一个指令的长度是不同的,像这里列举的mov和add这两个指令,它的机器码、指令码是不同的,长度是不同的,势必会造成IC器件的解码器,到软件流水操作上处理的步骤是不一样的,也必然会导致每条指令的执行周期不同,但是这样也有一个好处,就是一个指令就能完成一个比较复杂的事情,尽管说指令可能会变得很长,但是一条指令能完成一比较复杂的事情,对上层的程序员来讲,会容易理解一些。
这就是精简指令集和复杂指令集的一个简单背景,我们能看到,在反汇编下来的x86指令集和鲲鹏指令集的汇编代码上,操作指令是完全不同的,寄存器的命名也是完全不同的,在x86的平台上,有16个通用寄存器, x86 64模式下,有16个通用寄存器,浮点寄存器,根据支持的MMX技术或者SSE技术。
反观鲲鹏平台,因为是和Arm64指令兼容的,所以指令集要完全对照,从这个角度来讲,鲲鹏平台有31个通用寄存器,除了这31个通用寄存器以外,还有一些状态寄存器或者是一个栈寄存器,对应到浮点寄存器,就有32个叫做单指令多数据这样一个寄存器,32个寄存器位,位宽是128,这一点是和x86 64平台是有差异的,比如说x86 64如果支持AVX512的话,那么它的位宽是512比特,从这个角度上,硬件器件差异是非常明显的。
从反汇编的角度来讲,不知道大家有没有注意到x86平台上有一个mov指令。从第一行我们能看到从寄存器rbp mov一个存储数据,到EDX这样一个寄存器,把变量从内存里拷贝进来。同样的一件事情,在鲲鹏处理器上加载数据到寄存器的指令就变成了LDR,加法指令仍然是add,存储时对于x86来讲,是从寄存器mov到了内存里,但是对于鲲鹏平台它是用str指令,这也反映出精简指令的特点,它是用load stall模式,也就是说在鲲鹏处理器平台上不支持内存到内存的直接访问,必须要经过寄存器作为桥接来中转。
这是和x86指令复杂指令集不同的另外一个地方,还有就是在x86平台上,它的内存访问的模式非常多,对于公共平台上就没有那么丰富了。以一个程序为例,我们简单列举一下,从CPU的角度来看,同样是一段C代码,CPU做了不同的事情,执行了不同的指令,那么经过不同的周期不同的运算以后,它会输出最终计算的一个结果。当然从这个角度来讲,从这段程序两个平台是没有任何差异的,除了指令上以外,执行结果不会有任何变化。
跨平台移植软件要面临的不少问题,因为软件移植本身就是一个工程性问题。这里通常第1步来讲,如果说我们决定从x86平台迁移到鲲鹏平台,就要去判断一下这个软件迁移值不值得,困难有多大?目前常用的做法就是把x86平台,相应的软件包拿下来,然后去看它的依赖性关系。看看这个软件,如果跑在x86平台上,他依赖哪些第三方组件?这些第三方组件在目标平台上存不存在要做一些判断,这种判断通常都是这个平台之间的反反复复的安装,去运行,然后根据系统报出来的错误去一个个来排除,这都是通过人工来完成的,如果有移植经验的同学就会觉得比较费劲,很繁琐琐碎,不小心就错,可能还找不出来。
注意:因文章较长,大家可移步下方链接查看原文
参与本期回帖有奖请移步论坛跟帖留言:回帖有奖
- 点赞
- 收藏
- 关注作者
评论(0)