CoArray team
intel fortran ではまだですが、gfortran の場合 OpenCoarray で team 機能の一部が試せます。Team を使うと coarray のイメージをいくつかの群れに分けて、別々のタスクに従事させことが容易になります。
参考:J. Reid, The new features of Fortran 2018 https://www.fortranplus.co.uk/app/download/29753373/N2161.pdf
sourceryinstitute, OpenCoarray github.com
インストール
以下の記事を参考にお任せコースで行きます。 www.scivision.dev
sudo apt install gfortran libcoarrays-dev libcoarrays-openmpi-dev
しかし、この場合 openmpi を利用するので、openmpi 固有のめんどくささが生じて、記事通りにゆきません。FAQ を見る必要があります。
コンパイル時のライブラリ名を caf_openmpi にする必要があります。また CAFRUN 用の設定が面倒なので mpirun を利用することにします。
gfortran -fcoarray=lib xxxxxf90 -lcaf_openmpi mpirun -np 9 --oversubscribe ./a.out
プログラム
よく分からないので、サンプルを元に、二種類のチーム分けを試してみました。それぞれフォーメーション1と2 です。フォーメーション1では、イメージ番号の3による剰余での分け方で、2では4で割った商でチーム分けしました。
program caf0 use, intrinsic :: iso_fortran_env implicit none real :: arr[*] integer :: me, ne type(team_type) :: form1, form2 ne = num_images() me = this_image() form team (mod(me, 3) + 1, form1) if (me == 1) print *, 'formation 1' change team (form1) sync team (form1) select case(team_number()) case (1) print *, 'a-team', me, ne case (2) print *, 'b-team', me, ne case (3) print *, 'c-team', me, ne case default stop 'never come here' end select sync team (form1) end team form team (me / 4 + 1, form2) sync all if (me == 1) print *, 'formation 2' sync all change team (form2) select case(team_number()) case (1) print *, 'team 1', me, ne case (2) print *, 'team 2', me, ne case (3) print *, 'team 3', me, ne case default stop 'never come here' end select end team end program caf0
$ gfortran -fcoarray=lib team.f90 -lcaf_openmpi $ mpirun -np 9 --oversubscribe ./a.out formation 1 c-team 5 9 c-team 8 9 c-team 2 9 a-team 6 9 a-team 9 9 a-team 3 9 b-team 7 9 b-team 4 9 b-team 1 9 formation 2 team 1 2 9 team 1 3 9 team 2 5 9 team 2 6 9 team 1 1 9 team 3 8 9 team 3 9 9 team 2 7 9 team 2 4 9