调试MPI应用
MPI(Message Passing Interface)是消息传递并行程序设计的标准之一,当前通用的是MPI1.1规范。需要安装Open MPI或者是MPI CH实现MPI标准。
- 通讯器(communication),定义了一组能够互相发消息的进程。在这组进程中,每个进程赋予一个叫做秩(rank)的序号,进程间显性地通过指定秩来进行通信。
- 点对点(point-to-point)通信,一个进程可以通过指定另一个进程的秩以及唯一的消息标签(tag)来发送消息给另一个进程。接受者可以发送一个接收特定标签标记的消息的请求,然后依次处理接收到的数据。类似一个发送者以及一个接受者的通信被称作点对点通信。
- 集体性(collective)通信,某个进程可能需要跟所有其他进程通信,比如主进程想发一个广播给所有的从进程,MPI提供专门的接口实现这类所有进程间的集体性通信。
编写语言:C/C++
- 单击左侧树快捷功能区按钮,或单击“开发”选择编译调试下方的“调试”,打开调试页面,选择“HPC并行应用”,配置MPI应用调试参数,如图1所示。
调试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调度器运行方式
说明:mpirun命令运行方式使用mpirun运行命令,mpirun是一个重要的工具,用作启动MPI并行应用程序,并提供进程之间的通信和清理工作等功能。
多瑙调度器是华为全自研的HPC集群调度器,提供大规模集群下的高资源利用率、高吞吐量的作业调度能力。
Slurm是一个开源的、高度可定制的、可扩展的、高性能的作业调度系统,它能够很好地提供资源管理和任务调度功能,广泛用于高性能计算、集群计算领域,如物理、化学、生物学、天文学等领域。
MPI运行命令行
输入的mpirun命令以及对应的命令参数,rank数目为1~2048。
多瑙调度器运行命令行
输入的多瑙调度器命令以及对应的命令参数。
Slurm调度器运行命令行
输入的Slurm调度器命令以及对应的命令参数。
OpenMP应用(可选)
勾选后,需要输入OpenMP线程数。
OpenMP线程数(可选)
输入的OpenMP应用thread数量。
死锁检测(可选)
勾选后,需要输入死锁超时时间。
死锁超时时间(s)(可选)
死锁超时时间,默认为10秒,取值范围10~60。
- 配置完成后,单击“开始调试”,右下角弹框提示“HPC并行应用调试启动中”,检测所输入的配置信息是否正确,若检测结果错误,请根据提示信息进行处理。若检测成功,右下角弹出弹框提示rank状态读取中,如图2所示。
若HPC并行应用调试启动失败,请参见HPC并行应用调试启动失败的解决办法进行处理。
- 在rank状态读取过程中,若rank状态读取存在失败,请根据提示下载最新日志文件了解失败详情。如图3所示。
- 在rank状态读取过程中,若rank状态读取全部成功,会自动跳转到MPI应用调试页面。页面上获取到运行和调试区、源码区和调试功能区,运行和调试区域包括调试信息区和RANK信息区,如图4所示。
- MPI应用支持三种调试粒度,分别为“全部”调试、“rank”调试或“通信组”调试,还可以选择调试功能区的其他操作按钮来进行调试操作。如表2所示。
表2 调试按钮操作描述 操作
操作描述
继续
点击执行到下一个断点
暂停
点击中断正在执行的程序
单步跳过
点击执行到下一行
单步调试
点击步入函数
单步跳出
点击步出函数
重启
点击后重新启动调试
停止
点击后停止调试
- 调试方式
- 以“全部”方式进行调试,选择某一个rank,会对全部rank进行调试,在rank信息区域所有通信组右侧显示定位图标。
- 以“rank”方式进行调试,对单一rank进行调试,在rank信息区域对应rank右侧显示定位图标。
- 以“通信组”方式进行调试,选择通信组中的某一个rank,会对其对应的通信组进行调试,在RANK信息区域对应rank的通信组右侧显示定位图标。
- 设置断点
- 进行调试时,当前调试的代码行会高亮显示,在代码行号处单击,会设置上断点标记。
- rank状态展示
- rank前的状态灯表示当前rank的状态,绿色表示rank停止,红色表示rank正在运行,灰色表示rank已退出。
- 调试方式
- 单击调试功能区的按钮,将重新启动MPI应用调试,重启后右下角弹出弹框提示rank状态读取中,读取成功后打开MPI应用调试页面。图5 重启调试任务
- 单击左侧调试信息区域会显示对应的变量(Locals、Register)、监视、断点和调用堆栈信息。
- 在调试过程中可以修改变量值,右击变量表达式,可设置变量值,也可将变量表达式添加到监视中(Register表达式不能添加到监视中);
- 在监视区域中,支持添加、修改、单个删除、全部删除监视表达式,仅支持C/C++语言格式的表达式。
展开调试信息如图6所示。 - 在RANK信息区域单击按钮,在VS Code面板显示“通信子组变化”页面。
- 单击“变化概览”,显示通信子组的变化概览,每100ms显示通信子组的变化。通信子组的变化用不同颜色的菱形来区分,蓝色表示通信子组创建,紫色表示通信子组清除,黄色表示100ms内存在通信子组创建和通信子组清除。
图7 通信子组变化概览
鼠标悬浮到菱形上,显示通信子组变化的详细信息。
图8 通信子组悬浮信息
- 单击“变化详情”,显示通信子组的变化详情,鼠标悬浮到对应位置会显示所属通信子组以及rank信息。
图9 通信子组变化详情
- 调试过程中若检测到死锁,提示通信组发生死锁,单击“查看详情”或“死锁”,显示死锁详细信息,如死锁状态图以及表格信息。表格展示rank、源进程(rank)、目标进程(rank)、标记、数据大小(byte)和调用栈信息。
图10 通信子组死锁详情
若未单击按钮,调试过程中发生死锁,右下角弹框会提示检测到死锁,如图11所示,单击“查看详情”,跳转到死锁页面,查看通信组死锁的详细信息。
在RANK信息区域,单击按钮,开启后对通信子组的创建和清除进行采集,并在VS Code面板上显示变化概览。
在通信子组变化概览页面中,单击“通信子组创建”、“通信子组清除”或“通信子组创建并清除”,可以不查看对应相关信息。
死锁是指两个或多个进程各自在等待另一个进程释放资源,或两个或多个进程在循环链中等待资源的情况。在MPI应用中进行点对点通信时,MPI点对点函数顺序不当则会发生死锁的现象。
- 单击“变化概览”,显示通信子组的变化概览,每100ms显示通信子组的变化。通信子组的变化用不同颜色的菱形来区分,蓝色表示通信子组创建,紫色表示通信子组清除,黄色表示100ms内存在通信子组创建和通信子组清除。
编写语言:Fortran
Fortran是目前国际上广泛流行的一种高级语言,适用于科学计算。Fortran也是一种编译型语言,源代码必须通过编译器以生成的可以运行的机器可执行文件。安装编译器GFortran参考链接:https://gcc.gnu.org/fortran/。
Fortran90程序是一种分块形式的程序,整个程序由若干个程序模块组成,各模块都有相似的语句组织形式,其中主程序起整体控制作用,各辅程序模块各自完成问题中的一个算法。Fortran95是对Fortran90的补充,两者差别不大,都可支持调试。
由于毕昇编译器和Fortran自身的语法特性,在调试毕昇编译器编译的Fortran应用时会出现进入到汇编且无法打断点和查看调试信息的情况。
- 单击左侧树快捷功能区按钮,或单击“开发”选择编译调试下方的“调试”,打开调试页面,选择“HPC并行应用”,配置MPI应用调试参数,如图12所示。
调试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调度器运行方式
说明:mpirun命令运行方式使用mpirun运行命令,mpirun是一个重要的工具,用作启动MPI并行应用程序,并提供进程之间的通信和清理工作等功能。
多瑙调度器是华为全自研的HPC集群调度器,提供大规模集群下的高资源利用率、高吞吐量的作业调度能力。
Slurm是一个开源的、高度可定制的、可扩展的、高性能的作业调度系统,它能够很好地提供资源管理和任务调度功能,广泛用于高性能计算、集群计算领域,如物理、化学、生物学、天文学等领域。
MPI运行命令行
输入的mpirun命令以及对应的命令参数,rank数目为1~2048。
多瑙调度器运行命令行
输入的多瑙调度器命令以及对应的命令参数。
Slurm调度器运行命令行
输入的Slurm调度器命令以及对应的命令参数。
OpenMP应用(可选)
勾选后,需要输入OpenMP线程数。
OpenMP线程数(可选)
输入的OpenMP应用thread数量。
死锁检测(可选)
勾选后,需要输入死锁超时时间。
死锁超时时间(s)(可选)
死锁超时时间,默认为10秒,取值范围10~60。
- 配置完成后,单击“开始调试”,右下角弹框提示“HPC并行应用调试启动中”,检测所输入的信息是否正确,若检测结果错误,请根据提示信息进行处理。若检测成功,右下角弹出弹框提示rank状态读取中,如图13所示。
若HPC并行应用调试启动失败,请参见HPC并行应用调试启动失败的解决办法进行处理。
- 在rank状态读取过程中,若rank状态读取存在失败,请根据提示下载日志文件了解失败详情。如图14所示。
- 在rank状态读取过程中,若rank状态读取全部成功,会自动跳转到MPI应用调试页面。页面上获取到运行和调试区、源码区和调试功能区,运行和调试区域包括调试信息区和RANK信息区,如图15所示。
- MPI应用支持三种调试粒度,分别为“全部”调试、“rank”调试或“通信组”调试,还可以选择调试功能区的其他操作按钮来进行调试操作。如表4所示。
表4 调试按钮操作描述 操作
操作描述
继续
点击执行到下一个断点
暂停
点击中断正在执行的程序
单步跳过
点击执行到下一行
单步调试
点击步入函数
单步跳出
点击步出函数
重启
点击后重新启动调试
停止
点击后停止调试
- 调试方式
- 以“全部”方式进行调试,选择某一个rank,会对全部rank进行调试,在rank信息区域所有通信组右侧显示定位图标。
- 以“rank”方式进行调试,对单一rank进行调试,在rank信息区域对应rank右侧显示定位图标。
- 以“通信组”方式进行调试,选择通信组中的某一个rank,会对其对应的通信组进行调试,在RANK信息区域对应rank的通信组右侧显示定位图标。
- 设置断点
- 进行调试时,当前调试的代码行会高亮显示,在代码行号处单击,会设置上断点标记。
- rank状态展示
- rank前的状态灯表示当前rank的状态,绿色表示rank停止,红色表示rank正在运行,灰色表示rank已退出。
- 调试方式
- 单击按钮,弹出重启任务弹框,单击“确定”将重新启动编译任务,跳转到rank状态读取页面,读取成功后重新打开MPI应用调试页面。图16 重启任务
- 单击左侧调试信息区域会显示对应的变量(Locals、Register)、监视、断点和调用堆栈信息。
- 在调试过程中可以修改变量值,右击变量表达式,可设置变量值,也可将变量表达式添加到监视中(Register表达式不能添加到监视中);
- 在监视区域中,支持添加、修改、单个删除、全部删除监视表达式,仅支持C/C++语言格式的表达式。
展开调试信息如图17所示。 - 在RANK信息区域单击按钮,在VS Code面板显示“通信子组变化”页面。
- 单击“变化概览”,显示通信子组的变化概览,每100ms显示通信子组的变化。通信子组的变化用不同颜色的菱形来区分,蓝色表示通信子组创建,紫色表示通信子组清除,黄色表示100ms内存在通信子组创建和通信子组清除。
图18 通信子组变化概览
鼠标悬浮到菱形上,显示通信子组变化的详细信息。
图19 通信子组悬浮信息
- 单击“变化概览”,显示通信子组的变化概览,每100ms显示通信子组的变化。通信子组的变化用不同颜色的菱形来区分,蓝色表示通信子组创建,紫色表示通信子组清除,黄色表示100ms内存在通信子组创建和通信子组清除。
- 单击“查看详情”按钮,切换到通信组变化详情页面,鼠标悬浮到对应位置会显示所属通信子组以及rank信息。图20 通信组变化详情
在RANK信息区域,单击按钮,点击后在界面下方展示通信子组的创建和清除信息。
在通信子组变化概览页面中,单击“通信子组创建”、“通信子组清除”或“通信子组创建并清除”,可以不查看对应相关信息。