调试MPI+OpenMP应用
OpenMP是一种用于共享内存并行系统的多线程程序设计方案,支持的编程语言包括C、C++和Fortran,OpenMP以线程作为基础,提供了对并行算法的高层抽象描述,具有相对简单、可扩展、移植性好的优势,特别适合在多核CPU机器上的并行程序设计。
OpenMP主要针对细粒度的循环进行并行,即在循环中将每次循环分配给不同的线程执行,MPI主要针对粗粒度级别的并行。调试MPI+OpenMP应用,可进行rank级调试、线程级调试。
编写语言:C/C++
- 单击左侧树快捷功能区
按钮,或单击“开发”选择编译调试下方的“调试”,打开调试页面,选择“HPC并行应用”,配置MPI+OpenMP应用调试参数,如图1所示。
表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
调试启动方式
调试启动方式可选:
- MPI命令运行方式
- 多瑙调度器运行方式
- Slurm调度器运行方式
说明:MPI命令运行方式使用mpirun运行命令,mpirun是一个重要的工具,用作启动MPI并行应用程序,并提供进程之间的通信和清理工作等功能。
多瑙调度器是华为全自研的HPC集群调度器,提供大规模集群下的高资源利用率、高吞吐量的作业调度能力。
Slurm是一个开源的、高度可定制的、可扩展的、高性能的作业调度系统,它能够很好地提供资源管理和任务调度功能,广泛用于高性能计算、集群计算领域,如物理、化学、生物学、天文学等领域。
MPI运行命令行
输入的mpirun命令以及对应的命令参数,rank数目为1~2048。
多瑙调度器运行命令行
输入的多瑙调度器命令以及对应的命令参数。
Slurm调度器运行命令行
输入的Slurm调度器命令以及对应的命令参数。
OpenMP应用
勾选后,需要输入OpenMP线程数。
OpenMP线程数
输入的OpenMP应用thread数量。
死锁检测(可选)
勾选后,需要输入死锁超时时间。
死锁超时时间(s)(可选)
死锁超时时间,默认为10秒,取值范围10~60。
- 配置完成后,单击“开始调试”,右下角弹框提示“HPC并行应用调试启动中”,检测所输入的配置信息是否正确,若检测结果是错误的,请根据提示信息进行处理。若检测成功,右下角弹出弹框提示rank状态读取中,如图2所示。
- 在rank状态读取过程中,若rank状态读取存在失败,请根据提示下载日志文件了解失败详情。如图3所示。
- 在rank状态读取过程中,若rank状态读取全部成功,会自动跳转到MPI+OpenMPI应用调试页面。运行和调试区、源码区和调试功能区,运行和调试区域包括调试信息区和RANK信息区,如图4所示。
- 可以选择调试功能区的操作按钮来进行调试操作。如表2所示。
表2 调试按钮操作描述 操作
操作描述
继续
点击执行到下一个断点
暂停
点击中断正在执行的程序
单步跳过
点击执行到下一行
单步调试
点击步入函数
单步跳出
点击步出函数
重启
点击后重新启动调试
停止
点击后停止调试
thread状态展示:thread前的点表示当前thread的状态,绿点表示thread停止,红点表示thread正在运行。
- 进行调试时,当前调试的代码行会高亮显示,在代码行号处单击,会设置上断点标记,右击断点可编辑、删除和禁用断点。
支持添加条件断点(表达式、命中次数),条件断点支持修改、启用、禁用和删除。表达式断点是指表达式成立时中断该程序,命中次数断点是指命中指定的次数时中断该程序(当大于等于设置的命中次数时,均可进入断点中)。
图5 设置断点- 表达式长度不大于1024个字符。
- 命中次数不大于2147483647(2^31-1)的正整数。
- 调试功能区的
按钮,将重新启动MPI+OpenMP应用调试,重启后右下角弹出弹框提示rank状态读取中,读取成功后打MPI+OpenMP应用调试页面。
图6 重启调试任务 - 单击左侧调试信息区域会显示对应的变量(Locals、Register)、监视、断点和调用堆栈信息。
- 在调试过程中可以修改变量值,右击变量表达式,可设置变量值,也可将变量表达式添加到监视中(Register表达式不能添加到监视中);
- 在监视区域中,支持添加、修改、单个删除、全部删除监视表达式,仅支持C/C++语言格式的表达式。
- 在断点区域中,支持单个删除、全部删除、启用所有、禁用所有断点。
- 在RANK信息区域单击
按钮,在VS Code面板显示“通信子组变化”页面。
- 单击“变化概览”,显示通信子组的变化概览,每100ms显示通信子组的变化。通信子组的变化用不同颜色的菱形来区分,蓝色表示通信子组创建,紫色表示通信子组清除,黄色表示100ms内存在通信子组创建和通信子组清除。
图8 通信子组变化概览
鼠标悬浮到菱形上,显示通信子组变化的详细信息。
图9 通信子组悬浮信息 - 单击“查看详情”,切换到通信组变化详情页面,鼠标悬浮到对应位置会显示所属通信子组以及rank信息。
图10 通信组变化详情
调试过程中若检测到死锁,提示通信组发生死锁,显示死锁详细信息。
在RANK信息区域,单击
按钮,开启后对通信子组的创建和清除进行采集,并在VS Code面板上显示变化概览。
在通信子组变化概览页面中,单击“通信子组创建”、“通信子组清除”或“通信子组创建并清除”,可以不查看对应相关信息。
- 单击“变化概览”,显示通信子组的变化概览,每100ms显示通信子组的变化。通信子组的变化用不同颜色的菱形来区分,蓝色表示通信子组创建,紫色表示通信子组清除,黄色表示100ms内存在通信子组创建和通信子组清除。