使用MPI_Barrier在所有处理器上打印变量的值

时间:2014-03-05 18:34:28

标签: mpi fortran90

我有一个很大的Fortran90应用程序,我正在尝试调试。我试图让所有处理器将特定变量的值转储到程序中的给定位置,但我只获得处理器的子集,有时使用以下代码重复处理器等级:

call mpi_barrier(mpi_comm_world, imstat)
do i = 0, nprocs
    if (rank == i) print*, rank, ! ... hopefully useful stuff
    call mpi_barrier(mpi_comm_world, imstat)
end do

我过去在这个特定的应用程序中遇到了堆栈损坏的问题,所以我怀疑我的问题就是这样的错误。但我无法弄清楚我没有看到所有处理器上的值的原因是该错误还是我的转储代码是否有问题。

第一次调用例程(nprocs = 30

时输出
rank, ntiltin =          29          1 m rank, ntiltin =          24          14
rank, ntiltin =          24          14
rank, ntiltin =          24          14
rank, ntiltin =          24          14
rank, ntiltin =          24          14
rank, ntiltin =          24          14
rank, ntiltin =          24          14
rank, ntiltin =          24          14
rank, ntiltin =          24          14
rank, ntiltin =          24          14
rank, ntiltin =          24          14
rank, ntiltin =          24          14
rank, ntiltin =          24          14
rank, ntiltin =          24          14
rank, ntiltin =          24          14
rank, ntiltin =          24          14
rank, ntiltin =          24          14
rank, ntiltin =          24          14
rank, ntiltin =          24          14
rank, ntiltin =          24          14
rank, ntiltin =          24          14
rank, ntiltin =          24          14
rank, ntiltin =          26          14
rank, ntiltin =          26          14
rank, ntiltin =          26          14
rank, ntiltin =          26          14
rank, ntiltin =          26          14
rank, ntiltin =          26          14
rank, ntiltin =          26          14
rank, ntiltin =          26          14
rank, ntiltin =          26          14
rank, ntiltin =          26          14
rank, ntiltin =          26          14
rank, ntiltin =          26          14
rank, ntiltin =          26          14
rank, ntiltin =          26          14
rank, ntiltin =          26          14
rank, ntiltin =          26          14
rank, ntiltin =          26          14
rank, ntiltin =          26          14
rank, ntiltin =          26          14
rank, ntiltin =          26          14
rank, ntiltin =          26          14
rank, ntiltin =          26          14
rank, ntiltin =          26          14
rank, ntiltin =          26          14
rank, ntiltin =          26          14

另一个,下次我打电话给同一个例行程序时:

rank, ntiltin =          20           5
rank, ntiltin =          28           5
rank, ntiltin =          20           5
rank, ntiltin =          20           5
rank, ntiltin =          20           5

看起来我也有输出缓冲问题,但是我使用ifort进行了编译,并且Google搜索结果显示了一个结果(Enable buffered I/O to stdout with Intel ifort compiler),似乎表明缓冲到stdout并不是ifort会做的事情。我正在将输出重定向到一个文件,所以也许那里有一些系统缓冲,这是我的问题?

所以我的问题是看起来像是一个合理的代码片段来在所有处理器上转储变量的值,还是我的睡眠不足以追上我?

提前致谢!

1 个答案:

答案 0 :(得分:1)

如果您怀疑堆栈损坏问题,则通常不打印到标准输出。对于MPI来说,这一点更为重要,其中stdout本身被重新路由到执行实际写入的任务0。

作为一般建议,在这种情况下,只需让每个任务打开一个文件,使用其task-id进行参数化,然后让每个文件写入文件,并在每次写入后执行刷新。

为了正确对齐文件,只需打印更多内容(如迭代编号),即可在分离的输出文件中重建正确的顺序。

我知道,这很烦人,但有时需要发现......烦人的问题!一旦你解决了它,就摆脱所有这一切。

如果您正在处理大型项目,可以评估使用#ifdef和C预处理器在编译时参数化启用/禁用它们