1. 形式

HPF 指示文は、次のいずれかのプレフィックスに続いて記述する。

!HPF$ または *HPF$ または CHPF$

ただし、HPF/JA 指示文(ex. reflect)は、次のいずれかのプレフィックス
に続いて記述する。

!HPFJ または *HPFJ または CHPF$


2. 対応一覧

-------------------------------+----------------------------------
        VPP 最適化制御行       |           HPF 指示文
-------------------------------+----------------------------------
PROCESSOR                      |   processors
PARALLEL REGION - END PARALLEL |   なし (HPF では不要)
INDEX PARTITION                |   template + distribute
LOCAL/GLOBAL/EQUIVALENCE       |   align/distribute + shadow
SPREAD REGION                  |   on home - end on
SPREAD DO                      |   independent + on home - end on
SPREAD MOVE + MOVEWAIT         |   なし (HPF では不要)
OVERLAPFIX + MOVEWAIT          |   reflect
BROADCAST                      |   なし
グローバル関数                 |   reduction
SUBPROCESSOR                   |   部分プロセッサ (未サポート)
BARRIER                        |   なし (HPF では不要)
LOCKON                         |   なし
-------------------------------+----------------------------------


3. VPP 最適化制御行と HPF 指示文の対応


3.1. プロセッサ形状の宣言

・VPP FORTRAN

  PROCESSOR 文

・HPF

  processors 指示文

・変換例

---------------------------------------------
!XOCL PROCESSOR P(NPROC)
---------------------------------------------
            ↓
---------------------------------------------
!HPF$ processors p(nproc)
---------------------------------------------

・説明

HPF 組み込み関数 number_of_processors() を用いて、
プロセッサの形状を動的に決定することも可能である。

例.
---------------------------------------------
!HPF$ processors p(number_of_processors())
---------------------------------------------


3.2. パラレルリージョンの宣言

・VPP FORTRAN

  PARALLEL REGION - END PARALLEL

・HPF

  対応する HPF 指示文はない (HPF では不要)。

・変換例

---------------------------------------------
!XOCL PARALLEL REGION
      ...
!XOCL END PARALLEL
---------------------------------------------
            ↓
---------------------------------------------

---------------------------------------------

・説明

  HPF では、解析の結果およびその他の指示行から得られる情報を元に、
  コンパイラが逐次実行部, 冗長実行部, 並列実行部を決定するため、
  パラレルリージョンを指定する必要はない。


○ 分割の定義

・VPP FORTRAN

  INDEX PARTITION

・HPF

  template + distribute

・変換例

---------------------------------------------
!XOCL INDEX PARTITION A=(P,INDEX=1:40,PART=BAND,OVERLAP=(1,1))
---------------------------------------------
            ↓
---------------------------------------------
!HPF$ template :: A(1:40)
!HPF$ distribute (block) onto P :: A
---------------------------------------------

・説明

VPP FORTRAN の INDEX PARTITION 文には、HPF の template 指示文,
distribute 指示文, shadow 指示文が相当する。

INDEX PARTITION 文で指定されるインデックス範囲に相当する概念を、HPF では
「テンプレート」と呼ぶ。template 指示文によってテンプレートを宣言し、
distribute 指示文によってテンプレートの分割を指定する。

 ※ 多くの場合、データの分割は直接指定(3.3節)によって指定される。
    したがって、template 指示文が必要になることは少ない。

INDEX PARTITION 文の PROC 文, INDEX 文, PART 文, OVERLAP 文は、それぞれ
以下のように HPF 指示文に対応している。

 - PROC

   distribute 指示文の onto 節が対応する。

 - INDEX

   template 指示文によって宣言されるテンプレートの宣言範囲が対応する。

 - PART

   distribute 指示文の分散フォーマット。分割方法の種別は以下のように対応する。

    ----------------+----------------+----------------
        分割方法    |  VPP FORTRAN   |      HPF
    ----------------+----------------+----------------
     均等割り当て   |     BAND       |     block
     循環割り当て   |    CYCLIC      |    cyclic
     不規則割り当て |  (5,20,5,10)   |   gen_block
    ----------------+----------------+----------------

 - OVERLAP

   shadow 指示文が対応する。ただし、HPF では、オーバラップ領域(「シャドウ」
   と呼ぶ)は、テンプレートではなくデータに指定する(3.3節)。


3.3. データの宣言と引用

・VPP FORTRAN

  LOCAL/GLOBAL/EQUIVALENCE

・HPF

  align/distribute + shadow

・変換例

 (1) 間接指定

---------------------------------------------
!XOCL PROCESSOR P(4)
      DIMENSION S(10,40)
!XOCL INDEX PARTITION A=(P,INDEX=1:40,PART=BAND,OVERLAP=(1,1))
!XOCL LOCAL S(:,/A)
---------------------------------------------
         ↓
---------------------------------------------
!HPF$ processors P(4)
      DIMENSION S(10,40)
!HPF$ template A(1:40)
!HPF$ distribute (block) onto P :: A
!HPF$ align (i) with a(i) :: S
!HPF$ shadow (0,1:1) :: S
---------------------------------------------

 (2) 直接指定

---------------------------------------------
!XOCL PROCESSOR P(4)
      DIMENSION S(10,40)
!XOCL LOCAL S(:,/(P,INDEX=1:40,OVERLAP=(1,1))
---------------------------------------------
         ↓
---------------------------------------------
!HPF$ processors P(4)
      DIMENSION S(10,40)
!HPF$ distribute (*,block) :: S
!HPF$ shadow (0,1:1) :: S
---------------------------------------------

・説明

VPP FORTRAN と同様に、HPF でも間接指定と直接指定の2つの方法でデータの分割配置を
指定することが可能である。

 ※ 実際には、ほとんどの場合で直接指定方式を用いればよく、間接指定方式が
    必要になるのは、インデックス範囲とデータの宣言範囲が異なるような場合に限られる。

また、HPF では、LOCAL データと GLOBAL データの区別はなく、全てのデータは 
「GLOBAL」であるものとして扱われる。

したがって、EQUIVALENCE 文によって LOCAL データと GLOBAL データが結合
されている場合、いずれか一方の宣言を削除し、実行文中では一方だけを参照
するように修正する必要がある。

HPF コンパイラは、データのアクセスパターンを解析し、必要な場合にのみ通信を
生成するので、「GLOBAL」データに対するアクセスであっても性能低下は最小に抑
えられる。コンパイラが解析しきれない複雑なアクセスパターンに対しては、
データの出現に対して LOCAL 節(3.4, 3.5節)を指定し、性能低下を抑えることができる。


3.4. 並列リージョンの指定

・VPP FORTRAN

  SPREAD REGION - REGION - END SPREAD

・HPF

  on home - end on

・変換例

---------------------------------------------
!XOCL SPREAD REGION /P(1:1)
      ...
!XOCL REGION /P(2:2)
      ...
!XOCL REGION /P(3:3)
      ...
!XOCL REGION /P(4:4)
      ...
!XOCL END SPREAD
---------------------------------------------
            ↓
---------------------------------------------
!HPF$ processors P(4)
      dimension :: A(100)
!HPF$ distribute (block) onto P :: A
      ...
!HPF$ on home( A(1) ), local begin
      ...
!HPF$ end on
!HPF$ on home( A(26) ), local begin
      ...
!HPF$ end on
!HPF$ on home( A(51) ), local begin
      ...
!HPF$ end on
!HPF$ on home( A(76) ), local begin
      ...
!HPF$ end on
----------------------------------------------

VPP FORTRAN では、PROCESSOR 文で宣言したプロセッサ要素を指定するこ
とによって、並列リージョンを特定のプロセッサが実行することを指示する。

これに対し、HPF では、特定の配列要素を on 指示文の home 節に指定するこ
とによって、その配列要素を保持するプロセッサがコードブロックを実行する
ことを指示する。上の例では、A(1) を保持するプロセッサ(processors 
指示文と distribute 指示文の指定の仕方によって、P(1)に一致する)が、
一つ目の並列リージョン(HPF では「タスク」と呼ぶ)を実行する。local 節は、
当該コードブロックにおいて通信が不要であることを示し、結果として4つのタスク
は並列に実行される。


3.5. 並列ループの指定

・VPP FORTRAN

  SPREAD DO - END SPREAD

・HPF

  independent + on home - end on

・変換例

  (1) 単純並列ループの指定

---------------------------------------------
!XOCL SPREAD DO /IP
      DO 10 I=1, 40
        ……
   10 CONTINUE
!XOCL END SPREAD
---------------------------------------------
            ↓
---------------------------------------------
!HPF$ independent
      DO 10 I=1, 40
!HPF$   on home( A(I) ), local begin
        ……
!HPF$   end on
   10 CONTINUE
---------------------------------------------

  (2) 拡張並列ループの指定

---------------------------------------------
!XOCL SPREAD DO /IP
!XOCL INDEX 1
      ...
!XOCL INDEX
      DO 10 I=2, 40
        ...
   10 CONTINUE
!XOCL END SPREAD
---------------------------------------------
            ↓
---------------------------------------------
!HPF$ on home( A(1) ), local begin
      ...
!HPF$ end on
!HPF$ independent
      DO 10 I=2, 40
!HPF$   on home( A(I) ), local begin
        ……
!HPF$   end on
   10 CONTINUE
---------------------------------------------

・説明

VPP FORTRAN では、INDEX PARTITION 文で分割を宣言したインデックス範囲
とループの繰り返し空間を対応させることによって、ループの並列化を指定
する。

これに対し、HPF では、independent 指示文によってループが並列化可能であ
ることを指示した上で、特定の分散配列要素を on 指示文の home 節に指定す
ることによって、その配列要素を保持するプロセッサがループの各繰り返しを
実行することを指示する。上の例では、DO 10 ループの I=i 番目の繰り返し
は、A(i) を割り当てられているプロセッサによって実行される。on 指示文の 
local 節は、当該ループにおいて通信が不要であることを示す。

VPP FORTRAN の拡張並列ループ指定に対応する指示文は HPF には存在しないが、
並列ループ外で実行される繰り返しを個別のタスクとして指定することで等価な
結果が得られる。

並列ループ内でプライベート変数が使われたり、リダクション処理が含まれる
場合、それぞれ independent 指示文の new 節と reduction 節(3.9節)に指定する。

例.
---------------------------------------------
!XOCL SPREAD DO /IP
      DO 10 I=1, N
        K = A(I)
        B(I) = B(I) + K
   10 CONTINUE
!XOCL END SPREAD
---------------------------------------------
            ↓
---------------------------------------------
!HPF$ independent, new(K)
      DO 10 I=1, N
!HPF$   on home( A(I) ), local begin
        K = A(I)
        B(I) = B(I) + K
!HPF$   end on
   10 CONTINUE
---------------------------------------------

HPF/SX V2 は、自動的に independent 指示文と on home -end on 指示文を
生成する機能を持つ。したがって、多くのループに対しては、これらの指示文
を挿入する必要はない。


3.6. 並列代入文の指定

・VPP FORTRAN

  SPREAD MOVE - END SPREAD + MOVEWAIT

・HPF

  対応する HPF 指示文はない (HPF では不要)。

・変換例

---------------------------------------------
!XOCL SPREAD MOVE /IP
      DO 10 I=1,40
        代入
   10 CONTINUE
!XOCL END SPREAD(wait-id)
      ...
!XOCL MOVEWAIT(wait-id)
---------------------------------------------
            ↓
---------------------------------------------

---------------------------------------------

・説明

HPF では、LOCAL データと GLOBAL データの区別がないため、SPREAD MOVE に相当する
指示行は必要ない。


3.7. オーバラップ領域の更新

・VPP FORTRAN

  OVERLAPFIX + MOVEWAIT

・HPF

  reflect

・変換例

---------------------------------------------
!XOCL OVERLAPFIX(A) (wait-id)
!XOCL MOVEWAIT(wait-id)
---------------------------------------------
            ↓
---------------------------------------------
!HPFJ reflect A
---------------------------------------------

・説明

  reflect 指示文は、OVERLAPFIX 文とほぼ等価な機能を持つ。


3.8. データのブロードキャスト

・VPP FORTRAN

  BROADCAST

・HPF

  対応する HPF 指示文はない。


・説明


3.9. 集計演算 (リダクション)

・VPP FORTRAN

  各種のグローバル関数

・HPF

  reduction

・変換例

---------------------------------------------
!XOCL SPREAD DO /IP
      DO 10 I=1, N
        M = min(A(I),M)
   10 CONTINUE
!XOCL END SPREAD MIN(M)
---------------------------------------------
            ↓
---------------------------------------------
!HPF$ independent, reduction(M)
      DO 10 I=1, N
        M = min(A(I),M)
   10 CONTINUE
---------------------------------------------

・説明

  総和や最大値といった集計演算(リダクション)を行うループでは、
  independent 指示文の reduction 節に対象の変数を指定する。

  コンパイラが、リダクションの種別を認識できず並列化が行われない場合には、
  HPF/JA 言語拡張によってリダクション種別を指定することも可能である。

例.
----------------------------------------------
!XOCL SPREAD DO /IP
      DO I=1, N
        IF (S .LT. A(I)) THEN
           S = A(I)
           MAXI = I
        END IF
      END DO
!XOCL END SPREAD MAX(S,MAXI)
----------------------------------------------
            ↓
----------------------------------------------
!HPF$ independent, reduction(FIRSTMAX:A/MAXI/)
      DO I=1, N
         IF (S .LT. A(I)) THEN
            S = A(I)
            MAXI = I
         END IF
      END DO
----------------------------------------------

  リダクション節に指定できる種別は次の14個である。

  ------------------+---------------------
   リダクション種別 |        意味
  ------------------+---------------------
   +                |  総和
   *                |  総積
   .AND.            |  論理積
   .OR.             |  論理和
   .EQV.            |  論理等号
   .NEQV.           |  論理不等号
   MAX              |  最大値
   MIN              |  最小値
   IAND             |  ビット論理積
   IOR              |  ビット論理和
   IEOR             |  ビット排他的論理和
   FIRSTMAX         |  最大値と最初の要素
   FIRSTMIN         |  最小値と最初の要素
   LASTMAX          |  最大値と最後の要素
   LASTMIN          |  最小値と最後の要素
  ------------------+----------------------


3.10. 仮プロセッサグループの定義

・VPP FORTRAN

  SUBPROCESSOR

・HPF

  部分プロセッサ

・変換例

----------------------------------------
!XOCL PROCESSOR P(4)
!XOCL SUBPROCESSOR SP(2) = P(2:3)
      DIMENSION A(40)
!XOCL LOCAL A(/(SP,INDEX=1:40))
----------------------------------------
              ↓
----------------------------------------
!HPF$ processors p(4)
      DIMENSION A(40)
!HPF$ distribute (block) onto p(2:3) :: A
----------------------------------------

・説明

  HPF では、distribute 指示文の onto 節に部分プロセッサ配列を指定
  することによって、プロセッサの部分集合にデータを配置する。本機能は、
  HPF/SX では未サポートである。


3.11. バリア同期

・VPP FORTRAN

  BARRIER

・HPF

  対応する HPF 指示文はない (HPF では不要)。

・変換例

----------------------------------------
!XOCL BARRIER
----------------------------------------
             ↓
----------------------------------------

----------------------------------------

・説明

  HPF では、プログラム中の必要な箇所にコンパイラが同期を挿入するので、
  BARRIER 文に相当する指示行は必要ない。


3.12. 排他制御

・VPP FORTRAN

  LOCKON

・HPF

  対応する HPF 指示行はない。