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

如何从MPI代码的gprof中获得有意义的结果?,mpi,hpc,gprof,Mpi,Hpc,Gprof,我正在优化MPI代码,并与Gprof合作。 问题是我得到的结果完全不合理。我的工作流程如下: 编译代码添加-pg作为编译标志 正在运行代码mpirun-np Nproc EXEC.exe arg1。。。argN 在可执行文件上运行gprofgprof EXEC.exe 这有什么不对?运行gprof的说明通常假定程序是串行的,或者是单进程但多线程的 要使用多进程程序(如MPI程序)运行gprof,您需要 确保每个流程输出自己的文件 跨进程显式求和文件 对结果运行gprof 或是良好的起点: 在

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

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

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

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


这有什么不对?

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

要使用多进程程序(如MPI程序)运行
gprof
,您需要

  • 确保每个流程输出自己的文件
  • 跨进程显式求和文件
  • 对结果运行
    gprof
  • 或是良好的起点:

  • 在运行mpiexec命令之前,设置记录不良的
    GMON\u OUT\u PREFIX
    环境变量,例如在bash中,
    export GMON\u OUT\u PREFIX=GMON.OUT-
    (然后,根据环境的不同,您可能需要运行
    mpirun-x GMON\u 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-*
    )检查单个文件或整体文件)