fortran66のブログ

fortran について書きます。

【メモ帳】coaray team でチーム分け

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 を見る必要があります。

github.com

コンパイル時のライブラリ名を 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