bash on windows に OpenCoarrays インストール
OpenCoarrays + gfortran の組み合わせで、Fortran 2015 での coarray 拡張機能が使えるようなので、試してみます。
ここの Installation Script の項目に従って実行した。
問題点は、デフォルトの gcc/gfortran のバージョンが 5.2 で古すぎて、コンパイルできないこと。したがって、バージョン6の gcc/gfortran を入れてから、これを使うように指示して make する。
本番
適当なディレクトリにソースを取ってきて展開。
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