XL Fortran プログラムの実行

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

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

実行の取り消し

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

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

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

XL Fortran 実行可能ファイルを別のシステムに移動して実行したい場合は、 静的にプログラム (および任意で実行時メッセージ・カタログ) をリンクおよびコピーすることができます。 また、プログラム (および、必要な場合は XL Fortran ライブラリーと任意で実行時メッセージ・カタログ) を動的に リンクしてコピーすることもできます。 SMP 以外のプログラムの場合、通常必要とされる XL Fortran ライブラリーは libxlf90.so だけです。 SMP プログラムの場合、通常は少なくとも

libxlf90_r.so および

libxlsmp.so

ライブラリーが必要です。 libxlfpmt*.so および libxlfpad.so が必要となるのは、プログラムが -qautodbl オプションを使用してコンパイルされている場合だけです。

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

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

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

POSIX Pthreads がサポートする実行時ライブラリー

POSIX のスレッド・サポートを使用して接続された実行時ライブラリーが 2 種類あります。 libxlf90_r.so ライブラリー は、スレッド・セーフ・バージョンの Fortran 実行時ライブラリーです。 libxlsmp.so ライブラリーは、SMP 実行時ライブラリーです。

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

コマンド 使用されるライブラリー インクルード・ディレクトリー
xlf90_r
xlf95_r
xlf_r
/opt/ibmcmp/lib/libxlf90_r.so
/opt/ibmcmp/lib64/libxlf90_r.so
/opt/ibmcmp/lib/libxlsmp.so
/opt/ibmcmp/lib64/libxlsmp.so
/opt/ibmcmp/xlf/9.1/include

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

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
関連情報:
各国語サポートのための環境変数を参照してください。

実行時オプションの設定

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

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

XLFRTEOPTS 環境変数

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

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

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

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

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

SETRTEOPTS プロシージャー (「XL Fortran ランゲージ・リファレンス」で定義されています) は、 環境変数 XLFRTEOPTS と同じ名前値のペアを含んでいる単一ストリング引き数を受け入れます。これは環境変数をオーバーライドし、プログラムの実行中に設定を変更したいときに使用することができます。 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;
    fflush(stdout);
}

入力データ・ファイル (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 ランゲージ・リファレンス」の 『データ転送ステートメント』を 参照してください。 IOSTAT 値に関する詳細は、 「XL Fortran ランゲージ・リファレンス」の『条件および IOSTAT 値』を参照してください。
cpu_time_type={usertime | systime | alltime | total_usertime | total_systime | total_alltime}
CPU_TIME(TIME) の呼び出しによって戻される時間の尺度を決定します。

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

usertime
プロセスのユーザー時間を戻します。

systime
プロセスのシステム時間を戻します。

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

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

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

total_alltime
プロセスのユーザー時間とシステム時間の合計を戻します。 ユーザー時間とシステム時間の合計とは、 現行プロセスのユーザーおよびシステム時間と、 その子プロセス (ある場合) のユーザーおよびシステム時間の合計です。
default_recl={64 | 32}
RECL= 指定子なしでオープンされた順次ファイル用のデフォルトのレコード・サイズを決定することができます。 サブオプションは以下のとおりです。

64
デフォルトのレコード・サイズとして 64 ビット値を使用します。

32
デフォルトのレコード・サイズとして 32 ビット値を使用します。

default_recl 実行時オプションは 64 ビット・モードでのみ適用されます。 32 ビット・モードでは、default_recl は無視され、レコード・サイズは 32 ビットになります。

32 ビット・プログラムを 64 ビット・モードに移植するときは、default_recl を使用してください。 64 ビット・レコード長は指定された整変数に適合しません。 以下を見てください。

INTEGER(4) I
OPEN (11)
INQUIRE (11, RECL=i)
 

default_recl=64 のとき、64 ビット・モードでは上記のコード・サンプルで実行時エラーが 発生します。 これは、デフォルト・レコード長 2**63-1 が 4 バイト整数 I に適合しないためです。 default_recl=32 を指定すると、I に適合するデフォルト・レコード・サイズ 2**31-1 が保証されます。

RECL= 指定子について詳しくは、「XL Fortran ランゲージ・リファレンス」の OPEN ステートメントの説明を参照してください。

erroreof={yes | no}
ファイルの終わり条件が検出されたときに END= 指定子が存在しない場合は、 ERR= 指定子によって指定されたラベルが分岐するかどうかを判別します。
err_recovery={yes | no}
この実行時オプションが no に設定されている場合、指定子 IOSTAT= または ERR= を持つ I/O ステートメントの実行中に回復可能エラーが存在すると、プログラムが停止します。 デフォルト時には、これらのステートメントのいずれかが回復可能エラーを検出すると、プログラムは回復処置を 行って作業を続行します。 cnverryes に設定し、err_recoveryno に設定すると、変換エラーが 発生して、プログラムが停止する場合があります。
iostat_end={extended | 2003std}
ファイルの終わりおよびレコードの終わり条件が発生したときは、 IOSTAT 値を、 XL Fortran 定義または Fortran 2003 ドラフト標準に基づいて設定します。 サブオプションは以下のとおりです。

extended
IOSTAT 変数を、XL Fortran の値と条件の定義に基づいて設定します。

2003std
IOSTAT 変数を、Fortran 2003 の値と条件の定義に基づいて設定します。

たとえば、iostat_end=2003std 実行時オプションを設定すると、ファイルの終わり条件に対して 戻される拡張子と異なる IOSTAT 値となります。

    export XLFRTEOPTS=iostat_end=2003std
    character(10) ifl
    integer(4) aa(3), ios
    ifl = "12344321  "
    read(ifl, '(3i4)', iostat=ios) aa ! end-of-file condition occurs and
                                      ! ios is set to -1 instead of -2.
 

IOSTAT 値の設定および使用の詳細については、 「XL Fortran ランゲージ・リファレンス」の READ および WRITE の説明、 ならびに『条件と IOSTAT 値』の節を参照してください。

intrinthds={num_threads}
MATMUL および RANDOM_NUMBER 組み込みプロシージャーの 並列実行のスレッド数を指定します。 MATMUL 組み込みの使用時の num_threads のデフォルト値は、オンラインのプロセッサー数と同じです。 RANDOM_NUMBER 組み込みの使用時の num_threads のデフォルト値は、オンラインのプロセッサー数*2 に等しくなります。

MATMUL および RANDOM_NUMBER 組み込みプロシージャーで使用可能なスレッド数を変更すると、 パフォーマンスに影響を及ぼす可能性があります。

langlvl={extended| 90std | 95std | 2003std}
Fortran の標準および標準の拡張機能をサポートするレベルを判別します。 サブオプションの値は、以下のようになります。

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

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

2003std
XL Fortran がサポートする Fortran 2003 形式とともに、Fortran 95 標準が 指定するすべての標準の I/O ステートメントおよび形式をコンパイラーが 受け入れるように指定します。 それ以外は、エラーとしてフラグが付けられます。

たとえば、langlvl=2003std 実行時オプションを設定すると、実行時エラー・メッセージが出されます。

integer(4) aa(100)
call setrteopts("langlvl=2003std")
    ...          ! Write to a unit without explicitly
    ...          ! connecting the unit to a file.
write(10, *) aa  ! The implicit connection to a file does not
    ...          ! comform with Fortran 2003 behavior.
 

extended
Fortran 95 言語標準、XL Fortran がサポートする Fortran 2003 フィーチャー、および拡張機能を コンパイラーが受け入れるようにし、言語レベルのチェックが実際上オフになるように指定します。

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

以下の例には、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
 
end

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 | nulldev | combined | no }
デバイスで複数の論理装置に接続できるようにします。 それにより、同じ装置に接続されている複数の論理装置に書き込んだり、その論理装置から読み取ったりすることができます。 サブオプションは以下のとおりです。
combined
ヌル装置と TTY 装置の組み合わせを複数の論理装置に接続できるようにします。
nulldev
ヌル装置を複数の論理装置に接続できるようにします。
tty
TTY デバイスで複数の論理装置に接続できるようにします。
注:
このオプションを使用すると、予測不能な結果が生じる場合があります。

これでプログラムにおいて、UNIT パラメーターとは値が異なっていても、FILE パラメーターとは 同じ値を含む OPEN ステートメントを複数指定することができます。 たとえば、TTY デバイス /dev/tty にリンクされている 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/tty に事前に接続されている 場合、multconnio=tty オプションを指定すれば、以下のプログラムを実行することができます。

PROGRAM iotest
   ! /dev/pts/2 is your current tty, as reported by the 'tty' command.
   ! (This changes every time you login.)
   CALL SETRTEOPTS ('multconnio=tty')
   OPEN (UNIT=3, FILE='/dev/pts/2')
   WRITE (3, *) 'hello'  ! Display 'hello' on your screen
END PROGRAM
namelist={new | old}
プログラムが入出力に XL Fortran の新しい NAMELIST 形式を使用するか、または 古い NAMELIST 形式を使用するかを判別します。 Fortran 90 および Fortran 95 標準では、この新しい形式が要求されています。
注:
NAMELIST 出力を含む既存のデータ・ファイルを読み取るには、古い設定が必要になる 場合があります。ただし、新しいデータ・ファイルの書き込みには、標準に準拠している新しい形式を使用してください。

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

関連情報:
NAMELIST I/O に関する詳細は、 「XL Fortran ランゲージ・リファレンス」の『名前リストの形式設定』を参照してください。
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 は、次の bash コマンド形式を使用して宣言できます。

                      .-:------------------------------------------.
                      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 ランゲージ・リファレンス」の SCHEDULE ディレクティブに関する説明を参照してください。
並列実行オプション
3 つの並列実行オプション、 parthdsusrthds、および stack について次に説明します。

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

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

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

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

stack=num
スレッドのスタックが必要とするスペースの最大量のバイト数 (num) を指定します。 num のデフォルト値は 4194304 です。

stack=num を、受け入れ可能な上限におさまるように設定します。num は、32 ビット・モードでは最大 256 MB まで、64 ビット・モードではシステム・リソースによって 決められている限界までにすることができます。 上限を超えるアプリケーションでは、セグメンテーションの障害が発生する可能性があります。

パフォーマンスの調整オプション
スレッドが作業を完了し、新しい作業が残っていなければ、そのスレッドは「使用中待機」状態か 「スリープ」状態に入ります。 「使用中待機」状態では、スレッドは短いループで実行し続け、残っている新しい作業を探します。 この状態は反応が速い一方、システムの総合的な使用効率に悪影響を与えます。 スレッドがスリープ状態の場合は、別のスレッドがそのスリープ状態のスレッドに作業を実行するようにシグナルを送るまで 実行は完全に中断されます。 この状態では、システムの使用効率はよくなりますが、アプリケーションに余分なオーバーヘッドがかかります。

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 回の反復から成るチャンクが割り当てられ、即時実行する作業がなければ使用中待機状態になります。

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

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"
IBM Copyright 2003