特别是在Fortran的MPI中,是否有可能并且只在根进程上定义一个数组是一个很好的选择?例如:
program test
implicit none
include 'mpif.h'
all mpi_init(ierr)
call mpi_comm_rank(mpi_comm_world,myid,ierr)
call mpi_comm_size(mpi_comm_world,numproc,ierr)
if (myid .eq. 0) then
complex(8), dimension(:,:), allocatable :: array
end if
...
if (myid .eq. 0) then
allocate(array(2,2))
end if
...
end program
正如你猜测的那样,我已经尝试了这个并且它不起作用,因为Fortran声明需要在顶部。但我希望有办法解决这个问题?
这样,阵列也不会进入我的“虚拟”内存吧?或者我误解了什么?
答案 0 :(得分:4)
正如您所指出的那样,您不能在IF
- 块中或在程序的声明块之后的任何位置具有声明语句。但是,允许在所有进程上将数组声明为ALLOCATABLE
,并仅允许在某些进程上进行分配,并且在我看来是一个不错的选择。
! Declare as allocatable on all processes
complex(8), dimension(:,:), allocatable :: array
...
! Allocate only on some
if (myid .eq. 0) then
allocate(array(2,2))
end if
这样,程序就不会在其他进程上消耗任何额外的内存。
答案 1 :(得分:0)
每个进程都需要(完整)数组吗?如果没有,尝试以块的形式分配它:Proc0:1--10,Proc1:11--20等。然后,每个进程只需要分配它的块。您可能需要一种在全局索引(本示例中为1-20)和本地索引(每个进程1--10)之间进行映射的方法。
当然,您需要在某个时刻(例如I / O)将所有进程中的所有块收集到根进程,但是您可以顺序执行此操作而无需任何进一步的内存。