---
title: 调试MPI应用
description: "编译调试工具提供HPC场景多节点并行调试能力，仅支持以Launch模式调试MPI应用。并行计算包含任务并行和数据并行，指每个节点执行不同的任务或每个节点存储不同的数据，目前HPC并行任务只支持CPU调试。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengdevps/debugging/debugger/DevKit_Debugger_00013.html
sourcePath: /source/zh/kunpengdevps/debugging/debugger/DevKit_Debugger_00013.html
indexId: ec46c7687192ac7b3bd05c4ba07e5408d6f1799f709c4b156de25ede1365bd6d69
---
# 调试MPI应用

编译调试工具提供HPC场景多节点并行调试能力，仅支持以Launch模式调试MPI应用。并行计算包含任务并行和数据并行，指每个节点执行不同的任务或每个节点存储不同的数据，目前HPC并行任务只支持CPU调试。

MPI（Message Passing Interface）是消息传递并行程序设计的标准之一，当前通用的是MPI1.1规范。需要安装OpenMPI实现MPI标准。

1. 通讯器（communication），定义了一组能够互相发送消息的进程。在这组进程中，每个进程赋予一个叫做秩（rank）的序号，进程间显式地通过指定秩来进行通信。
2. 点对点（point-to-point）通信，一个进程可以通过指定另一个进程的秩以及唯一的消息标签（tag）来发送消息给另一个进程。接收者可以发送一个接收特定标签标记的消息的请求，然后依次处理接收到的数据。类似一个发送者以及一个接收者的通信被称作点对点通信。
3. 集体（collective）通信，某个进程可能需要跟所有其他进程通信，例如主进程想发一个广播给所有的从进程，MPI提供专门的接口实现这类所有进程间的集体通信。

#### 前提条件

- 已成功登录鲲鹏DevKit。
- 程序已完成编译。
- 已安装  OpenMPI 4.1.4(https://www.open-mpi.org/software/ompi/v4.1/)
版本，安装OpenMPI相关操作可参考《  OpenMPI 安装指南(https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpcindapp/instg-osc/kunpengopenmpi_03_0001.html)
》。
- 在VS Code工具的资源管理器中打开本地源程序所在的文件夹。


#### 编写语言：C/C++

1. 单击左侧树快捷功能区按钮，或单击“开发”选择编译调试下方的“调试”，打开调试页面。
2. 选择“HPC并行应用”，配置MPI应用调试参数，如图1所示，配置完成后，单击“开始调试”。
  图1 HPC并行应用调试

  调试MPI应用无需打开“OpenMP应用”参数。

**表1 HPC并行应用调试参数说明**

| 参数 | 说明 |
| --- | --- |
| 远程服务器配置 | 进行HPC并行应用调试的目标服务器。 |
| Linux用户名 | 输入启动MPI应用的Linux用户名称。 说明： root用户拥有最高权限，为了避免给系统带来不必要的风险，建议使用非root用户进行调试。 |
| Linux用户密码 | 使用的Linux用户密码。 |
| 记住密码 | 勾选后可记住当前远程服务器Linux用户密码。 |
| SSH端口 | 输入启动MPI应用的服务器SSH端口号。 |
| 应用程序 | 输入的MPI应用，支持动态检索并显示应用程序路径。 请给Linux用户添加当前MPI应用的可读权限以及应用所在目录的可读、可写和可执行权限。 说明： MPI应用要为可执行文件。 若MPI应用中无源码信息，则调试器默认以汇编形式进行调试。 |
| 应用程序参数（可选） | 传递给应用程序运行的参数，若存在多个参数需使用空格隔开。 请给Linux用户添加应用程序所在目录的可读、可写、可执行权限及应用程序所在目录父目录的可执行权限。 |
| 应用程序源码路径 | 源码和MPI应用存放的共享路径，支持动态检索并显示应用程序源码工作目录。 若MPI应用已配置共享路径，源码与MPI应用都应存放在共享路径下。 请给Linux用户添加当前MPI应用源码路径的可读、可执行权限及源码文件所在目录父目录的可执行权限。 |
| 环境变量设置（可选） | 输入运行HPC并行应用所需要的环境变量，有以下3种方式可选择，可根据实际情况进行修改。 export PATH=$PATH:/path/to/mpi source /configure/mpi/path/file module load /mpi/modulefiles |
| 调试启动方式 | 调试启动方式可选： mpirun 命令运行方式 多瑙调度器 运行方式 Slurm调度器 运行方式 |
| MPI运行命令行 | 输入的mpirun命令以及对应的命令参数，rank数目为1 ~ 2048。 |
| 多瑙调度器运行命令行 | 输入的多瑙调度器命令以及对应的命令参数。 |
| Slurm调度器运行命令行 | 输入的srun命令以及对应的命令参数。 |
| OpenMP应用（可选） | 勾选后，需要输入OpenMP线程数。 |
| OpenMP线程数（可选） | 输入的OpenMP应用thread数量，取值范围1 ~ 1024。 |
| 死锁检测（可选） | 勾选后，需要输入死锁超时时间。 |
| 死锁超时时间（s）（可选） | 死锁超时时间，默认为10秒，取值范围10秒 ~ 60秒。 |


3. 右下角弹框提示“HPC并行应用调试启动中”，检测所输入的配置信息是否正确，若检测结果错误，请根据提示信息进行处理。若检测成功，右下角弹出弹框提示rank状态读取中，如图2所示。
  图2 rank状态读取中

  若HPC并行应用调试启动失败，请参见HPC并行应用调试启动失败的解决方法进行处理。

4. 在rank状态读取过程中，若rank状态读取失败，请根据提示下载最新日志文件了解失败详情。如图3所示。
  图3 rank状态读取失败

5. 在rank状态读取过程中，若rank状态读取全部成功，会自动跳转到MPI应用调试页面。页面上获取到运行和调试区、源码区和调试功能区，运行和调试区域包括调试信息区和RANK信息区，如图4所示。
  图4 rank状态读取成功

6. MPI应用支持三种调试粒度，分别为“全部”调试、“rank”调试或“通信组”调试，还可以选择调试功能区的其他操作按钮来进行调试操作，如表2所示。鼠标移动到调试按钮左侧区域，单击鼠标可以移动调试按钮到其他地方。
**表2 调试按钮操作描述**

| 图标 | 操作 | 操作描述 |
| --- | --- | --- |
|  | 继续 | 单击执行到下一个断点 |
|  | 暂停 | 单击中断正在执行的程序 |
|  | 单步跳过 | 单击执行到下一行 |
|  | 单步调试 | 单击步入函数 |
|  | 单步跳出 | 单击步出函数 |
|  | 重启 | 单击后重新启动调试 |
|  | 停止 | 单击后停止调试 |


  调试方式 以“全部”方式进行调试，选择某一个rank，会对全部rank进行调试，在RANK信息区域所有通信组右侧显示定位图标。 以“rank”方式进行调试，对单一rank进行调试，在RANK信息区域对应rank右侧显示定位图标。 以“通信组”方式进行调试，选择通信子组中的某一个rank，会对其对应的通信子组进行调试，在RANK信息区域对应rank的通信子组右侧显示定位图标。 rank状态展示 rank前的状态灯表示当前rank的状态，绿色表示rank停止，红色表示rank正在运行，灰色表示rank已退出。

7. 进行调试时，当前调试的代码行会高亮显示，在代码行号处单击，会添加断点标记，右击断点可编辑、删除和禁用断点。
  支持添加条件断点（表达式、命中次数），条件断点支持修改、启用、禁用和删除。表达式断点是指表达式成立时中断该程序，命中次数断点是指命中指定的次数时中断该程序（当大于等于设置的命中次数时，均可进入断点中）。

  图5 设置断点

  表达式长度不大于1024个字符。 命中次数不大于2147483647（2^31-1）的正整数。

8. 单击调试功能区的按钮，将重新启动MPI应用调试，重启后右下角弹出弹框提示rank状态读取中，读取成功后打开MPI应用调试页面。
  图6 重启调试任务

9. 单击左侧调试信息区域会显示对应的变量（Locals、Register）、监视、断点和调用堆栈信息。

  - 在调试过程中可以修改变量值，右击变量表达式，可设置变量值，也可将变量表达式添加到监视中（Register表达式不能添加到监视中）。
  - 在监视区域中，支持添加、修改、单个删除、全部删除监视表达式，仅支持C/C++语言格式的表达式。
  - 在断点区域中，支持单个删除、全部删除、启用所有、禁用所有断点。
展开调试信息如图7所示。图7 调试信息- 单击调用堆栈区域展开显示堆栈信息，包含函数名、文件名、当前运行的行数和地址。
- 在调试信息区单击某个堆栈，源码区会切换到对应的源码或汇编语言。


10. 在RANK信息区域单击按钮，在VS Code面板上显示“通信子组变化”页面。

  - 单击“变化概览”，显示通信子组的变化概览，每100ms显示通信子组的变化。通信子组的变化用不同颜色的菱形来区分，蓝色表示通信子组创建，紫色表示通信子组清除，黄色表示100ms内存在通信子组创建和通信子组清除。
    图8 通信子组变化概览

    鼠标悬浮到菱形上，显示通信子组变化的详细信息。

    图9 通信子组悬浮信息

  - 单击“变化详情”，显示通信子组的变化详情，鼠标悬浮到对应位置会显示所属通信子组以及rank信息。
    图10 通信子组变化详情

  - 调试过程中若检测到死锁，提示通信子组发生死锁，单击“查看详情”或“死锁”，显示死锁详细信息，如死锁状态图以及表格信息。表格展示rank、源进程（rank）、目标进程（rank）、标记、数据大小（byte）和调用栈信息。
    图11 通信子组死锁详情

    若未单击按钮，调试过程中发生死锁，右下角弹框会提示检测到死锁，如图12所示，单击“查看详情”，跳转到死锁页面，查看通信子组死锁的详细信息。

    图12 检测到死锁

    在RANK信息区域，单击按钮，开启后对通信子组的创建和清除进行采集，并在VS Code面板上显示变化概览。 在通信子组变化概览页面中，单击“通信子组创建”、“通信子组清除”或“通信子组创建并清除”，可以不查看对应相关信息。 死锁是指两个或多个进程各自在等待另一个进程释放资源，或两个或多个进程在循环链中等待资源的情况。在MPI应用中进行点对点通信时，MPI点对点函数顺序不当则会发生死锁的现象。


#### 编写语言：Fortran

Fortran是目前国际上广泛流行的一种高级语言，适用于科学计算。Fortran也是一种编译型语言，源代码必须通过编译器生成可以运行的机器可执行文件。安装编译器GFortran参考链接：https://gcc.gnu.org/fortran/(https://gcc.gnu.org/fortran/)。

Fortran90程序是一种分块形式的程序，整个程序由若干个程序模块组成，各模块都有相似的语句组织形式，其中主程序起整体控制作用，各辅程序模块各自完成问题中的一个算法。Fortran95是对Fortran90的补充，两者差别不大，都可支持调试。

由于毕昇编译器和Fortran自身的语法特性，在调试毕昇编译器编译的Fortran应用时会出现进入到汇编且无法打断点和查看调试信息的情况。


1. 单击左侧树快捷功能区按钮，或单击“开发”选择编译调试下方的“调试”，打开调试页面。
2. 选择“HPC并行应用”，配置MPI应用调试参数，如图13所示，配置完成后，单击“开始调试”。
  图13 HPC并行应用调试

  调试MPI应用无需打开“OpenMP应用”参数。 Fortran文件扩展名为.f90，.f90是现代Fortran源文件的标准文件扩展名。 90指的是1990年的第一个现代Fortran标准。

**表3 HPC并行应用调试参数说明**

| 参数 | 说明 |
| --- | --- |
| 远程服务器配置 | 进行HPC并行应用调试的目标服务器。 |
| Linux用户名 | 输入启动MPI应用的Linux用户名称。 说明： root用户拥有最高权限，为了避免给系统带来不必要的风险，建议使用非root用户进行调试。 |
| Linux用户密码 | 使用的Linux用户密码。 |
| 记住密码 | 勾选后可记住当前远程服务器Linux用户密码。 |
| SSH端口 | 输入启动MPI应用的服务器SSH端口号。 |
| 应用程序 | 输入的MPI应用，支持动态检索并显示应用程序路径。 请给Linux用户添加当前MPI应用的可读权限以及应用所在目录的可读、可写和可执行权限。 说明： MPI应用要为可执行文件。 若MPI应用中无源码信息，则调试器默认以汇编形式进行调试。 |
| 应用程序参数（可选） | 传递给应用程序运行的参数，若存在多个参数需使用空格隔开。 请给Linux用户添加应用程序所在目录的可读、可写、可执行权限及应用程序所在目录父目录的可执行权限。 |
| 应用程序源码路径 | 源码和MPI应用存放的共享路径，支持动态检索并显示应用程序源码路径。 若MPI应用已配置共享路径，源码与MPI应用都应存放在共享路径下。 请给Linux用户添加当前MPI应用源码路径的可读、可执行权限及源码文件所在目录父目录的可执行权限。 |
| 环境变量设置（可选） | 输入运行HPC并行应用所需要的环境变量，有以下3种方式可选，可根据实际情况进行修改。 export PATH=$PATH:/path/to/mpi source /configure/mpi/path/file module load/mpi/modulefiles |
| 调试启动方式 | 调试启动方式可选： mpirun 命令运行方式 多瑙调度器 运行方式 Slurm调度器 运行方式 |
| MPI运行命令行 | 输入的mpirun命令以及对应的命令参数，rank数目为1 ~ 2048。 |
| 多瑙调度器运行命令行 | 输入的多瑙调度器命令以及对应的命令参数。 |
| Slurm调度器运行命令行 | 输入的Slurm调度器命令以及对应的命令参数。 |
| OpenMP应用（可选） | 勾选后，需要输入OpenMP线程数。 |
| OpenMP线程数（可选） | 输入的OpenMP应用thread数量。 |
| 死锁检测（可选） | 勾选后，需要输入死锁超时时间。 |
| 死锁超时时间（s）（可选） | 死锁超时时间，默认为10秒，取值范围10秒 ~ 60秒。 |


3. 右下角弹框提示“HPC并行应用调试启动中”，检测所输入的信息是否正确，若检测结果错误，请根据提示信息进行处理。若检测成功，右下角弹出弹框提示rank状态读取中，如图14所示。
  图14 rank状态读取中

  若HPC并行应用调试启动失败，请参见HPC并行应用调试启动失败的解决方法进行处理。

4. 在rank状态读取过程中，若rank状态读取存在失败，请根据提示下载日志文件了解失败详情。如图15所示。
  图15 rank状态读取失败

5. 在rank状态读取过程中，若rank状态读取全部成功，会自动跳转到MPI应用调试页面。页面上获取到运行和调试区、源码区和调试功能区，运行和调试区域包括调试信息区和RANK信息区，如图16所示。
  图16 rank状态读取成功

6. MPI应用支持三种调试粒度，分别为“全部”调试、“rank”调试或“通信组”调试，还可以选择调试功能区的其他操作按钮来进行调试操作，如表4所示。鼠标移动到调试按钮左侧区域，单击鼠标可以移动调试按钮到其他地方。
**表4 调试按钮操作描述**

| 图标 | 操作 | 操作描述 |
| --- | --- | --- |
|  | 继续 | 单击执行到下一个断点 |
|  | 暂停 | 单击中断正在执行的程序 |
|  | 单步跳过 | 单击执行到下一行 |
|  | 单步调试 | 单击步入函数 |
|  | 单步跳出 | 单击步出函数 |
|  | 重启 | 单击后重新启动调试 |
|  | 停止 | 单击后停止调试 |


  调试方式 以“全部”方式进行调试，选择某一个rank，会对全部rank进行调试，在RANK信息区域所有通信组右侧显示定位图标。 以“rank”方式进行调试，对单一rank进行调试，在RANK信息区域对应rank右侧显示定位图标。 以“通信组”方式进行调试，选择通信子组中的某一个rank，会对其对应的通信子组进行调试，在RANK信息区域对应rank的通信子组右侧显示定位图标。 rank状态展示 rank前的状态灯表示当前rank的状态，绿色表示rank停止，红色表示rank正在运行，灰色表示rank已退出。

7. 进行调试时，当前调试的代码行会高亮显示，在代码行号处单击，会添加断点标记，右击断点可编辑、删除和禁用断点。
  支持添加条件断点（表达式、命中次数），条件断点支持修改、启用、禁用和删除。表达式断点是指表达式成立时中断该程序，命中次数断点是指命中指定的次数时中断该程序（当大于等于设置的命中次数时，均可进入断点中）。

  图17 设置断点

  表达式长度不大于1024个字符。 命中次数不大于2147483647（2^31-1）的正整数。

8. 单击按钮，弹出重启任务弹框，单击“确定”将重新启动调试任务，跳转到rank状态读取页面，读取成功后重新打开MPI应用调试页面。
  图18 重启任务

9. 单击左侧调试信息区域会显示对应的变量（Locals、Register）、监视、断点和调用堆栈信息。

  - 在调试过程中可以修改变量值，右击变量表达式，可设置变量值，也可将变量表达式添加到监视中（Register表达式不能添加到监视中）。
  - 在监视区域中，支持添加、修改、单个删除、全部删除监视表达式，仅支持Fortran语言格式的表达式。
  - 在断点区域中，支持单个删除、全部删除、启用所有、禁用所有断点。
展开调试信息如图19所示。图19 调试信息- 单击调用堆栈区域展开显示堆栈信息，包含函数名、文件名、当前运行的行数和地址。
- 在调试信息区单击某个堆栈，源码区会切换到对应的源码或汇编语言。


10. 在RANK信息区域单击按钮，在VS Code面板上显示“通信子组变化”页面。

  - 单击“变化概览”，显示通信子组的变化概览，每100ms显示通信子组的变化。通信子组的变化用不同颜色的菱形来区分，蓝色表示通信子组创建，紫色表示通信子组清除，黄色表示100ms内存在通信子组创建和通信子组清除。
    图20 通信子组变化概览

    鼠标悬浮到菱形上，显示通信子组变化的详细信息。

    图21 通信子组悬浮信息

11. 单击“变化详情”，切换到通信子组变化详情页面，鼠标悬浮到对应位置会显示所属通信子组以及rank信息。
  图22 通信子组变化详情

  在RANK信息区域，单击按钮，单击后在界面下方展示通信子组的创建和清除信息。 在通信子组变化概览页面中，单击“通信子组创建”、“通信子组清除”或“通信子组创建并清除”，可以不查看对应相关信息。
