导致内存泄漏的MPI_REDUCE

时间:2015-11-17 10:11:16

标签: memory-leaks fortran mpi reduce

我最近遇到过堰行为。如果我在我的机器上运行以下代码(使用最新版本的cygwin,打开MPI版本1.8.6),我的内存使用量会线性增长,很快就会压倒我的电脑。

program memoryTest

use mpi

implicit none

integer            :: ierror,errorStatus      ! error codes
integer            :: my_rank                 ! rank of process
integer            :: p                       ! number of processes
integer            :: i,a,b

call MPI_Init(ierror)
call MPI_Comm_rank(MPI_COMM_WORLD, my_rank, ierror)
call MPI_Comm_size(MPI_COMM_WORLD, p, ierror)

b=0
do i=1,10000000
    a=1*my_rank
    call MPI_REDUCE(a,b,1,MPI_INTEGER,MPI_MAX,0,MPI_COMM_WORLD,errorStatus)
end do

call MPI_Finalize(ierror)

stop
end program memoryTest

知道问题可能是什么?这段代码看起来很适合初学者的眼睛。编译行是

mpif90 -O2 -o memoryTest.exe memoryTest.f90

2 个答案:

答案 0 :(得分:3)

这已在相关主题here中讨论过。

问题是根进程需要从其他进程接收数据并执行减少,而其他进程只需要将数据发送到根进程。因此,根进程运行速度较慢,可能会被传入消息的数量所淹没。如果在MPI_REDUCE调用之后插入MPI_BARRIER调用,那么代码应该没有问题地运行。

MPI规范的相关部分说:“集合操作可以(但不是必须)尽快完成调用者的操作 参与集体沟通已经完成。阻止操作已经完成 一旦呼叫返回。非阻塞(立即)呼叫需要单独完成 打电话(参见章节  3.7 )。集体操作的完成表明呼叫者是免费的 修改通信缓冲区中的位置。它并不表示其他进程 该小组已完成或甚至开始行动(除非另有暗示 操作说明)。 因此,集体沟通操作可能会,也可能不会, 具有同步所有调用进程的效果。当然,此声明不包括在内 屏障操作。“

答案 1 :(得分:1)

为macelee的答案添加更多支持:如果您在MPICH下运行此程序并且MPICH的内部内存泄漏跟踪/报告已打开,您会看到没有泄漏。此外,valgrind的泄漏检查报告

==12866== HEAP SUMMARY:
==12866==     in use at exit: 0 bytes in 0 blocks
==12866==   total heap usage: 20,001,601 allocs, 20,000,496 frees, 3,369,410,210 bytes allocated
==12866== 
==12866== All heap blocks were freed -- no leaks are possible
==12866==