练习:快速完成C/C++程序源码迁移
发表于 2023/04/27
0
尊敬的鲲鹏开发者你好,为了解决开发者在软件迁移过程中遇到的疑难问题,我们提供了DevKit迁移工具,帮助开发者更快更方便的实现跨平台软件的迁移,您可以阅读本文进行DevKit迁移工具的快速入门。
本文主要介绍了以下知识:
(1)跨平台软件为何要进行迁移
(2)如何使用DevKit迁移工具实现软件的快速迁移
(3)以smartdenovo软件包为待迁移案例展示软件的快速迁移过程
基础技能:
(1)具备基础的C/C++语言编程能力
(2)了解常用的Linux操作命令
(3)了解VS Code基础操作
跨平台软件为何要进行迁移
在了解DevKit代码迁移工具之前,您可能会有这样的疑问,我们为什么要进行软件迁移呢?不能直接下载软件使用吗?为了让您更好的了解这个问题,我们可以从开发过程的一个常见场景中一窥究竟,我们开发者应该都在电脑上安装过软件,很多软件都提供了X86版本和Arm版本,如果你买的是苹果笔记本,是无法安装X86版本的软件的,这其实就是芯片架构的问题,苹果笔记本使用的是和鲲鹏一样的芯片架构,是没有办法直接使用X86版本的软件的。
这就涉及到了我们鲲鹏架构和传统X86架构之间的差异。鲲鹏和传统X86的最根本的区别是两者的指令集不同(X86是复杂指令集、鲲鹏使用精简指令集),一样的代码c=a+b,经过编译后,在不同的芯片架构下转换成的不同的机器码,从而不能交叉运行。相应的编译选项,语言表现也有所差异。
如何使用DevKit迁移工具实现软件的快速迁移
为了解决平台差异问题,Devkit推出了迁移工具帮助用户进行迁移,迁移工具提供了五大迁移功能,帮助开发者简单方便的将软件迁移到鲲鹏平台上进行使用:
一个待迁移的系统往往是由很多个复杂的子组件组成的,除了自己开发的源代码,还有引用的各种依赖软件,使用Devkit迁移工具会使整个系统迁移工作更加简单高效,首先用户可以进行软件迁移评估,将待迁移的软件包传入,获取so依赖库兼容信息、工作量预估信息等多项关键数据,方便后续重构功能的使用。
之后再根据子组件的情况使用不同的重构功能,如果待迁移的子组件是C/C++编写的软件,同时可以获取到源码包,则可以使用源代码迁移功能进行源码级别迁移,迁移结束后还可以使用鲲鹏亲和分析进行扫描,修复其中的变量对齐,内存一致性等问题、提升软件的性能和稳定性;除了源码级的重构,迁移工具还提供了软件包重构功能,将用户的X86软件包重构为适用于鲲鹏平台的软件包;同时针对工程和科研领域的一些常用软件,用户可以直接使用专项软件迁移功能获取迁移好的软件包直接使用,一步到位完成迁移。
如果希望更进一步了解DevKit代码迁移工具Porting Advisor,欢迎大家前往社区下载:
https://www.hikunpeng.com/developer/devkit/porting-advisor/download?tab=0
开始smartdenovo开源软件的源码迁移实验
smartdenovo是一个同时适用于pacbio和nanopore测序数据的denovo组装软件,它是一款基于C语言开发的开源软件。相较于其他组装软件(如:canu、falcon),smartdenovo组装可从raw reads开始,不需要经过error correction纠错过程。经初步组装后,smartdenovo还提供了工具对初始组装的contig进行polish,生成consensus,也可以使用其他consensus polish工具来纠错。
1. 准备工作
步骤一:申请鲲鹏远程实验室资源
源码迁移的过程需要在鲲鹏平台上完成,为了方便开发者在鲲鹏环境上进行开发,我们提供了鲲鹏远程实验室资源供大家免费申请。
为了兼顾所有鲲鹏开发者的开发体验,我们在鲲鹏远程实验室中提供了云开发环境(开发态模式)和远程服务器(黑框模式)。本文涉及案例会在云开发环境上进行,开发者在申请云开发环境后可以直接通过在线IDE的方式打开页面进行操作。降低了开发者在鲲鹏上的开发门槛。
首先我们访问鲲鹏社区的远程实验室页面https://www.hikunpeng.com/zh/developer/cloud-lab,申请云开发环境:

之后我们输入自己的邮箱地址,选择openEuler 20.03 LTS-SP1系统,申请成功后我们点击“打开在线IDE”按钮,进入云开发环境中,云开发环境给大家提供了在线Vscode页面,方便我们直接在鲲鹏上进行开发。
步骤二:确认当前环境以及预置的相关源码
首先点击侧边栏第一个图标后依次点击“终端”、“新建终端”
新建终端后在下方弹出的终端页面中输入命令以root用户登录。
之后在下方弹出的终端页面中输入命令ssh root@IP address后,输入yes进行指纹确认,再输入SSH密码,切换至root用户(环境申请成功后,会向申请邮箱中发送邮件,密码需要从邮件中获取),这里大家注意2个事情:
1. IP地址要换成自己云开发环境的IP地址,打开终端后就会在下图中的对应位置上显示。
2. 可能会需要输入服务器用户密码,而密码属于隐私信息,因此大家在输入的时候屏幕不会显示输入的信息,大家不必疑惑,正常完成输入后按下回车就好。
不需输入密码情况
输入密码情况
云开发环境中已经预置了如下代码:
/opt/devkitdemo/Porting_advisor/smartdenovo-master
(X86平台下的开源源码)
/opt/devkitdemo/Porting_advisor/AvxToNeon-master
(源码迁移适配后编译依赖的ARM NEON指令库)
/opt/portadv/vscode/sourcecode/smartdenovo-master
(源码迁移的对象,未适配修改前内容与/root/smartdenovo-master一致)
ll /opt/devkitdemo/Porting_advisor/
ll /opt/portadv/vscode/sourcecode/
通过上述命令确认预置源码工程存在,且属组正确,如下图所示。
步骤三:编译迁移前的代码
未迁移前的编译,会产生编译报错:
编译运行命令如下:
cd /opt/devkitdemo/Porting_advisor/smartdenovo-master
make
未迁移前编译报错
2. 源码迁移实践
步骤一:执行源码迁移任务
完成上述准备工作后,现在就可以开始执行源码迁移任务了。我们点击鲲鹏代码迁移插件的图标,点击登录后勾选“我已阅读并同意”,点击“确认”,输入邮件的DevKit工具用户名和密码登录代码迁移工具。
选择“源码迁移”页签
在输入框中点击可自动识别已经预置到工具目录下的smartdenovo-master工程,其他为默认项,单击“开始分析”
步骤二:基于报告修改建议完成源码迁移
分析完成后单击“查看报告”,进入“源码迁移建议”页签查看具体的修改建议。
根据迁移报告,确认有两个文件需要修改。在“源码迁移建议”页面,检查每个文件的修改建议,并根据建议进行源代码修改,主要执行两个动作:
(1)根据“文件列表”中Makefile文件内显示红色波浪线提示的内容,修改Makefile文件;
(2)根据“文件列表”中ksw.c文件内显示红色波浪线提示的内容,修改ksw.c文件。
修改源码文件
在“源码迁移建议”页面,查看ksw.c文件的修改建议
根据红色波浪线发现一共有两处修改点
修改点一:
使用快速修复,效果如下
修改点二:
修改点三:使用快速自动修改,修改效果如下图所示,增加了ARM的NENO指令库头文件。
由于增加了头文件,所以需要引入到工程中
输入命令ssh root@IP address后,输入yes进行指纹确认,再输入SSH密码,切换至root用户。
将头文件目录复制一份到/opt/portadv/vscode/sourcecode/smartdenovo-master的include目录里。
cd /opt/portadv/vscode/sourcecode/smartdenovo-master
mkdir include
cp /opt/devkitdemo/Porting_advisor/AvxToNeon-master /opt/portadv/vscode/sourcecode/smartdenovo-master/include/AvxToNeon-master -r
修改构建文件
在“源码迁移建议”页面,查看Makefile文件的修改建议。
根据以上建议,Makefile文件中需要给CFLAGS变量增加选项内容“-march=armv8-a -fsigned-char”,同时,还需要删除CFLAGS变量中的选项“-mpopcnt”和“-msse3”。
由于增加了额外的Neon库头文件,Makefile文件中需要给CFLAGS变量增加选项内容“-I./include/AvxToNeon-master”,修改效果如图所示。
增加include路径
至此,所有源码迁移修改都已经完毕。
步骤三:迁移后的验证
编译运行命令如下
cd /opt/portadv/vscode/sourcecode/smartdenovo-master/
make
迁移后编译成功且运行正常
恭喜
到这里整个实验流程就已经结束了,通过上面的软件迁移动作我们拿到了重构好的smartdenovo安装包,这个安装包可以直接在鲲鹏环境上安装运行。各位鲲鹏开发者也可以参考上面的软件迁移过程迁移一些其他的跨平台软件,同时探索迁移工具提供的源码迁移、亲和分析等功能,成为更加优秀的鲲鹏开发者。
除了上述学习内容,我们还提供了很多辅助学习资源(课程/实验/文档/文章),希望能帮助到您更好的使用鲲鹏DevKit迁移工具:
鲲鹏代码迁移工具介绍(课程):
https://www.hikunpeng.com/learn/courses-list/detail/1590560841222623234手把手带你使用代码迁移工具实现源码迁移(课程):
https://www.hikunpeng.com/learn/courses-list/detail/1556841082254745602鲲鹏代码迁移工具-快速入门(文档):
https://www.hikunpeng.com/document/detail/zh/kunpengdevps/porting/qs/qs-pa-kunpengdevps.html