我有一个大的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会做的。我将输出重定向到一个文件,所以也许有一些系统缓冲,那是我的问题?
所以我的问题是,这看起来像是一个合理的代码片段来转储出所有处理器上的变量的值,或者是我缺乏睡眠赶上我?
在此先感谢!
添喜禁用它们 - 以最快的方式来解决这类问题是使用一个调试器 - 因为这些报告完全正在发生,没有输出缓冲的雾。见:http://stackoverflow.com/questions/5985424/parallel-debuggers一些意见和建议。 – David