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

How do I get meaningful results from gprof on an MPI code?

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

这有什么问题吗?

运行ning gprof 的说明通常假设程序是串行的,或者是单进程但多线程的。

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

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

This blog post or these instructions at LLNL 是很好的起点:

  1. 设置记录不完整的 GMON_OUT_PREFIX 环境变量,例如在 bash、export GMON_OUT_PREFIX=gmon.out- 之前 运行 执行 mpiexec 命令(然后,根据环境,您可能必须 运行 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-12345gprof EXEC.exe gmon.out-* 一起检查文件)