建议使用以下浏览器,以获得最佳体验。 IE 9.0+以上版本 Chrome 31+ 谷歌浏览器 Firefox 30+ 火狐浏览器
请选择 进入手机版 | 继续访问电脑版
设置昵称

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

确定
我再想想
选择版块

大咖说

发帖: 9粉丝: 12

级别 : 注册会员

Rank: 2

发消息 + 关注

发表于2020-3-17 10:24:41 1162 13
直达本楼层的链接
楼主
显示全部楼层
[干货分享] 回帖有奖《云话鲲鹏之大咖来了》第9期:如何将90%的代码自动迁移到鲲鹏平台上

封面图.png

大家好,鲲鹏论坛《云话鲲鹏之大咖来了》第9期与大家见面啦!


科技前沿,探寻不怠,以责任、权威和专业,


《云话鲲鹏之大咖来了》将从#初识鲲鹏#、#探索鲲鹏#、#玩转鲲鹏#等不同的维度带领大家更深刻的认识和学习鲲鹏!


本期《云话鲲鹏之大咖来了》为大家邀请到的是一位新朋友:华为云.云享专家—“张老师”,本期我们将跟着这位大咖一起来学习如何将代码自动迁移到鲲鹏平台上。



大咖简介


专家简介.PNG




正文:如何将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平台上,他依赖哪些第三方组件?这些第三方组件在目标平台上存不存在要做一些判断,这种判断通常都是这个平台之间的反反复复的安装,去运行,然后根据系统报出来的错误去一个个来排除,这都是通过人工来完成的,如果有移植经验的同学就会觉得比较费劲,很繁琐琐碎,不小心就错,可能还找不出来。


注意:因文章较长,大家可移步下方链接查看原文


文字版:如何将90%的代码自动迁移到鲲鹏平台上


视频版:如何将90%的代码自动迁移到鲲鹏平台上



福利来喽


在本帖回复与本文主题相关的任意有效内容,均可获得100码豆哦!(数量有限,先到先得)



活动规则:

1、活动时间:2020年3月17日---2020年3月30日

2、所有用户均可参与,为杜绝恶意灌水,每个ID连续回复不得超过3楼,总回复不得超过10楼,否则取消获奖资格,奖品顺延至下一有效楼层;

3、中奖用户不重复;

4、码豆发放需要在活动结束后统一发放,需要提供正确的华为云账号名,开奖后请于3日内私信楼主提供个人信息,逾期作废,*注意事项:1.用户需要至少登陆过一次DevCloud会员中心。  2.用户提供的账号名需要是注册时首次填写账号名,后期修改过的无法发放。 3.如果用户是一个租户下的子账号,需要同时提供租户名及用户名;3、码豆可兑换商品,请移步https://devcloud.huaweicloud.com/bonususer/home进行兑换;



往期大咖来了


《云话鲲鹏之大咖来了》第1期:#初识鲲鹏#之“鲲鹏初学者开始指南”


《云话鲲鹏之大咖来了》第2期:#初识鲲鹏#之“创造一个属于自己的鲲鹏开发者环境


《云话鲲鹏之大咖来了》第3期:#初识鲲鹏#之“在鲲鹏上使用编程语言——C语言


《云话鲲鹏之大咖来了》第4期:#初识鲲鹏#之“手把手教你在鲲鹏上使用编程语言——Java、Python”


《云话鲲鹏之大咖来了》第5期:#初识鲲鹏#之“技术小姐姐带你秒懂华为云鲲鹏云服务和解决方案”


《云话鲲鹏之大咖来了》第6期:#探索鲲鹏#之手把手教你如何在ARM上源码编译Redis


《云话鲲鹏之大咖来了》第7期:#探索鲲鹏#之鲲鹏弹性云服务器GCC交叉编译环境搭建


《云话鲲鹏之大咖来了》第8期:Intel SGX和ARM TrustZone浅析


举报
分享

分享文章到朋友圈

分享文章到微博

大咖说

发帖: 9粉丝: 12

级别 : 注册会员

Rank: 2

发消息 + 关注

发表于5 天前
直达本楼层的链接
来自 2#
显示全部楼层


本期获得码豆的小伙伴们注意啦!

本期码豆将在本周统一安排发放,请大家在4月2日之前私信提供你的华为云租户名(已有的不用提供)



用户名 租户名 码豆数
wstar
100
cityhunter2046 已提供 100
andyleung 已提供 100
tomandy2046 已提供 100
www2046 已提供 100
十年树木
100
点赞 评论 引用 举报

阿奇@汪汪...

发帖: 41粉丝: 18

级别 : 版主

Rank: 7Rank: 7Rank: 7

发消息 + 关注

发表于2020-3-17 10:28:31
直达本楼层的链接
沙发
显示全部楼层

期待大咖讲解。


点赞 评论 引用 举报

wstar

发帖: 0粉丝: 1

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2020-3-17 11:10:28
直达本楼层的链接
板凳
显示全部楼层

当前C#开发的产品是否可以移植到鲲鹏平台?如果可以,是不是都可以(.NET2.0,.NET3.5、.NET4.0..)还是指定版本?

评论
大咖说 2020-3-17 15:49 评论

需要先迁移到.net core 3.0,然后再移植到鲲鹏平台

... 查看全部
点赞 评论 引用 举报

cityhunter...

发帖: 20粉丝: 2

级别 : 中级会员

Rank: 3Rank: 3

发消息 + 关注

发表于2020-3-17 22:36:32
直达本楼层的链接
地板
显示全部楼层

剩余的10%代码为啥不能自动迁移到鲲鹏平台的呢?

评论
粥先先 2020-3-18 17:59 评论

无法直接移植到鲲鹏平台上的代码,均是与架构强相关的汇编代码,如果没有对应的C代码实现,则其软件只需要重写该部分的汇编就可以迁移到鲲鹏

... 查看全部
点赞 评论 引用 举报

andyleung

发帖: 110粉丝: 8

级别 : 外部版主

Rank: 7Rank: 7Rank: 7

发消息 + 关注

发表于2020-3-17 22:43:00
直达本楼层的链接
5#
显示全部楼层

关于剩余的代码对硬件架构敏感的(就是能感觉到服务器是X86还是鲲鹏ARM架构)能否网站就提供工具给我们直接进行代码的转换的呢?或者转换的方案?

点赞 评论 引用 举报

tomandy204...

发帖: 16粉丝: 3

级别 : 中级会员

Rank: 3Rank: 3

发消息 + 关注

发表于2020-3-17 22:44:38
直达本楼层的链接
6#
显示全部楼层

如果我使用的代码都是跟X86不是强相关的,比如我跑的代码都是跑在虚拟机JVM上的是否可以100%成功自动化迁移到鲲鹏ARM平台上去的呢?

评论
粥先先 2020-3-18 17:56 评论

纯JAVA代码可以按照JDK后直接运行在鲲鹏上

... 查看全部
点赞 评论 引用 举报

www2046

发帖: 7粉丝: 0

级别 : 注册会员

Rank: 2

发消息 + 关注

发表于2020-3-17 22:54:55
直达本楼层的链接
7#
显示全部楼层

这样看来鲲鹏的架构对在X86架构的代码兼容性也可以达到了90%?

点赞 评论 引用 举报

肥仔

发帖: 3粉丝: 1

级别 : 注册会员

Rank: 2

发消息 + 关注

发表于2020-3-24 14:35:00
直达本楼层的链接
11#
显示全部楼层

大佬厉害

点赞 评论 引用 举报

tzc_zsh

发帖: 0粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2020-3-26 15:41:33
直达本楼层的链接
12#
显示全部楼层

冲冲冲!

点赞 评论 引用 举报

十年树木

发帖: 5粉丝: 3

级别 : 中级会员

Rank: 3Rank: 3

发消息 + 关注

发表于2020-3-26 16:41:50
直达本楼层的链接
13#
显示全部楼层

大多数软件都是使用高级语言编写的,是否就可以认为100%可以代码的自动移植成功

点赞 评论 引用 举报

沙旋小吃

发帖: 0粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2020-3-27 01:14:39
直达本楼层的链接
14#
显示全部楼层

感叹一句  科技改变世界


点赞 评论 引用 举报

游客

富文本
Markdown
您需要登录后才可以回帖 登录 | 立即注册