これまで:プロセス並列とスレッド並列
これまで、fortranでは主に「openMP」と「MPI」という二つの並列計算ライブラリが使われてきました。
openMPはスレッド並列方式で、メモリを共有したスレッドという単位で並列化します。共有メモリなので通信が不要であるというメリットがある一方、並列数に上限があります。
MPIはプロセス並列方式で、メモリが固有のプロセスという単位で並列化します。複数のノード上にプロセスを割り当てて硬度に並列化することができる一方、メモリが分かれているために通信が必要となり、そこに工夫の余地が生まれます。
また、両者ともに多かれ少なかれコードに並列化するための工夫が必要であるというデメリットがあります。特にMPIでは顕著で、通信のために大量の固有のサブルーチンを覚えなければならないという苦労が必要でした。
Coarrayとは
Coarrayはgo言語のgoroutineと同じように「プログラマが特に意識することなく並列計算ができるようにする」ことを目標として制定された仕様です。fortran2008から導入された、最新の機能です。
Coarrayはイメージ制御とセットで導入されました。イメージとは、プロセスやスレッドを包括した、一般的な処理の単位です。Coarrayはそのイメージごとのデータの扱いを、より簡単にできるようにしたものです。
ソースコードはたくさん公開されているので、ここでは割愛します。
Coarrayを使うには
gfortranでCoarrayを使う場合、外部ライブラリが必要になります。1 ライブラリの実装はいくつかあり、MPIでの実装がおそらく現実的かなあと思います。つまり、結局のところ「CoarrayはMPIを簡単に使うためのもの」みたいです。
まずコンパイル時に-fcoarray=lib
オプションが必要です。コンパイルするために設定しなければならない環境変数はopenMPIとMPICHの場合で異なっているようです。
また、中身はMPIコードなので、実行時はmpiexec
で実行します。
参考サイト
Coarrays via GNU Fortran's Coarray Communication Library
https://gcc.gnu.org/wiki/CoarrayLib
めっちゃ新しもの好き Fortran 2008
http://jjoo.sakura.ne.jp/tips/fortran2008/
Co-array Fortran (wikipedia)
https://ja.wikipedia.org/wiki/Co-array_Fortran
-
single image、すなわち1並列の場合は内蔵機能でできますが、あまり意味がありません。おそらくCoarrayで書かれたコードをそのままコンパイルするための機能だと思われます。 ↩