---
title: 调试MPI+OpenMP应用
description: "OpenMP是一种用于共享内存并行系统的多线程程序设计方案，支持的编程语言包括C/C++/Fortran，OpenMP以线程作为基础，提供了对并行算法的高层抽象描述，具有相对简单、可扩展、移植性好的优势，特别适合在多核CPU机器上的并行程序设计。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengdevps/debugging/debugger/DevKit_Debugger_00014.html
sourcePath: /source/zh/kunpengdevps/debugging/debugger/DevKit_Debugger_00014.html
indexId: bc7a4d7aedb4e4a1de72ed171d83df17bcb3e8e34400fccffde004ee95fa3b2869
---
# 调试MPI+OpenMP应用

OpenMP是一种用于共享内存并行系统的多线程程序设计方案，支持的编程语言包括C/C++/Fortran，OpenMP以线程作为基础，提供了对并行算法的高层抽象描述，具有相对简单、可扩展、移植性好的优势，特别适合在多核CPU机器上的并行程序设计。

OpenMP主要针对细粒度的循环进行并行，即在循环中将每次循环分配给不同的线程执行，MPI主要针对粗粒度级别的并行。调试MPI+OpenMP应用，可进行rank级调试、线程级调试。

#### 前提条件

- 已成功登录鲲鹏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++

MPI+OpenMP应用支持编写语言C/C++/Fortran，Fortran相关操作请参见编写语言：Fortran。


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

**表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+OpenMP应用调试页面。运行和调试区、源码区和调试功能区，运行和调试区域包括调试信息区和RANK信息区，如图4所示。
  图4 rank状态读取成功

6. 可以选择调试功能区的操作按钮来进行调试操作，如表2所示。鼠标移动到调试按钮左侧区域，单击鼠标可以移动调试按钮到其他地方。
**表2 调试按钮操作描述**

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


  thread状态展示：thread前的点表示当前thread的状态，绿点表示thread停止，红点表示thread正在运行。

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

  图5 设置断点

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

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

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

  - 在调试过程中可以修改变量值，右击变量表达式，可设置变量值，也可将变量表达式添加到监视中（Register表达式不能添加到监视中）。
  - 在监视区域中，支持添加、修改、单个删除、全部删除监视表达式，仅支持C/C++语言格式的表达式。
  - 在断点区域中，支持单个删除、全部删除、启用所有、禁用所有断点。
展开调试信息如图7所示。图7 调试信息

- 单击调用堆栈区域展开显示堆栈信息，包含函数名、文件名、当前运行的行数和地址。
- 在调试信息区单击某个堆栈，源码区会切换到对应的源码或汇编语言。


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

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

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

    图9 通信子组悬浮信息

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

    调试过程中若检测到死锁，提示通信子组发生死锁，显示死锁详细信息。 在RANK信息区域，单击按钮，开启后对通信子组的创建和清除进行采集，并在VS Code面板上显示变化概览。 在通信子组变化概览页面中，单击“通信子组创建”、“通信子组清除”或“通信子组创建并清除”，可以不查看对应相关信息。
