如何在 MPI 代码上从 gprof 获得有意义的结果?
How do I get meaningful results from gprof on an MPI code?
我正在优化 MPI 代码并且正在使用 Gprof。
问题是我得到的结果是完全不合理的。我的工作流程如下:
编译代码添加-pg
作为编译标志。
运行代码mpirun -np Nproc EXEC.exe arg1 ... argN
.
运行 可执行文件上的 gprof gprof EXEC.exe
这有什么问题吗?
运行ning gprof
的说明通常假设程序是串行的,或者是单进程但多线程的。
要 运行 gprof
使用像 MPI 程序这样的多进程程序,您需要
- 确保每个进程输出自己的文件
- 跨进程显式汇总文件
- 运行
gprof
上结果。
This blog post or these instructions at LLNL 是很好的起点:
- 设置记录不完整的
GMON_OUT_PREFIX
环境变量,例如在 bash、export GMON_OUT_PREFIX=gmon.out-
之前 运行 执行 mpiexec 命令(然后,根据环境,您可能必须 运行 mpirun -x GMON_OUT_PREFIX -np Nproc EXEC.exe arg1 ... argN
以确保每个进程都有环境变量)
- 使用 gprof 本身来收集和总结结果,
gprof -s EXEC.exe gmon.out-*
gprof EXEC.exe gmon.sum
(或仅检查单个文件,或使用 gprof EXEC.exe gmon.out-12345
或 gprof EXEC.exe gmon.out-*
一起检查文件)
我正在优化 MPI 代码并且正在使用 Gprof。 问题是我得到的结果是完全不合理的。我的工作流程如下:
编译代码添加
-pg
作为编译标志。运行代码
mpirun -np Nproc EXEC.exe arg1 ... argN
.运行 可执行文件上的 gprof
gprof EXEC.exe
这有什么问题吗?
运行ning gprof
的说明通常假设程序是串行的,或者是单进程但多线程的。
要 运行 gprof
使用像 MPI 程序这样的多进程程序,您需要
- 确保每个进程输出自己的文件
- 跨进程显式汇总文件
- 运行
gprof
上结果。
This blog post or these instructions at LLNL 是很好的起点:
- 设置记录不完整的
GMON_OUT_PREFIX
环境变量,例如在 bash、export GMON_OUT_PREFIX=gmon.out-
之前 运行 执行 mpiexec 命令(然后,根据环境,您可能必须 运行mpirun -x GMON_OUT_PREFIX -np Nproc EXEC.exe arg1 ... argN
以确保每个进程都有环境变量) - 使用 gprof 本身来收集和总结结果,
gprof -s EXEC.exe gmon.out-*
gprof EXEC.exe gmon.sum
(或仅检查单个文件,或使用gprof EXEC.exe gmon.out-12345
或gprof EXEC.exe gmon.out-*
一起检查文件)