コンテンツにスキップ

Fortran/並列処理

出典: フリー教科書『ウィキブックス(Wikibooks)』


Wikipedia
Wikipedia
ウィキペディア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]
訳者から解説
共配列(Coarray)は、Fortranの並列処理機能を提供するための概念の一部です。これはFortran 2008標準で導入され、プログラムを複数のプロセッサまたはイメージに分割し、それらのイメージ間でデータを共有するための仕組みを提供します。共配列は、プログラムをイメージと呼ばれる独立した実行単位に分割し、それらのイメージが相互に通信することで、並列処理を実現します。

主な特徴や用語について以下に説明します:

  1. イメージ(Image):
    • イメージは、プログラムが実行される各独立した実行単位です。各イメージは同じプログラムのコピーであり、独自のメモリ空間を持ちます。
  2. コディメンション(Codimension):
    • 共配列は通常の配列と同じように宣言されますが、それぞれのイメージに対して追加のコディメンションがあります。これは、通常の配列の次元に追加されるもので、各イメージが別々のデータを持つための仕組みです。
  3. * マーカー:
    • 共配列のコディメンションには、通常の次元と同様にサイズを指定できますが、*というマーカーを使って利用可能なプロセッサの最大数を指定することもできます。これにより、動的にプロセッサ数に対応したコディメンションを作成できます。
  4. データの転送:
    • 共配列は、イメージ間でデータを効率的に転送する手段を提供します。データの転送は、コディメンションを介して行われ、特に対応するコディメンションのインデックス化を使用して行います。
共配列を使用することで、Fortranプログラムは異なるイメージで同時に実行され、イメージ間でデータを簡単に共有できます。これにより、並列処理の構築や高性能計算の実現が容易になります。