2007.03.02 2版

HPF推進協議会

http://www.hpfpc.org/

fhpf
ユーザーガイド

 

プログラミング言語HPFHigh Performance Fortran)およびHPF/JAの言語仕様や、HPFに関係する最新の情報は、HPF推進議会(HPFPC)のホームページ:

          http://www.hpfpc.org/

から入手してください。fhpfを紹介しているプラズマ・核融合学会誌Vol.82 No.92006年)の連載コラムも、上記のサイトから参照できます。

 

 

1        ソフトウェアの特徴と構成

1.1    特徴

fhpfは、HPFプログラムを入力として、Fortranプログラムコードを出力する、ソース-to-ソースのコンパイラ(トランスレータ)です。出力コードにはMPI1.1 APIに準拠したMPIライブラリの呼出しが含まれます[1]

fhpfの出力は、ハードウェアやFortranコンパイラやMPIライブラリの種類に依存しません[2]。任意のFortranコンパイラを使って翻訳し、任意のMPI環境の上で実行することが可能です。

 

1.2    ソフトウェアの構成

本ソフトウェア(以降、fhpfと呼びます)には、Linux版とSolaris版があります。どちらも、以下のファイルから構成されています。

·          fhpf(シェルスクリプト)
全体を制御するシェルスクリプトです。fhpffhpf_msgを呼び出します。

·          flops(バイナリファイル)
コンパイラ本体です。ドライバ制御スクリプトを参照しながらソースプログラムの翻訳を行います。必要に応じてIMライブラリを参照します。

·          fhpf_msg(シェルスクリプト)
メッセージデータを参照し、翻訳時のエラーや警告のメッセージを出力します。

·          f77.script, f90.script(ドライバ制御スクリプト)
flops
の動作を制御するデータです。

·          IMライブラリ(imディレクトリ配下)
翻訳時に必要に応じてFortranコードに展開されるライブラリです。中間コードの形式で格納されています。

·          メッセージデータ(msgディレクトリ配下)
メッセージ出力のためのデータが格納されています。

·          サンプルプログラム(sampleディレクトリ配下)
HPF
プログラムのサンプルと出力例が格納されています。使用方法は「4サンプルプログラム」を参照してください。

 

 

2        翻訳と実行の方法

実行ファイルを作成するには、fhpfによる翻訳(HPF翻訳)と、Fortranコンパイラによる翻訳・結合(Fortran翻訳)の2段階の作業が必要です。HPF翻訳の結果は、MPIライブラリ呼出しを含むFortranプログラムです。Fortran翻訳は、通常のMPIプログラムの翻訳と同じです。

作成した実行ファイルは、通常のMPIプログラムと全く同じように実行できます。

 

2.1    HPF翻訳

取り扱うプログラムには、FORTRAN77モードとFortran90モードの2通りがあります。これらは以下のように識別されます。

オプション-f77が有効

FORTRAN77モード

オプション-f90が有効

Fortran90モード

-f77,-f90とも指定なし

入力ファイル名のサフィックスが

.f77または.hpf77

FORTRAN77モード

入力ファイル名のサフィックスが

.fまたは.f90または.hpf

Fortran90モード

 

それぞれのモードに対して、fhpfの動作は以下の通りです。


FORTRAN77モード

Fortran90モード

入力プログラムの制限

FORTRAN77に含まれない書式(引用仕様宣言、形状引継ぎ配列など)が含まれていてはなりません。

 

出力プログラム

FORTRAN77プログラムとなります[3]

Fortran90プログラムとなります。Fortran翻訳には、90仕様をサポートするコンパイラを使用してください。

出力ファイル名

デフォルト

入力ファイルと同じ名前で、サフィックスが.mpi.fになります。

入力ファイルと同じ名前で、サフィックスが.mpi.f90になります。

 

fhpfコマンドの使用方法は以下の通りです。

 

fhpf {オプション|入力ファイル名} ...

 

入力ファイルは、同時に複数指定することができます。オプションには、以下のものがあります。

 

·          ドライバ制御オプション

-f77|-f90

入力ファイル名のサフィックスに関わりなく、同時翻訳するすべてのプログラムをFORTRAN77モードまたはFortran90モードとします。

-f77     FORTRAN77モードとします。

-f90     Fortran90モードとします。

-h|-help

fhpfの使用方法を表示します。実行は行いません。

-o出力ファイル名

出力するファイルの名前を指定します。入力ファイルが複数ある場合でも、出力は指定した1ファイルにまとめられます。

-q

ドライバが出すメッセージを抑止します。

-show

ドライバが参照する制御スクリプトを表示します。

-stdout

出力先をファイルでなく標準出力とします。

 

·          コンパイル制御オプション

-Am

入力プログラムがモジュールを使用しているときに指定します。モジュールがファイルを跨いで引用される場合や、同じファイル内でもモジュールの引用が定義よりも前にある場合には、必ず指定が必要です。このオプションを指定すると、カレントディレクトリに <モジュール名>.pmiという名前のファイルが生成されます。

-Fixed|-Free

入力ファイルが固定形式か自由形式かを指定します。デフォルトでは固定形式となります。どちらの場合でも、出力ファイルは固定形式としても自由形式としても解釈可能なFortranプログラムとなります。

-I  ディレクトリ

インクルードファイルを検索するディレクトリを指定します。

-w

入力ファイルが固定形式のとき、255カラム目までの文字を有効と見なします。

-K{サブオプション},...

最適化に関わるサブオプションを指定します。1つの-Kに続けてサブオプションを複数指定する場合には、サブオプションをコンマで区切って空白を空けないで並べます。

 

·          -Kのサブオプション

-indep

ローカルアクセスの自動判定を抑止します。

indep

(デフォルト)

INDEPENDENT指示のないDOループも、可能な限り並列化されます。(INDEPENDENT指示の自動化)

noindep

 

INDEPENDENT指示のないDOループは、並列化されません。DOループの並列化には、INDEPENDENT指示が必須となります。

on

(デフォルト)

ON指示のないDOループも、できる限り並列化されます。(ONの自動化)

noon

ON指示のないDOループは、並列化されません。並列化したいDOループの並列化には、INDEPENDENTONの両方の指示が必須となります。

local

(デフォルト)

LOCAL指示のないデータの定義と使用について、コンパイル時にローカルアクセス(通信不要)の判定が行われます。(LOCAL指示の自動化)

nolocal

LOCAL指示のないデータの定義と使用について、ローカルアクセス(通信不要)の判定はすべて実行時に行われます。

 

【例1-1

HPFプログラムファイルabc.fHPF翻訳され、ファイルabc.mpi.f90に出力されます。

% fhpf abc.f

 

【例1-2

Fortran翻訳にFORTRAN77コンパイラを使用する場合、オプション-f77を使います。入力ファイルhoge77.fFortran90仕様を含むことはできません。出力ファイル名はhoge77.mpi.fとなります。

% fhpf -f77 hoge77.f

 

【例1-3

HPFプログラムファイルa1.fa2.fHPF翻訳され、結果はファイルa12.fにまとめて出力されます。オプション-oは出力ファイル名を指定します。

% fhpf a1.f a2.f -o a12.f

 

【例1-4

オプション-stdoutは、標準出力への出力を指定します。以下は例1-2と同じ効果があります。

% fhpf -stdout a1.f a2.f >a12.f

 

2.2    Fortran翻訳・結合

MPIライブラリが提供する翻訳コマンドを使用するのが便利です。使用するMPIのドキュメントを参照してください。

HPF翻訳で生成されるFortranプログラムは、固定長形式でも自由長形式でも翻訳可能です。

結合編集時には、HPF翻訳した結果のファイルと、逐次Fortranプログラムファイルやオブジェクトファイルを混在させることもできます。

 

【例2-1

1-1のように作成されたFortranコードabc.mpi.f90を翻訳し、MPIライブラリを結合します。出力ファイル名はabcとします。翻訳にはmpif90コマンドを使用します。オプションについては、使用するMPIFortranコンパイラのマニュアルを参照してください。

% mpif90 abc.mpi.f90 -o abc

 

【例2-2

1-2のように作成されたFORTRAN77コードを翻訳し、MPIライブラリを結合します。翻訳にはmpif77コマンドを使用し、Fortranコンパイラには/usr/bin/g77を選択しています。出力ファイル名は通常a.outとなります。オプションについては、使用するMPIFortranコンパイラのマニュアルを参照してください。

% mpif77 –fc=/usr/bin/g77 hoge77.mpi.f

 

【例2-3

富士通PRIMEPOWERを使って、例1-1のように作成されたFortranコードabc.mpi.f90を翻訳し、MPIライブラリを結合します。翻訳にはmpifrtコマンドを使用し、オプションにより64ビットアドレスモードを選択しています。翻訳時オプションについては、富士通のMPI使用手引書とFortran使用手引書を参照してください。

% mpifrt -KV9 -o abc abc.mpi.f90

 

2.3    並列実行ファイルの実行

並列実行ファイルは通常のMPIの実行可能ファイルと同じように実行できます。実行方法の詳細は、実行する計算機で使用するMPIのマニュアルを参照してください。

備考

並列実行ファイルは、同じプログラムをFortranコンパイラだけで翻訳した実行ファイルと比較して、スタック領域を多く使用する傾向があります。そのため、スタック領域不足による実行時エラーが発生しがちです。並列実行ファイルの実行時には、スタック領域を十分に確保することをお勧めします。

スタック領域の大きさの設定には、limit(1)コマンドを使用します。例えばcshでは、以下のようにスタックサイズを50 Mbyteに設定できます。詳しくはLinuxまたはSolarisのオンラインマニュアルなどを参照してください。

% limit stacksize 50M

 

【例3-1

mpirunを使って、4並列の並列実行ファイルa.outを実行する場合。

% mpirun -np 4 a.out

 

【例3-2

SCore Version 5.0.1を使って、4並列のMPI実行ファイルa.outを実行する場合。この例では、in.datを標準入力と結合し、out.datを標準出力と結合しています。

% scrun -nodes=4 scatter == ./a.out :=in.dat =:out.dat

 

【例3-3

富士通PRIMEPOWER8並列の並列実行ファイルabcを実行する場合、以下のように記述できます。fhpfで生成したMPIプログラムは、高速なlimitedモードで実行可能です。
             
mpiexec -mode limited -n 8 abc
Parallelnavi
環境の下でバッチ実行を行うには、例えば以下のようなNQSスクリプトを用意し、qsub(1)コマンドを使ってジョブキューに投入します。

 

#!/usr/bin/csh

# @$-oi                         # 統計情報を標準出力ファイルへ

# @$-eo                         # 標準エラー出力を標準出力ファイルへ

# @$-q queue8                   # ジョブキューの指定

# @$-lp 1 -lP 8         # スレッド並列なし、8プロセス確保

# @$-lM 100gb                   # メモリ使用量(総量)100Gbyteを確保

# @$-ls 100mb                   # スタック使用量(プロセス当り)100Mbyteを確保

 

cd $QSUB_WORKDIR

 

setenv PATH /opt/FSUNf90/bin:/opt/FSUNaprun/bin:/opt/FJSVmpi2/bin

setenv LD_LIBRARY_PATH /opt/FSUNf90/lib:/opt/FJSVmpi2/lib:/opt/FSUNaprun/lib

setenv LD_LIBRARY_PATH_64 /opt/FJSVmpi2/lib/sparcv9

 

#setenv GMP_INFO_TRANSPORT              # MPI動作設定(MPI使用手引書を参照)

 

echo '*** JOB Start ***'

date

mpiexec -mode limited -n 8 abc  # limitedモードで8並列実行

date

 

 

3        HPFプログラミング

3.1    プログラミング上の注意事項

3.1.1                           最適化レベルに関して

デフォルトでループの自動並列化を行います(V1.4以降)。オプション(2.1節)によって自動化を止めて利用者の指示だけに従わせることもできます。

Independent-DOループ内で変数のシャドウ領域を参照するためのON HOME指示とLOCAL指示は、Independent-DOループの直前にREFLECT指示文がある場合には省略可能です(V1.4以降)。

 

3.1.2                           プロセッサ数に関して

DISTRIBUTE指示文でONTO以降を省略すると、実行時に決まるプロセッサ数と同じ大きさを持つ1次元プロセッサ配列に対する分散と見なされます。つまり、例えば配列Aの分散に関して、
    !HPF$ DISTRIBUTE A(*,*,BLOCK)

    !HPF$ PROCESSORS P(NUMBER_OF_PROCESSORS())
    !HPF$ DISTRIBUTE A(*,*,BLOCK) ONTO P
は同じ意味を持ちます。2次元以上のプロセッサ配列に対する分散では、ONTO以降を省略することはできません。

PROCESSORS指示文で指定したプロセッサ配列の大きさと、実行時に指定するノード数(mpirunのオプション-npで指定する数値など)は、一致しなければなりません。PROCESSORS指示文で複数のプロセッサ配列が指定されているとき、それらの次元数や形状は一致する必要はありませんが、大きさは一致しなければなりません。

 

3.1.3                           手続き呼び出しに関して

手続境界での自動再マッピングは、明示的引用仕様(Interfaceブロックなど)がある場合に限って行われます。呼出し側とサブプログラムで引数のマッピングが一致しない場合には、明示的引用仕様が必要です。逆に、明示的引用仕様がない場合には、再マッピングによる性能的オーバヘッドが生じないことが保証されます。

原則として、HPF手続をIndependent-DOループの中で呼び出すことはできませんが、手続き内で入出力や分散配列の参照がない場合に限っては許されます。

FortranまたはCの逐次実行手続は、Independent-DOループの中で呼び出すことができます。HPFプログラムから呼び出されるFortranプログラムを定義するときは、接頭辞EXTRINSIC('FORTRAN','LOCAL')を使用するか、fhpfを通さないで翻訳し結合してください。

 

3.1.4                           その他の制限事項

宣言指示文の出現順序に制限があります。変数名、テンプレート名およびプロセッサ名は、それらが使用されるよりも前に宣言されていなければなりません。つまり、ALIGN指示文より先にそのターゲットに関するTEMPLATE指示文、DISTRIBUTE指示文などがなければならず、DISTRIBUTE指示文より先にその分散先プロセッサに関するPROCESSORS指示文がなければなりません。

分散配列をDATA文などで初期化することはできません。大きなデータはファイルから読ませるなどの方法で回避してください。

同じ翻訳単位内に出現する複数のASYNCHRONOUS指示文およびASYNC接頭辞は、同じ非同期識別子を持つことはできません。

そのほか、HPF/JA1.0仕様のうち以下の機能は未サポートです(ON指示構文はV1.4.3以降サポートされています)。

·          文字型変数および構造体のマッピング

·          ALIGN指示文による変数の複製

·          部分プロセッサに対する分散

·          BLOCK以外の分散に対するSHADOW指示

·          フルシャドウ

·          TASK_REGION指示構文

·          仮引数の転写的(transcriptive)なマッピング指定、INHERIT指示

·          手続呼出し境界での再マッピングが必要な内部手続き

·          HPF組込み関数、HPFライブラリ

·          REDISTRIBUTE指示、REALIGN指示、DYNAMIC指示

·          INDEX_REUSE指示

·          分散配列を左辺とする代入文での、配列構成子の使用

Fortran言語仕様に関して、以下の制限があります。

·          ASSIGN文と割当て型GOTO文、ENTRY文、選択戻り指定子

·          WHERE文、WHERE構文

·          引数キーワード

·          総称指定のある引用仕様宣言

 

 

4        サンプルプログラム

本ソフトウェアがインストールされたディレクトリの下に、ディレクトリsampleが展開されます。サンプルプログラムとしてご利用ください。

サンプルプログラムは、姫野ベンチマークプログラム
              http://accc.riken.jp/HPC/HimenoBMT/
himenoBMTxpHPFで並列化したものです。

 

4.1    プログラムについて

ディレクトリsampleの下には、以下のHPFプログラムがあります。

(1)    himenoBMTxp_HPFv1.f(インクルードファイルなし)
3次元空間のうちz軸方向をblock分散するプログラムです。プロセッサ数はコンパイル時に指定する必要はなく、実行時にオプション(mpirunコマンドの-npなど)で指定した値となります。

(2)    himenoBMTxp_HPFv2.f(インクルードファイルはparam_HPFv2.h
3次元空間のうちz軸方向をblock分散するプログラムです。プロセッサ数はインクルードファイルを修正して再コンパイルすれば変更することができます。

(3)    himenoxp_dim3.hpf(インクルードファイルはparam_dim3.h
x
軸、y軸、z軸の3次元方向にblock分散するプログラムです。インクルードファイルのPARAMETER文を修正して、各次元方向に任意の大きさで分割することができます。3次元方向の分割数を掛け合わせた値が、プロセッサ数となります。

 

4.2    fhpfのインストール確認の方法

それぞれのプログラムについて、HPF翻訳(2.1節)が正しく行われるか確認してください。翻訳時オプションなしでHPF翻訳した場合に出力される結果を、mpi_codeの下に置いています[4]

 

4.3    プログラムの実行

インクルードファイルの最初のPARAMETER文の選択により、問題規模を選択してください。

himenoxp_dim1.hpfhimenoxp_dim3.hpfでは、実行するプロセッサ台数に合わせてインクルードファイルを修正する必要があります。このとき、インクルードファイルで定義したプロセッサ数と、実行時オプションで指定したノード数は一致していなければなりません。

サンプルプログラムは、Webで公開されている姫野ベンチマーク(himenoBMTxp)と同様に、ハードウェアの能力や並列度に寄らずほぼ一定の時間(1分程度)で終了するようにできています。実行結果として、実行時間(elapsed time)をベースとした性能値(浮動小数点演算の実行頻度)が、Mflop/sの単位で出力されます。

 

以上



[1] 標準のMPIでは使用できない四倍精度(16バイト)実数型や四倍精度(32バイト)複素数型を取り扱うため、一部MPI1.1 APIにない機能を使用しています。MPICHや富士通のMPIではサポートされている機能です。

[2] LAM/MPIの現在の版では四倍精度実数型や四倍精度複素数型のサポートが不完全であるため、ドライバ制御スクリプトを修正して生成コードを若干変更することをお勧めします。詳しくはインストールガイドの「4.インストール手順」を参照してください。

[3] 出力に自動割付け配列が含まれる場合があります。自動割付け配列はFORTRAN77の範囲を超えますが、gnu g77コンパイラではサポートされています。

[4] Linux版でもSolaris版でも結果は同じになります。LAM/MPIを使用するなどの理由でドライバスクリプトf90.scriptを修正している場合には、異なる結果となることがあります。