2014-03-05 45 views
0

我有一个大的Fortran90应用程序,我试图进行调试。我试图让所有的处理器在程序给定的位置抛售他们的特定变量的值,但我只得到了处理器的子集,有时反复处理器行列使用下面的代码:使用MPI_Barrier在所有处理器上打印变量的值

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,谷歌搜索产生了一个结果(Enable buffered I/O to stdout with Intel ifort compiler),似乎表明缓冲到标准输出不是什么ifort会做的。我将输出重定向到一个文件,所以也许有一些系统缓冲,那是我的问题?

所以我的问题是,这看起来像是一个合理的代码片段来转储出所有处理器上的变量的值,或者是我缺乏睡眠赶上我?

在此先感谢!

+0

添喜禁用它们 - 以最快的方式来解决这类问题是使用一个调试器 - 因为这些报告完全正在发生,没有输出缓冲的雾。见:http://stackoverflow.com/questions/5985424/parallel-debuggers一些意见和建议。 – David

回答

1

如果您怀疑存在堆栈损坏问题,那么不打印到标准输出是一个普遍的想法。对于MPI来说,这更重要,其中stdout本身重新路由到执行实际写入的任务0。

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

为了正确对齐文件,只需打印更多的内容,如迭代数字,以便在分离的输出文件中重新生成正确的顺序。

我知道,这很烦人,但有时需要发现......恼人的问题!一旦你解决了它,就把它全部清除掉。

如果你正在处理一个大的项目,你可以评估使用#ifdef的以及C预处理器以参数启用/编译时

+0

对于每个进程,将调试内容写入不同的文件是我认为最好的方法,至少对于少量的进程。无论如何,其他两个选项可能是:使用mpi_gather收集数据并让一个进程一起打印它们。使用并行调试器查看特定值。 – haraldkl