使用MPI_屏障在所有处理器上打印变量的值

使用MPI_屏障在所有处理器上打印变量的值,mpi,fortran90,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) e

我有一个很大的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
过去我在这个特定的应用程序中遇到过堆栈损坏的问题,所以我怀疑我的问题是这样的错误。但是我很难弄清楚我没有在所有处理器上看到值的原因是这个bug还是我的转储代码出了什么问题

第一次调用例程(对于
nprocs=30
)时的输出是

还有一次,下次我调用相同的例程时:

rank, ntiltin =          20           5
rank, ntiltin =          28           5
rank, ntiltin =          20           5
rank, ntiltin =          20           5
rank, ntiltin =          20           5
看起来我也有输出缓冲问题,但我使用ifort编译,谷歌搜索结果()似乎表明,ifort不会对stdout进行缓冲。我将输出重定向到一个文件,所以可能有一些系统缓冲,这就是我的问题

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


提前谢谢

如果您怀疑存在堆栈损坏问题,一般不要打印到标准输出。这对于MPI更为重要,因为标准输出本身被重新路由到执行实际写入的任务0

作为一般建议,在本例中,只需让每个任务打开一个文件,并用其任务id参数化,然后让每个任务写入该文件,并在每次写入后执行刷新

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

我知道,这很烦人,但有时需要找出。。。讨厌的问题!一旦你解决了它,就把它全部扔掉


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

将调试内容写入每个进程的不同文件是最好的方法,我认为,至少对于少数进程是这样。无论如何,还有两种选择:使用mpi_gather收集数据,并让一个进程将它们全部打印在一起。使用并行调试器查看特定值。Hi Tim-解决此类问题的最快方法是使用调试器-因为这些调试器准确地报告正在发生的事情,而不需要输出缓冲。参见:了解一些意见和建议。
rank, ntiltin =          20           5
rank, ntiltin =          28           5
rank, ntiltin =          20           5
rank, ntiltin =          20           5
rank, ntiltin =          20           5