首页 > 解决方案 > MPI_finalize 是否释放内存?

问题描述

在下面的代码中,我有一个在 MPI 中使用的数组b 。据我了解,每个处理器甚至在调用MPI_INIT. 但是我们调用之后会发生什么MPI_FINALIZE?每个处理器仍然可以使用那块内存吗?

以类似的方式,如果b被声明为指针,它被分配在内部MPI_INIT-MPI_FINALIZE但它没有被释放,会发生什么?最终确定 MPI 后,该内存是否仍然可用?

program main
use mpi
implicit none

integer myr, numpr, ier
integer b(1000)

call MPI_INIT(ier)
call MPI_COMM_RANK(MPI_COMM_WORLD, myr, ier)
call MPI_COMM_SIZE(MPI_COMM_WORLD, numpr, ier)

if (myr .eq. 0) then
   !initialize b array
endif 

call MPI_BCAST(b, 100, MPI_INTEGER, 0, MPI_COMM_WORLD, ier)

call MPI_FINALIZE(ier)

!do more calculations with b

end

标签: fortranmpi

解决方案


如果您想象您编写的代码没有任何 MPI 内容,您会看到每个处理器都以大小为 1000 的 B 数组开头,因为您将其声明为:

integer b(1000)

MPI_Init 和 MPI_Finalise 都不参与分配或解除分配任何此内存。

同样,您可以在运行时 (C) 分配一个数组,它会一直存在,直到您显式取消分配它:

PROGRAM main
use mpi
implicit none

integer myr, numpr, ier
integer b(1000)
INTEGER, ALLOCATABLE :: C(:)



call MPI_INIT(ier)
call MPI_COMM_RANK(MPI_COMM_WORLD, myr, ier)
call MPI_COMM_SIZE(MPI_COMM_WORLD, numpr, ier)

ALLOCATE(C(1000))

if (myr .eq. 0) then
  b = 100  ! Set all values to 100
  c = 99   ! Ditto 99
endif 

call MPI_BCAST(b, 1000, MPI_INTEGER, 0, MPI_COMM_WORLD, ier)
call MPI_BCAST(c, 1000, MPI_INTEGER, 0, MPI_COMM_WORLD, ier)

call MPI_FINALIZE(ier)

PRINT *, myr, B(200)
PRINT *, myr, C(200)


DEALLOCATE(C)

END PROGRAM main

产生输出:

           1         100
           1          99
           0         100
           0          99

另外,请注意您的初始代码中有一个错字(我认为)。您只发送 B 的前 100 个成员(大小为 1000)。


推荐阅读