3

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

这样,数组也不会吃掉我的“虚拟”内存,对吧?还是我误解了什么?

4

2 回答 2

4

正如您所指出的,您不能在IF-blocks 或过程的声明块之后的任何地方有声明语句。但是,允许将数组声明为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

这样,程序就不会在其他进程上消耗任何额外的内存。

于 2013-09-11T15:04:50.397 回答
0

您是否需要每个进程上的(完整)数组?如果没有,尝试分块分配:Proc0: 1--10, Proc1: 11--20 等。然后,每个进程只需要分配它的块。您可能需要一种在全局索引(本例中为 1--20)和本地索引(每个进程为 1--10)之间进行映射的方法。

当然,您需要在某个时间点(例如 I/O)将所有进程的所有块收集到根进程,但您可以按顺序执行此操作而无需任何额外的内存。

于 2013-09-11T15:29:32.250 回答