1 概述

1.1 背景介绍

鲲鹏DevKit是覆盖软件迁移、应用开发和性能调优的全流程鲲鹏原生开发工具,可以帮助开发者加速应用迁移和算力升级,提供鲲鹏开发套件,包括应用迁移和性能分析等一些列软件工具。

通过实际操作,让大家了解如何通过鲲鹏DevKit插件远程连接DevKit工具,并对应用进行远程编译调试,体验鲲鹏DevKit在鲲鹏原生开发过程中给开发者提供的便利。

1.2 适用对象

  • 企业
  • 个人开发者
  • 高校学生

1.3 案例时间

本案例总时长预计120分钟。

1.4 案例流程

image.png

说明:

① 自动部署鲲鹏云服务器;
② 安装鲲鹏DevKit插件;
③ 下载MPI程序源文件;
④ 环境安装;
⑤ 编译应用;
⑥ 并行调试。

1.5 资源总览

本案例预计花费总计0元。

资源名称 规格 单价(元) 时长(分钟)
华为开发者空间 — 云主机 鲲鹏通用计算增强型 kc2 | 4vCPUs | 8G | Ubuntu 免费 120

最新案例动态,请查阅 《鲲鹏DevKit之多点并行调试》。小伙伴快来领取华为开发者空间进行实操吧!

2 操作步骤

2.1 自动部署鲲鹏云服务器

进入华为开发者空间工作台界面,点击打开云主机 > 进入桌面连接云主机。
如果还没有领取云主机进入工作台界面后点击配置云主机,选择Ubuntu操作系统。
image.png
image.png

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

image.png

执行自动部署命令如下:

hcd deploy --password abcd1234@ --time 7200

命令的参数说明:

  • password:password关键字后设置的是鲲鹏云服务器的root用户密码,命令中给出的默认为abcd1234@,开发者可以替换成自定义密码(至少8个字符)。
  • time:time关键字后面设置的为鲲鹏云服务器的可用时间,单位为秒,至少600秒。本案例建议申请的时间为120分钟,即7200秒。

记录部署鲲鹏云服务器公网IP,如图:

image.png

2.2 安装鲲鹏DevKit插件

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

image.png

2.3 下载MPI程序源文件

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

wget https://codeload.github.com/kunpengcompute/devkitdemo/zip/refs/heads/devkitdemo-23.0.1
unzip devkitdemo-23.0.1

image.png

解压后“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。

sudo yum update -y
sudo yum install -y openmpi openmpi-devel

image.png

配置环境变量:

1.编辑配置文件,进入Vim窗口后,按“i”编辑profile。

sudo vim /etc/profile

2.在文件末尾添加以下内容。

export PATH=$PATH:/usr/lib64/openmpi/bin

3.按“ESC”退出编辑,再按“:wq”保存修改并退出,然后刷新配置文件。

source /etc/profile

安装 OpenMPI 后会提供 mpicc,查看 mpicc 的版本信息成功,表明 mpicc 已经成功安装在你的系统中。

mpicc --version

image.png

2.4.2 安装MPI

由于目前环境中mpirun版本为2.1.1,不满足lldb-server服务要求,需要更新。这里我们安装MPI 4.1.4版本。

同样在远程鲲鹏云服务器中,下载安装包。

mkdir -p /path/to/OpenMPI
cd /path/to/OpenMPI
wget https://dtse-mirrors.obs.cn-north-4.myhuaweicloud.com/case/0018/openmpi-4.1.4.tar.gz
tar -zxvf openmpi-4.1.4.tar.gz

安装依赖包。

yum install -y numactl-devel-* systemd-devel-*

image.png

加载编译器。

export PATH=/path/to/GUN/bin:$PATH
export LD_LIBRARY_PATH=/path/to/GUN/lib64:$LD_LIBRARY_PATH

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

cd openmpi-4.1.4
./configure --prefix=/path/to/OPENMPI --enable-pretty-print-stacktrace --enable-orterun-prefix-by-default --with-cma  --enable-mpi1-compatibility CC=gcc CXX=g++ FC=gfortran

image.png

安装编译。

make -j 2

image.png

make install

image.png

配置环境变量:

1.编辑配置文件,进入Vim窗口后,按“i”编辑profile

sudo vim /etc/profile

2.在文件末尾添加

export PATH=/path/to/GNU/bin:/path/to/OPENMPI/bin:$PATH
export LD_LIBRARY_PATH=/path/to/GNU/lib64:/path/to/OPENMPI/lib:$LD_LIBRARY_PATH

3.按“ESC”退出编辑,再按“:wq”保存修改并退出,然后刷新配置文件。

source /etc/profile

/path/to/OPENMPI/:OpenMPI实际安装的路径,请根据实际情况进行替换。

执行以下命令验证OpenMPI是否安装成功。

mpirun --version

image.png

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。

sudo mv /usr/lib64/libstdc++.so.6 /usr/lib64/libstdc++.so.6.bak

建立软链接。

sudo ln -s /opt/DevKit/tools/libstdc++.so.6 /usr/lib64/libstdc++.so.6

检查软链接。

ls -l /usr/lib64/libstdc++.so.6

image.png

2.5 编译应用

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

08c68b8149b5bcf719fc604d8fae17cc.png

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

644bc6e7c41a1ca3fe02f43dcb34ad63.png

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

665ee69e02724214771e9326af0ce6fe.png

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

afcb9d80efd846396ac6ba065d493d8b.png

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

1d462ff3df3b3c8378dd3e7b6a7cfde0.png

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

mpicc -g bcast_demo.c -o bcast_demo

7b69217095fb11d1ca1ce7a7b196514e.png

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

5bb1ade6e0f7eeea9b4503d8b5739779.png

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

3c9ab1e058b15a15333cc486ed46cd38.png

2.6 并行调试

在DevKit插件中点击“调试”,打开调试页面,选择“HPC并行应用”,配置MPI应用调试参数,点击“开始调试”。

应用程序:/root/workspace/mpi_demo/bcast_demo

应用程序源码路径:/root/workspace/mpi_demo

MPI运行命令行:mpirun --allow-run-as-root -np 2

400fcae2ab4c14932811bb3003a17cca.png

参数说明如下:

参数 说明
远程服务器配置 进行HPC并行应用调试的目标服务器
Linux用户名 输入启动MPI应用的Linux用户名称
Linux用户密码 使用的Linux用户密码
SSH端口 驶入启动MPI应用的服务器SSH端口号
应用程序 输入的MPI应用,支持动态检索并显示应用程序路径
应用程序参数(可选) 传递给应用程序运行的参数
应用程序源码路径 源码和MPI应用存放的共享路径,支持动态检索并显示应用程序源码路径。
环境变量设置(可选) 输入运行HPC并行应用所需要的环境变量
调试启动方式 调试启动方式可选: mpirun命令运行方式 多瑙调度器运行方式 Slurm调度器运行方式
MPI运行命令行 输入的mpirun命令以及对应的命令参数,rank数目为1~2048
OpenMP应用(可选) 勾选后,需要输入OpenMP线程数。
死锁检测(可选) 勾选后,需要输入死锁超时时间。

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

开始调试后会读取rank状态:

f156dc813c61a4213caa420aee3f08be.png

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

调用方式 效果
全部 在RANK信息区域选择“全部”方式进行调试,选择某一个rank,对其进行调试会应用到全部rank。
rank 在RANK信息区域选择“rank”方式进行调试,对单一rank进行调试。
通信组 在RANK信息区域选择“通信组”方式进行调试,选择通信组中的某一个rank,对其进行调试会应用到整个通信组。

aa5003f9855afd23a0cc5ca9191972f8.png

760b3e5f315963c3e6a6d3585ad7f932.png

调试按钮操作描述:

操作 操作描述
继续 点击执行到下一个断点
单步跳过 点击执行到下一行
单步调试 点击步入函数
单步跳出 点击步出函数
停止 点击后停止调试

RANK信息区域选择“全部”调试方式,在89行代码处、47行代码处和93行代码处打上断点,再继续执行后续操作。

选择“全部”调试方式,单击“继续”按钮,代码执行到89行,再单击“下一步”执行MPI_Comm_split(MPI_COMM_WORLD, color, rankNum, &row_comm)函数,该函数可将所有的rank进行通信分组。这里将2个rank生成2个通信子组,rank1在通信子组1,rank0在通信子组2。

7b5f19798110292d90f280eee72d2e0e.png

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

调试通信子组1:

8b466586d6ce0306a2819d43bd4e119a.png

未调试通信子组2:

da4b1e1969dbd7cb2d43cea254a54007.png

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

rank1处于等待状态:
c7c5d53457cba0479ca851a080ca3e40.png

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

1086a423e8158f195081d9065d3f449b.png

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

6c33791f93c64830acf38af185d08910.png

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

dc1664ffd8957ea862f380a2d4bcd729.png

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

b2167b36f20d461cf9cf76346460ed9d.png

至此,使用鲲鹏DevKit工具进行MPI应用并行调试完成。

更多鲲鹏DevKit调试能力探索:介绍-编译调试工具-IDE插件-用户指南-鲲鹏开发套件开发文档-鲲鹏社区

3 问题记录

3.1 编译调试问题

1、重复操作案例或更换鲲鹏云服务器重新编译失败
报错:cd: /root/workspace/mpi_demo: No such file or directory

42cd9bf20c8ba554245ab42ea8a942aa.png

原因:mpi_demo在第一次编译时同步项目到鲲鹏云服务器中,并在项目下缓存了记录,想要再次编译时触发同步项目需要删除mpi_demo下的缓存文件。

解决:删除云主机中mpi_demo项目下的缓存文件./devkit,删除后重新点击编译,参考2.5编译应用配置编译命令(mpicc -g bcast_demo.c -o bcast_demo)即可。

cd /home/developer/Desktop/devkitdemo-devkitdemo-23.0.1/Compiler_and_Debugger/mpi_demo
rm -rf .devkit/

“/home/developer/Desktop/devkitdemo-devkitdemo-23.0.1/Compiler_and_Debugger/mpi_demo”是云主机本地mpi_demo路径,以个人操作时实际路径为准。

3.2 反馈改进建议

如您在案例实操过程中遇到问题或有改进建议,可以到论坛帖评论区反馈即可,我们会及时响应处理,谢谢!

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐