Warm tip: This article is reproduced from serverfault.com, please click

fortran-MPI_finalize是否释放内存?

(fortran - Does MPI_finalize release memory?)

发布于 2020-12-01 13:37:56

在下面的代码中,我有一个数组b在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
Questioner
armando
Viewed
0
Joe Todd 2020-12-01 21:56:52

如果你想象编写的代码没有任何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)。