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の共次元数と同じです。例)
共配列が上記のように宣言されている場合で、現在のチームに8つの像がある場合、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に割り当てられます。
