Fortran/並列処理
並列処理は、Fortran 2008標準に含まれています。並列機能を使用するには、Fortranプログラムを並列処理が有効になっている状態でコンパイルする必要があります。例えば、Intel ifortコンパイラでは、-coarray
フラグが使用されます。
イメージ
[編集]Fortranは、並列処理のために区分化大域アドレス空間(Partitioned Global Address Space; PGAS)モデルを使用しています。各プロセッサに対して、プログラムは独自のメモリパーティションを持つ別個の重複した「イメージ」として実行されます。以下のプログラムを考えてみてください:
program hello implicit none write (*,*) 'Hello from ', this_image(), 'of', num_images() end program hello
組込み関数 this_image
は、実行中のイメージの番号を返し、組込み関数 num_images
はプログラムの全イメージ数を返します。プログラムが4つのプロセッサでコンパイルおよび実行された場合、出力は次のようになるかもしれません:
Hello from image 1 of 4 Hello from image 4 of 4 Hello from image 2 of 4 Hello from image 3 of 4
イメージは非同期に実行されるため、出力が1、2、3、4の順番で表示されるとは限りません。
共配列
[編集]共配列(Coarray)は、イメージ間で配列データを通信する方法です。共配列は通常の配列と同じように機能しますが、各イメージに対して追加のコディメンションがあります。コディメンションは角かっこ []
を使用して宣言およびインデックス化することができます。例えば、サイズが10でコディメンションのサイズが4のランク1の共配列を宣言するには:
real :: coarr(10)[4] ! もしくは、同じことを行うために宣言属性を使用することもできます real, dimension (10), codimension [4] :: another_coarr
スカラ変数も共配列にすることができます:
integer :: scalar['*']
ここで、 は利用可能なプロセッサの最大数を示します。コディメンションには通常の次元と同様に複数の軸があることができますが、コディメンションのランクは15が上限です。イメージ間でデータを転送するのはコディメンションのインデックス化と同じくらい簡単です。
! すべてのイメージを1に設定 coarr = 1 ! インデックス化 another_coarr(3)[4] = coarr(3)[3]
主な特徴や用語について以下に説明します:
- イメージ(Image):
- イメージは、プログラムが実行される各独立した実行単位です。各イメージは同じプログラムのコピーであり、独自のメモリ空間を持ちます。
- コディメンション(Codimension):
- 共配列は通常の配列と同じように宣言されますが、それぞれのイメージに対して追加のコディメンションがあります。これは、通常の配列の次元に追加されるもので、各イメージが別々のデータを持つための仕組みです。
- * マーカー:
- 共配列のコディメンションには、通常の次元と同様にサイズを指定できますが、
*
というマーカーを使って利用可能なプロセッサの最大数を指定することもできます。これにより、動的にプロセッサ数に対応したコディメンションを作成できます。
- 共配列のコディメンションには、通常の次元と同様にサイズを指定できますが、
- データの転送:
- 共配列は、イメージ間でデータを効率的に転送する手段を提供します。データの転送は、コディメンションを介して行われ、特に対応するコディメンションのインデックス化を使用して行います。