MPI循环增加了内存使用/内存泄漏

时间:2016-03-03 02:45:18

标签: memory-leaks fortran mpi

我正在使用MPI编写一个Fortran程序,其中一个数组被分成多个条带,每个条带被发送到一个等级以进行计算,然后每个数组的边缘被发送到它旁边的等级以进行更新下一个时间步。这是一个迭代过程,因此每个边缘多次传递到其相邻的等级。然而,它工作正常,因为我已经开始为更大的数组和更多时间步骤运行程序,我注意到(通过顶部)似乎存在内存泄漏,因为每个进程不断增加它正在使用的内存量。如果我运行程序的时间足够长,最终会占用所有系统内存并导致我的机器崩溃。

我所要做的就是连续多次将一串数据从一个等级发送到另一个等级,我不知道为什么内存应该通过传递这些信息而增加。下面是展示行为的示例。我不知道从内存中释放传递的数据,导致它随着时间的推移而积累?

(编辑:更改示例代码以反映下面的评论)

Program main

use mpi

REAL(KIND=KIND(0.0D0)) ::putbuf ( 1000 ), getbuf ( 1000 )
INTEGER, PARAMETER :: from = 2, to = 3,fromtag = 123, totag = 456
INTEGER, DIMENSION(MPI_STATUS_SIZE) :: status
INTEGER :: error, rank

!  Initialize MPI.
  call MPI_Init ( error )
!  Get the number of processes.
  call MPI_Comm_size ( MPI_COMM_WORLD, num_procs, error )
!  Get the individual process ID.
  call MPI_Comm_rank ( MPI_COMM_WORLD, rank, error )


do i = 1,50000000
putbuf = i
if (rank == 0) then
    CALL MPI_Sendrecv ( putbuf, 1000,MPI_DOUBLE_PRECISION, 1, 123,getbuf, 1000, MPI_DOUBLE_PRECISION,&
    1, 456,MPI_COMM_WORLD, status, error )
else
    CALL MPI_Sendrecv ( putbuf, 1000,MPI_DOUBLE_PRECISION, 0, 456,getbuf, 1000, MPI_DOUBLE_PRECISION,&
    0, 123,MPI_COMM_WORLD, status, error )
endif
enddo

call MPI_Finalize ( error )
endprogram

0 个答案:

没有答案