インテル® Fortran コンパイラー 19.0 デベロッパー・ガイドおよびリファレンス
Co-Array は、macOS* システムでは利用できません。
Co-Array は、Fortran 2008 で標準化され Fortran 2018 で拡張されたデータ共有概念で、1 つのプログラムの複数のコピーを使用して並列処理を可能にします。それぞれのコピーはイメージと呼ばれ、通常のローカル変数に加えて、Co-Array または共通変数 (covariable) と呼ばれる共有変数を持ちます。共通変数は配列またはスカラーのいずれかで、プログラムのすべてのイメージで共有されます。この PGAS (Partitioned Global Address Space) モデルでは、各イメージが共通変数のそれぞれの部分にローカル変数としてアクセスすることができ、また角括弧で囲まれた共通インデックス (coindex) を使用してほかのイメージの部分にもアクセスすることができます。
インテル® Fortran は、マルチコアまたはマルチプロセッサー・システムで共有メモリーを使用して実行する Co-Array プログラムをサポートします。一部の製品では (「機能要件」を参照してください)、分散メモリー型の Linux* または Windows* クラスターでも Co-Array プログラムを実行することができます。また、インテル® Xeon Phi™ 製品をターゲットとする場合、Linux* システムでも実行できます。
詳細は、リリースノートのシステム要件を参照してください。
Co-Array を使用してプログラムを作成する方法については、Fortran 2008 言語や ISO Fortran 2008 標準に関する書籍を参照してください。
Co-Array 構文の使用
Fortran 2008 の Co-Array では、次のような追加の構文が必要になります。
CODIMENSION 属性と "[共通境界 (cobound)]" は、オブジェクトを Co-Array (共通変数) として宣言します。
[共通インデックス] は共通変数またはほかのイメージを参照します。
SYNC ALL、SYNC IMAGES、および SYNC MEMORY 文はイメージが共有データの同期を行わなければならない場所を示します。
CRITICAL と END CRITICAL 文は同時に 1 つのイメージのみが実行できるコード領域をブロック化します。
LOCK と UNLOCK 文は特定のイメージの動作を同期するのに使用されるロックと呼ばれるオブジェクトを制御します。
ERROR STOP 文はすべてのイメージを終了します。
ALLOCATE と DEALLOCATE 文は Co-Array を指定します。
組込みプロシージャー IMAGE_INDEX、LCOBOUND、NUM_IMAGES、THIS_IMAGE、および UCOBOUND
ATOMIC_DEFINE および ATOMIC_REF (アトミック変数の定義と参照)
次の Fortran 2018 の Co-Array 拡張がサポートされています。
2 つのイメージの実行を同期する EVENT POST および EVENT WAIT 文
組込みプロシージャー COSHAPE および EVENT_QUERY
Co-Array コンパイラー・オプションの使用
-coarray (Linux*) または /Qcoarray (Windows*) コンパイラー・オプション (以降、[Q]coarray) を使用して、コンパイラーで Co-Array 構文が認識されるようにする必要があります。このコンパイラー・オプションを使用しないと、Co-Array の構文や機能を使用するプログラムではコンパイル時にエラーが発生します。
リストでは、1 つのオプションのみコマンドラインで有効です。複数の Co-Array コンパイラー・オプションが指定された場合、最後に指定されたオプションが使用されます。この規則の例外は、キーワード single を指定した [Q]coarray コンパイラー・オプションです。指定された場合、コマンドラインの位置に関係なく、このオプションが優先されます。
キーワードなしで [Q]coarray を使用することは、1 つのノード (共有メモリー) で実行するのと同じです。
キーワード shared を指定して [Q]coarray を使用すると、インテル® メッセージ・パッシング・インターフェース (MPI) ライブラリーの並列化が 1 つのノード (共有メモリー型のマルチコアまたはマルチプロセッサー) で実行されます。
キーワード distributed を指定して [Q]coarray を使用すると、インテル® MPI ライブラリーの並列化がマルチノード環境 (分散メモリー型のマルチ CPU) で実行されます。これには、特別なライセンスが必要です (「機能要件」 を参照してください)。
-coarray=coprocessor (Linux*) を使用すると、最初のイメージをホストで実行し、ほかのイメージをホストまたはターゲットで実行します。設定ファイルに正確な構成とイメージを実行する場所を指定します。-coarray-config-file=filename コンパイラー・オプションを使用して設定ファイルを指定します。
キーワード single を指定して [Q]coarray を使用すると、複製されない実行ファイル (1 つの実行イメージ) が生成されます (ほかの Co-Array キーワードが指定された場合は自己複製が行われます)。このオプションは、デバッグに役立ちます。
Co-Array を含むプログラムを実行するのに特別な手順は必要ありません。単に実行ファイルを実行するだけです。並列化の実装にはインテル® MPI ライブラリーを使用します。コンパイラーをインストールすると、共有メモリーで実行するのに必要なインテル® MPI ランタイム・ライブラリーが自動でインストールされます。クラスターをサポートする製品をインストールすると、分散メモリーで実行するのに必要なインテル® MPI ライブラリーのランタイム・ライブラリーが自動でインストールされます。その他の MPI 実装や OpenMP* との Co-Array アプリケーションの使用はサポートされていません。
デフォルトでは、作成されるイメージ数は現在のシステムの実行ユニットの数と同じです。メインプログラムをコンパイルする ifort コマンドラインで [Q]coarray-num-images コンパイラー・オプションを使用してイメージ数を指定することができます。環境変数 FOR_COARRAY_NUM_IMAGES に実行時のイメージ数を指定することもできます。
設定ファイルの使用
config-file オプションの使用は、限られたケースにおいてのみ適切です。
前述したように、-coarray=coprocessor コンパイラー・オプション (Linux*) 構文を使用する場合は設定ファイルを指定する必要があります。
Co-Array 環境でインテル® MPI ライブラリーの機能を活用するには、"mpiexec -config filename" を filename ファイルに指定し、[Q]coarray-config-file: コンパイラー・オプションを使用してファイル名をインテル® MPI ライブラリーに渡します。コマンドラインで [Q]coarray-num-images コンパイラー・オプションを指定した場合、設定ファイルの指定が優先されます。MPI 設定ファイルを使用する際の規則は次のとおりです。
設定ファイルの形式は、インテル® MPI ライブラリーのドキュメントで説明されています。Co-Array をマルチノード (分散メモリー) システムで動作させるには、設定ファイルに MPI オプション "-genv FOR_ICAF_STATUS launched" を追加する必要があります。
環境変数 FOR_COARRAY_CONFIG_FILE に実行時に使用するインテル® MPI ライブラリーの設定ファイル名とパスを設定することもできます。
Windows* の例:
/Qcoarray:shared /Qcoarray-num-images:8 は、共有メモリーシステムで 8 つのイメージを使用して Co-Array プログラムを実行します。
/Qcoarray:shared /Qcoarray-confi-file:filename は、共有メモリーシステムで filename の MPI 設定を使用して Co-Array プログラムを実行します。
/Qcoarray:distributed /Qcoarray-config-file:filename は、分散メモリーシステムで filename のインテル® MPI ライブラリー設定を使用して Co-Array プログラムを実行します。
Linux* の例:
-coarray=shared -coarray-num-images=8 は、共有メモリーシステムで 8 つのイメージを使用して Co-Array プログラムを実行します。
-coarray=distributed -coarray-num-images=8 は、共有メモリーシステムで 8 つのイメージを使用して Co-Array プログラムを実行します。
-coarray=coprocessor -coarray-config-file=filename は、最初のイメージをホストで実行し、ほかのイメージをホスト・プロセッサーまたはインテル® メニー・インテグレーテッド・コア (インテル® MIC) アーキテクチャー・ベースのコプロセッサーの組み合わせで実行する構成で Co-Array プログラムを実行します。このコマンドラインは、filename のインテル® MPI ライブラリー設定を使用します。
コンパイラーをインストールすると、コプロセッサーのファイルシステムに必要なインテル® MPI ランタイム・ライブラリーとバイナリーが提供されます。これらのファイルは、カードを再起動するたびにカードのファイルシステムに手動でコピーする必要があります。
次のように、mpirt ディレクトリーを移動し、インテル® MPI ファイルをコピーします。
sudo scp lib/mic/libmpi_mt.so mic0:/lib64/libmpi_mt.so
sudo scp bin/mic/mpiexec.hydra mic0:/bin/mpiexec.hydra
sudo scp bin/mic/pmi_proxy mic0:/bin/pmi_proxy
同じディレクトリーから、Co-Array サポート用インテル® Fortran ランタイム・ライブラリーもカードのファイルシステムにコピーします。
sudo scp lib/mic/libmpi_mt.so mic0:/lib64/libmpi_mt.so
sudo scp bin/mic/mpiexec.hydra mic0:/bin/mpiexec.hydra
sudo scp bin/mic/pmi_proxy mic0:/bin/pmi_proxy
いくつかの構成例を次に示します。
構成例: ホストでイメージ 1、インテル® MIC アーキテクチャー・ベースのコプロセッサーでイメージ 2 ~ N を実行する
この構成では、Co-Array プログラムは一部のイメージをホストで実行し、一部のイメージをコプロセッサーで実行します。
この構成では、次のように指定します。
ifort -coarray=coprocessor -coarray-config-file=MixedPlatform.conf myProg.f90 -o myProg
myProg および myProgMIC の 2 つの実行ファイルが生成されます。myProgMIC をカードのファイルシステムにコピーし、その場所を設定ファイルで指定します。
MixedPlatform.conf ファイルには次の内容が含まれます。
-n 1 -host <hostid-of-CPU> -genv FOR_ICAF_STATUS=T ./myProg : \
-n 4 -host <hostid-of-mic> genv FOR_ICAF_STATUS=T /home/mydir/myProgMIC
構成例: ホストでイメージ 1、ホストとコプロセッサーでイメージ 2 ~ N を実行する
前の例のバリエーションです。設定ファイルでホストまたはコプロセッサーに追加のイメージを指定します。各ホストのイメージ数を指定するため、-n X オプションが使用されています。例えば、CPU で 4 つのイメージ、4 つのコプロセッサーでそれぞれ 2 つのイメージを実行するには、設定ファイルで次のように指定します。
-n 4 -host MYCPU -genv FOR_ICAF_STATUS=true ./myProg : \ -n 2 -host CARD1 -genv FOR_ICAF_STATUS=true /home/mydir/myProgMIC :\ -n 2 -host CARD2 -genv FOR_ICAF_STATUS=true /home/mydir/myProgMIC :\ -n 2 -host CARD3 -genv FOR_ICAF_STATUS=true /home/mydir/myProgMIC :\ -n 2 -host CARD4 -genv FOR_ICAF_STATUS=true /home/mydir/myProgMIC
上記のように設定ファイルで指定した場合、myProg の num_images() は 12 になります。
構成例: ホストでイメージ 1 ~ N を実行し、コプロセッサーにコードをオフロードする
この構成では、すべての Co-Array イメージをホスト・プロセッサーで実行しますが、各イメージにコプロセッサーで実行するオフロードコードが含まれます。
この構成では、次のように指定します。
ifort -coarray -coarray-num-images=X myProg.f90 -o myProg
この構成では、コードにオフロード領域を追加し、次のようにディレクティブでマークする必要があります。
!DIR$ OFFLOAD BEGIN <ユーザーコード> !DIR$ END OFFLOAD
コードには次の制限も適用されます。
共通インデックスが付けられたオブジェクトはオフロード領域内で使用できません。
イメージ制御文はオフロード領域内で使用できません。
共通インデックスが付けられたオブジェクトは OpenMP* 領域内で使用できません。
イメージ制御文は OpenMP* 領域内で使用できません。
最適化に関する注意事項 |
---|
インテル® コンパイラーでは、インテル® マイクロプロセッサーに限定されない最適化に関して、他社製マイクロプロセッサー用に同等の最適化を行えないことがあります。これには、インテル® ストリーミング SIMD 拡張命令 2、インテル® ストリーミング SIMD 拡張命令 3、インテル® ストリーミング SIMD 拡張命令 3 補足命令などの最適化が該当します。インテルは、他社製マイクロプロセッサーに関して、いかなる最適化の利用、機能、または効果も保証いたしません。本製品のマイクロプロセッサー依存の最適化は、インテル® マイクロプロセッサーでの使用を前提としています。インテル® マイクロアーキテクチャーに限定されない最適化のなかにも、インテル® マイクロプロセッサー用のものがあります。この注意事項で言及した命令セットの詳細については、該当する製品のユーザー・リファレンス・ガイドを参照してください。 注意事項の改訂 #20110804 |