通过鲲鹏DevKit代码迁移工具快速完成C&C++源码迁移
引导式阅读
C++
通过鲲鹏DevKit代码迁移工具快速完成C&C++源码迁移
作者
鲲鹏 DevKit 团队
上架时间
2023-09-12 12:30:17

示例简介

尊敬的开发者你好,为了帮助开发者解决将软件从X86平台迁移到鲲鹏平台过程中遇到的疑难问题,鲲鹏提供了DevKit迁移工具,帮助开发者更快更方便的实现跨平台软件的迁移,您可以阅读本文进行DevKit迁移工具的快速入门,在Cloudeide环境中体验软件迁移过程。

本示例主要介绍了以下知识:

(1)跨平台软件为何要进行迁移

(2)如何使用DevKit迁移工具实现软件的快速迁移

(3)以smartdenovo软件包为待迁移案例展示C/C++软件的快速迁移过程

需要掌握的基础技能:

(1)具备基础的C/C++语言编程能力

(2)了解常用的Linux操作命令

(3)了解Cloudide基础操作

跨平台软件为何要进行迁移

在了解DevKit代码迁移工具之前,您可能会有这样的疑问,为什么要进行软件迁移呢?不能直接下载软件使用吗?为了让您更好的了解这个问题,接下来从开发过程的一个常见场景中一窥究竟,开发者应该都在电脑上安装过软件,很多软件都提供了X86版本和Arm版本,如果你买的是苹果笔记本,是无法安装X86版本软件的,这其实就是芯片架构的问题,苹果笔记本使用的是和鲲鹏一样的芯片架构,是没有办法直接使用X86版本的软件的。

这就涉及到了我们鲲鹏架构和传统X86架构之间的差异。鲲鹏和传统X86的最根本的区别是两者的指令集不同(X86是复杂指令集、鲲鹏使用精简指令集),一样的代码c=a+b,经过编译后,在不同的芯片架构下转换成的不同的机器码,从而不能交叉运行。相应的编译选项,语言表现也有所差异。

https://www.hikunpeng.com/p/resource/202304/be03f9e934dc4506a1abb97f3d82776a.png

如何使用DevKit迁移工具实现软件的快速迁移

为了解决平台差异问题,Devkit推出了迁移工具帮助用户进行迁移,迁移工具提供了五大迁移功能,帮助开发者简单方便的将软件迁移到鲲鹏平台上进行使用:

https://www.hikunpeng.com/p/resource/202304/892af83882aa476a8542bf831203fec5.png

一个待迁移的系统往往是由很多个复杂的子组件组成的,除了自己开发的源代码,还有引用的各种依赖软件,使用Devkit迁移工具会使整个系统迁移工作更加简单高效,首先用户可以进行软件迁移评估,将待迁移的软件包传入,获取so依赖库兼容信息、工作量预估信息等多项关键数据,方便后续重构功能的使用。

之后再根据子组件的情况使用不同的重构功能,如果待迁移的子组件是C/C++编写的软件,同时可以获取到源码包,则可以使用源代码迁移功能进行源码级别迁移,迁移结束后还可以使用鲲鹏亲和分析进行扫描,修复其中的变量对齐,内存一致性等问题、提升软件的性能和稳定性;除了源码级的重构,迁移工具还提供了软件包重构功能,将用户的X86软件包重构为适用于鲲鹏平台的软件包;同时针对工程和科研领域的一些常用软件,用户可以直接使用专项软件迁移功能获取迁移好的软件包直接使用,一步到位完成迁移。

如果希望更进一步了解DevKit代码迁移工具Porting Advisor,欢迎大家前往鲲鹏社区了解代码迁移工具的详细使用方法:

<https://www.hikunpeng.com/document/detail/zh/kunpengdevps/porting/qs/qs-pa-kunpengdevps.html>

源码迁移实验准备工作

smartdenovo是一个同时适用于pacbio和nanopore测序数据的denovo组装软件,它是一款基于C语言开发的开源软件。相较于其他组装软件(如:canu、falcon),smartdenovo组装可从raw reads开始,不需要经过error correction纠错过程。经初步组装后,smartdenovo还提供了工具对初始组装的contig进行polish,生成consensus,也可以使用其他consensus polish工具来纠错。

在进行实验前需要完成如下准备工作:

步骤一:打开cloudide开发环境,安装鲲鹏开发框架插件

点击示例工程页面右侧的“运行调试”按钮打开cloudide开发环境。之后点击cloudide页面左侧的“插件管理”页签,搜索“kunpeng”,安装鲲鹏代码迁移插件。

BC9792BF-47F3-4786-8160-FE6E2B275BDB.png

步骤二:登录鲲鹏代码迁移插件

安装完成后,点击左侧鲲鹏原生开发插件的图标,如果是第一次登录鲲鹏DevKit系列的插件,需要创建用户,点击登录后创建密码,点击“确认”,进入到登录页面。如果之前已经创建过用户,直接输入密码登录即可

再次输入密码,点击“登录”后,在使用声明中勾选“我已阅读并同意”,点击“确认”,进入工具页面。

步骤三:确认当前环境以及预置的相关源码

smartdenovo是一款在github上开源的开源软件,基于X86平台进行开发,源码地址如下:https://github.com/ruanjue/smartdenovo

为了让开发者更方便的体验迁移功能,cloudide环境中已经预置了smartdenovo的源代码,存放地址如下:

/home/user/devkitdemo/porting/smartdenovo-master

在实验的过程中,还需要avxToNeon的源代码,当应用程序从x86架构移植到鲲鹏架构时,由于Arm64指令名称和功能与x86不同,需要进一步开发指令。

为了减少用户的移植工作量,在avxToNeon项目中,常用的AVX指令被封装为独立的模块, AVX指令被相关的NEON SIMD指令取代,而指令名称和功能保持不变。用户可以通过将相关头文件导入应用软件来调用相应的指令。avxToNeon的源码存放地址如下:

/home/user/devkitdemo/porting/smartdenovo-master/AvxToNeon-master

首先点击左上角的应用程序菜单,选择“终端”中的“新建终端”。

之后在页面下方的终端窗口中输入命令确认预置源码工程是否存在,结果如下图所示。

cd /home/user/devkitdemo/porting ls

通过cp命令将要分析的源码放到工具的源码扫描路径下,这样后面执行迁移过程时可以省略上传步骤,直接进行迁移。

cp -r /home/user/devkitdemo/porting/smartdenovo-master /opt/portadv/portadmin/sourcecode/

步骤三:编译迁移前的代码,对比迁移效果

首先尝试编译未进行迁移修改的代码,查看是否可以编译成功。编译运行命令如下:

cd /opt/portadv/portadmin/sourcecode/smartdenovo-master/ make

从执行结果中可以看到,编译过程报错,无法成功编译smartdenovo软件包。

执行源码扫描任务

完成上述准备工作后,现在就可以开始执行源码迁移任务了。在工具页面选择“源码迁移”页签,点击“创建任务”按钮,进入“新建源码迁移任务”页面。

在输入框中点击可自动识别已经预置到工具目录下的smartdenovo-master工程,点击选择该工程,其他为默认项,单击“开始分析”。

根据扫描报告修改源码

分析完成后单击右下角的“查看报告”,查看具体的修改建议。迁移报告中详细展示了需要迁移的源码文件的路径、待迁移代码的行数,用户点击“查看建议代码”后可跳转到源码页面,根据修改建议直接修改源码。

从迁移报告中可以得知,有Makefile和ksw.c两个文件需要修改。首先点击ksw.c对应的“查看建议代码”按钮,修改ksw.c的源代码。

1、修改源码文件ksw.c

根据源码页面中的红色波浪线发现一共有两处修改点

修改点一:

点击“快速修复…”按钮后,在右下角的弹框中点击确认按钮,自动完成此处的代码适配:

修改后,效果如下:

修改点二:

使用快速自动修改,修改效果如下图所示,增加了ARM的NEON指令库头文件。

增加的头文件需要引入到工程中,点击左上角的应用程序菜单,选择“终端”中的“新建终端”,输入命令将头文件目录复制一份到/opt/portadv/vscode/sourcecode/smartdenovo-master的include目录里。

cd /opt/portadv/portadmin/sourcecode/smartdenovo-master mkdir include cp -r /home/user/devkitdemo/porting/AvxToNeon-master /opt/portadv/portadmin/sourcecode/smartdenovo-master/include/AvxToNeon-master

2、修改构建文件Makefile

在“源码迁移建议”页面,查看Makefile文件的修改建议,悬浮在黄色波浪线的语句上,可以看到详细的迁移建议。

根据建议,Makefile文件中需要给CFLAGS变量增加选项内容-march=armv8-a -fsigned-char,同时,还需要删除CFLAGS变量中的选项“-mpopcnt”和“-msse3”。 同时,由于增加了额外的Neon库头文件,Makefile文件中还需要给CFLAGS变量增加选项内容-I./include/AvxToNeon-master,修改效果如下:

此外,因smartdenovo的系统兼容性问题,在cloudide的系统中无法直接编译,还需要修改 smartdenovo/wtlay.h 文件,使用命令下面的命令进行修改:

cd /opt/portadv/portadmin/sourcecode/smartdenovo-master/ vi wtlay.h

回车后进入编辑界面,点击ESC按键后,输入:515,按回车后跳转到515行,按下键盘上的A按键,进入编辑模式,如下图所示。

在该行前面添加“static”,修改完成后点击ESC按键,输入:wq!,点击回车。

至此,所有源码迁移修改都已经完毕。之后执行编译命令进行编译,从输出中可以看到,编译成功完成,无报错信息展示:

cd /opt/portadv/portadmin/sourcecode/smartdenovo-master/ make

更多学习内容

到这里整个实验流程就已经结束了,通过上面的源码迁移动作我们拿到了可以在鲲鹏平台上运行的smartdenovo软件包。各位鲲鹏开发者也可以参考上面的软件迁移过程迁移一些其他的跨平台软件,同时探索迁移工具提供的软件包扫描、亲和分析等功能,更深入的掌握迁移工具的使用方法。

除了上述学习内容,我们还提供了很多辅助学习资源(课程/实验/文档/文章),希望能帮助到您更好的使用鲲鹏DevKit迁移工具:

鲲鹏代码迁移工具介绍(课程):

<https://www.hikunpeng.com/learn/courses-list/detail/1590560841222623234>

学习路径 - 应用跨平台迁移(课程):

<https://www.hikunpeng.com/developer/learning-path/detail/8aeaef971c4d42619dd2ba0829e699ca>