【问题标题】:How to compile a Fortran code for profiling with gprof in OpenMPI?如何编译 Fortran 代码以在 OpenMPI 中使用 gprof 进行分析?
【发布时间】:2019-07-12 10:57:25
【问题描述】:

我能够使用 gfortran 编译器编译我的 Openmpi 代码。我给出的编译语法是:

mpif90 -o mycode.exe mycode.f90

mpirun -np 4 ./mycode.exe

它有效。现在我想使用 Gprof 分析我的代码。我知道我应该添加 -pg 标志,但如果我把它放在 mpif90 之后它会崩溃。我应该把国旗放在哪里?

【问题讨论】:

  • 请说明您收到的确切错误消息以及您正在使用的完整命令行。
  • 是的,这就是问题所在。我实际上不知道如何用 gprof 编译代码。如果我写“mpif90 -o -pg mycode.exe mycode.f90”,它不会给我可执行文件,而是创建一个名为“-pg”的文件。
  • -o 后面的是可执行文件的名称。尝试将 -pg 放在 -o 之前或 mycode.exe 之后。
  • 显然分析输出都在一个文件中,除非您定义 GMON_OUT_PREFIX stackoverflow.com/a/30085788/3327666
  • 你说它崩溃了。究竟发生了什么?您使用了哪些确切的命令?错误信息是什么?

标签: parallel-processing fortran gfortran openmpi gprof


【解决方案1】:

您可以尝试一下,看看效果如何。假设您使用的是 openmpi。 将以下内容创建为名为 mywrapper.sh 的脚本

#!/bin/bash
prefix="gmon_${OMPI_COMM_WORLD_RANK}.out"
GMON_OUT_PREFIX=$prefix $*

并使用

运行您的代码
mpif90 -o mycode.exe -pg mycode.f90
mpirun -np 4 mywrapper.sh ./mycode.exe

分析 MPI 代码的测试代码(我使用的是 C,但 FORTRAN 应该可以正常工作):

//file x.c
#include <mpi.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
    int rank=9;
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    printf("Hello from rank=%d!\n", rank);
    MPI_Finalize();
    return 0;
}

编译和运行测试的命令

#!/bin/bash
mpicc -pg x.c
mpirun --hostfile hostfile mywrapper.sh ./a.out

为了简单测试,hostfile 仅使用本地主机。命令输出:

Hello from rank=1!
Hello from rank=2!
Hello from rank=0!

然后你得到那些gprof文件,如果不能,一定是mpi配置问题。

.
├── a.out
├── gmon_0.out.2690
├── gmon_1.out.2692
├── gmon_2.out.2693

【讨论】:

  • 它给出了错误:Open MPI 尝试通过“execve”系统调用创建一个新进程,但失败了。 Open MPI 在尝试启动子进程之前会检查很多东西,但没有什么是完美的。此错误可能表示目标主机上的另一个问题,或者甚至像为您的应用程序指定目录一样愚蠢。您的工作现在将中止。
  • 刚试了一遍脚本,编辑错字,去掉“;”在脚本的第三行,它应该可以工作。如果 continue 有问题,我可以发布此示例的完整测试套件。
  • 我又试了一次,还是一样的错误:“错误:执行格式错误”。如果您可以发布测试服,那将很有帮助。谢谢!
  • hostfile 的 localhost 名称是 3 倍
猜你喜欢
  • 1970-01-01
  • 2013-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-10
  • 1970-01-01
  • 1970-01-01
  • 2014-11-06
相关资源
最近更新 更多