| パラダイム | マルチパラダイム:並列、メッセージパッシング、 命令型(手続き型、オブジェクト指向)、構造化 |
|---|---|
| デザイン: | ロバート・ナムリッチとジョン・リード |
| 開発者 | PL22.3 Fortran委員会 |
| 安定版リリース | Fortran 2008 (ISO/IEC 1539-1:2010)
|
| タイピングの規律 | 強い、静的 |
| OS | クロスプラットフォーム |
| 主な実装 | |
| Cray、g95、GNU Fortran、Intel Fortran コンパイラ、Rice CAF 2.0、OpenUH、NAG Fortran コンパイラ | |
| 影響を受けた | |
| フォートラン | |
Coarray Fortran ( CAF ) は、以前はF--と呼ばれていましたが、 1990 年代に Robert Numrich と John Reid によって作成された並列処理用のFortran 95/2003の拡張として始まりました。Fortran 2008標準 (ISO/IEC 1539-1:2010) には、2005 年 5 月の ISO Fortran 委員会の会議で決定されたように、現在では Coarray (ハイフンなしで表記) が含まれています。Fortran 2008 標準の構文は、元の CAF 提案とは若干異なります。
CAFプログラムは、複数回複製され、すべてのコピーが非同期で実行されたかのように解釈されます。各コピーには独自のデータ オブジェクト セットがあり、イメージと呼ばれます。Fortranの配列構文は、角括弧内の末尾の添え字を追加して拡張され、イメージ全体に分散されたデータへの参照を簡潔に表現します。
CAF 拡張は、Crayのコンパイラなど、一部の Fortranコンパイラに実装されています(リリース 3.1 以降)。Fortran 2008 標準に Co-Array が組み込まれて以来、実装の数は増え続けています。Linuxアーキテクチャ用の Fortran 2008 標準で指定されている Co-Array を実装した最初のオープンソースコンパイラはG95です。現在、GNU Fortran は、シングル イメージ構成とマルチ イメージ構成 (後者は OpenCoarrays ライブラリに基づく) で、Fortran の Co-Array 機能を幅広くカバーしています。Fortran 2008 の Co-Array および関連する並列拡張の別の実装は、ヒューストン大学で開発されたOpenUH コンパイラ ( Open64のブランチ)で利用できます。
コンパイラでの実装
CAF は、移植性のためにMessage Passing Interface (MPI) ライブラリの上に実装されることがよくあります。GNU Fortranや OpenUH コンパイラで利用可能な実装など、一部の実装は、パーティション化されたグローバル アドレス空間言語をサポートするために設計された他の低レベル レイヤー (GASNet など) の上に実行される場合があります。
例
以下に簡単な例を示す。CAFはブリストル大学で開発された多結晶材料をシミュレートするためのオープンソースパッケージであるCGPACKで使用されている。 [1]
プログラムHello_World
暗黙的 none整数:: i ! ローカル変数文字( len = 20 ) :: name [ * ] ! スカラー共配列、イメージごとに 1 つの "name"。! 注: "name" はローカル変数ですが、 "name[<index>]" は特定のイメージ内の ! 変数にアクセスします。"name[this_image()]" は "name" と同じです。
! 画像 1でユーザーと対話します。他のすべての実行はパスします。if ( this_image () == 1 ) then write ( * , '(a)' , advance = 'no' ) '名前を入力してください: ' read ( * , '(a)' ) name
! 他の画像に情報を配布する
do i = 2 , num_images () name [ i ] = name end do end if
すべてを同期します。データが到着したことを確認するためのバリア。
! すべてのイメージからの I/O は任意の順序で実行されますが、書き込まれた各レコードはそのままです。
write ( * 、'(3a,i0)' ) 'Hello ' 、trim ( name ) 、' from image ' 、this_image () end program Hello_world
上記のプログラムは、情報を分配するループが順次実行されるため、スケーラビリティが低くなります。スケーラブルなプログラムを作成するには、並列アルゴリズムの高度な理解、基盤となるネットワーク特性の詳細な知識、データ転送のサイズなどのアプリケーション特性に合わせた特別な調整が必要になることがよくあります。ほとんどのアプリケーション開発者にとって、コンパイラまたはランタイムライブラリに最善のアルゴリズムを決定させる方が、より堅牢で高性能です。Fortran 2018 では、コンパイラとランタイムライブラリチームが集合通信と分散計算のための効率的な並列アルゴリズムを集合サブルーチンのセットにカプセル化できるようにする集合通信サブルーチンが提供されます。これらのサブルーチンとその他の新しい並列プログラミング機能は、Fortran 標準委員会が Fortran 2018 に組み込むことを投票した技術仕様[2]にまとめられています。これにより、ユーザーは上記のアルゴリズムのより効率的なバージョンを作成できます。
プログラムHello_World
暗黙的 none文字( len = 20 ) :: name [ * ] ! スカラー共配列、各イメージに 1 つの "name"。! 注: "name" はローカル変数ですが、 "name[<index>]" は特定のイメージの ! 変数にアクセスします。"name[this_image()]" は "name" と同じです。
! 画像 1 でユーザーと対話します。他のすべての実行はパスします。
if ( this_image () == 1 ) then write ( * , '(a)' , advance = 'no' ) '名前を入力してください: ' read ( * , '(a)' ) name end if ! すべての画像に情報を配信しますcall co_broadcast ( name , source_image = 1 )
! すべてのイメージからの I/O は任意の順序で実行されますが、書き込まれた各レコードはそのままです。
write ( * 、'(3a,i0)' ) 'Hello ' 、trim ( name ) 、' from image ' 、this_image () end program Hello_world
明示的な同期がないと、イメージ間の調整が少なくなり、パフォーマンスが向上する可能性があります。さらに、TS 18508 では、「イメージからの転送は、そのイメージで集合サブルーチンが呼び出されるまでは発生しません」と保証されています。これは、co_broadcast 内で部分的な同期を意味しますが、前の例の「すべてを同期」よりもパフォーマンスが向上する可能性があります。TS 18508 には、以下で説明する CAF 2.0 の取り組みで対象とされている問題に対処する他のいくつかの新機能も組み込まれています。例としては、イメージとイベントのチームがあります。
別の視点
2011年、ライス大学はFortran言語の共配列拡張の別のビジョンを追求しました。[3]彼らの見解では、Fortran 2008標準委員会の設計上の選択は、並列プログラミングをサポートするために最良の拡張機能のセットを組み立てるというよりも、言語にできるだけ少ない変更を導入したいという願望によって形作られたというものです。彼らの見解では、NumrichとReidの元の設計とFortran 2008に提案された共配列拡張の両方に、次の欠点があります。
- プロセッササブセットはサポートされていません。たとえば、共配列はすべてのイメージに割り当てる必要があります。
- Coarray 拡張には、あらゆる種類のリンク データ構造の作成と操作に不可欠なグローバル ポインタの概念がありません。
- 相互排他制御に名前付きクリティカル セクションを依存すると、相互排他制御がデータ オブジェクトではなくコード領域に関連付けられるため、スケーラブルな並列処理が妨げられます。
- Fortran 2008 の sync images ステートメントは、安全な同期スペースを提供しません。その結果、ライブラリ呼び出しが行われた時点で保留中のユーザー コード内の同期操作が、ライブラリ呼び出し内の同期を妨げる可能性があります。
- リモート イメージ上のデータを操作する際に、遅延を回避または許容するメカニズムはありません。
- 集団コミュニケーションはサポートされていません。
これらの欠点に対処するため、ライス大学のグループは Coarray Fortran プログラミング モデルを一から再設計しています。ライス大学の Coarray Fortran の新しい設計は、Coarray Fortran 2.0 と呼ばれ、生産性の高い並列プログラミング モデルを提供するために設計された、Fortran に対する Coarray ベースの拡張の表現力豊かなセットです。Fortran 2008 と比較すると、ライス大学の新しい Coarray ベースの言語拡張には、いくつかの追加機能が含まれています。
- チームと呼ばれるプロセスサブセットは、共配列、集団通信、およびペアワイズ操作のプロセスイメージの相対インデックスをサポートします。
- 論理的なコミュニケーション構造でチームを強化するトポロジー
- 共配列やその他の共有データの動的割り当て/解放、
- チームベースの共配列の割り当てと解放、
- 動的データ構造をサポートするグローバルポインタ、
- 遅延の隠蔽と回避のサポート、および
- 非同期コピー、
- 非同期の集合操作、および
- 機能出荷。
- プログラム実行を細かく制御するための同期のサポートが強化されました。
- ロックやロックセットを含む相互排他制御の安全かつスケーラブルなサポート
- ポイントツーポイント同期のための安全な空間を提供するイベント、
- 非同期操作のローカル完了を強制するcofence
- 終了、チーム全体の非同期操作の完了を強制するバリアのようなSPMD構造、
参照
参考文献
- ^ A. Shterenlikht、3Dセルオートマトン微細構造シミュレーション用Fortran共配列ライブラリ、 Wayback Machineで2016-03-04にアーカイブ、(2013) Proc. 7th PGAS conf、M. Weiland、A. Jackson、N. Johnson編、エディンバラ大学発行、ISBN 978-0-9926615-0-2
- ^ TS 18508 Fortran における追加の並列機能
- ^ 「CoArray Fortran 2.0」。
一般的な
- ISO Fortran 委員会 2011-04-23 にWayback Machineでアーカイブ
- ANSI/INCITS Fortran 委員会
- John Reid による Fortran 標準の CAF に関する指導ビデオ (付録 B を参照)
- GNU Fortran の Coarray
- GNU Fortran の CoarrayLib
- OpenCoarrays ライブラリ
- NAG Fortran コンパイラ
