仅在根进程上声明的数组

时间:2013-09-11 14:58:01

标签: arrays fortran mpi

特别是在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声明需要在顶部。但我希望有办法解决这个问题?

这样,阵列也不会进入我的“虚拟”内存吧?或者我误解了什么?

2 个答案:

答案 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)将所有进程中的所有块收集到根进程,但是您可以顺序执行此操作而无需任何进一步的内存。