Memory leaks MPI_减少导致内存泄漏

Memory leaks MPI_减少导致内存泄漏,memory-leaks,fortran,mpi,reduce,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 proces

我最近遇到了一个问题。如果我在我的机器上运行以下代码(使用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

这已经在相关的线程中讨论过

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

MPI规范的相关部分说:“集合操作可以(但不要求)在调用方发出请求后尽快完成 集体通信的参与完成。阻塞操作完成 非阻塞(立即)调用需要单独完成 呼叫(参见第节 3.7 )。完成集合操作表示呼叫者空闲 修改通信缓冲区中的位置。这并不表示其他进程 组中已完成或甚至已开始操作(除非 因此,集体通信操作可以是,也可以不是, 具有同步所有调用进程的效果。此语句当然不包括,
屏障操作。”

为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== 

引用Fortran时应始终使用标记。如果出于某种原因需要区分版本,请使用或或其他。可以在OpenSuSE Linux上确认。看起来像是库问题。可在Gentoo Linux w/gcc-5.2.0和OpenMPI 1.10.0上复制我很好奇-有人能确认它不能用MPICH或Intel MPI复制吗?我可以用mpich2 3.0.4和gfortran 4.9.3复制它(意味着内存刚刚爆炸)。然而,“英特尔MPI 5.1.1”运行起来却如虎添翼。另一方面,Gcc的-fsanize=leak显示了许多漏洞,可能是误报。至少对于OpenMPI(这是问题的目标,而不是MPICH)。我想我也必须编译带有该标志的MPI库。我发现MPICH的内部泄漏跟踪不仅对MPICH泄漏的内容有帮助,而且对用户忘记释放的内容也有帮助,例如属性、数据类型、信息对象、文件句柄、,等等。我打赌openMPI也有类似的功能,但我对openMPI不太熟悉。请注意,内存调试工具在MPI应用程序中的用处可能有限。为了获得更好的性能(这可能是实现MPI时的首要任务),开发人员可能会故意使用“不安全”技术(例如将数据写入未初始化的内存)。事实上,根据常见问题解答,OpenMPI并不干净。