HPF推進協議会
プログラミング言語HPF(High Performance Fortran)の言語仕様、プログラミングガイドや、HPFに関係する最新の情報は、HPF推進議会(HPFPC)のホームページ:
から入手してください。
fhpfは、HPFプログラムを入力として、Fortranプログラムコードを出力する、ソース-to-ソースのコンパイラ(トランスレータ)です。出力コードにはMPI1.1 APIに準拠したMPIライブラリの呼出しが含まれます[1]。
fhpfの出力は、ハードウェアやFortranコンパイラやMPIライブラリの種類に依存しません[2]。任意のFortranコンパイラを使って翻訳し、任意のMPI環境の上で実行することが可能です。
本ソフトウェア(以降、fhpfと呼びます)には、Linux版とSolaris版があります。どちらも、以下のファイルから構成されています。
·
fhpf(シェルスクリプト)
全体を制御するシェルスクリプトです。fhpfとfhpf_msgを呼び出します。
·
flops(バイナリファイル)
コンパイラ本体です。ドライバ制御スクリプトを参照しながらソースプログラムの翻訳を行います。必要に応じてIMライブラリを参照します。
·
fhpf_msg(シェルスクリプト)
メッセージデータを参照し、翻訳時のエラーや警告のメッセージを出力します。
·
f77.script, f90.script(ドライバ制御スクリプト)
flopsの動作を制御するデータです。
·
IMライブラリ(imディレクトリ配下)
翻訳時に必要に応じてFortranコードに展開されるライブラリです。中間コードの形式で格納されています。
·
メッセージデータ(msgディレクトリ配下)
メッセージ出力のためのデータが格納されています。
·
サンプルプログラム(sampleディレクトリ配下)
HPFプログラムのサンプルと出力例が格納されています。使用方法は5章を参照してください。
実行ファイルを作成するには、fhpfによる翻訳(HPF翻訳)と、Fortranコンパイラによる翻訳・結合(Fortran翻訳)の2段階の作業が必要です。HPF翻訳の結果は、MPIライブラリ呼出しを含むFortranプログラムです。Fortran翻訳は、通常のMPIプログラムの翻訳と同じです。
作成した実行ファイルは、通常のMPIプログラムと全く同じように実行できます。
取り扱うプログラムには、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ループの並列化には、INDEPENDENTとONの両方の指示が必須となります。 |
local (デフォルト) |
LOCAL指示のないデータの定義と使用について、コンパイル時にローカルアクセス(通信不要)の判定が行われます。(LOCAL指示の自動化) |
nolocal |
LOCAL指示のないデータの定義と使用について、ローカルアクセス(通信不要)の判定はすべて実行時に行われます。 |
HPFプログラムファイルabc.fはHPF翻訳され、ファイルabc.mpi.f90に出力されます。
% fhpf abc.f
Fortran翻訳にFORTRAN77コンパイラを使用する場合、オプション-f77を使います。入力ファイルhoge77.fはFortran90仕様を含むことはできません。出力ファイル名はhoge77.mpi.fとなります。
% fhpf -f77 hoge77.f
HPFプログラムファイルa1.fとa2.fはHPF翻訳され、結果はファイルa12.fにまとめて出力されます。オプション-oは出力ファイル名を指定します。
% fhpf a1.f a2.f -o a12.f
オプション-stdoutは、標準出力への出力を指定します。以下は例1-2と同じ効果があります。
% fhpf -stdout a1.f a2.f >a12.f
MPIライブラリが提供する翻訳コマンドを使用するのが便利です。使用するMPIのドキュメントを参照してください。
HPF翻訳で生成されるFortranプログラムは、固定長形式でも自由長形式でも翻訳可能です。
結合編集時には、HPF翻訳した結果のファイルと、逐次Fortranプログラムファイルやオブジェクトファイルを混在させることもできます。
例1-1のように作成されたFortranコードabc.mpi.f90を翻訳し、MPIライブラリを結合します。出力ファイル名はabcとします。翻訳にはmpif90コマンドを使用します。オプションについては、使用するMPIやFortranコンパイラのマニュアルを参照してください。
% mpif90 abc.mpi.f90 -o abc
例1-2のように作成されたFORTRAN77コードを翻訳し、MPIライブラリを結合します。翻訳にはmpif77コマンドを使用し、Fortranコンパイラには/usr/bin/g77を選択しています。出力ファイル名は通常a.outとなります。オプションについては、使用するMPIやFortranコンパイラのマニュアルを参照してください。
% mpif77 –fc=/usr/bin/g77 hoge77.mpi.f
富士通PRIMEPOWERを使って、例1-1のように作成されたFortranコードabc.mpi.f90を翻訳し、MPIライブラリを結合します。翻訳にはmpifrtコマンドを使用し、オプションにより64ビットアドレスモードを選択しています。翻訳時オプションについては、富士通のMPI使用手引書とFortran使用手引書を参照してください。
% mpifrt -KV9 -o abc abc.mpi.f90
並列実行ファイルは通常のMPIの実行可能ファイルと同じように実行できます。実行方法の詳細は、実行する計算機で使用するMPIのマニュアルを参照してください。
並列実行ファイルは、同じプログラムをFortranコンパイラだけで翻訳した実行ファイルと比較して、スタック領域を多く使用する傾向があります。そのため、スタック領域不足による実行時エラーが発生しがちです。並列実行ファイルの実行時には、スタック領域を十分に確保することをお勧めします。
スタック領域の大きさの設定には、limit(1)コマンドを使用します。例えばcshでは、以下のようにスタックサイズを50 Mbyteに設定できます。詳しくはLinuxまたはSolarisのオンラインマニュアルなどを参照してください。
% limit stacksize 50M
mpirunを使って、4並列の並列実行ファイルa.outを実行する場合。
% mpirun -np 4 a.out
SCore Version 5.0.1を使って、4並列のMPI実行ファイルa.outを実行する場合。この例では、in.datを標準入力と結合し、out.datを標準出力と結合しています。
% scrun -nodes=4 scatter == ./a.out :=in.dat =:out.dat
富士通PRIMEPOWERで8並列の並列実行ファイル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.1節)によって自動化を止めて利用者の指示だけに従わせることもできます。
Independent-DOループ内で変数のシャドウ領域を参照するためには、ループ本体へのON HOME指示と、その変数に関するLOCAL指示が必ず必要です。これらがないと、REFLECT指示文やEXT_HOME節を使ってシャドウへ値を設定しても、シャドウのではなく隣接プロセッサの値が参照されます。
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指示文で複数のプロセッサ配列が指定されているとき、それらの次元数や形状は一致する必要はありませんが、大きさは一致しなければなりません。
手続境界での自動再マッピングは、明示的引用仕様(Interfaceブロックなど)がある場合に限って行われます。呼出し側とサブプログラムで引数のマッピングが一致しない場合には、明示的引用仕様が必要です。逆に、明示的引用仕様がない場合には、再マッピングによる性能的オーバヘッドが生じないことが保証されます。
HPF手続をIndependent-DOループの中で呼び出すことはできません。FortranまたはCの逐次実行手続は、Independent-DOループの中で呼び出すことができます。なお、HPFプログラムから呼び出されるFortranプログラムを定義するときは、接頭辞EXTRINSIC('FORTRAN','LOCAL')を使用するか、fhpfを通さないで翻訳し結合してください。
宣言指示文の出現順序に制限があります。変数名、テンプレート名およびプロセッサ名は、それらが使用されるよりも前に宣言されていなければなりません。つまり、ALIGN指示文より先にそのターゲットに関するTEMPLATE指示文、DISTRIBUTE指示文などがなければならず、DISTRIBUTE指示文より先にその分散先プロセッサに関するPROCESSORS指示文がなければなりません。
分散配列をDATA文などで初期化することはできません。大きなデータはファイルから読ませるなどの方法で回避してください。
同じ翻訳単位内に出現する複数のASYNCHRONOUS指示文およびASYNC接頭辞は、同じ非同期識別子を持つことはできません。
そのほか、HPF/JA1.0仕様のうち以下の機能は未サポートです。
· 文字型変数および構造体のマッピング
· ALIGN指示文による変数の複製
· 部分プロセッサに対する分散
· BLOCK以外の分散に対するSHADOW指示
· フルシャドウ
· Independent-DOループのbody全体を囲む形以外のON指示
· TASK_REGION指示構文
· 仮引数の転写的(transcriptive)なマッピング指定、INHERIT指示
· 手続呼出し境界での再マッピングが必要な内部手続き
· HPF組込み関数、HPFライブラリ
· REDISTRIBUTE指示、REALIGN指示、DYNAMIC指示
· INDEX_REUSE指示
· 分散配列を左辺とする代入文での、配列構成子の使用
Fortran言語仕様に関して、以下の制限があります。
· ASSIGN文と割当て型GOTO文、ENTRY文、選択戻り指定子
· WHERE文、WHERE構文
· 引数キーワード
· 総称指定のある引用仕様宣言
以上
[1] 標準のMPIでは使用できない四倍精度(16バイト)実数型や四倍精度(32バイト)複素数型を取り扱うため、一部MPI1.1 APIにない機能を使用しています。MPICHや富士通のMPIではサポートされている機能です。
[2] LAM/MPIの現在の版では四倍精度実数型や四倍精度複素数型のサポートが不完全であるため、ドライバ制御スクリプトを修正して生成コードを若干変更することをお勧めします。詳しくはインストールガイドの「4.インストール手順」を参照してください。
[3] 出力に自動割付け配列が含まれる場合があります。自動割付け配列はFORTRAN77の範囲を超えますが、gnu g77コンパイラではサポートされています。