Co-Array は、macOS* システムでは利用できません。
Co-Array は、Fortran 2008 で標準化され Fortran 2018 で拡張されたデータ共有概念で、1 つのプログラムの複数のコピーを使用して並列処理を可能にします。それぞれのコピーはイメージと呼ばれ、通常のローカル変数に加えて、Co-Array または covariable と呼ばれる共有変数を持ちます。
covariable は配列またはスカラーのいずれかで、プログラムのすべてのイメージで共有されます。この PGAS (Partitioned Global Address Space) モデルでは、各イメージが共変数のそれぞれの部分にローカル変数としてアクセスすることができ、また角括弧で囲まれた coindex を使用してほかのイメージの部分にもアクセスすることができます。
インテル® Fortran は、マルチコアまたはマルチプロセッサー・システムで共有メモリーを使用して実行する Co-Array プログラムをサポートします。一部の製品では (「機能要件」を参照してください)、分散メモリー型の Linux* または Windows* クラスターでも Co-Array プログラムを実行することができます。
詳細は、リリースノートのシステム要件を参照してください。
Co-Array は 64 ビット・アーキテクチャーでのみサポートされます。
Co-Array を使用してプログラムを作成する方法については、Fortran 2008 言語や ISO Fortran 2008 標準に関する書籍を参照してください。
Co-Array 構文の使用
Fortran 2008 の Co-Array では、次のような追加の構文が必要になります。
CODIMENSION 属性と "[cobound]" は、オブジェクトを Co-Array (covariable) として宣言します。
[coindex] は covariable またはほかのイメージを参照します。
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 拡張がサポートされています。
イメージを実行している現在のチームを変更する CHANGE TEAM 文と END TEAM 文
2 つのイメージの実行を同期する EVENT POST 文と EVENT WAIT 文
失敗したイメージをシミュレーションする FAIL IMAGE 文
現在のチームから 1 つまたは複数のチームを作成する FORM TEAM 文
イメージのチームを同期する SYNC TEAM 文
組込みプロシージャー COSHAPE、EVENT_QUERY、FAILED_IMAGES、GET_TEAM、IMAGE_STATUS、STOPPED IMAGES、および TEAM_NUMBER
オプションで TEAM や TEAM_NUMBER 引数を指定可能な新しい形式の IMAGE_INDEX、NUM_IMAGES、および THIS_IMAGE
アトミック・サブルーチン ATOMIC_ADD、ATOMIC_AND、ATOMIC_CAS、ATOMIC_FETCH_ADD、ATOMIC_FETCH_AND、ATOMIC_FETCH_OR、ATOMIC_FETCH_XOR、ATOMIC_OR、および ATOMIC_XOR
集合サブルーチン CO_BROADCAST、CO_MAX、CO_MIN、CO_REDUCE、and CO_SUM
CRITICAL 構造のオプションの STAT= 指定子と ERRMSG= 指定子、MOVE_ALLOC 組込みサブルーチンのオプション引数 STAT と ERRMSG、イメージセレクターに対するオプションの STAT=、TEAM=、および TEAM_NUMBER 指定子、ATOMIC_DEFINE サブルーチンと ATOMIC_REF STAT サブルーチンへのオプションの STAT 引数
チーム変数を作成可能な、組込みモジュール ISO_FORTRAN_ENV で定義されている TYPE TEAM_TYPE
組込みモジュール ISO_FORTRAN_ENV で定義されている 定数 INITIAL_TEAM、CURRENT_TEAM、および PARENT_TEAM
TEAM=、TEAM_NUMBER=、または STAT= 指定子を持つイメージセレクター
Co-Array コンパイラー・オプションの使用
-coarray (Linux*) または /Qcoarray (Windows*) コンパイラー・オプション (以降、[Q]coarray) を指定して、コンパイラーで Co-Array 構文が認識されるようにする必要があります。このコンパイラー・オプションを指定しないと、Co-Array の構文や機能を使用するプログラムではコンパイル時にエラーが発生します。
コマンドラインでは、1 つの [Q]coarray オプションのみ有効です。複数の [Q]coarray オプションを指定すると、最後に指定されたものが使用されます。この規則の例外は、キーワード single を指定した [Q]coarray コンパイラー・オプションです。指定された場合、コマンドラインの位置に関係なく、このオプションが優先されます。
オプションのキーワードは次のとおりです。
キーワードなしで [Q]coarray を使用することは、1 つのノード (共有メモリー) で実行するのと同じです。
キーワード shared を指定して [Q]coarray を使用すると、インテル® MPI ライブラリーの並列化が 1 つのノード (共有メモリー型のマルチコアまたはマルチプロセッサー) で実行されます。
キーワード distributed を指定して [Q]coarray を使用すると、インテル® MPI ライブラリーの並列化がマルチノード環境 (分散メモリー型のマルチ CPU) で実行されます。これには、特別なライセンスが必要です (「機能要件」 を参照してください)。
キーワード single を指定して [Q]coarray を使用すると、複製されない実行ファイル (1 つの実行イメージ) が生成されます。ほかの Co-Array キーワードが指定された場合は自己複製が行われます。このオプションは、デバッグに役立ちます。
Co-Array を含むプログラムを実行するのに特別な手順は必要ありません。単に実行ファイルを実行するだけです。
並列化の実装にはインテル® MPI ライブラリーを使用します。コンパイラーをインストールすると、共有メモリーで実行するのに必要なランタイム・ライブラリーが自動でインストールされます。クラスターをサポートする製品をインストールすると、分散メモリーで実行するのに必要なランタイム・ライブラリーが自動でインストールされます。その他のインテル® MPI ライブラリー実装や OpenMP* の Co-Array アプリケーションでの使用はサポートされていません。
デフォルトでは、作成されるイメージ数は現在のシステムの実行ユニットの数と同じです。メインプログラムをコンパイルする ifort コマンドラインで [Q]coarray-num-images コンパイラー・オプションを使用してイメージ数を指定することができます。環境変数 FOR_COARRAY_NUM_IMAGES に実行時のイメージ数を指定することもできます。
設定ファイルの使用
[Q]coarray-num-images コンパイラー・オプションを指定して設定ファイルを使用することは、限られたケースでのみ適切です。
主な理由として、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 ライブラリーの設定ファイル名とパスを設定することもできます。
設定環境変数の使用
インテル® Fortran は、インテル® MPI ライブラリーを Co-Array 機能のトランスポート・レイヤーとして使用します。インテル® MPI ライブラリーは、環境変数を使用して特定の使用パターンに合わせて調整できます。
インテル® Fortran では、インテル® MPI ライブラリーのいくつかの制御変数を、ほとんどのユーザーや多くの Co-Array 使用パターンに適した値に設定しています。インテル® Fortran が設定していないほかの変数を設定することも可能です。インテル® Fortran が設定しない変数は、ほかの使用パターンでパフォーマンスが低下する可能性があったり、古いバージョンのインテル® MPI ライブラリーで使用するとエラーが発生する可能性があるためです。
インテル® MPI ライブラリー 2019 Update 5 以降の共有メモリーで動作するアプリケーションでは、次の 2 つの変数を "shm'" に設定することで利点が得られます。
I_MPI_FABRICS
I_MPI_DEVICE
Linux* システムで上記の環境変数を設定すると、共有メモリーの使用量が増えるため、Red Hat* 7.2 および Ubuntu* ではハングアップすることがあります。Linux* のバスエラー (SIGBUS) を回避するには、/dev/shm のサイズを大きくする必要があります。
オーバーサブスクライブする (マシンの実際のプロセッサー数よりも多くの Co-Array イメージを実行する) アプリケーションでは、以下の変数を 1 に設定するとよいでしょう。
I_MPI_WAIT_MODE
オーバーサブスクライブが多いアプリケーション (1 プロセッサーあたり 5 イメージ以上) では、以下の変数を 3 に設定するとよいでしょう。
I_MPI_THREAD_YIELD
これらは、設定環境変数の使用に関する基本です。インテル® MPI ライブラリーの調整に使用できる環境変数はほかにも多数あります。詳細は、『Intel® MPI Library Developer Reference』の「Other Environment Variables」を参照してください。
Windows* の例:
/Qcoarray:shared /Qcoarray-num-images:8
上記のコマンドは、8 イメージを使用して、共有メモリーで Co-Array プログラムを実行します。
/Qcoarray:shared /Qcoarray-config-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 プログラムを実行します。