XL Fortran for AIX V8.1.1

ユーザーズ・ガイド


XL Fortran プログラムの実行

実行可能プログラムのデフォルトのファイル名は a.out です。 -o コンパイラー・オプションを指定して別の名前を選択することができます。誤ったコマンドをうっかり実行することがないように、システム・コマンドまたはシェル・コマンド (たとえば、 test または cp) と同じ名前をプログラムに付けないようにする必要があります。名前の矛盾が発生した場合は、 ./test などのパス名を指定することにより、プログラムを実行することができます。

実行可能オブジェクト・ファイルのパス名とファイル名、実行時の引き数をコマンド行に入力すれば、プログラムを実行できます。

実行の取り消し

プログラムの実行を取り消すには、プログラムがフォアグラウンドにある間に、 Ctrl+Z キーを押してください。実行を再開するには、fg コマンドを使用してください。

プログラムの実行を中断するには、プログラムがフォアグラウンドにある間に Ctrl+C キーを押してください。

以前にコンパイルしたプログラムの実行

XL Fortran バージョン 8.1.1 より前のレベルによってコンパイルされたプログラムを静的にリンクした場合、パフォーマンスまたは動作を変えることなく引き続き実行する必要があります。それらのプログラムをコンパイルしたシステムとはオペレーティング・システムのレベルが異なるシステムでは、それらのプログラムは実行できない場合があります。

XL Fortran のバージョン 2 から 7 でコンパイルした、動的にリンクされているプログラムを持っている場合は、 XL Fortran バージョン 8 ライブラリーを持つシステム上で稼動することができます。プログラムは、現行コンパイラーのデータ形式と I/O 動作を使用します。これらは、XL Fortran バージョン 2 のデータ形式と I/O 動作とは多少異なっています。

別のシステム上でのコンパイルと実行

XL Fortran 実行可能ファイルを別のシステムに移動して実行したい場合は、プログラム (および任意で実行時メッセージ・カタログ) を静的にリンクしてコピーすることができます。また、プログラム (および、必要な場合は XL Fortran ライブラリーと任意で実行時メッセージ・カタログ) を動的にリンクしてコピーすることもできます。 SMP 以外のプログラムの場合、通常必要とされる XL Fortran ライブラリーは libxlf90.a だけです。 SMP プログラムの場合、通常は、少なくとも libxlf90_r.alibxlsmp.a ライブラリーが必要です。libxlf.a が必要となるのは、プログラムに XL Fortran バージョン 1 または 2 のオブジェクト・ファイルがリンクされて入っている場合だけです。libxlfpmt*.alibxlfpad.a が必要となるのは、プログラムが -qautodbl オプションを使用してコンパイルされている場合だけです。ご使用のアプリケーションが libhmd.a に依存している場合は、ライブラリーの依存性の詳細について、 XL Fortran のデバッグ・メモリー・ルーチンの使用を参照してください。

動的にリンクしたプログラムが正しく動作するためには、実行システム上の XL Fortran ライブラリーおよびオペレーティング・システム・レベルがコンパイル・システム上のレベルと同じか、またはそれより新しいレベルでなければなりません。

静的にリンクしたプログラムが正しく動作するためには、実行システム上のオペレーティング・システム・レベルがコンパイル・システム上のレベルと同じでなければならない場合があります。

関連情報:
動的リンクおよび静的リンクを参照してください。

POSIX Pthreads のバイナリー互換性

XL Fortran コンパイラーおよび実行時ライブラリーでは、以下の領域でのバイナリー互換性が提供されています。

ただし、バイナリー互換性に関する制限事項があります。 XL Fortran では、 Draft 7 の組み合わせとある種のインスタンスにおける 1003.1-1996 標準オブジェクト・ファイルがサポートされています。たとえば、XL Fortran バージョン 5.1.0 を使用してライブラリーを作成すると、そのライブラリーは Draft 7 pthreads API を使用します。そのライブラリーを使って構築したアプリケーションは、 Draft 7 pthreads API を使って構築したアプリケーションの一部が、 1003.1-1996 標準 pthreads API を使って構築したアプリケーションの一部と pthreads のデータ・オブジェクト (mutexes や条件変数など) を共用していなければ、 Draft 7 pthreads API か 1003.1-1996 標準 pthreads API のいずれかを使用することができます。 そうしたオブジェクトのいずれかが、別のレベルの pthreads API を使ってコンパイルされたアプリケーションの一部を使用する必要がある場合、最後のアプリケーションは、アプリケーション全体で使われている Draft 7 pthreads API か 1003.1-1996 standard pthreads API のいずれかを使用する必要があります。次の 2 つの方法のいずれかを行います。

POSIX Pthreads がサポートする実行時ライブラリーおよび組み込みディレクトリー

POSIX のスレッドをサポートするライブラリーが 3 種類あります。 libxlf90_r.a ライブラリーは、マルチプロセッサー使用可能バージョンの Fortran 実行時ライブラリーです。 libxlsmp.a ライブラリーは、SMP 実行時ライブラリーです。

以下のライブラリーが使用されます。

/lib/libxlf90.a
1003.1-1996 標準の 32 ビットおよび 64 ビット・サポートを提供します。このライブラリーは、libxlf90_r.a にリンクされます。

/lib/libxlsmp.a
1003.1-1996 標準の 32 ビットおよび 64 ビット・サポートを提供します。

/lib/libxlfpthrds_compat.a
Draft 7 の 32 ビット・サポートを提供します。

XL Fortran では、.mod ファイルで使用する以下のディレクトリーが提供されています。

/usr/lpp/xlf/include_32_d7
Draft 7 の 32 ビット・サポートを提供します。

/usr/lpp/xlf/include_32
1003.1-1996 標準の 32 ビット・サポートを提供します。

/usr/lpp/xlf/include_64
1003.1-1996 標準の 64 ビット・サポートを提供します。

呼び出しコマンド、またある場合には、コンパイラー・オプションによって、スレッドをサポートするのに適切なライブラリーとインクルード・ファイルのセットがバインドされています。たとえば、次のようになります。


コマンド 使用されるライブラリー 使用されるインクルード・ファイル サポートされている POSIX Pthreads API レベル
xlf90_r
xlf95_r
/lib/libxlf90.a


/lib/libxlsmp.a


/lib/libpthreads.a

/usr/lpp/xlf/include_32
(-q32 を指定する場合)
/usr/lpp/xlf/include_64
(-q64 を指定する場合)
1003.1-1996 標準
xlf90_r7
xlf95_r7
/lib/libxlf90.a
/lib/libxlsmp.a
/lib/libxlfpthrds_compat.a
/lib/libpthreads.a
/usr/lpp/xlf/include_32_d7 Draft 7

実行時メッセージ用の言語の選択

XL Fortran プログラムが作成する実行時メッセージ用の言語を選択するには、プログラムの実行前に環境変数 LANGNLSPATH を設定してください。

環境変数の設定の他にも、プログラムは C ライブラリー・ルーチン setlocale を呼び出して、実行時にプログラムのロケールを設定する必要があります。たとえば、次のプログラムは、実行時メッセージのカテゴリーを環境変数 LC_ALLLC_MESSAGESLANG に応じて設定することを指定します。

  PROGRAM MYPROG
  PARAMETER(LC_MESSAGES = 5)
  EXTERNAL SETLOCALE
  CHARACTER NULL_STRING /Z'00'/
  CALL SETLOCALE (%VAL(LC_MESSAGES), NULL_STRING)
  END
関連情報:
各国語サポートのための環境変数を参照してください。

C ライブラリー・ルーチン setlocale は、「AIX Technical Reference: Base Operating System and Extensions Volume 1 」の中で定義されています。

実行時オプションの設定

XL Fortran プログラム内の内部スイッチは、コンパイラー・オプションがコンパイル時動作を制御する方法と似た方法で、実行時の I/O 動作を制御します。実行時オプションは、プログラム内の環境変数またはプロシージャー・コールによって設定することができます。

次の 2 つの環境変数のどちらかを使用して、すべての XL Fortran の実行時オプションの設定を指定することができます: XLFRTEOPTS および XLSMPOPTS

XLFRTEOPTS 環境変数

XLFRTEOPTS 環境変数を使用すると、ユーザーは I/O、EOF エラー処理、および乱数発生ルーチンの指定に影響を与えるオプションを指定することができます。 XLFRTEOPTS は、次の ksh コマンド形式を使用して宣言します。

                       .-:------------------------------------------.
                       V                                            |
>>-XLFRTEOPTS=--+---+----runtime_option_name--=----option_setting---+--+---+-><
                '-"-'                                                  '-"-'
 
 

オプション名と設定は、英大文字または小文字のどちらでも指定することができます。コロンおよび等号の前後にブランクを追加して、読みやすくすることができます。しかし、XLFRTEOPTS オプション・ストリングに組み込みブランクが含まれている場合は、オプション・ストリング全体を二重引用符 (") で囲む必要があります。

プログラムが次のいずれかの状況を初めて検出したときに、環境変数がチェックされます。

プログラムの実行中に XLFRTEOPTS 環境変数を変更しても、プログラムには影響はありません。

SETRTEOPTS プロシージャー (「XL Fortran for AIX ランゲージ・リファレンス 」の『サービス・プロシージャーおよびユーティリティー・プロシージャー 』で定義されています) は、環境変数 XLFRTEOPTS と同じ名前値のペアを含んでいるストリング引き数を 1 つ受け入れます。これは環境変数をオーバーライドし、プログラムの実行中に設定を変更したいときに使用することができます。 SETRTEOPTS への別の呼び出しによって変更されない限り、プログラムの残りの部分には、新たな設定が引き続き有効です。 プロシージャー・コールで指定された設定だけが変更されます。

次の実行時オプションは、環境変数 XLFRTEOPTS またはプロシージャー SETRTEOPTS で指定することができます。

buffering={enable | disable_preconn | disable_all}
XL Fortran の実行時ライブラリーが、 I/O 操作で使用するバッファリングを実行するかどうかを判別します。

ライブラリーは、チャンクにあるファイル・システムからのデータの読み取りや、それに対するデータの書き込みを、少しずつ行うのではなく、 READ ステートメントや WRITE ステートメントが来るたびに一括して行います。バッファリングを実行する主な利点は、パフォーマンスを向上させることができるということです。

Fortran のルーチンが他の言語のルーチンと一緒に作業するアプリケーションや、 Fortran のプロセスが同じデータ・ファイル上の他のプロセスと一緒に作業するアプリケーションがある場合、 Fortran ルーチンによって書かれたデータは、バッファリングが実行されるため、他のパーティーによってすぐには認識されない場合があります (その逆も言えます)。また、Fortran の READ ステートメントは、 I/O バッファーに必要以上のデータを読み込む場合があり、結果として次のデータを読み取るはずの、他の言語で書かれたルーチンや他のプロセスによって実行される入力操作が失敗する可能性があります。こういう場合、buffering 実行時オプションを使用して、 XL Fortran の実行時ライブラリーのバッファリングを使用不能にすることができます。 そうすれば、 READ ステートメントはファイルから必要とするデータを正確に読み取ることができ、 WRITE ステートメントによるデータの書き込みも、ステートメントの完了時にファイル・システムへフラッシュされます。

注: I/O バッファリングは、順次アクセス・デバイス (パイプ、ターミナル、ソケット、テープ・ドライブなど) 上のファイルでは常に使用可能です。 buffering オプションを設定しても、このようなタイプのファイルに影響を及ぼすことはありません。

論理装置で I/O バッファリングを使用不能にすると、 Fortran のサービス・ルーチン flush_ を呼び出して、その論理装置用の I/O バッファーの内容をフラッシュする必要はありません。

buffering のサブオプションは、以下のとおりです。

enable
Fortran 実行時ライブラリーは、接続されている各論理装置ごとに I/O バッファーを保持します。実行時ライブラリーが保持する現行の読み取り / 書き込みファイル・ポインターは、ファイル・システムにある対応するファイルの読み取り / 書き込みポインターとの同期を取らない場合があります。

disable_preconn
Fortran 実行時ライブラリーは、事前に接続されている各論理装置 (0、5、および 6) ごとに I/O バッファーを保持しません。ただし、接続されている他の論理装置の I/O バッファーはすべて保持します。実行時ライブラリーが事前接続された装置用に保持する現行の読み取り / 書き込みファイル・ポインターは、ファイル・システムにある対応するファイルの読み取り / 書き込みポインターと同じです。

disable_all
Fortran 実行時ライブラリーは、どの論理装置にも I/O バッファーを保持しません。非同期 I/O を実行する Fortran プログラムを使用していない場合には、 buffering=disable_all オプションを指定しないでください。

以下の例では、 Fortran ルーチンと C ルーチンが、リダイレクトする標準入力からデータ・ファイルを読み取ります。最初に、メインの Fortran プログラムが整数を 1 つ読み取ります。それから、C ルーチンが整数を 1 つ読み取ります。最後に、メインの Fortran プログラムが別の整数を読み取ります。

Fortran のメインプログラム:

integer(4) p1,p2,p3
print *,'Reading p1 in Fortran...'
read(5,*) p1
call c_func(p2)
print *,'Reading p3 in Fortran...'
read(5,*) p3
print *,'p1 p2 p3 Read: ',p1,p2,p3
end

C のサブルーチン (c_func.c):

#include <stdio.h>
void
c_func(int *p2)
{
    int n1 = -1;
 
    printf("Reading p2 in C...\n");
    setbuf(stdin, NULL);    /* Specifies no buffering for stdin */
    fscanf(stdin,"%d",&n1);
    *p2=n1;
}

入力データ・ファイル (infile):

11111
22222
33333
44444

メインプログラムは、リダイレクトする標準出力として infile を使用して実行します。次のようにします。

$ main < infile

buffering=disable_preconn をオンにすると、結果は次のようになります。

Reading p1 in Fortran...
Reading p2 in C...
Reading p3 in Fortran...
p1 p2 p3 Read:  11111 22222 33333

buffering=enable をオンにすると、結果は予想不能です。

cnverr={yes | no}
この実行時オプションが no に設定されていると、プログラムは変換エラーを検出する I/O ステートメントの IOSTAT= および ERR= 指定子に従いません。その代わり、デフォルトの回復処置を実行します (err_recovery の設定とは無関係です)。さらに、警告メッセージを出すこともあります (xrf_messages が設定されているかどうかによって決まります)。
関連情報:
変換エラーに関する詳細は、「XL Fortran for AIX ランゲージ・リファレンス 」の『データ転送ステートメントの実行 』を参照してください。 IOSTAT 値に関する詳細は、「XL Fortran for AIX ランゲージ・リファレンス 」の『条件および IOSTAT 値 』を参照してください。
|
|cpu_time_type={usertime | systime | alltime | total_usertime | total_systime | total_alltime}
|CPU_TIME(TIME) の呼び出しによって戻される時間の尺度を決定します。

|cpu_time_type のサブオプションは、以下のとおりです。 |

|usertime
|プロセスのユーザー時間を戻します。(ユーザー時間の定義については、 |AIX パフォーマンス・マネージメント・ガイド 」を |参照してください。)

|systime
|プロセスのシステム時間を戻します。(システム時間の定義については、「AIX パフォーマンス・マネージメント・ガイド 」を |参照してください。)

|alltime
|プロセスのユーザーおよびシステム時間の合計を戻します。

|total_usertime
|プロセスのユーザー時間の合計を戻します。 |ユーザー時間の合計とは、プロセスのユーザー時間と、その子プロセス (ある場合) の |ユーザー時間の合計です。

|total_systime
|プロセスのシステム時間の合計を戻します。 |システム時間の合計とは、現行プロセスのシステム時間と、その子プロセス (ある場合) の |システム時間の合計です。

|total_alltime
|プロセスのユーザー時間とシステム時間の合計を戻します。 |ユーザー時間とシステム時間の合計とは、 |現行プロセスのユーザーおよびシステム時間と、 |その子プロセス (ある場合) のユーザーおよびシステム時間の合計です。 |
erroreof={yes | no}
ファイルの終わり条件が検出されたときに END= 指定子が存在しない場合は、 ERR= 指定子によって指定されたラベルが分岐するかどうかを判別します。
err_recovery={yes | no}
この実行時オプションが no に設定されている場合、指定子 IOSTAT= または ERR= を持つ I/O ステートメントの実行中に回復可能エラーが存在すると、プログラムが停止します。 デフォルト時には、これらのステートメントのいずれかが回復可能エラーを検出すると、プログラムは回復処置を行って作業を続行します。 cnverryes に設定し、 err_recoveryno に設定すると、変換エラーが発生して、プログラムが停止する場合があります。 |
|intrinthds={num_threads}
|MATMUL および RANDOM_NUMBER 組み込みプロシージャーの |並列実行のスレッド数を指定します。 |num_threads のデフォルト値は、オンラインのプロセッサーの数と同じです。
langlvl={extended | 90ext| 90std | 95std }
Fortran の標準および標準の拡張機能をサポートするレベルを判別します。サブオプションの値は、以下のようになります。

90std
Fortran 90 標準の I/O ステートメントおよびフォーマットのすべての拡張機能にエラーのフラグを付けるよう指定します。

95std
Fortran 95 標準の I/O ステートメントおよびフォーマットのすべての拡張機能にエラーのフラグを付けるよう指定します。

extended
Fortran 90 標準および Fortran 95 標準の I/O ステートメントおよびフォーマットのすべての拡張機能を、コンパイラーが受け入れるように指定します。

90ext
現在、 extended サブオプションと同じレベルのサポートを提供しています。 90ext は、XL Fortran バージョン 7.1 以前のデフォルトのサブオプションでした。しかし、このサブオプションは現在用いられていません。将来問題が生じるのを防ぐため、可能な限り拡張されたサブオプションを使用して開始するようにしてください。

Fortran 95 標準の一部であり、XL Fortran バージョン 7.1 以降で使用できる項目 (名前リストのコメントなど) のサポートを取得するには、以下のサブオプションのいずれかを指定する必要があります。

以下の例には、Fortran 95 拡張機能 (file 指定子が OPEN ステートメントで脱落している) が含まれています。

program test1
 
call setrteopts("langlvl=95std")
open(unit=1,access="sequential",form="formatted")
 
10 format(I3)
 
write(1,fmt=10) 123

langlvl=95std を指定すると、実行時のエラー・メッセージが作成されます。

以下の例には、 Fortran 90 には含まれていない Fortran 95 の機能 (名前リストのコメント) が含まれています。

program test2
 
INTEGER I
LOGICAL G
NAMELIST /TODAY/G, I
 
call setrteopts("langlvl=95std:namelist=new")
 
open(unit=2,file="today.new",form="formatted", &
    & access="sequential", status="old")
 
read(2,nml=today)
close(2)
 
end
 
today.new:
 
&TODAY  ! This is a comment
I = 123, G=.true. /

langlvl=95std を指定すると、実行時のエラー・メッセージは作成されません。 しかし、langlvl=90std を指定すると、実行時のエラー・メッセージが作成されます。

err_recovery 設定は、発生したエラーが回復可能なエラーであるか、それとも重大なエラーであるかを判別します。

multconn={yes | no}
複数の論理ユニットで同時に同じファイルにアクセスできるようにします。このオプションを使用すると、ファイルのコピーを作成せずにファイル内の同じ複数の位置を同時に読み取ることができます。

同じプログラム内の多重接続が許可されるのは、ディスク・ドライブなどのランダム・アクセス・デバイス上にあるファイルの場合だけです。次のような場合には、同じプログラム内の多重接続は許可されていません。

ファイルに損傷を与えないようにするために、以下の点に注意してください。

multconnio={tty | no }
TTY デバイスで複数の論理装置に接続できるようにします。同じ TTY デバイスに接続されている複数の論理装置に書き込んだり、その論理装置から読み取ったりすることができます。
注:
このオプションを使用すると、予測不能な結果が生じる場合があります。

これでプログラムにおいて、UNIT パラメーターとは値が異なっていても、 FILE パラメーターとは同じ値を含む OPEN ステートメントを複数指定することができます。たとえば、 TTY デバイス /dev/pts/2 にリンクされている mytty というシンボリック・リンクがある場合には、 multconnio=tty オプションを指定する際に、以下のプログラムを実行することができます。

PROGRAM iotest
OPEN(UNIT=3, FILE='mytty', ACTION="WRITE")
OPEN(UNIT=7, FILE='mytty', ACTION="WRITE")
END PROGRAM iotest

Fortran は、装置 0、5、および 6 を TTY デバイスに事前に接続します。通常は、OPEN ステートメントを使用して、装置 0、5、および 6 に接続された TTY デバイスに、追加の装置を接続することはできませんが、 multconnio=tty オプションを指定すれば、それが可能です。 たとえば、装置 0、5、および 6 が TTY デバイス /dev/pts/2 に事前に接続されている場合、 multconnio=tty オプションを指定すれば、以下のプログラムを実行することができます。

PROGRAM iotest
OPEN(UNIT=3, FILE='/dev/pts/2')
END PROGRAM iotest
namelist={new | old}
プログラムが I/O に XL Fortran の新しい NAMELIST 形式を使用するか、または古い (バージョン 1) NAMELIST 形式を使用するかを判別します。 Fortran 90 および Fortran 95 標準では、この新しい形式が要求されています。
注:
NAMELIST 出力を含む既存のデータ・ファイルを読み取るには、古い設定が必要になる場合があります。|ただし、新しいデータ・ファイルの書き込みには、 |標準に準拠している新しい形式を使用してください。

namelist=old では、 langlvl=95std 設定および langlvl=90std 設定はいずれも、非標準 NAMELIST 形式をエラーと見なしません。

関連情報:
NAMELIST I/O に関する詳細は、「XL Fortran for AIX ランゲージ・リファレンス 」の『名前リストの形式設定』を参照してください。
nlwidth=record_width
デフォルト時には、NAMELIST 書き込みステートメントは、書き込まれた NAMELIST 項目をすべて含むことができる長さの出力レコードを 1 つ作成します。出力レコード NAMELIST を指定の幅に制限するには、実行時オプション nlwidth を使用します。
注:
このオプションは、順次ファイル用の RECL= 指定子を使用することによって、無効なオプションになります。プログラムは指定されたレコード長の範囲内に入るように NAMELIST 出力を合わせようとするからです。幅 nlwidth が宣言されているファイルのレコード長を超過しない限りは、依然として nlwidthRECL= と組み合わせて使用することができます。
random={generator1 | generator2}
RANDOM_SEEDGENERATOR 引き数を指定して呼び出されていない場合は、 RANDOM_NUMBER が使用する生成プログラムを指定します。 generator1 (デフォルト) の値は GENERATOR=1 に一致し、 generator2 の値は GENERATOR=2 に一致します。 RANDOM_SEEDGENERATOR 引き数を指定して呼び出されている場合は、その時以降のプログラム内のランダム・オプションをオーバーライドします。 ランダム・オプションを変更するために、 GENERATOR オプションを指定して RANDOM_SEED を呼び出した後で SETRTEOPTS を呼び出しても、効果はありません。
scratch_vars={yes | no}
スクラッチ・ファイルに特定の名前を指定するには、実行時オプション scratch_varsyes に設定し、環境変数 XLFSCRATCH_unit に、指定したユニット番号へ関連付けたいファイルの名前を指定します。 例については、スクラッチ・ファイルの命名を参照してください。
unit_vars={yes | no}
暗黙に接続されるファイル、または FILE= 指定子なしにオープンされるファイルの名前を指定するには、まず実行時オプションの unit_vars=yes を指定し、次に XLFUNIT_unit という形式の名前が付いた 1 つ以上の環境変数をファイル名に設定します。 例については、明示的な名前に接続されていないファイルの命名を参照してください。
uwidth={32 | 64}
不定様式順次ファイルのレコード長フィールドの幅を指定する場合、値をビット単位で指定します。不定様式順次ファイルのレコード長が (2**31 - 1) バイトから 8 バイトを引いた値 (データを囲むレコード終了文字を表す) より大きい場合は、実行時オプションの uwidth=64 を設定して、レコード長フィールドを 64 ビットに拡張する必要があります。このようにすると、レコード長は最高で (2**63 - 1) から 16 バイトを引いた値 (データを囲むレコード終了文字を表す) にすることができます。実行時オプションの uwidth は、64 ビット・モードのアプリケーションでしか使用できません。
xrf_messages={yes | no}
I/O 操作、RANDOM_SEED 呼び出し、および ALLOCATE または DEALLOCATE ステートメントの実行中に、プログラムがエラー状態に関する実行時メッセージを表示しないようにするには、実行時オプション xrf_messagesno に設定してください。no に設定しておかないと、変換エラーおよびその他の問題に関する実行時メッセージが、標準エラー・ストリームに送られます。

次の例は、実行時オプション cnverryes に設定し、 xrf_messages オプションを no に設定します。

# Basic format
  XLFRTEOPTS=cnverr=yes:xrf_messages=no
  export XLFRTEOPTS
 
# With imbedded blanks
  XLFRTEOPTS="xrf_messages = NO : cnverr = YES"
  export XLFRTEOPTS
 

SETRTEOPTS への呼び出しとして、上記の例は次のように記述できます。

  CALL setrteopts('xrf_messages=NO:cnverr=yes')
! Name is in lowercase in case -U (mixed) option is used.

XLSMPOPTS 環境変数

XLSMPOPTS 環境変数を使用すると、ユーザーは SMP の実行に影響を与えるオプションを指定することができます。

XLSMPOPTS は、次の ksh コマンド形式を使用して宣言できます。

                      .-:------------------------------------------.
                      V                                            |
>>-XLSMPOPTS=--+---+----runtime_option_name--=----option_setting---+--+---+-><
               '-"-'                                                  '-"-'
 
 

オプション名と設定は、英大文字または小文字のどちらでも指定することができます。コロンおよび等号の前後にブランクを追加して、読みやすくすることができます。しかし、XLSMPOPTS オプション・ストリングに組み込みブランクが含まれている場合は、オプション・ストリング全体を二重引用符 (") で囲む必要があります。

次の実行時オプションは、環境変数 XLSMPOPTS で指定することができます。

schedule
実行時にデフォルトとして使用されるスケジューリング・タイプとチャンク・サイズを選択します。この方法で指定されたスケジューリング・タイプは、コンパイル時にスケジューリング・タイプが指定されていないループにしか使用されません。

使用するスケジューリング・タイプとチャンク・サイズに応じて、さまざまな方法でスレッドに作業が割り当てられます。スケジューリング・タイプおよびそれらが作業の割り当てに与える影響について、以下に簡単に説明します。

dynamic または guided
実行時ライブラリーはスレッドの並列作業を「先着順実行」の原則に基づいて動的にスケジュールします。残りの作業の「チャンク」は、すべての作業が割り当てられるまで、使用可能なスレッドに割り当てられます。スリープ状態のスレッドには作業は割り当てられません。
static
作業のチャンクは「ラウンドロビン」方式でスレッドに割り当てられます。作業は、活動状態とスリープ状態の両方のスレッドに割り当てられます。システムは、作業に割り当てられるスリープ状態のスレッドを活動化して、割り当て作業を完了する必要があります。
affinity
実行時ライブラリーは、最初に反復を number_of_threads 個の区画に分割します。この区画に含まれる反復の数は次のとおりです。
   CEILING(number_of_iterations / number_of_threads)

これらの区画は各スレッドに割り当てられます。そして、反復のチャンクにさらに分割されます。スレッドがスリープ状態の場合は、他の活動状態のスレッドが、割り当てられている作業区画を完了します。

チャンクをどの程度細分化するかによって、オーバーヘッドと負荷平衡のバランスは異なってきます。このオプションの構文は schedule=suboption です。 suboptions は次のように定義されます。

affinity[=n]
すでに説明したとおり、ループの反復は最初に区画に分割され、次いでその区画はスレッドに事前に割り当てられます。各区画は、n 回の反復を含むチャンクにさらに分割されます。 n が指定されなかった場合は、 CEILING(number_of_iterations_left_in_partition / 2) ループ反復でチャンクが構成されます。

スレッドが使用可能になると、事前に割り当てられている区画から次のチャンクが選ばれます。その区画にチャンクがなくなると、別のスレッドに事前に割り当てられている区画から次に使用可能なチャンクが選ばれます。

dynamic[=n]
ループの反復は、 n 反復を含むチャンクに 1 つずつ分割されます。 n が指定されなかった場合は、 CEILING(number_of_iterations / number_of_threads) 反復でチャンクが構成されます。

guided[=n]
ループの反復は、 n ループ反復の最小チャンク・サイズに到達するまで、より小さなチャンクへと漸進的に分割されていきます。 n を指定していない場合は、n のデフォルト値は 1 回の反復になります。

最初のチャンクには、 CEILING(number_of_iterations / number_of_threads) 回の反復が含まれます。次のチャンクには CEILING(number_of_iterations_left / number_of_threads) 回の反復が含まれます。

static[=n]
ループの反復は、 n 反復を含むチャンクに分割されます。スレッドは「ラウンドロビン」方式でチャンクに割り当てられます。この方式は、ブロック巡回スケジューリングとして知られています。 n の値が 1 である場合は、必然的に、スケジューリング・タイプが巡回スケジューリングとして参照されます。

n を指定しない場合、チャンクには CEILING (number_of_iterations / number_of_threads) 反復が入ります。 各スレッドは、これらのチャンクのいずれかに割り当てられます。これをブロック・スケジューリング と言います。

schedule を指定していない場合は、デフォルトが schedule=static に設定され、その結果ブロック・スケジューリングが行われます。

関連情報:
詳細については、「XL Fortran for AIX ランゲージ・リファレンス 」の SCHEDULE ディレクティブに関する説明を参照してください。
並列実行オプション
3 つの並列実行オプション、 parthdsusrthds、および stack について次に説明します。

parthds=num
-qsmp オプションを使ってコンパイルされたコードを並列実行するために使用するスレッドの数 (num) を指定します。デフォルト時には、この数はオンライン・プロセッサーの数と等しくなります。アプリケーションによっては、多くてもプロセッサーの最大数のスレッドしか使用できないものがあります。また、プロセッサーの数を超えるスレッドを使用するとパフォーマンス向上を達成できるアプリケーションもあります。

このオプションを使用すると、実行スレッドの数を完全に制御することができます。 -qsmp を指定しない場合、num のデフォルト値は 1 です。 -qsmp を指定する場合には、マシン上のオンライン・プロセッサーの数になります。詳細については、「XL Fortran for AIX ランゲージ・リファレンス 」の NUM_PARTHDS 組み込み関数を参照してください。

usrthds=num
コードが明示的に作成されると予測されるスレッドの最大数 (num) を指定します (コードが明示的にスレッドを作成する場合)。 num のデフォルト値は 0 です。

詳細については、「XL Fortran for AIX ランゲージ・リファレンス 」の NUM_PARTHDS 組み込み関数を参照してください。

stack=num
スレッドのスタックが必要とするスペースの最大量のバイト数 (num) を指定します。 num のデフォルト値は 4194304 です。
パフォーマンスの調整オプション
スレッドが作業を完了し、新しい作業が残っていなければ、そのスレッドは「使用中待機」状態か「スリープ」状態に入ります。「使用中待機」状態では、スレッドはタイト・ループで実行し続け、残っている新しい作業を探します。この状態は反応が速い一方、システムの総合的な使用効率に悪影響を与えます。スレッドがスリープ状態の場合は、別のスレッドがそのスリープ状態のスレッドに作業を実行するようにシグナルを送るまで実行は完全に中断されます。この状態では、システムの使用効率はよくなりますが、アプリケーションに余分なオーバーヘッドがかかります。

xlsmp 実行時ライブラリー・ルーチンは、作業を待機する方法として、「使用中待機」状態と「スリープ」状態の両方を使用します。 spinsyields、および delays オプションを使用して、このような状態を制御することができます。

使用中待機状態の作業を検索している間は、スレッドは作業キューを最高 num 回まで繰り返しスキャンします。ここで num は、spins オプションに指定した値です。指定されたスキャン中に作業が見つからない場合、スレッドは遅延ループを num 回実行して意図的にサイクルを浪費します。ここで num は、delays オプションに指定された値です。この遅延ループは、意味のない単一の反復から成っています。遅延ループにかかる実際の時間の長さはプロセッサーによって異なります。値 spins を超過してもまだ作業が見つからない場合は、スレッドは現行のタイム・スライス (プロセッサーがそのスレッドに割り当てた時間) を他のスレッドに譲渡します。スレッドはタイム・スライスを最高 num 回まで譲渡します。ここで、numyields オプションに指定した数です。この値 num を超過すると、スレッドはスリープ状態になります。

整理すると、作業の検索順序は次のステップで構成されています。

  1. 作業キューを spins 回までスキャンします。スキャン中に作業が見つからない場合は、 delays 回ループしてから、新しい検索を開始します。
  2. 作業が見つからなかった場合は、現行のタイム・スライスを譲渡します。
  3. 上記のステップを yields 回繰り返します。
  4. 作業が見つからなかった場合は、スリープ状態になります。

これらのオプションを指定する構文は次のとおりです。

spins[=num]
num は譲渡前のスピンの数です。 spins のデフォルト値は 100 です。

yields[=num]
num はスリープ前の譲渡の回数です。 yields のデフォルト値は 10 です。

delays[=num]
num は使用中待機状態中の遅延の数です。 delays のデフォルト値は 500 です。

spinsyields の特殊値はゼロです。ゼロを使えば、強制的に完全な使用中待機状態にすることができます。通常、専用システムのベンチマーク・テストでは、両方のオプションをゼロに設定します。しかし、それらを個別に設定すると、他の効果を持たせることができます。

たとえば、専用の 8 ウェイ SMP では、これらのオプションを次のように設定します。

parthds=8 : schedule=dynamic=10 : spins=0 : yields=0

この場合、CPU ごとに 1 スレッドという結果になります。各スレッドにはそれぞれ 10 回の反復から成るチャンクが割り当てられ、即時実行する作業がなければ使用中待機状態になります。

環境変数 SPINLOOPTIMEYIELDLOOPTIME を使用してパフォーマンスを調整することもできます。これらの変数の詳細については、「AIX パフォーマンス・マネージメント・ガイド 」を参照してください。

パフォーマンスの調整オプション
動的プロファイル作成を使用して、プログラムのループを並列化する際のコンパイラーの判断を再評価することができます。これには次の 3 つのオプションを使用します: parthresholdseqthreshold、および profilefreq

parthreshold=num
その時間を下回った場合、各ループがシリアルに実行される時間をミリ秒で指定します。 parthreshold を 0 に設定すると、コンパイラーで並列化されている各ループは、並列処理で実行されます。デフォルトの設定は、0.2 ミリ秒です。これは、1 つのループを並列に実行する時間が 0.2 ミリ秒以下の場合に、それをシリアルで処理するということです。

一般には、parthreshold を並列化のオーバーヘッドと等しくなるように設定します。並列化されたループの計算量が非常に少なく、並列化の設定においてこれらのループを実行するのにかかる時間が大部分を占める場合には、これらのループを順次実行した方がパフォーマンスはよくなります。

seqthreshold=num
動的プロファイル作成によってあらかじめ直列化されたループが、その時間を上回った場合並列ループに戻るようにするための時間を、ミリ秒で指定します。デフォルトの設定は、5 ミリ秒です。これは、1 つのループをシリアルに実行する時間が 5 ミリ秒以上の場合に、それを並列で処理するということです。

seqthreshold は、parthreshold とは逆の動作をします。

profilefreq=num
動的プロファイラーが、並列実行とシリアル実行のどちらが適切かを判別するために、ループに行く頻度を指定します。プログラムのループは、データに依存する可能性があります。動的プロファイル作成のパスを使ってシリアルに実行することを選択したループが、入力データが異なる場合にはループの後続の処理で並列処理によって恩恵を受ける可能性があります。それで、これらのループを定期的に調べて、実行時に並列ループをシリアル化する判断を再評価しなければなりません。

このオプションで指定できる値は、0 から 32 の数字です。 profilefreq を 0 から 32 のいずれかに設定した場合、次の処理が行われます。

  • profilefreq が 0 の場合、他の設定にかかわらず、すべてのプロファイル作成がオフになります。プロファイル作成の結果生じるオーバーヘッドは、なくなります。
  • profilefreq が 1 の場合、コンパイラーが自動的に並列化することになるループは、それらのループが実行されるたびにモニターされます。
  • profilefreq が 2 の場合、コンパイラーが自動的に並列化することになるループは、それらのループが 2 回実行されるたびに 1 回モニターされます。
  • profilefreq が 2 以上 32 以下の場合、各ループは n 回実行されるたびにモニターされます。
  • profilefreq が 33 以上の場合は、 32 が指定されたものと見なされます。

動的プロファイル作成は、ユーザー指定の並列ループ (たとえば、 PARALLEL DO ディレクティブを指定したループ) には適用できませんのでご注意ください。

OpenMP 環境変数

以下の環境変数は、OpenMP 標準に含まれており、並列コードの実行を制御できます。

注:
XLSMPOPTS 環境変数と OpenMP 環境変数を両方とも指定した場合、 OpenMP 環境変数が優先されます。

OMP_DYNAMIC 環境変数

OMP_DYNAMIC 環境変数は、並列領域の実行に使用できるスレッドの数を動的に調整できるようにしたり、できないようにしたりします。この環境変数の構文は次のとおりです。

>>-OMP_DYNAMIC=--+-TRUE--+-------------------------------------><
                 '-FALSE-'
 
 

この環境変数を TRUE に設定すれば、実行時環境は並列領域を実行するときに使用できるスレッドの数を調整できるため、システム・リソースをより効率的に使用できるようになります。この環境変数を FALSE に設定した場合、動的な調整は行えません。

OMP_DYNAMIC のデフォルト値は TRUE です。そのため、決まった数のスレッドを正確にコードが実行する必要がある場合は、動的スレッド調整を使用不可にしなければなりません。

omp_set_dynamic サブルーチンは、 OMP_DYNAMIC 環境変数よりも優先されます。

OMP_NESTED 環境変数

OMP_NESTED 環境変数は、ネストされた並列処理を行えるようにしたり、行えないようにしたりします。この環境変数の構文は次のとおりです。

>>-OMP_NESTED=--+-TRUE--+--------------------------------------><
                '-FALSE-'
 
 

この環境変数を TRUE に設定した場合、ネストされた並列処理を行えます。つまり、実行時環境は追加のスレッドを展開して、ネストされた並列領域で使用するためのスレッド・チームを形成できます。この環境変数を FALSE に設定した場合、ネストされた並列処理は行えません。

OMP_NESTED のデフォルト値は FALSE です。

omp_set_nested サブルーチンは、 OMP_NESTED 環境変数よりも優先されます。

OMP_NUM_THREADS 環境変数

OMP_NUM_THREADS 環境変数は、プログラムが実行時に使用するスレッドの数を設定します。この環境変数の構文は次のとおりです。

>>-OMP_NUM_THREADS=--num---------------------------------------><
 
 

num
スレッド数の動的調整が可能な場合に、使用できるスレッドの最大数を指定します。スレッド数の動的調整が不可能な場合、 OMP_NUM_THREADS の値は使用できるスレッドの実数になります。これは、正のスカラー整数でなければなりません。

プログラムが実行時に使用できるスレッドのデフォルト数は、マシン上のオンライン・プロセッサーの数です。

XLSMPOPTS 環境変数の PARTHDS サブオプションと OMP_NUM_THREADS 環境変数を両方とも使用してスレッドの数を指定した場合、 OMP_NUM_THREADS 環境変数のほうが優先されます。 omp_set_num_threads サブルーチンは、 OMP_NUM_THREADS 環境変数よりも優先されます。

OMP_NUM_THREADS 環境変数を設定する方法について、以下の例で示します。

export OMP_NUM_THREADS=16

OMP_SCHEDULE 環境変数

OMP_SCHEDULE 環境変数は、スケジュール・タイプが RUNTIMEPARALLEL DO ディレクティブと作業共用 DO ディレクティブに適用されます。この環境変数の構文は次のとおりです。

>>-OMP_SCHEDULE=--sched_type--+---------------+----------------><
                              '-,--chunk_size-'
 
 

sched_type
DYNAMICGUIDED、または STATIC のいずれかです。

chunk_size
これはチャンク・サイズを表す正のスカラー整数です。

この環境変数は、 PARALLEL DO ディレクティブおよび作業共用 DO ディレクティブのスケジュール・タイプが RUNTIME 以外の場合は無視されます。

コンパイル時にディレクティブによってスケジュール・タイプを指定しなかったか、あるいは実行時に OMP_SCHEDULE 環境変数、または XLSMPOPTS 環境変数の SCHEDULE オプションによってスケジュール・タイプを指定しなかった場合、デフォルトのスケジュール・タイプは STATIC となります。また、デフォルトのチャンク・サイズは、最初の N - 1 スレッドについては次のように設定されます。

chunk_size = ceiling(Iters/N)

N 番目のスレッドについては、次のように設定されます。ここで、N はスレッドの合計数、 ItersDO ループ内の反復の合計数です。

chunk_size = Iters - ((N - 1) * ceiling(Iters/N))

XLSMPOPTS 環境変数の SCHEDULE オプションと OMP_SCHEDULE 環境変数を両方とも指定した場合、 OMP_SCHEDULE 環境変数が優先されます。

OMP_SCHEDULE 環境変数を設定する方法について、以下の例で示します。

export OMP_SCHEDULE="GUIDED,4"
export OMP_SCHEDULE="DYNAMIC"


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]