fortran66のブログ

fortran について書きます。

メモ帳: OpenCoarrays インストール

bash on windows に OpenCoarrays インストール

OpenCoarrays + gfortran の組み合わせで、Fortran 2015 での coarray 拡張機能が使えるようなので、試してみます。


github.com

ここの Installation Script の項目に従って実行した。
問題点は、デフォルトの gcc/gfortran のバージョンが 5.2 で古すぎて、コンパイルできないこと。したがって、バージョン6の gcc/gfortran を入れてから、これを使うように指示して make する。

下準備

適当に

sudo apt install gcc-6
sudo apt install g++-6
sudo apt gfortran-6

本番

適当なディレクトリにソースを取ってきて展開。

git clone https://github.com/sourceryinstitute/OpenCoarrays
cd OpenCoarrays
./install.sh -j 4 -c gcc-6 -C g++-6 -f gfortran-6

  • j 4 は4スレッドで実行のこと。スレッドを増やすと早い。

インストール

できたバイナリをパスの効いたところへコピー。(スクリプトのオプションでも行ける。)

cd prerequisites/installations/opencoarrays/
cp -R * /usr/opt

細部は忘れたので、間違ってたらゴメンw

実行

ソース・プログラム

リダクション演算が入りました。

      program test
        implicit none
        integer ::  m[*]
        m = this_image()
        print *, m
        call co_sum(m, result_image = 1)
        if (this_image() == 1) then
          print *, 'sum=', m
        end if
      end program test

コンパイル&実行

O@VM10:~$ caf coa.f90
O@VM10:~$ cafrun -n 10 ./a.out
           4
           6
           8
           2
           5
           7
           9
          10
           1
 sum=          55
           3
O@VM10:~$

ソース・プログラム

      module m_caf2
        implicit none
      contains
        pure integer function mul(ia, ib)
          integer, intent(in) :: ia, ib
          mul = ia * ib
        end function mul
      end module m_caf2

      program caf2
        use m_caf2
        implicit none
        integer :: m[*]
        m = this_image()
        call co_min(m, result_image = 1)
        if (this_image() == 1) print *, m

        sync all
        call co_broadcast(m, source_image = num_images())
        m = m / num_images()
        sync all
        call co_sum(m, result_image = 1)
        if (this_image() == 1) print *, m

        sync all
        m = this_image()
        call co_reduce(m, mul, result_image = 1)
        if (this_image() == 1) print *, m
      end program caf2

実行結果

O@VM10:~$ caf coa2.f90
O@VM10:~$ cafrun -n 4 ./a.out
           1
           4
          24