この章では、
HPF構文
について簡潔に述べます。
構文は、HPF2.0仕様、HPF2.0公認拡張
、
あるいは
HPF/JA1.0拡張仕様
に基づいています。
HPF/JA1.0仕様で新たに定義された仕様
に関しては、その旨が記述されています。
特に記述のない場合は、HPF2.0又はHPF2.0公認拡張中で
定義されている仕様です。
HPF2.0中で定義された名前付き要素を宣言するための指示文 について述べます。
PROCESSORS プロセッサ名 [ ([下限:]上限[,[下限:]上限...] ) ]
PROCESSOR指示文により、プロセッサ構成を宣言できます。
TEMPLATE テンプレート名 [ ([下限:]上限[,[下限:]上限...] ) ]
TEMPLATE指示文により、記憶領域を持たない仮想的な配列を 宣言し、整列先として利用できます。
ここでは、宣言部で記述できるマッピング指示文の一覧を示します。
POINTER属性やTARGET属性を持ったり、
そのような実体を成分として持つ構造型配列をマップすることはできません。
DISTRIBUTE 配列名 [*][(分散形式[,分散形式...])] [ ONTO [*] プロセッサ名 ]
分散形式としては、以下のいずれかを指定することができます。
BLOCK[(スカラ整数式)] CYCLIC[(スカラ整数式)] GEN_BLOCK(整数型一次元配列) INDIRECT(整数型一次元配列) *
DISTRIBUTE指示文により、配列をプロセッサ構成上へ分散することができます。
GEN_BLOCK分散、INDIRECT分散
の整数型一次元配列を
マッピング配列
と言います。
分散形式'*'で分散された次元は、on-processor分散されていると言います。
ALIGN 配列名 [(align-source-list)] WITH [*] 配列名 [(align-subscript-list)]
align-source としては、以下のいずれかを指定することができます。
整数型スカラ変数名 * :
align-source が、整数型スカラ変数名であるとき、 これを align-dummy といいます。
align-subscript としては、以下のいずれかを指定することができます。
align-dummyの線形式 * 添字3つ組 スカラ整数式
ALIGN指示文により、配列を他の配列 ( 整列先 と呼ばれます) に整列することができます。
SHADOW 配列名 [*][(shadow-spec-ja-list)]
shadow-spec-ja としては、以下のいずれかを指定することができます。
スカラ整定数式 スカラ整定数式:スカラ整定数式
SHADOW指示文により、各抽象プロセッサ上のローカルな部分に隣接した 定数幅のシャドウ領域 を指定することができます。
DYNAMIC 配列名 [,配列名...]
REDISTRIBUTE指示文、REALIGN指示文 により、 マッピングが動的に変更される実体は、宣言部でDYNAMIC指示文中に記述し なければなりません。
INHERIT 配列名 [,配列名...]
INHERIT指示文を仮引数に指定することにより、 対応する実引数のマッピングをそのまま引継ぐことができます。
ここまでに記述された指示文は、 以下の形式により、一行にまとめて指定することができます。
属性[,属性...] :: 配列名[([下限:]上限[,[下限:]上限...])][,配列名[([下限:]上限[,[下限:]上限...])]...]
属性としては、以下のものが指定できます。
PROCESSORS TEMPLATE DISTRIBUTE [*][(分散形式[,分散形式...])] [ ONTO [*] プロセッサ名 ] ALIGN [(align-source-list)] WITH [*] 配列名 [(align-subscript-list)] SHADOW [*][(shadow-spec-ja-list)] DYNAMIC INHERIT DIMENSION([下限:]上限[,[下限:]上限...] )
SEQUENCE [[::] 配列名又は共通ブロック名[,配列名又は共通ブロック名...]] NO SEQUENCE [[::] 配列名又は共通ブロック名[,配列名又は共通ブロック名...]]
形状の異なる実引数と仮引数を、Fortranの順序結合に基づいて結合する場合や、 EQUIVALENCE文や共通ブロックを通じて、形状の異なる実体同士を Fortranの記憶列結合に基づいて結合する場合、 それらにSEQUENCE指示文を指定する必要があります。
SEQUENCE指示文を指定した配列をマップすることはできません。
ここでは、実行部に記述できるマッピング指示文の一覧を示します。
REDISTRIBUTE 配列名 [(分散形式[,分散形式...])] [ ONTO プロセッサ名 ] REDISTRIBUTE [(分散形式[,分散形式...])] [ ONTO プロセッサ名 ] :: 配列名[,配列名...]
REDISTRIBUTE指示文により、配列の分散を実行時に変更することができます。
REDISTRIBUTE指示文中に指定する配列名は、有効域の宣言部で、
DYNAMIC指示文中に記述しなければなりません。
REALIGN 配列名 [(align-source-list)] WITH 配列名 [(align-subscript-list)] REALIGN [(align-source-list)] WITH 配列名 [(align-subscript-list)] :: 配列名[,配列名...]
REALIGN指示文により、配列の整列を実行時に変更することができます。
REALIGN指示文中に指定する配列名は、有効域の宣言部で、
DYNAMIC指示文中に記述しなければなりません。
ここでは、実行部に記述できる、計算マッピングや通信を制御するための 指示文について述べます。
INDEPENDENT [,NEW(変数名 [,変数名...])] [,REDUCTION(変数名 [,変数名...])]
INDEPENDENT指示文によって、 ループの繰り返しにまたがる依存がないことを、 HPFコンパイラに対して明示し、HPFコンパイラの最適化を促進できます。
NEW節中に、ループの各繰り返し内で、定義されてから利用される 作業変数を指定することにより、例えば、スカラ作業変数の配列化といった プログラムの書き換えをせずに、INDEPENDENT指示文を記述できます。
集計演算を行うようなループに対しても、 REDUCTION節中に集計演算の対象となる変数名を 指定することで、INDEPENDENT指示文を記述できます。
ON指示文とLOCAL節の構文は以下の通りです。
ON HOME( 変数又はテンプレートの部分 ) [,LOCAL[(配列名[,配列名...])]]
ON指示構文とLOCAL節の構文は以下の通りです。
ON HOME( 変数又はテンプレートの部分 ) [,LOCAL[(配列名[,配列名...])]] BEGIN block END ON
block は、Fortranの実行文の列を意味しています。
ON指示文により、演算の抽象プロセッサへの割り当て方法を指定できます。
ON指示文により指定された抽象プロセッサの集合を活動プロセッサ集合といいます。
LOCAL節によって、
指定された配列が、
全ての活動プロセッサ上にデータ実体又はシャドウ実体としてマップされている
ために、対象の文が、一切の通信の必要なく実行可能であることを
HPFコンパイラに対して明示できます。
LOCAL節は、HPF/JA1.0仕様で定義されています。
REFLECT 配列名[,配列名...]
REFLECT指示文により、配列のシャドウ実体に、対応するデータ実体の
値を設定することができます。
REFLECT指示文は、HPF/JA1.0仕様で定義されています。
INDEX_REUSE [ (論理式) ] 配列名[,配列名...]
配列が、ループ中で間接参照されるような場合に、
もし、全く同じ添字の値でそのループ処理が繰り返し行われるなら、
INDEX_REUSE指示文により、2回目以降の通信や参照のオーバヘッドを
削減することができます。
INDEX_REUSE指示文は、HPF/JA1.0仕様で、定義された指示文です。