我最近遇到过堰行为。如果我在我的机器上运行以下代码(使用最新版本的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
答案 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==