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ブロック内またはプロシージャの宣言ブロックの後のどこにも宣言ステートメントを含めることはできません。ただし、すべてのプロセスで配列を宣言し、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 に答える