【鲲鹏经典直播征文】体验鲲鹏代码迁移工具的极致效率

举报
长弓三石 发表于 2021/08/19 17:55:21 2021/08/19
【摘要】 对于编译型语言开发的应用或依赖文件,需要进行软件迁移并重新编译,具体来说对于依赖文件,可以将x86平台的依赖文件用鲲鹏对应依赖文件替代,再重新编译或打包;对于源码及编译脚本中涉及平台相关内容,修改为鲲鹏平台兼容代码,再用对应编译器重新编译。

一、软件的平台相关性及迁移挑战

1.多样性算力成为下一代计算产业的主流趋势

在计算产业发展的这几十年来,算力的发展越来越趋向于开放、多样性。从最早的封闭模式的大/小型机时期,发展到相对不那么封闭,实现了软硬件解耦的X86时代,一直到到现在开放的多种算力结合的多样性时代,特别是ARM架构的异军突起,从端侧开始,慢慢形成了端、边、云协同的新形式。

2.ARM架构渐成服务器头部厂商的新选择

ARM架构的发展是大势所趋,ARM架构的服务器出现在了越来越多的应用场景中:

  • HPC场景:Fujitsu Fugaku富岳ARM系统登顶TOP500超算榜首;欧洲处理器计划(EPI)推动融合ARM、RISC-V技术的本土首款百亿亿级超算处理器落地;
  • 公有云场景:亚马逊、微软、华为云等TOP云服务厂商上线基于ARM的Web、大数据等主流公有云服务;
  • 数据中心场景:基于华为(64核)、Ampere ( 80核)、Marvell ( 96核)等多核高并发ARM架构的服务器成熟商用;

3.软件-语言-平台兼容性

现在在X86平台上已经有海量的软件,常用的开发语言也有几十种之多,那么,在把软件从X86平台迁移到鲲鹏平台的时候,会有哪些兼容性问题呢?如何解决?

一般来说,把语言类型分为三种,一种是编译型、一种是解释型,另一种是专有型,如下图所示:

从上图可以看出,对于编译型语言开发的应用或依赖文件,需要进行软件迁移并重新编译,具体来说对于依赖文件,可以将x86平台的依赖文件用鲲鹏对应依赖文件替代,再重新编译或打包;对于源码及编译脚本中涉及平台相关内容,修改为鲲鹏平台兼容代码,再用对应编译器重新编译。

4.软件迁移策略

根据上一节所示的平台兼容性,可以把软件迁移策略分为解释型语言、编译型语言、Windows开发语言3类,它们具体的迁移策略如下图所示:

(1)解释型语言

JAVA、Python等解释型语言,因为语言本身支持跨平台,迁移起来最简单,找到合适的解释器,只要运行环境没问题,就可以直接使用。当然,有些解释型语言的软件还有对编译型语言的调用,比如so库等,这些被调用的文件也需要找到合适的鲲鹏架构下的替代文件。

(2)编译型语言

C/C++/Fortran/GO等编译型语言,需要根据软件本身的性质来选择合适的迁移策略。

  • 开源软件:可以和社区协同,获取源代码,然后执行迁移、重新编译的流程,获得在鲲鹏计算平台运行的软件。
  • 自研软件:自己开发的软件,可以通过商业合作的形式进行迁移,或者直接自己迁移。
  • 商业闭源软件:如果可以通过商业合作的形式,就通过商业合作;如果不能进行商业合作,可以选择替代的其他软件;对于性能要求不高的,也可以通过动态翻译工具Exagear在鲲鹏计算平台上直接运行,如果性能要求较高,可以在X86平台上部署这些软件,形成鲲鹏平台和X86平台的混合部署。

(3)Windows开发语言

因为鲲鹏计算平台目前尚不支持Windows,对于这种开发语言开发的程序,可以通过混合部署的模式部署到X86平台上。

5.鲲鹏处理器与x86处理器的架构和指令差异

鲲鹏架构和X86架构在多个层面都有较大的差异,以一个简单的加法为例,如下图所示:

可以看到,两者在指令长度、指令操作符和操作数、汇编指令含义等都存在非常大的不同。

两者的不同还体现在下面的几点:

  • char数据类型的符号
  • 内嵌汇编指令重写
  • 双精度浮点型转整形溢出处理
  • -m64编译选项的替换
  • 宏定义
  • Built-in函数
  • SSE Intrinsic

在进行迁移的时候,这些方面都需要考虑到,在鲲鹏平台上找到相应的解决方法,然后进行替换。

6.软件迁移面临的挑战

因为X86和鲲鹏架构之间的巨大差异,导致迁移工作面临较大的挑战,如图所示:

不管是迁移的可行性分析、实际的迁移,还是迁移后的性能调优,都存在着门槛高、准确率低、周期长、人工分析困难等情况。

二、鲲鹏开发套件全景介绍

针对软件迁移存在的这种痛点,华为推出了鲲鹏DevKit一站式开发套件,帮助开发者完成软件的代码迁移、编译调试、性能调优、异常诊断。

鲲鹏开发套件支持浏览器和IDE插件两种模式,对于轻度使用者可以使用浏览器模式,重度使用者可以使用IDE模式,在编码的时候就可以随时在IDE里使用鲲鹏开发套件的功能。鲲鹏开发套件安装的时候需要服务器,如果没有服务器的话,可以免费申请鲲鹏开发套件专属远程云环境

1.IDE插件

鲲鹏开发套件的插件主要支持Visual Studio Code和IntelliJ IDEA两种开发工具,以Visual Studio Code为例,在扩展:商店里输入“kunpeng”可以找到鲲鹏开发套件的插件“Kunpeng DevKit”,如图所示:

单击“安装”按钮可以一键安装所有的4个扩展包(也可以根据需要安装特定的扩展包):

  • 鲲鹏代码迁移插件
    鲲鹏加速库插件
    鲲鹏编译插件
    鲲鹏性能分析插件

2.一键式安装&链接服务器端工具

工具支持一键式部署服务端工具,以代码迁移工具为例,步骤如下:

首先进入配置远端服务器窗口:

然后单击“点击此处部署”超链接,打开安装代码迁移工具的窗口:

输入目标服务器信息,单击“检测连接”按钮,检测通过后,“开始部署”按钮变成有效状态,单击该按钮,即可启动工具部署流程,安装终端的提示操作即可:

部署成功后,再配置远端服务器,即可完成服务器的连接。

三、代码迁移工具链解读

代码迁移工具主要包括5大功能:软件迁移评估、源码迁移、软件包重构、专项软件迁移、增强功能。

1.软件迁移评估

  • 检查用户软件包(RPM、DEB、TAR、ZIP、GZIP等文件)中包含的SO(Shared Object)依赖库和可执行文件,并评估SO依赖库和可执行文件的可迁移性。
  • 检查用户Java类软件包(JAR、WAR)中包含的SO依赖库和二进制文件,并评估SO依赖库和二进制文件的可迁移性。
  • 检查指定的用户软件安装路径下的SO依赖库和可执行文件,并评估SO依赖库和可执行文件的可迁移性。

2.源码迁移

  • 检查用户C/C++/Fortran软件构建工程文件,并指导用户如何迁移该文件。
  • 检查用户C/C++/Fortran/Python软件构建工程文件使用的链接库,并提供可迁移性信息。
  • 检查用户C/C++/Fortran/Python软件源码,并指导用户如何迁移源文件。其中,Fortran源码支持从Intel Fortran编译器迁移到GCC Fortran编译器,并进行编译器支持特性、语法扩展的检查。
  • 检查用户Python程序通过ctypes模块加载的SO文件的兼容性。
  • x86汇编指令转换,分析部分x86汇编指令,并转换成功能对等的鲲鹏汇编指令。

源码分析完毕后会生成分析报告:

分析报告分为迁移报告和源码迁移建议两个部分,默认显示迁移报告。

迁移报告分为5个区域,分别解释如下:

  • 配置信息:记录被扫描分析的源码路径、是否增强检查、编译器版本,构建工具,编译命令,目标操作系统,目标系统内核版本等信息。
  • 迁移统计信息:分为两个部分,一部分是依赖文件信息,包括需要迁移的依赖文件总数、可兼容替换的数量、待验证替换的数量;另一部分是源码迁移统计,包括需要的人月、源文件数及代码行数。
  • 与架构相关的依赖库文件:显示依赖文件信息以及处理建议,在“分析结果”列可以看到是否已经有兼容鲲鹏平台的替换文件,如果有的话可以在“处理建议”列单击“下载”超链接下载适配好的依赖文件。
  • 需要迁移的源文件:显示需要迁移的源文件个数、具体文件信息和需要迁移的代码行数,在每一个文件的操作列,可以单击“查看建议源码”超链接来查看修改建议。
  • 下载报告:可以下载.CSV格式和.html格式的报告,单击对应的按钮即可以下载。

源码迁移建议页面分为两个部分,左侧是文件列表,右侧是选定源码文件的内容及迁移建议。

在文件列表栏选中文件,在原始源代码区域会用红色波浪线标出需要修改的代码,把鼠标放在待修改代码上面,会弹出修改建议,可以按照修改建议自动或者手动修改代码。

3.软件包重构

在鲲鹏平台上,分析待迁移软件包构成,重构并生成鲲鹏平台兼容的软件包,或直接提供已迁移了的软件包。

软件包重构流程一般如下:

步骤1:准备要重构的软件包;

步骤2:评估迁移需要重构的软件包;

步骤3:分析软件包,生成分析报告,下载可兼容替换的jar包;

步骤4:进入软件包重构界面,上传要重构的软件包;

步骤5:配置依赖文件;

步骤6:执行软件包重构;

步骤7:下载重构后的软件包;

4.专项软件迁移

专项软件迁移提供开源软件迁移、调优的工具化解决方案。用户可以按照解决方案的粒度选择相应的软件,进行工具化快速迁移软件。专项软件迁移包含软件下载、修改、编译和软件包构建功能,需要用户在基于鲲鹏的服务器环境使用。

5.增强功能

鲲鹏代码迁移工具提供下面三种增强功能:

  • 64位运行模式检查

    对用户C/C++软件从32位模式迁移到64位模式进行检查。工具强制以64位模式编译用户软件,并通过编译选项发现从32位模式迁移到64位模式的必要修改,并提示用户进行进一步检查。

  • 结构体字节对齐检查

    用户软件中的结构体变量进行检查,分析其内存分配情况,并反馈用户。

  • 内存一致性检查

    对用户软件迁移到鲲鹏平台可能存在的内存一致性问题进行检查、修复。自动修复工具需要更新用户使用的GCC编译器,随后在用户软件的编译过程中自动完成内存一致性问题的修复。

四、加速库

为了充分发挥鲲鹏CPU硬件设计的优良性能以及ARM指令本身的优势,华为推出了一系列基于硬件加速和软件指令加速的鲲鹏加速库,这些加速库以基础库的形式提供,兼容开放的接口,在保证上层应用基本不需要更改代码的前提下,为鲲鹏平台的应用提供更强的能力。

鲲鹏加速库插件即插即用,支持从Visual Studio Marketplace及JetBrains Marketplace下载并在线安装插件客户端,能够扫描代码文件中可使用鲲鹏加速库优化后的函数或汇编指令,生成可视化报告;编码时能够自动匹配鲲鹏加速库函数字典,智能提示、高亮、联想字典中可以替换的库和函数。

五、编译器

由于鲲鹏处理器与x86处理器的指令差异,编译型代码/软件包从x86迁移到鲲鹏处理器时,通常需要重新编译才能运行;为解决这种问题,鲲鹏提供一键式部署的GCC编译器及包含毕昇编译器、JDK在内的全套编译软件,发挥鲲鹏平台极致性能,使能开发者高效创新。

  • 毕昇编译器:基于开源LLVM开发,并进行了优化和改进,同时将Flang作为默认的Fortran语言前端编译器,是针对鲲鹏平台的高性能编译器;
  • 毕昇JDK:基于OpenJDK开发的一款高性能JDK,可用于生产环境;
  • 鲲鹏GCC:基于开源GCC开发的编译器工具链(包含编译器,汇编器,链接器);

六、亮点与优势

鲲鹏开发套件具有入门简单、自动化、高效、便捷、可视化的优势。

1.入门简单

不改变开发者开发习惯,快速上手。

2.自动化

迁移内容自动识别,汇编代码自动翻译。

3.高效

代码修改建议自动生成,开发效率倍增。

  • 识别C/C++/Fortran/汇编源代码,提供修改建议;Make、CMake、Automake编译选项、编译宏的解析及迁移建议;
  • 支持100%Intrinsic函数转换(6000+个),包括MMX 、SSE及AVX Intrinsic 等;
  • 快速64位检查与结构体字节对齐修改建议;

4.便捷

远程调测,提供更便捷的调测能力。

5.可视化

全场景性能分析可视,性能瓶颈一目了然、调优尽在掌握。

详细的鲲鹏开发套件介绍见官网:https://www.hikunpeng.com/zh/developer/devkit

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

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

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。