如何在 MPI 代码上从 gprof 获得有意义的结果?

Joh*_*now 3 hpc mpi gprof

我正在优化 MPI 代码并且正在使用 Gprof。问题是我得到的结果完全不合理。我的工作流程如下:

  • 编译代码添加-pg为编译标志。

  • 运行代码mpirun -np Nproc EXEC.exe arg1 ... argN

  • 在可执行文件上运行 gprof gprof EXEC.exe

这有什么问题?

Jon*_*rsi 5

运行指令gprof通常假定程序是串行的,或单进程但多线程的。

要运行gprof像 MPI 程序这样的多进程程序,您需要

  1. 确保每个进程输出自己的文件
  2. 跨进程显式求和文件
  3. 运行gprof结果。

这篇博文LLNL 的这些说明是很好的起点:

  1. 在运行 mpiexec 命令之前设置记录不足的GMON_OUT_PREFIX环境变量,例如在 bash 中export GMON_OUT_PREFIX=gmon.out-(然后,根据环境,您可能必须运行mpirun -x GMON_OUT_PREFIX -np Nproc EXEC.exe arg1 ... argN以确保每个进程都具有环境变量)
  2. 使用 gprof 本身来收集和总结结果, gprof -s EXEC.exe gmon.out-*
  3. gprof EXEC.exe gmon.sum(或仅检查单个文件,或使用gprof EXEC.exe gmon.out-12345或共同检查文件gprof EXEC.exe gmon.out-*