鲲鹏 DevKit 实战!华为开发者空间体验 MPI 应用并行调试与编译

1 概述
1.1 背景介绍
鲲鹏DevKit是覆盖软件迁移、应用开发和性能调优的全流程鲲鹏原生开发工具,可以帮助开发者加速应用迁移和算力升级,提供鲲鹏开发套件,包括应用迁移和性能分析等一些列软件工具。
通过实际操作,让大家了解如何通过鲲鹏 DevKit 插件远程连接 DevKit 工具,并对应用进行远程编译调试,体验鲲鹏 DevKit 在鲲鹏原生开发过程中给开发者提供的便利。
1.2 适用对象
企业
个人开发者
高校学生
1.3 案例时间
本案例总时长预计 120 分钟。
1.4 案例流程

说明:
① 自动部署鲲鹏云服务器;② 安装鲲鹏 DevKit 插件;③ 下载 MPI 程序源文件;④ 环境安装;⑤ 编译应用;⑥ 并行调试。
1.5 资源总览
本案例预计花费总计 0 元。
最新案例动态,请查阅 《鲲鹏DevKit之多点并行调试》。小伙伴快来领取华为开发者空间进行实操吧!
2 操作步骤
2.1 自动部署鲲鹏云服务器
进入华为开发者空间工作台界面,点击打开云主机 > 进入桌面连接云主机。如果还没有领取云主机进入工作台界面后点击配置云主机,选择 Ubuntu 操作系统。


在云主机桌面右键选择“Open Terminal Here”,打开命令终端窗口。

执行自动部署命令如下:
命令的参数说明:
password:password 关键字后设置的是鲲鹏云服务器的 root 用户密码,命令中给出的默认为 abcd1234@,开发者可以替换成自定义密码(至少 8 个字符)。
time:time 关键字后面设置的为鲲鹏云服务器的可用时间,单位为秒,至少 600 秒。本案例建议申请的时间为 120 分钟,即 7200 秒。
记录部署鲲鹏云服务器公网 IP,如图:

2.2 安装鲲鹏 DevKit 插件
在云主机桌面,打开 CodeArts IDE for Python/Java 开发环境,单击右侧“扩展”按钮,搜索 Kunpeng DevKit,点击安装该插件。

2.3 下载 MPI 程序源文件
在云主机桌面右键选择“Open Terminal Here”,打开命令终端窗口,输入以下命令下载并解压待使用的 MPI 程序源文件。

解压后“Compiler_and_Debugger/mpi_demo/”路径下的 bcast_demo.c 作为 MPI 程序源文件。
2.4 环境安装
以下工具或依赖库安装更新都是在2.1自动部署的鲲鹏云服务器上进行的,不是云主机,确定好操作环境再进行安装。
使用“ssh root@鲲鹏云服务器公网 IP”命令连接远程鲲鹏云服务器,“鲲鹏云服务器公网”就是自动部署鲲鹏云服务器后记录的 IP 地址。
2.4.1 安装 mpicc
由于在自动部署拉起的服务器上进行编译调试时,需要使用 mpicc,mpicc 是 MPI 实现的一部分,常见的 MPI 实现有 OpenMPI 和 MPICH。这里安装 OpenMPI。
使用 ssh 命令(ssh root@鲲鹏云服务器公网 IP)连接远程鲲鹏云服务器后,执行以下命令安装 OpenMPI。

配置环境变量:
1.编辑配置文件,进入 Vim 窗口后,按“i”编辑 profile。
2.在文件末尾添加以下内容。
3.按“ESC”退出编辑,再按“:wq”保存修改并退出,然后刷新配置文件。
安装 OpenMPI 后会提供 mpicc,查看 mpicc 的版本信息成功,表明 mpicc 已经成功安装在你的系统中。

2.4.2 安装 MPI
由于目前环境中 mpirun 版本为 2.1.1,不满足 lldb-server 服务要求,需要更新。这里我们安装 MPI 4.1.4 版本。
同样在远程鲲鹏云服务器中,下载安装包。
安装依赖包。

加载编译器。
执行以下命令进行配置预编译。

安装编译。


配置环境变量:
1.编辑配置文件,进入 Vim 窗口后,按“i”编辑 profile
2.在文件末尾添加
3.按“ESC”退出编辑,再按“:wq”保存修改并退出,然后刷新配置文件。
/path/to/OPENMPI/:OpenMPI 实际安装的路径,请根据实际情况进行替换。
执行以下命令验证 OpenMPI 是否安装成功。

2.4.3 创建 libstdc++.so.6 软链接
由于/usr/lib64/libstdc++.so.6 版本较旧,不包含 GLIBCXX_3.4.26,不满足 lldb-server 需求。这里用软链接方式将/usr/lib64/libstdc++.so.6 的链接指向 /opt/Devkit/tools/libstdc++.so.6。
建议备份/usr/lib64/libstdc++.so.6。
建立软链接。
检查软链接。

2.5 编译应用
在云主机桌面双击打开 CodeArts IDE,打开解压后的 MPI 程序,即解压后“Compiler_and_Debugger/mpi_demo/”路径。

打开工程后,点击打开 bcast_demo.c 文件,修改 85 行为:“int color = rankNum / 1;”。即将调试时划分通信子组规则由 2 个 rank 为 1 个通信子组改为 1 个 rank 为 1 个通信子组。

进入鲲鹏 DevKit 插件,选择使用鲲鹏 DevKit 窗口中的“开始使用”,配置 IP 和端口,IP 是2.1自动部署鲲鹏云服务器得到的弹性公网 IP,端口是 8086,服务证书选择“信任当前服务证书”。

首次登录需要创建管理员密码,登录成功后,点击“编译”,添加目标服务器。

添加远程鲲鹏云服务器为目标服务器,服务器 IP 地址为鲲鹏云服务器弹性公网 IP 地址。

然后再次点击“编译”到编译配置窗口,服务器信息会自动带出,配置编译命令后再点击“编译”。编译命令如下:

首次创建后再修改编译和调试配置可以通过点击 CodeArts IDE 底部“鲲鹏 DevKit”,点击右上角“设置”按钮,再选择 “工程设置”即可对编译和调试配置进行二次修改。

根据提示输入鲲鹏云服务器密码,编译成功会在鲲鹏云服务器/root/workspace/mpi_demo 目录下生成带调试信息的可执行文件 bcast_demo。

2.6 并行调试
在 DevKit 插件中点击“调试”,打开调试页面,选择“HPC 并行应用”,配置 MPI 应用调试参数,点击“开始调试”。
应用程序:/root/workspace/mpi_demo/bcast_demo
应用程序源码路径:/root/workspace/mpi_demo
MPI 运行命令行:mpirun --allow-run-as-root -np 2

参数说明如下:
rank:rank 用于标识 MPI 并行程序中各个进程的唯一编号,在特定通信组内具有唯一性,且决定进程间通信和数据交互的顺序与方式。在 MPI 并行程序执行时,会启动多个进程协同工作,rank 就像是每个进程的 “身份证号”。
开始调试后会读取 rank 状态:

在 rank 状态读取过程中,若 rank 状态读取全部成功,会自动跳转到 MPI 应用调试页面。页面上获取到运行和调试区、源码区和调试功能区,运行和调试区域包括调试信息区和 rank 信息区。HPC 并行应用调试支持三种调试粒度,分别为“全部”调试、“rank”调试或“通信组”调试。


调试按钮操作描述:
RANK 信息区域选择“全部”调试方式,在 89 行代码处、47 行代码处和 93 行代码处打上断点,再继续执行后续操作。
选择“全部”调试方式,单击“继续”按钮,代码执行到 89 行,再单击“下一步”执行 MPI_Comm_split(MPI_COMM_WORLD, color, rankNum, &row_comm)函数,该函数可将所有的 rank 进行通信分组。这里将 2 个 rank 生成 2 个通信子组,rank1 在通信子组 1,rank0 在通信子组 2。

生成 2 个通信子组后,所有 rank 的源码执行到 90 行代码处,选择“通信组”调试方式,选择通信子组 1 中的 rank1,单击“下一步”按钮,通信子组 1 中的 rank 代码执行到 92 行,通信子组 2 中的 rank0 代码无变化,停留在 90 行。
调试通信子组 1:

未调试通信子组 2:

选择“通信组”调试方式,在左侧通信子组 1 中选择 rank1,单击“继续”按钮,代码执行到 47 行,单击“下一步”按钮,执行 MPI_Barrier(MPI_COMM_WORLD)函数,函数执行完成后,通信子组 1 会一直处于等待状态,此时,在左侧通信子组 2 中选择 rank0,单击“继续”按钮,代码执行到 47 行,单击“下一步”按钮,执行 MPI_Barrier(MPI_COMM_WORLD)函数,函数执行完成后,通信子组 1 不再等待,同步执行到 49 行代码处。
rank1 处于等待状态:

rank0 执行后,rank1、rank 同步执行到 49 行:

单击“点击放大”按钮,在 CodeArts IDE 面板中能看到通信子组的变化概览,每 100ms 显示通信子组的变化。通信子组的变化用不同颜色的菱形来区分,蓝色表示通信子组创建,紫色表示通信子组清除,黄色表示 100ms 内存在通信子组创建和通信子组清除。

释放掉 47 行断点,RANK 信息区域选择“全部”调试方式,循环点击“继续”按钮,代码执行到 93 行,在单击“下一步”按钮,执行 MPI_Comm_free(&row_comm)函数,当不再调试某一通信子组时,可以释放创建的通信子组,该函数能实现释放创建的通信子组。

点击侧边或下方工具栏中“运行和调试”查看调试信息。

至此,使用鲲鹏 DevKit 工具进行 MPI 应用并行调试完成。
更多鲲鹏 DevKit 调试能力探索:介绍-编译调试工具-IDE插件-用户指南-鲲鹏开发套件开发文档-鲲鹏社区
3 问题记录
3.1 编译调试问题
1、重复操作案例或更换鲲鹏云服务器重新编译失败报错:cd: /root/workspace/mpi_demo: No such file or directory

原因:mpi_demo 在第一次编译时同步项目到鲲鹏云服务器中,并在项目下缓存了记录,想要再次编译时触发同步项目需要删除 mpi_demo 下的缓存文件。
解决:删除云主机中 mpi_demo 项目下的缓存文件./devkit,删除后重新点击编译,参考2.5编译应用配置编译命令(mpicc -g bcast_demo.c -o bcast_demo)即可。
“/home/developer/Desktop/devkitdemo-devkitdemo-23.0.1/Compiler_and_Debugger/mpi_demo”是云主机本地 mpi_demo 路径,以个人操作时实际路径为准。
3.2 反馈改进建议
如您在案例实操过程中遇到问题或有改进建议,可以到论坛帖评论区反馈即可,我们会及时响应处理,谢谢!
评论