我在调用MPI_FINALIZE()
Fortran 90 程序时遇到分段错误。虽然代码相当广泛,但我将发布伪代码并查看它是否引发任何标志。我有一种预感(但还没有尝试过)这可能是由于没有释放数组引起的?但是我不确定 - 在 Fortran 90 中未能解除分配数组会导致调用期间出现分段错误MPI_FINALIZE
吗?
if(<rank 0>) then
do iat = 1,natoms
do il = 0, LMAX
do im = -il,il
<mpi_recv "rank_rdy"> ! find out which rank is ready for (at,l,m)
<mpi_send "(iat,il,im)"> ! send (at,l,m) to the rank asking for it
enddo
enddo
enddo
else ! other ranks send a 'ready' signal and recieve the (at,l,m) to optimize
if(<rank 0 is not finished processing (at,l,m)'s>)
<mpi_send "my_rank"> ! tell rank 0 that i am ready to receive
<mpi_recv "(iat,il,im)"> ! recieve (at,l,m) from rank 0
call optimize(iat,il,im) ! do work on (at,l,m)
endif
endif
if(<rank 0>)
<read temp files created by other ranks>
<write temp files to one master file>
endif
print*, 'calling finalize'
call MPI_BARRIER(MPI_COMM_WORLD, ierr)
call MPI_FINALIZE()
现在在输出中,除了与此问题无关的其他信息外,我还得到以下信息:
calling finalize
calling finalize
calling finalize
calling finalize
calling finalize
calling finalize
=====================================================================================
= BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
= EXIT CODE: 11
= CLEANING UP REMAINING PROCESSES
= YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
=====================================================================================
APPLICATION TERMINATED WITH THE EXIT STRING: Segmentation fault (signal 11)
即使我不打电话,我也会遇到同样的问题,MPI_BARRIER
但我认为这可能会有所帮助。请注意,每个等级中都使用了一些数组,我不会费心解除分配,因为我在整个程序中都使用它们,所以我不担心内存泄漏或任何事情。MPI_FINALIZE()
是否有可能由于在没有释放内存的情况下被调用而发生此段错误?
我将自己探索更多,但我想发布这个问题有几个原因:
想知道这是否是调用时的已知问题
MPI_FINALIZE()
想知道调用
MPI_FINALIZE()
. 在内部,导致此段错误的原因是什么?我在网上搜索了高低,没有发现任何关于这个问题的信息,所以对于后人来说,这可能是一个在网上回答的好问题。
编辑:我忘了提到这一点,但是在串行运行时我无法复制这个问题。显然,我不做(at,l,m)
串行分配。唯一的过程只是简单地遍历所有组合并逐一优化它们。我没有,但是解除分配我认为可能导致 MPI 问题的数组,并且我仍然没有遇到段错误。