开发者
资源
Kunpeng DevKit MPI 调试实验
Kunpeng DevKit MPI 调试实验
原创
发表于06/11
5250

Kunpeng DevKit MPI 调试实验配置说明

本实验只使用服务器 /home/kunpeng/ 目录下的两个示例源码:

文件类型DevKit 配置场景
/home/kunpeng/bcast_demo.c纯 MPI 应用不勾选OpenMP应用
/home/kunpeng/mpi_openmp_demo.cMPI + OpenMP 混合应用勾选OpenMP应用

服务器信息:

项目
IP121.36.46.xx
SSH 端口22
系统Huawei Cloud EulerOS 2.0aarch64
CPUKunpeng 920,4 核
示例源码目录/home/kunpeng

不要把服务器密码写入文档、脚本或命令历史中。建议后续改用 SSH key 登录。

1. 实验前置环境

1.1 需要的软件

本实验需要服务器具备以下环境:

环境用途检查命令
gcc编译 C/OpenMP 程序gcc --version
mpicc编译 MPI 程序command -v mpicc
mpirun启动 MPI 程序command -v mpirun
OpenMP 支持编译 MPI+OpenMP 程序gcc -fopenmp --version

之前检查服务器时,发现当前还没有安装好 MPI:

mpirun: NOT_FOUND
mpiexec: NOT_FOUND
mpicc: NOT_FOUND
ompi_info: NOT_FOUND

所以需要先安装 OpenMPI。系统仓库里的 OpenMPI 可以让命令行示例先跑起来:

dnf install -y openmpi openmpi-devel

安装后检查:

command -v mpirun
command -v mpicc
mpirun --version

在这台 Huawei Cloud EulerOS 上,OpenMPI 安装后常见路径是:

/usr/bin/mpirun
/usr/bin/mpicc
/usr/lib64/openmpi/bin/mpirun

但要注意:DevKit MPI 调试器本身可能要求 OpenMPI 4.x 的运行库 libmpi.so.40。当前系统仓库安装的是 OpenMPI 2.1.1,只提供:

/usr/lib64/openmpi/lib/libmpi.so.20

如果 DevKit 启动日志里出现 libmpi.so.40: cannot open shared object file,说明需要额外安装 OpenMPI 4.x,不能只依赖系统仓库的 OpenMPI 2.1.1。

1.2 DevKit MPI 调试器需要的 OpenMPI 4.x

DevKit MPI 调试器启动 lldb-server 时,如果依赖 libmpi.so.40,需要准备 OpenMPI 4.x。建议安装到独立目录,避免覆盖系统自带 OpenMPI:

/opt/openmpi-4.1.4

安装完成后应能看到:

ls -l /opt/openmpi-4.1.4/lib/libmpi.so.40
/opt/openmpi-4.1.4/bin/mpirun --version
/opt/openmpi-4.1.4/bin/mpicc --showme

如果使用 OpenMPI 4.x,后续编译和 DevKit 调试都应使用同一套 OpenMPI 4.x:

export PATH=/opt/openmpi-4.1.4/bin:$PATH
export LD_LIBRARY_PATH=/opt/openmpi-4.1.4/lib:$LD_LIBRARY_PATH

本实验服务器 /home/kunpeng 下已经有源码包:

/home/kunpeng/openmpi-4.1.4.tar.gz
/home/kunpeng/openmpi-4.1.4/

从源码安装 OpenMPI 4.1.4:

cd /home/kunpeng/openmpi-4.1.4

./configure \
  --prefix=/opt/openmpi-4.1.4 \
  --disable-mpi-fortran \
  --disable-oshmem \
  --without-verbs \
  --enable-mpirun-prefix-by-default

make -j4
make install

参数说明:

参数作用
--prefix=/opt/openmpi-4.1.4安装到独立目录,不覆盖系统 OpenMPI 2.1.1
--disable-mpi-fortran本实验只用 C 程序,避免缺少 Fortran 编译器导致 configure 失败
--disable-oshmem本实验不使用 OpenSHMEM,减少编译内容
--without-verbs单机实验不使用 InfiniBand/openib,避免相关告警
--enable-mpirun-prefix-by-defaultmpirun自动使用当前安装前缀下的库和组件

安装后验证:

/opt/openmpi-4.1.4/bin/mpirun --version
/opt/openmpi-4.1.4/bin/mpicc --showme
ls -l /opt/openmpi-4.1.4/lib/libmpi.so.40

再用 OpenMPI 4.1.4 重新编译本实验程序:

cd /home/kunpeng
/opt/openmpi-4.1.4/bin/mpicc -g -O0 bcast_demo.c -o bcast_demo
/opt/openmpi-4.1.4/bin/mpicc -g -O0 -fopenmp mpi_openmp_demo.c -o mpi_openmp_demo

命令行验证:

cd /home/kunpeng
export PATH=/opt/openmpi-4.1.4/bin:$PATH
export LD_LIBRARY_PATH=/opt/openmpi-4.1.4/lib:$LD_LIBRARY_PATH

mpirun --allow-run-as-root -np 2 ./bcast_demo

export OMP_NUM_THREADS=2
mpirun --allow-run-as-root -np 2 ./mpi_openmp_demo

1.3 检查示例源码

cd /home/kunpeng
ls -l bcast_demo.c mpi_openmp_demo.c

这两个 .c 文件是源码,不能直接填到 DevKit 的 应用程序 字段中。应用程序 字段要填编译后的可执行文件路径。

2. 编译示例程序

建议使用 -g -O0 编译,方便 DevKit Debugger 单步调试和查看变量。

进入源码目录:

cd /home/kunpeng

编译纯 MPI 示例:

mpicc -g -O0 bcast_demo.c -o bcast_demo

编译 MPI + OpenMP 示例:

mpicc -g -O0 -fopenmp mpi_openmp_demo.c -o mpi_openmp_demo

如果已安装 OpenMPI 4.x,建议明确使用 OpenMPI 4.x 的 mpicc

/opt/openmpi-4.1.4/bin/mpicc -g -O0 bcast_demo.c -o bcast_demo
/opt/openmpi-4.1.4/bin/mpicc -g -O0 -fopenmp mpi_openmp_demo.c -o mpi_openmp_demo

检查可执行文件:

ls -l /home/kunpeng/bcast_demo /home/kunpeng/mpi_openmp_demo

3. 命令行运行验证

在填 DevKit 前,建议先在服务器命令行确认程序可以运行。

3.1 纯 MPI 示例:bcast_demo

如果使用 root 用户运行 OpenMPI,需要加 --allow-run-as-root

cd /home/kunpeng
mpirun --allow-run-as-root --mca btl ^openib -np 2 ./bcast_demo

如果使用普通用户运行:

cd /home/kunpeng
mpirun -np 2 ./bcast_demo

3.2 MPI + OpenMP 示例:mpi_openmp_demo

服务器是 4 核,推荐先用 2 个 MPI 进程,每个进程 2 个 OpenMP 线程:

cd /home/kunpeng
export OMP_NUM_THREADS=2
mpirun --allow-run-as-root --mca btl ^openib -np 2 ./mpi_openmp_demo

含义:

2 个 MPI 进程 x 每个进程 2 个 OpenMP 线程 = 4 个线程

也可以简化为 1 个 MPI 进程,4 个 OpenMP 线程:

cd /home/kunpeng
export OMP_NUM_THREADS=4
mpirun --allow-run-as-root --mca btl ^openib -np 1 ./mpi_openmp_demo

4. DevKit 配置:纯 MPI 应用

适用文件:

/home/kunpeng/bcast_demo.c

编译后 DevKit 使用的应用程序:

/home/kunpeng/bcast_demo

4.1 字段填写

DevKit 字段填写内容
远程服务器配置121.36.46.xx
SSH 端口22
Linux 用户名实际登录服务器的用户,例如root
Linux 用户密码对应 Linux 用户密码
应用程序/home/kunpeng/bcast_demo
应用程序参数留空
应用程序源码路径/home/kunpeng
环境变量设置如果使用 OpenMPI 4.x,填export PATH=/opt/openmpi-4.1.4/bin:$PATH; export LD_LIBRARY_PATH=/opt/openmpi-4.1.4/lib:$LD_LIBRARY_PATH
调试启动方式mpirun 命令运行方式
MPI 运行命令行mpirun --allow-run-as-root --mca btl ^openib -np 2
OpenMP 应用不勾选
死锁检测先不勾选

4.2 说明

  • 应用程序/home/kunpeng/bcast_demo,不要填 /home/kunpeng/bcast_demo.c
  • MPI 运行命令行mpirun 和启动参数,不要重复写应用程序路径。
  • 如果换成普通用户运行,可以把 --allow-run-as-root 去掉。

普通用户示例:

MPI 运行命令行:mpirun -np 2

5. DevKit 配置:MPI + OpenMP 应用

适用文件:

/home/kunpeng/mpi_openmp_demo.c

编译后 DevKit 使用的应用程序:

/home/kunpeng/mpi_openmp_demo

5.1 推荐配置:2 个 MPI 进程,每个进程 2 个 OpenMP 线程

DevKit 字段填写内容
远程服务器配置121.36.46.xx
SSH 端口22
Linux 用户名实际登录服务器的用户,例如root
Linux 用户密码对应 Linux 用户密码
应用程序/home/kunpeng/mpi_openmp_demo
应用程序参数留空
应用程序源码路径/home/kunpeng
环境变量设置export OMP_NUM_THREADS=2; export PATH=/opt/openmpi-4.1.4/bin:$PATH; export LD_LIBRARY_PATH=/opt/openmpi-4.1.4/lib:$LD_LIBRARY_PATH
调试启动方式mpirun 命令运行方式
MPI 运行命令行mpirun --allow-run-as-root --mca btl ^openib -np 2
OpenMP 应用勾选
OpenMP 线程数2
死锁检测先不勾选

含义:

2 个 MPI 进程 x 每个进程 2 个 OpenMP 线程 = 4 个线程

5.2 简化配置:1 个 MPI 进程,4 个 OpenMP 线程

DevKit 字段填写内容
应用程序/home/kunpeng/mpi_openmp_demo
应用程序参数留空
应用程序源码路径/home/kunpeng
环境变量设置export OMP_NUM_THREADS=4; export PATH=/opt/openmpi-4.1.4/bin:$PATH; export LD_LIBRARY_PATH=/opt/openmpi-4.1.4/lib:$LD_LIBRARY_PATH
调试启动方式mpirun 命令运行方式
MPI 运行命令行mpirun --allow-run-as-root --mca btl ^openib -np 1
OpenMP 应用勾选
OpenMP 线程数4

含义:

1 个 MPI 进程 x 4 个 OpenMP 线程 = 4 个线程

5.3 线程数建议

这台服务器共有 4 个 CPU 核,建议满足:

MPI 进程数 x OpenMP 线程数 <= 4

推荐组合:

MPI 进程数OpenMP 线程数总线程数适用场景
144先调 OpenMP 并行部分
224推荐的 MPI+OpenMP 混合调试配置
414接近纯 MPI 的运行方式

6. mpirun 路径查询

安装 MPI 后,可以用下面命令查询 mpirun 路径:

command -v mpirun
which mpirun
type -a mpirun
whereis mpirun
readlink -f "$(command -v mpirun)"
```

查询哪个软件包提供 `mpirun`:

```
dnf provides '*/mpirun'
```

## 7. 常见问题

### 7.1 DevKit 的 `应用程序` 应该填什么?

**填编译后的可执行文件:**

```
/home/kunpeng/bcast_demo
/home/kunpeng/mpi_openmp_demo
```

**不要填源码文件:**

```
/home/kunpeng/bcast_demo.c
/home/kunpeng/mpi_openmp_demo.c
```

### 7.2 `mpirun: command not found`

说明 MPI 没安装,或者 `mpirun` 不在 PATH 中。

**先安装 OpenMPI:**

```
dnf install -y openmpi openmpi-devel
```

**再检查:**

```
command -v mpirun
```

如果 `mpirun` 在 `/usr/lib64/openmpi/bin/mpirun`,但 DevKit 找不到,可以在环境变量设置中加入:

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

7.3 root 用户运行 OpenMPI 报错

OpenMPI 默认不建议用 root 运行。如果实验中必须用 root,在 MPI 运行命令行 加:

mpirun --allow-run-as-root --mca btl ^openib -np 2

如果 DevKit 不方便加这个参数,也可以在环境变量设置中加入:

export OMPI_ALLOW_RUN_AS_ROOT=1
export OMPI_ALLOW_RUN_AS_ROOT_CONFIRM=1

7.4 OpenFabrics/openib 网络接口警告

如果运行时看到类似下面的提示:

A high-performance Open MPI point-to-point messaging module was unable to find any relevant network interfaces
Module: OpenFabrics (openib)

这不是程序运行失败,只是 OpenMPI 没找到 openib 高性能网络接口,会自动改用其他通信方式。本实验是单台服务器示范,可以在 MPI 运行命令行 中加入:

--mca btl ^openib

例如:

mpirun --allow-run-as-root --mca btl ^openib -np 2

这样可以屏蔽这个警告。

7.5 MPI+OpenMP 的线程数不一致

保持这两个位置一致:

OpenMP 线程数:2
环境变量设置:export OMP_NUM_THREADS=2

如果一个填 2,另一个填 4,调试时线程数量可能和预期不一致。

7.6 mpi_openmp_demo 输出很多、看起来很乱

mpi_openmp_demo.cCOUNT10000,并且循环内每次都会 printf。使用 -np 2OMP_NUM_THREADS=2 时,会有大量并行输出,顺序交错是正常现象。

验证是否真正运行成功,优先看命令返回码和最后几行输出。正常结束时会看到类似:

end sum: 49995000
WORLD RANK/SIZE: 1/2 --- ROW RANK/SIZE: 1/1

7.7 DevKit 启动失败:缺少 libmpi.so.40

如果 DevKit 报:

MPI应用启动失败,失败原因请查看服务器日志文件:/usr/bin/devkit/debugger_entrance/temp/.../nohup_mpirun.out

并且日志中有:

Failed to launch lldbserver
error while loading shared libraries: libmpi.so.40: cannot open shared object file: No such file or directory

原因是 DevKit 启动的 lldb-server 依赖 OpenMPI 4.x 的 libmpi.so.40,而当前系统仓库安装的 OpenMPI 2.1.1 只提供 libmpi.so.20

检查命令:

rpm -qa | grep openmpi
find /usr /usr/local /opt -name 'libmpi.so*' 2>/dev/null

正确修复方式:

安装 OpenMPI 4.x,并在 DevKit 环境变量设置中加入 OpenMPI 4.x 的 PATH 和 LD_LIBRARY_PATH。

不要把 libmpi.so.20 强行软链接成 libmpi.so.40。这两个库 ABI 版本不同,可能导致调试器启动后崩溃或行为异常。

8. 本实验推荐最终填写

纯 MPI:bcast_demo

应用程序:/home/kunpeng/bcast_demo
应用程序参数:
应用程序源码路径:/home/kunpeng
环境变量设置:export PATH=/opt/openmpi-4.1.4/bin:$PATH; export LD_LIBRARY_PATH=/opt/openmpi-4.1.4/lib:$LD_LIBRARY_PATH
调试启动方式:mpirun 命令运行方式
MPI 运行命令行:mpirun --allow-run-as-root --mca btl ^openib -np 2
OpenMP 应用:不勾选
死锁检测:不勾选

MPI + OpenMP:mpi_openmp_demo

应用程序:/home/kunpeng/mpi_openmp_demo
应用程序参数:
应用程序源码路径:/home/kunpeng
环境变量设置:export OMP_NUM_THREADS=2; export PATH=/opt/openmpi-4.1.4/bin:$PATH; export LD_LIBRARY_PATH=/opt/openmpi-4.1.4/lib:$LD_LIBRARY_PATH
调试启动方式:mpirun 命令运行方式
MPI 运行命令行:mpirun --allow-run-as-root --mca btl ^openib -np 2
OpenMP 应用:勾选
OpenMP 线程数:2
死锁检测:不勾选
收藏举报
Level 1
0
帖子
0
粉丝
0
获赞