11.10 高度な共配列プログラミング
-
[7.0]
追加の組込みアトミックサブルーチン(以下)は、複数の像が同期せずにアトミック変数を更新できる手段を提供します。
ATOMIC_ADD
(ATOM,VALUE,STAT)
ATOMIC_AND
(ATOM,VALUE,STAT)
ATOMIC_CAS
(ATOM,OLD,COMPARE,NEW,STAT)
ATOMIC_FETCH_ADD
(ATOM,VALUE,OLD,STAT)
ATOMIC_FETCH_AND
(ATOM,VALUE,OLD,STAT)
ATOMIC_FETCH_OR
(ATOM,VALUE,OLD,STAT)
ATOMIC_FETCH_XOR
(ATOM,VALUE,OLD,STAT)
ATOMIC_OR
(ATOM,VALUE,STAT)
ATOMIC_XOR
(ATOM,VALUE,STAT)
引数
ATOM
、COMPARE
、NEW
、およびOLD
は、すべてINTEGER(ATOMIC_INT_KIND)
です。ATOM
引数は更新される引数であり、共配列または並列添字付き変数である必要があります。OLD
引数はINTENT(OUT)
であり、演算の前にATOM
の値を受け取ります。STAT
引数は省略可能であり、型がINTEGER
で、サイズが16ビット以上の非並列添字付き変数である必要があります。VALUE
引数はINTEGER
である必要がありますが、どのような種別でもかまいません。ただし、VALUE
と演算の結果の両方がINTEGER(ATOMIC_INT_KIND)
で表現可能である必要があります。*
_ADD
演算は加算であり、*_AND
演算はビット単位であり、(IAND
のように)、*_OR
演算はビット単位または(IOR
のように)また、*_XOR
演算はビット単位の排他的論理和または(IEOR
のように)です。ATOMIC_CAS
は、アトミックな比較スワップ演算です。ATOM
がCOMPARE
と等しい場合、値NEW
が割り当てられます。それ以外の場合は変更されません。 いずれの場合も、演算前の値はOLD
に割り当てられます。COMPARE
とNEW
の両方もINTEGER(ATOMIC_INT_KIND)
でなければならないことに注意してください。ATOM
が並列添字付き変数であり、失敗した像にある場合、演算は失敗し、エラー状態が発生します。OLD
引数は未定義になり、STAT
が存在する場合は、値STAT_FAILED_IMAGE
が割り当てられます。STAT
が存在しない場合、プログラムは終了します。 エラーが発生せず、STAT
が存在する場合、値ゼロが割り当てられます。 -
[7.0]
組込み関数
COSHAPE
は、共配列の共寸法のベクトルを返します。書式は次のとおりです。COSHAPE(COARRAY[、KIND])
COARRAY
:任意の型の共配列。ALLOCATABLE
の場合は、割り当てる必要があります。 構造成分の場合、右端の成分は共配列成分である必要があります。KIND
(省略可能):有効な整数の種別番号であるスカラ整数定数式。結果:整数型のベクトル、または
KIND
が存在する場合はInteger(KIND
)。 結果のサイズは、COARRAY
の共次元数と同じです。例)
REAL x[5,*]
COSHAPE(x)
は[5,2]
と等しくなります。 -
[7.0]
要素別処理関数
IMAGE_STATUS
は、別の像が停止したか失敗したかを問い合わせます。 書式は次のとおりです。IMAGE_STATUS( IMAGE [, TEAM ] )
IMAGE
:有効な像番号(正の整数)TEAM
(省略可能):現在または先祖のチームを識別するスカラTEAM_TYPE
値。結果:基本整数。
結果は、像が失敗した場合は
STAT_FAILED_IMAGE
、像が停止した場合はSTAT_STOPPED_IMAGE
、それ以外の場合はゼロです。 省略可能なTEAM
引数は、像番号が適用されるチームを指定します。 指定されていない場合は、現在のチームが使用されます。 -
[7.0]
組込み関数
STOPPED_IMAGES
は、通常終了を開始した像を示す配列を返します(つまり、“stopped”)。 書式は次のとおりです。STOPPED_IMAGES( [ TEAM, KIND ] )
TEAM
(省略可能) : スカラTEAM_TYPE
、現在のチームまたは先祖のチームを識別する値。KIND
(省略可能) : スカラINTEGER
、有効な整数の種別番号を示す定数式。結果 : 整数型のベクトル、または
KIND
が存在する場合はInteger(KIND
)。結果の各成分は停止した像番号(昇順)です。
-
[7.0]
組込みモジュール
ISO_FORTRAN_ENV
の型EVENT_TYPE
は、新しい文および組込み関数EVENT_QUERY
とともに、軽量の片側同期メカニズムであるeventsのサポートを提供します。型
LOCK_TYPE
と同様に、型EVENT_TYPE
の要素は変数または成分である必要があり、型EVENT_TYPE
の変数は共配列である必要があり、型LOCK_TYPE
の非共配列サブ成分を持つ変数は共配列である必要があります。 このような変数はイベント変数と呼ばれます。 イベント変数は、EVENTPOST
またはEVENTWAIT
文を除いて、変数定義コンテキスト(つまり、変更される可能性のあるコンテキスト)で指定することはできません。また、仮引数の場合は実引数として指定することもできません。 引数はINTENT(INOUT)
です。像のイベント変数には、像制御文
EVENTPOST
を使用して、イベント“posted”を設定できます。EVENT POST ( event-variable [, sync-stat ]... )
ここで、省略可能なsync-statは単一のSTAT=
stat-variable指定子および/または単一のERRSMG=
errmsg-variable指定子です。 stat-variableは、最大9999の値を保持できるスカラ整数変数である必要があり、errmsg-variableは、スカラの基本文字変数である必要があります。 イベントを投稿すると、変数の“outstanding event count”が増加します(このカウントは最初はゼロです)。 この文のevent-variableは、像がそれ自体にイベントを投稿することはめったにないため、通常は並列添字付き変数になります。STAT=
が指定され、投稿が成功すると、stat-variableにゼロが割り当てられます。 event-variableが配置されているイメージが停止している場合、STAT_STOPPED_IMAGE
がstat-variableに割り当てられます。 像にエラーが発生した場合はSTAT_FAILED_IMAGE
が割り当てられ、その他のエラーが発生した場合は他の正の値が割り当てられます。STAT=
が指定されずにエラーが発生した場合、プログラムはエラーで終了するため、STAT=
なしでERRMSG=
を使用しても意味がないことに注意してください。イベントは、像制御文
EVENTWAIT
によって受信されます。EVENT WAIT ( event-variable [, event-wait-spec-list ] )
ここで、省略可能なevent-wait-spec-listは単一のSTAT=
stat-variable指定子、単一のERRSMG=
errmsg-variable指定子、および/または、単一のUNTIL_COUNT=
scalar-integer-expr指定子をカンマ区切りで指定したリストです。 イベントの待機は、“未処理のイベント数”がUNTIL_COUNT=
指定子の値以上になるまで、またはUNTIL_COUNT=
が指定されていない場合はゼロより大きくなるまで待機します。UNTIL_COUNT=
で指定された値が1未満の場合、1に等しいものとして扱われます。この文のevent-variableは、共添え字付きにはできません。つまり、像は、それ自体のイベント変数に投稿されたイベントのみを待機できます。 待機中の像と“outstandingeventcount”に寄与した像の間には部分的な同期があります。
EVENTWAIT
文の実行後のセグメントは、EVENTPOST
文の実行前のセグメントの後に続きます。 同期は逆の動作はしません。つまり、投稿像のセグメントの実行が待機像のセグメントの後に続くとは限りません。STAT=
とERRMSG=
はEVENTPOST
文と同様に動作します。(STAT_FAILED_IMAGE
とSTAT_STOPPED_IMAGE
は除く)最後に、組込み関数
EVENT_QUERY
を使用して、イベント変数を待たずに問い合わせることができます。 書式は以下の通りです。EVENT_QUERY ( EVENT, COUNT [, STAT ] )
ここで、EVENT
はイベント変数、COUNT
は少なくとも基本整数と同じ大きさの整数変数、省略可能なSTAT
は最大9999の値を保持できる整数変数です。EVENT
を並列添字付き変数にすることは許可されていません。つまり、イベント変数が配置されている像のみがそのカウントを照会できます。COUNT
には、イベント変数の現在の“未処理のイベントのカウント”が割り当てられます。STAT
が存在する場合、正常に実行されるとゼロの値が割り当てられ、エラーが発生すると正の値が割り当てられます。 エラーが発生し、STAT
が存在しない場合、プログラムはエラーで終了します。順序付けされていないセグメントのイベント投稿は、カウントに割り当てられた値に含まれない場合があることに注意してください。 つまり、イベントポストが変数に到達するまでに(通信)時間がかかる場合があり、像がすでに同期されている場合にのみ変数に到達することが保証されます。
EVENT_QUERY
の使用は、それ自体が同期を意味するものではありません。 -
[7.0]
組込みモジュール
ISO_FORTRAN_ENV
の型TEAM_TYPE
は、新しい文と組込み手続きとともに、共配列並列計算を構造化する新しい方法であるteamsのサポートを提供します。 基本的な考え方は、チーム内で実行している間、共配列環境はチーム内の像のみが存在するかのように機能するというものです。 これにより、計算の特定の部分に関係する像をリストする配列を渡す手間をかけずに、共配列計算を独立した部分に分割することが容易になります。EVENT_TYPE
やLOCK_TYPE
とは異なり、TEAM_TYPE
を返す関数は許可されています。 さらに、型TEAM_TYPE
の変数は、共配列になることを禁じられており、 別の像からTEAM_TYPE
値を割り当てると(たとえば、派生型割り当ての成分として)、変数が未定義になります。 これは、TEAM_TYPE
値に特定の像に固有の情報(他の像へのルーティング情報など)が含まれている可能性があるためです。 型TEAM_TYPE
の変数は、チーム変数と呼ばれます。チームの生成 プログラム内のすべての像のセットは、初期チームと呼ばれます。 いつでも特定の像が特定のチーム、現在のチームで実行されます。 現在のチームのサブチームのセットは、 FORM TEAM
文(以下)を使用していつでも作成できます。FORM TEAM ( team-number , team-variable [, form-team-spec ]... )
ここで、team-numberは正の値に評価されるスカラ整数式、team-variableはチーム変数、各form-team-specはSTAT=
、ERRMSG=
、およびNEW_INDEX=
index-value指定子です。 form-team-specの各種類の多くても1つは、FORM TEAM
文で指定されます。 現在のチームのすべてのアクティブな像は、同じFORM TEAM
文を実行する必要があります。NEW_INDEX=
が指定される場合、index-valueは正のスカラ整数である必要があります(以下を参照)。STAT=
およびERRMSG=
指定子には、通常の形式とセマンティクスがあります。FORM TEAM
の実行によって生成されるサブチームの数は、その実行における一意のteam-number値の数と同じです。 それぞれの一意のteam-number値は、セット内のサブチームを識別し、各像は、チーム番号が指定されたサブチームに属します。NEW_INDEX=
が指定される場合は、像が新しいサブチームに含める像番号を指定するため、1からNの範囲である必要があります。ここで、Nは像の数です。そのサブチームで、一意である必要があります。NEW_INDEX=
が表示されない場合は、新しいサブチームの像番号は処理系依存です。例)
TYPE(TEAM_TYPE) oddeven myteamnumber = 111*(MOD(THIS_IMAGE(),2) + 1) FORM TEAM ( myteamnumber, oddeven )
上記は2つのサブチームのセットを作成します。1つはチーム番号111、もう1つはチーム番号222です。 チーム111には、現在のチームの像番号が偶数である像が含まれ、チーム222には、現在のチームの像番号が奇数である像が含まれます。 各像で、変数oddeven
は、その像が属するサブチームを識別します。チーム番号は完全に任意であり(プログラムによって選択されます)、“sibling”チームと呼ばれるサブチームのセット内でのみ意味を持つことに注意してください。
サブチームへの変更 現在のチームは、 CHANGE TEAM
構文を実行することで変更されます。書式は以下の通りです。CHANGE TEAM ( team-value [, sync-stat-list ] ) statements END TEAM [ ( [ sync-stat-list ] ) ]
ここで、team-valueは型TEAM_TYPE
の値であり、省略可能なsync-stat-listは、 最大で1つのSTAT=
とERRMSG=
指定子を含むカンマ区切りのリストです。STAT=
およびERRMSG=
指定子は、通常の書式とセマンティクスを持ちます。 構文内のstatementsの実行は、現在のチームがteam-valueで識別されるチームに設定された状態で行われます。 これは、構文外の現在のチームのサブチームである必要があります。 現在のチームの設定は、プロシージャの呼び出し中も有効なままであるため、 構文によって参照されるすべてのプロシージャも、新しいチームの現在のチームで実行されます。構文からの制御の転送、例:
RETURN
またはGOTO
文によるものは禁止です。 構文は、END TEAM
文を実行するか、構文に属するEXIT
文を実行することで終了できます。 後者は、構文に名前が付けられている場合にのみ可能です。 (これは上述の書式では示されていませんが、CHANGE TEAM
文の“構文名:
”接頭子、及びEND TEAM
文の“構文名”接尾子で指定します)。CHANGE TEAM
構文を実行している間、像選択子は新しいチームの像番号を使用して動作し、組込み関数NUM_IMAGES
とTHIS_IMAGES
は新しいチームのデータを返し、SYNC ALL
は新しいチームのみを同期します。CHANGE TEAM
文とEND TEAM
文の両方で、新しいチームのすべての像の暗黙的な同期があり、 この時点ですべてのアクティブな像は同じ文を実行する必要があります。親チームもしくは先祖チームの動機 CHANGE TEAM
構文内で実行している間、SYNC ALL
とSYNC IMAGES
の効果は現在のチーム内の像にのみ適用されます。SYNC ALL
で親チームを同期するには、最初に構文を終了する必要があり、 同期後の計算がチーム内で行われる場合、これは不便な場合があります。この目的のために、
SYNC TEAM
文が次の書式で追加されましたSYNC TEAM ( team-value [, sync-stat-list ] )
ここで、team-valueは現在のチームまたはその先祖を識別し、sync-stat-listは、 最大で1つのSTAT=
指定子と最大で1つのERRMSG=
指定子を含む通常のカンマ区切りのリストです。 (これらには通常のセマンティクスであるため、ここではこれ以上説明しません)。これによる効果は、指定されたチームのすべての像を同期することです。
チームに関連する組込み関数 -
組込み関数
GET_TEAM
は、特定のチームを識別する型TEAM_TYPE
の値を返します。 (これは、最初のチームのTEAM_TYPE
値を取得する唯一の方法です。) 関数の書式は以下の通りです。GET_TEAM( [ LEVEL ] )
ここで、省略可能なLEVEL
引数は、組込みモジュールISO_FORTRAN_ENV
の名前付き定数CURRENT_TEAM
、INITIAL_TEAM
、またはPARENT_TEAM
のいずれかに等しいスカラー整数値です。 この引数は、TEAM_TYPE
値はチームを指定します。 存在しない場合は、現在のチームの値が返されます。 現在のチームが最初のチームである場合、最初のチームには親がないため、LEVEL
引数はPARENT_TEAM
と等しくてはなりません。 -
組込み関数
TEAM_NUMBER
は、チーム番号(実行中の像によってFORM TEAM
で使用されたもの)を返します。 書式は以下の通りです。TEAM_NUMBER( [ TEAM ] )
ここで、省略可能なTEAM
引数は、情報がほしいチームを指定します。 サブチームや無関係のチームではなく、現在のチームまたは先祖のチームを示す必要があります。TEAM
がない場合は、現在のチームのチーム番号が返されます。 最初のチームのチーム番号は−1と見なされます(最初のチームを除いて、すべてのチーム番号は正の値です)。
兄弟及び親チームに関する情報 組込み関数 IMAGE_INDEX
、NUM_IMAGES
、およびTHIS_IMAGE
は通常、現在のチームに関連する情報を返しますが、TEAM
引数を使用して親チームの情報を返すことができます。これは、現在のチームまたは親チームを識別するスカラのTEAM_TYPE
値を取ります。 同様に、IMAGE_INDEX
およびNUM_IMAGES
組込み関数は、TEAM_NUMBER
引数を使用して兄弟チームの情報を返すことができます。これは、現在のチームまたは兄弟チームのチーム番号に等しいスカラ整数値を取ります。TEAM_NUMBER
引数は −1 にも等しくすることができ、その場合、初期チームを指定します。 (実行中の像が兄弟チームのメンバーになることはないため、THIS_IMAGE
はTEAM_NUMBER
引数を受け付けません。) したがって、組込み関数NUM_IMAGES
には以下の2つの追加形式があります:NUM_IMAGES( TEAM ) NUM_IMAGES( TEAM_NUMBER )
THIS_IMAGE
の場合、以下のよう書式があります。 ForTHIS_IMAGE
, the revised forms it may take are as follows:THIS_IMAGE( [ TEAM ] ) THIS_IMAGE( COARRAY [, TEAM ] ) THIS_IMAGE( COARRAY, DIM [, TEAM ] )
COARRAY
およびDIM
引数の意味は変更されていません。 省略可能なTEAM
引数は、情報がほしいチームを指定します。[7.2]
IMAGE_INDEX
に対して、追加で取りうる形式は以下の通りです:IMAGE_INDEX( COARRAY, SUB, TEAM ) IMAGE_INDEX( COARRAY, SUB, TEAM_NUMBER )
COARRAY
とSUB
引数の意味は変わりませんが、 添字は指定されたチームのものとして解釈されます。 返り値は同様に、指定されたチーム内の像番号です。共配列の確立 共配列は、そのチームまたはその先祖で確立されていない限り、チーム内で使用することはできません。 確立の基本的なルールは次のとおりです。 -
SAVE
属性(明示的または暗黙的)を持つ割り付け不可能な共配列は常に確立されます。 -
割り付けられていない共配列(
ALLOCATABLE
属性を持つ)は確立されていません。 - 割り付けられた共配列は、割り付けられたチームで確立されます。
- 仮引数の共配列は、手続き呼び出しを実行したチームで確立されます(実際の引数が確立されたチームとは異なる場合もあります)。
チームでの共配列の割付けと割付け解除 CHANGE TEAM
文の実行時にALLOCATABLE
属性を持つ共配列がすでに割付けられている場合、 その構文内(またはその構文から呼び出される手続き内)でDEALLOCATE
することはできません。CHANGE TEAM
文の実行時にALLOCATABLE
属性を持つ共配列が割付けられていない場合、 その構文内(またはその構文から呼び出された手続き内)で(ALLOCATE
を使用して)割付けられます。(後でその割付けを解除することもできます。)END TEAM
文の実行時にそのような共配列が割付けられたままの場合、その時点で自動的に割付けが解除されます。つまり、チームを使用する場合、割付け可能な共配列は、一部の像(チーム内)には割付けられますが、他の像(チーム外)には割付けられないか、他の像(チーム外)では異なる形状または型のパラメタで割付けられます。 ただし、チームで実行する場合、共配列はチームのすべての像に割付けられていないか、 チームのすべての像に同じ型のパラメタと形状で割付けられます。
兄弟チームの共配列へのアクセス 現在のチームの外部であるが兄弟チームの共配列へのアクセスは、像選択子の TEAM_NUMBER=
指定子を使用して可能です。 これには以下の像選択子の拡張構文を使用します。[ cosubscript-list [, image-selector-spec-list ] ]
ここで、cosubscript-listは通常の並列添字付きリストであり、 image-selector-spec-listにはTEAM_NUMBER=
team-number指定子が含まれています。 ここで、team-numberは、兄弟チームを識別する正の整数値です。 image-selector-spec-listには、STAT=
指定子を含めることもできます(これについては、後で「フォールトトレランス」で説明します)。TEAM_NUMBER=
指定子が使用される場合、並列添字は兄弟チームで並列添字として扱われます。 この方法でのアクセスは非常に危険であり、通常は親チーム全体の同期が必要になることに注意してください。 問題の共配列は、親チームで確立にする必要があります。先祖チームの共配列へのアクセス 像選択子の TEAM=
指定子を使用して、親チームまたはより遠い先祖チームの共配列にアクセスできます。 拡張書式は以下の通りです。[ cosubscript-list [, image-selector-spec-list ] ]
ここで、cosubscript-listは通常の並列添字付きリストであり、image-selector-spec-listにはTEAM=
team-value指定子が含まれています。ここでteam-valueは、 現在のチームまたは先祖を識別する型TEAM_TYPE
の値です。 image-selector-spec-listには、STAT=
指定子を含めることもできます(これについては、後で「フォールトトレランス」で説明します)。TEAM=
指定子が使用される場合、並列添字は指定された先祖チームで並列添字として扱われ、 このように指定された像は現在のチーム内もしくはチーム外にある可能性があります。 現在のチーム外の像にアクセスする場合は、像が適切に同期されるように注意する必要があります。 このような同期は、チーム内で動作するため、SYNC ALL
またはSYNC IMAGES
では取得できませんが、 先祖チームを指定するSYNC TEAM
によって、またはロックやイベントを使用して取得できます。 ここでの共配列は、指定された(現在または先祖の)チームで確立されている必要があります。CHANGE TEAM
での共配列の結合CHANGE TEAM
構文内のローカルな共配列名を、構文外の名前付き共配列と結合して、プロセス内で共次元数や共寸法を変更することができます。 これは、限定された引数の結合のように機能します。 ローカルな共配列名には、外部の共配列の型、パラメタ、次元数、配列の形状がありますが、ALLOCATABLE
属性はありません。 1つ以上のそのような結合を含むCHANGE TEAM
構文の書式は次のとおりです。CHANGE TEAM ( team-value , coarray-association-list [, sync-stat-list ] )
ここでcoarray-association-listは、カンマ区切りで指定される以下のリストです。local-coarray-name [ explicit-coshape-spec ] => outer-coarray-name
またexplicit-coshape-specは[ [ lower-cobound : ] upper-cobound , ]... [ lower-cobound : ] *
(ここで、記述[ 何か ]...は何か が0回以上繰り返される事を意味します)共上下限式は
CHANGE TEAM
文実行時に評価されます。この機能の使用は、引数の結合よりも強力ではなく、また混乱を招くため推奨しません。
-
組込み関数
-
[7.0]
共配列のフォールトトレランス機能がサポートされています。
これには
FAIL IMAGE
文、組込みモジュールISO_FORTRAN_ENV
の名前付き定数STAT_FAILED_IMAGE
、像選択子STAT=
指定子、および組込み関数FAILED_IMAGES
が含まれます。FAIL IMAGE
文の書式はシンプルです。FAIL IMAGE
この文を実行すると、現在の像が“fail”になります。つまり、プログラムの実行への参加が停止します。 これは、nAG Fortran 7.0で像が失敗する唯一の方法です。すべての像が失敗または停止した場合、プログラムの実行は終了します。 nAG Fortranは、いずれかの像に障害が発生した場合に警告メッセージを表示します。
像選択子には省略可能な指定子のリストがあります。(改訂された)書式は以下のとおりです。 (通常の角括弧は文字通り角括弧であり、斜体の角括弧は省略可能である事を示します):
[ cosubscript-list [, image-selector-spec-list ] ]
ここで、cosubscript-listは、カンマで区切られた共添え字(変数の共次元数ごとに1つのスカラ整数)です。 また、image-selector-spec-listは、最大で1つのSTAT=
stat-variable指定子と、最大で1つのTEAM=
またはTEAM_NUMBER=
指定子を含むカンマ区切りのリストです。 アクセスされている共添え字付き実体が失敗した像にある場合、値STAT_FAILED_IMAGE
がstat-variableに割り当てられ、それ以外の場合は値ゼロが割り当てられます。組込み関数
FAILED_IMAGES
は、失敗したことがわかっている像の配列を返します(像が失敗し、同期を試みるまで他の像が認識されない可能性があります)。 書式は次のとおりです。FAILED_IMAGES( [ TEAM, KIND ] )
TEAM
(省略可能) : スカラTEAM_TYPE
、現在のチームもしくは先祖チームを識別する値KIND
(省略可能) : 有効な整数種別番号を示すスカラ整数定数式結果 : 整数型のベクトル、もしくは
KIND
が存在する場合Integer(KIND
)型のベクトル結果は、失敗した像番号(昇順)です。
失敗した像を処理するため、次のセマンティクスが適用されます。
- 失敗した像の変数に値を書き込むことは許可されています(ただし、効果がない場合があります)。
- 失敗した像の変数から値を読み取ることは許可されていますが、結果は予測できません。
-
STAT=
指定子と共にCHANGE TEAM
、END TEAM
、FORM TEAM
、SYNC ALL
、SYNC IMAGES
、またはSYNC TEAM
文の実行が許可され、 失敗していない像に対してチームの変更、作成、または同期操作を行い、値STAT_FAILED_IMAGE
をSTAT=
変数に割り当てます。
フォールトトレランス機能は、原則としてハードウェア障害からの回復を可能にすることを目的としており、
FAIL IMAGE
文により回復シナリオのテストが可能になります。 nAG Fortranコンパイラ(リリース7.1)は、ハードウェア障害からの回復をサポートしていません。 -
[7.1]
組込みサブルーチン
CO_BROADCAST
、CO_MAX
、CO_MIN
、CO_REDUCE
、およびCO_SUM
は、集団的な演算を実行します。 これらのサブルーチンは共配列並列処理用のものです。明示的な同期を行わずに、現在のチームのすべての像の値を計算します。これらのサブルーチンにはすべて、省略可能な
STAT
およびERRMSG
引数があります。 正常に実行されると、STAT
引数には値ゼロが割り当てられ、ERRMSG
引数は変更されません。 エラーが発生した場合、正の値がSTAT
に割り当てられ、説明メッセージがERRMSG
に割り当てられます。 この方法で捕捉できるのは、エラーSTAT_FAILED_IMAGE
とSTAT_STOPPED_IMAGE
のみです。 完全な同期がないため(以下を参照)、異なる像で異なるエラーを受け取るか、まったく受け取らない可能性があります。 エラーが発生し、STAT
が存在しない場合、実行は終了します。STAT
またはERRMSG
の実引数が省略可能な仮引数である場合、それらはすべての像に存在するか、もしくはすべての像に存在しないかのどちらかでなければならないことに注意してください。これらのサブルーチンの1つへの参照(
CALL
)は像制御文ではなく、現在のセグメントを終了せず、また同期も意味しません(ただし、計算中に部分的な同期が発生します)。 ただし、このような呼び出しは、像制御文が許可されている場合にのみ許可されます。チーム内の各像は、チーム内の他の像と同じ順序の
CALL
文で集団的サブルーチンを実行する必要があります。 呼び出し時に像間に同期があってはなりません。 呼び出しは、順序付けされていないセグメントから行う必要があります。すべての集団的サブルーチンには、最初の引数“
A
”があります。これはINTENT(INOUT)
であり、添え字付き実体であってはなりません。 この引数には計算用のデータが含まれており、現在のチームのすべての像で同じ型、型パラメタ、および形状である必要があります。 共配列の仮引数の場合、すべての像で同じ末端引数を持っている必要があります。SUBROUTINE CO_BROADCAST ( A, SOURCE_IMAGE [, STAT, ERRMSG ] )
A
:任意の型の変数。 添え字付き実体であってはならず、現在のチームのすべての像で同じ型、型パラメタ、および形状を持っている必要があります。A
が共配列の仮引数の場合、各像で同じ末端引数を持っている必要があります。SOURCE_IMAGE
:整数スカラ。範囲は1からNUM_IMAGES()
で、この引数は現在のチームのすべての像で同じである必要があります。STAT
(省略可能):整数スカラ変数、共添え字付きではないERRMSG
(省略可能):共添え字付きではない基本文字スカラ変数。像
SOURCE_IMAGE
の引数A
の値は、他のすべての像の引数A
に割り当てられます。SUBROUTINE CO_MAX ( A [, RESULT_IMAGE, STAT, ERRMSG ] )
A
:整数、実数、または文字型の変数。 共添え字付き実体であってはならず、現在のチームのすべての像で同じ型、型パラメタ、および形状である必要があります。A
が仮引数である共配列である場合、各像で同じ末端引数を持っている必要があります。RESULT_IMAGE
(省略可能):1からNUM_IMAGES()
の範囲の整数スカラ。この引数は、すべての像に存在するか、もしくはすべての像に存在しないかのいずれかである必要があります。 存在する場合は現在のチームのすべての像で同じ値である必要があります。STAT
(省略可能):整数スカラ変数、共添え字なし。ERRMSG
(省略可能):共添え字なしの基本文字スカラ変数。このサブルーチンは、すべての像にわたって
A
の最大値を計算します。A
が配列の場合、値は要素別に計算されます。RESULT_IMAGE
が存在する場合、結果はその像の引数A
に割り当てられます。それ以外の場合、結果はすべての像の引数A
に割り当てられます。SUBROUTINE CO_MIN ( A [, RESULT_IMAGE, STAT, ERRMSG ] )
A
:整数、実数、または文字型の変数。 共添え字付き実体であってはならず、現在のチームのすべての像で同じ型、型パラメタ、および形状を持っている必要があります。A
が仮引数である共配列である場合、各像で同じ末端引数を持っている必要があります。RESULT_IMAGE
(省略可能):1からNUM_IMAGES()
の範囲の整数スカラ。この引数は、すべての像に存在するか、もしくはすべての像に存在しない必要があります。 存在する場合は、現在のチームのすべての像で同じ値である必要があります。STAT
(省略可能):整数スカラ変数、共添え字なし。ERRMSG
(省略可能):共添え字がない基本文字スカラ変数。このサブルーチンは、すべての像にわたって
A
の最小値を計算します。A
が配列の場合、値は要素別に計算されます。RESULT_IMAGE
が存在する場合、結果はその像の引数A
に割り当てられます。それ以外の場合、結果はすべての像の引数A
に割り当てられます。SUBROUTINE CO_REDUCE ( A, OPERATION [, RESULT_IMAGE, STAT, ERRMSG ] )
A
:任意の型の非多相変数。共添え字付き実体であってはならず、現在のチームのすべての像で同じ型、型パラメタ、および形状である必要があります。A
が共配列の仮引数である場合、各像で同じ末端引数を持っている必要があります。OPERATION
:正確に2つの引数を持つ純粋関数。OPERATION
の仮引数は、割り当て不可、省略可能、ポインター、非多相の仮変数である必要があり、各引数と関数の結果は、A
と同じ型および型パラメタを持つスカラである必要があります。RESULT_IMAGE
(省略可能):1からNUM_IMAGES()
の範囲の整数スカラ。この引数は、すべての像に存在するか、あるいはすべての像に存在しないのいずれかである必要があります。存在する場合は、現在のチームのすべての像で同じ値である必要があります。STAT
(省略可能):整数スカラ変数、共添え字なし。ERRMSG
(省略可能):共添え字がない基本文字スカラ変数。このサブルーチンは、すべての像にわたって
A
の任意の集約を計算します。A
が配列の場合、値は要素別に計算されます。 集約は、すべての像のA
の対応する値のセットから計算されます。 これは反復プロセスであり、セットから2つの値を取得し、OPERATION
関数を適用してそれらを1つの値に変換します。このプロセスは、セットに単一の値—が含まれるまで続き、その値が結果になります。RESULT_IMAGE
が存在する場合、結果はその像の引数A
に割り当てられます。それ以外の場合、結果はすべての像の引数A
に割り当てられます。SUBROUTINE CO_SUM ( A [, RESULT_IMAGE, STAT, ERRMSG ] )
A
:整数、実数、または複素数型の変数。 共添え字付き実体であってはならず、現在のチームのすべての像で同じ型、型パラメタ、および形状である必要があります。A
が仮引数である共配列である場合、各像で同じ末端引数を持っている必要があります。RESULT_IMAGE
(省略可能):1からNUM_IMAGES()
の範囲の整数スカラ。この引数は、すべての像に存在するか、もしくはすべての像に存在しないかのいずれかである必要があります。 存在する場合は、現在のチームのすべての像で同じ値である必要があります。STAT
(省略可能):整数スカラ変数、共添え字なし。ERRMSG
(省略可能):共添え字がない基本文字スカラ変数。このサブルーチンは、すべての像の
A
の合計を計算します。A
が配列の場合、値は要素別に計算されます。RESULT_IMAGE
が存在する場合、結果はその像の引数A
に割り当てられます。それ以外の場合、結果はすべての像の引数A
に割り当てられます。