Coarray
共配列の簡単な例
G95 coarray プログラムの実行
coarray の概要
Coarray リンク
共配列の簡単な例
この例では、coarray を使用して、同じコンピューターまたはネットワーク上の複数のコアに統合を分割する方法を示します。「イメージ」と呼ばれる各コアで同じプログラムが実行されます。各イメージには一意のイメージ番号があり、コア/イメージの総数に 1 が割り当てられます。
この例では、1 番目のイメージと残りのイメージの間の通信に使用される「work」という派生型を定義しています。角括弧は、変数宣言内の共配列を示します。式の角括弧は、別のイメージのメモリ参照を示します。’sync images’ ステートメントは、指定されたイメージが元のイメージと同期するまでイメージを待機させます。
この例は、’work’ 派生型を変更して、各サブタスクへの入力と出力を含めることで拡張できます。この例では、積分は部分範囲に分割され、積分を計算する個別の画像に渡されます。イメージ 1 は、個々の範囲を最終的な積分に追加します。この例は、個々の結果を任意の方法で収集および照合するように変更できます。
モジュールparallel_module
type work
double precision :: a, b, integer
logical :: halt
end type work
タイプ(作業) :: coarray[*] ! すべての画像で共有
含む
! 統合 — 統合。
私たちの例は!の定積分です。f(x) = x. あなたの積分または部分計算はここに入ります。
倍精度 関数integrate(a, b)
倍精度 a , b
統合 = 0.5 * (b*b – a*a)
終了 関数統合
!
worker — !からの統合リクエストを処理する無限ループ。主人。#1を除くすべての画像はここで終了します。
サブルーチンワーカー
do
sync images(1) !
(coarray % halt) stopの場合、イメージ 1 が作業をセットアップするのを待ちます
coarray % 積分 = 統合 (coarray % a, coarray % b)
同期画像(1) ! イメージ 1 を解放して、最終的な積分
enddo
end サブルーチンワーカーを計算します
!
parallel_integral — !の並列統合のためのサブルーチン 間隔(a、b)。
倍精度 関数parallel_integral(a, b)
倍精度a , b, h
(num_images() == 1)の場合
parallel_integral = 統合 (a, b)
endifを返す
! 画像ごとに作品を設定する
h = (b – a) / (num_images() – 1)
do i=2, num_images()
coarray[i] % 停止 = .FALSE.
coarray[i] % a = a + (i-2) * h
coarray[i] % b = a + (i-1) * h
遠藤
同期画像(*) ! リリースワーカーは
イメージを同期します(*) ! ワーカーが終了するのを待ちます
! 結果を収集する
並列積分 = 0.0
do i=2, num_images()
parallel_integral = parallel_integral + coarray[i] % 積分
enddo
終了 関数parallel_integral
! shutdown — イメージ #1 によって呼び出され、他のすべてのイメージを停止させます。
サブルーチンshutdown
do i=2, num_images()
coarray[i] % 停止 = .TRUE.
終了 する
同期画像(*)
end サブルーチンshutdown
end モジュールparallel_module
! 並列積分器を呼び出す最上位プログラム
プログラムp は
parallel_moduleを使用します
if (this_image() /= 1)ワーカーを呼び出す
do i=1, 10
print *, i, parallel_integral(0.0d0, real (i, kind=8))
enddo
シャットダウン
終了 プログラムp
を呼び出す
G95 coarray プログラムの実行:
coarray の SMP およびネットワーク バージョンは、2013 年 1 月 15 日以降にコンパイルされた g95 0.94 を使用して、x86/linux、x86-64/linux、および ia64/linux プラットフォームで利用できます。プログラムをコンパイルするために特別なオプションは必要ありません。
SMP マシンで 10 イメージ Co-Array プログラムを実行するには、次を使用します。
./a.out –g95 images=10
(異種) ネットワークを介して 10 個のイメージの Co-Array プログラムを実行するには、次のようにします。
./a.out –g95 master images=10
単一のマシンで。1 つ以上の計算ノードで、次を使用します。
./a.out –g95 host images=1
ここで、ホスト ノード上のイメージの数は、マスター上のイメージの数に加算されます。ホスト ノードで開始された複数のイメージは、ネットワークを使用するよりもはるかに効率的に相互に通信します。
プログラムを起動すると、それらはネットワークを介して相互に自動的にリンクします。マスターは、要求された数のイメージを見つけると、すべてのマシンでプログラムを開始します。
SMP coarray は無料です。ネットワーク化されたホストが 4 つを超える場合は、ライセンスを購入する必要があります。
Coarray の概要
Coarray は、fortran のエキサイティングな並列プログラミング拡張機能です。これらは、「イメージ」と呼ばれる、同じプログラムの複数のインスタンス間で共有できる特別な変数です。coarray の主な利点は、fortran 言語自体との高レベルの統合であり、並列ライブラリへのサブルーチン呼び出しよりもはるかに読みやすいプログラムになります。同期プリミティブも提供されます。
Coarray は、丸の代わりに角かっこがあることを除いて、Fortran 配列のように見えます。角かっこは、別の (またはおそらく同じ) イメージ上の coarray への参照を示します。簡単な coarray 宣言は次のようになります。
INTEGER :: x[*]
これは、xイメージ間で共有可能な整数であることを宣言します。式では、現在のイメージxの を参照します x。 上の画像のものx[1]を指します 。x- 表記*は、Fortran 想定サイズ配列のようなものです。共配列の境界は、コンパイル時ではなく、実行時に決定されます。
角括弧なしで共配列変数を使用すると、式内のローカル値が参照されます。共配列変数を角かっこで使用すると、特定のイメージの共配列変数が参照されます。割り当ての右側では、値が画像から読み込まれます。割り当ての左側では、値がそのイメージに格納されます。ステートメント:
x[1] = x[2]
イメージ 2 の値がxロードされ、xイメージ 1 に格納されます。このステートメントは、任意のイメージに対して実行された場合と同じ効果があります。
簡単な coarray プログラムは次のとおりです。
integer :: m[*]
m = THIS_IMAGE()
print *, m
SYNC ALL
if (THIS_IMAGE() == 1) then
do i=1, NUM_IMAGES()
print *, i, m[i]
enddo
endif
end
組み込み関数THIS_IMAGE()は、現在の画像の画像番号を返します。これは 1 ~ でありNUM_IMAGES()、計算内の画像の総数を返します。
このSYNC ALLステートメントにより、すべてのイメージがステートメントに到達するまで、すべてのイメージが待機しますSYNC ALL。m これが発生すると、image 1 は他のすべてのイメージの値を出力します。他のすべてのイメージは静かに終了します。
coarray がメッセージ パッシング ライブラリに勝る大きな利点は、プログラムがはるかに読みやすいことです。メッセージ パッシング ライブラリを呼び出す必要があり、引数リストは長くて読みにくい場合があります。Coarray では、角かっこはクロスイメージ通信が行われており、サブルーチンの代わりに言語ステートメントが同期を実装するために使用されていることを示しています。
Coarray とその使用方法の詳細については、John Reid の論文「Coarrays in the next Fortran Standard」と、私自身のCoarray Compendiumを参照してください。この概要は、coarray の穏やかな入門書ですが、網羅的ではありません。いくつかのサンプルプログラムが含まれています。
リンク
次の Fortan 標準の Coarray (John Reid、N1747) HTTP
Coarray 概要 HTTP