実行可能プログラムのデフォルトのファイル名は 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 のスレッド・サポートを使用して接続された実行時ライブラリーが 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 プログラムが作成する実行時メッセージ用の言語を選択するには、 プログラムの実行前に環境変数 LANG と NLSPATH を設定してください。
環境変数の設定の他にも、プログラムは C ライブラリー・ルーチン setlocale を呼び出して、 実行時にプログラムのロケールを設定する必要があります。 たとえば、次のプログラムは、実行時メッセージのカテゴリーを環境変数 LC_ALL、 LC_MESSAGES、LANG に応じて設定することを指定します。
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 環境変数を使用すると、 ユーザーは I/O、EOF エラー処理、 および乱数発生ルーチンの指定に影響を与えるオプションを指定することができます。 XLFRTEOPTS は、次の bash コマンド形式を使用して宣言します。
.-:------------------------------------------. V | >>-XLFRTEOPTS=--+---+----runtime_option_name--=----option_setting---+--+---+->< '-"-' '-"-'
オプション名と設定は、英大文字または小文字のどちらでも指定することができます。 コロンおよび等号の前後にブランクを追加して、読みやすくすることができます。 しかし、XLFRTEOPTS オプション・ストリングに組み込みブランクが含まれている場合は、 オプション・ストリング全体を二重引用符 (") で囲む必要があります。
プログラムが次のいずれかの状況を初めて検出したときに、環境変数がチェックされます。
プログラムの実行中に XLFRTEOPTS 環境変数を変更しても、プログラムには影響はありません。
SETRTEOPTS プロシージャー (「XL Fortran ランゲージ・リファレンス」で定義されています) は、 環境変数 XLFRTEOPTS と同じ名前値のペアを含んでいる単一ストリング引き数を受け入れます。これは環境変数をオーバーライドし、プログラムの実行中に設定を変更したいときに使用することができます。 SETRTEOPTS への別の呼び出しによって変更されない限り、プログラムの残りの部分には、新たな設定が引き続き有効です。 プロシージャー・コールで指定された設定だけが変更されます。
次の実行時オプションは、環境変数 XLFRTEOPTS またはプロシージャー SETRTEOPTS で指定することができます。
ライブラリーは、チャンクにあるファイル・システムからのデータの読み取りや、それに対するデータの書き込みを、少しずつ 行うのではなく、READ ステートメントや WRITE ステートメントが来るたびに一括して行います。 バッファリングを実行する主な利点は、パフォーマンスを向上させることができるということです。
Fortran のルーチンが他の言語のルーチンと一緒に作業するアプリケーションや、Fortran のプロセスが同じ データ・ファイル上の他のプロセスと一緒に作業するアプリケーションがある場合、Fortran ルーチンによって 書かれたデータは、バッファリングが実行されるため、他のパーティーによってすぐには認識されない場合が あります (その逆も言えます)。 また、Fortran の READ ステートメントは、I/O バッファーに必要以上のデータを読み込む場合があり、 結果として次のデータを読み取るはずの、他の言語で書かれたルーチンや他のプロセスによって実行される 入力操作が失敗する可能性があります。 このような場合、buffering 実行時オプションを使用して、XL Fortran の実行時ライブラリーの バッファリングを使用不能にすることができます。 そうすれば、READ ステートメントはファイルから必要とするデータを正確に読み取ることができ、 WRITE ステートメントによるデータの書き込みも、ステートメントの完了時にファイル・システムへ フラッシュされます。
注: I/O バッファリングは、順次アクセス装置 (パイプ、端末、ソケット など) 上のファイルでは常に使用可能です。 buffering オプションを設定しても、このようなタイプのファイルに影響を及ぼすことはありません。
論理装置で I/O バッファリングを使用不能にすると、Fortran のサービス・ルーチン flush_ を呼び出して、 その論理装置用の I/O バッファーの内容をフラッシュする必要はありません。
buffering のサブオプションは、以下のとおりです。
以下の例では、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 をオンにすると、結果は予想不能です。
cpu_time_type のサブオプションは、以下のとおりです。
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 ステートメントの説明を参照してください。
たとえば、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 値』の節を参照してください。
MATMUL および RANDOM_NUMBER 組み込みプロシージャーで使用可能なスレッド数を変更すると、 パフォーマンスに影響を及ぼす可能性があります。
たとえば、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.
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 設定は、発生したエラーが回復可能なエラーであるか、それとも重大なエラーであるかを 判別します。
同じプログラム内の多重接続が許可されるのは、ディスク・ドライブなどのランダム・アクセス・デバイス上にある ファイルの場合だけです。 次のような場合は、同じプログラム内の多重接続は許可されていません。
ファイルに損傷を与えないようにするために、以下の点に注意してください。
したがって、リンクされたファイルは同じファイルと見なされます。
これでプログラムにおいて、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=old では、langlvl=95std、langlvl=90std、または langlvl=2003std 設定はいずれも、非標準 NAMELIST 形式をエラーと見なしません。
次の例は、実行時オプション cnverr を yes に設定し、 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 環境変数を使用すると、ユーザーは SMP の実行に影響を与えるオプションを指定することが できます。
XLSMPOPTS は、次の bash コマンド形式を使用して宣言できます。
.-:------------------------------------------. V | >>-XLSMPOPTS=--+---+----runtime_option_name--=----option_setting---+--+---+->< '-"-' '-"-'
オプション名と設定は、英大文字または小文字のどちらでも指定することができます。 コロンおよび等号の前後にブランクを追加して、読みやすくすることができます。 しかし、XLSMPOPTS オプション・ストリングに組み込みブランクが含まれている場合は、 オプション・ストリング全体を二重引用符 (") で囲む必要があります。
次の実行時オプションは、 環境変数 XLSMPOPTS で指定することができます。
使用するスケジューリング・タイプとチャンク・サイズに応じて、 さまざまな方法でスレッドに作業が割り当てられます。 スケジューリング・タイプおよびそれらが作業の割り当てに与える影響について、 以下に簡単に説明します。
CEILING(number_of_iterations / number_of_threads)
これらの区画は各スレッドに割り当てられます。 そして、反復のチャンクにさらに分割されます。 スレッドがスリープ状態の場合は、他の活動状態のスレッドが、割り当てられている作業区画を完了します。
チャンクをどの程度細分化するかによって、オーバーヘッドとロード・バランシングのバランスは異なってきます。 このオプションの構文は schedule=suboption です。 suboptions は次のように定義されます。
スレッドが使用可能になると、事前に割り当てられている区画から次のチャンクが選ばれます。 その区画にチャンクがなくなると、別のスレッドに事前に割り当てられている区画から次に使用可能なチャンクが 選ばれます。
最初のチャンクには CEILING(number_of_iterations / number_of_threads) 回の反復が含まれます。 次のチャンクには CEILING(number_of_iterations_left / number_of_threads) 回の反復が含まれます。
n を指定しない場合、チャンクには CEILING (number_of_iterations / number_of_threads) 反復が入ります。 各スレッドは、これらのチャンクのいずれかに割り当てられます。 これをブロック・スケジューリング と言います。
schedule を指定していない場合は、デフォルトが schedule=static に設定され、その結果 ブロック・スケジューリングが行われます。
このオプションを使用すると、実行スレッドの数を完全に制御することができます。 -qsmp を指定しない場合、num のデフォルト値は 1 です。 -qsmp を指定する場合は、マシン上のオンライン・プロセッサーの数になります。 詳細については、「XL Fortran ランゲージ・リファレンス」の『NUM_PARTHDS』組み込み関数を参照してください。
詳細については、「XL Fortran ランゲージ・リファレンス」の 『NUM_PARTHDS』組み込み関数を参照してください。
stack=num を、受け入れ可能な上限におさまるように設定します。num は、32 ビット・モードでは最大 256 MB まで、64 ビット・モードではシステム・リソースによって 決められている限界までにすることができます。 上限を超えるアプリケーションでは、セグメンテーションの障害が発生する可能性があります。
xlsmp 実行時ライブラリー・ルーチンは、作業を待機する方法として、「使用中待機」状態と「スリープ」状態の 両方を使用します。 spins、yields、および delays オプションを使用して、このような状態を制御することができます。
使用中待機状態の作業を検索している間は、スレッドは作業キューを最高 num 回まで繰り返しスキャンします。 ここで num は、spins オプションに指定した値です。 指定されたスキャン中に作業が見つからない場合、スレッドは遅延ループを num 回実行して意図的にサイクルを浪費します。 ここで num は、delays オプションに指定された値です。 この遅延ループは、意味のない単一の反復から成っています。 遅延ループにかかる実際の時間の長さはプロセッサーによって異なります。 値 spins を超過してもまだ作業が見つからない場合は、スレッドは現行のタイム・スライス (プロセッサーがその スレッドに割り当てた時間) を他のスレッドに譲渡します。 スレッドはタイム・スライスを最高 num 回まで譲渡します。 ここで、num は yields オプションに指定した数です。 この値 num を超過すると、スレッドはスリープ状態になります。
要約すると、作業を検索するための順序付けられた方法は次のステップで構成されています。
これらのオプションを指定する構文は次のとおりです。
spins と yields の特殊値はゼロです。 ゼロを使えば、強制的に完全な使用中待機状態にすることができます。 通常、専用システムのベンチマーク・テストでは、両方のオプションをゼロに設定します。 しかし、それらを個別に設定すると、他の効果を持たせることができます。
たとえば、専用の 8 ウェイ SMP では、これらのオプションを次のように設定します。
parthds=8 : schedule=dynamic=10 : spins=0 : yields=0
この場合、CPU ごとに 1 スレッドという結果になります。 各スレッドにはそれぞれ 10 回の反復から成るチャンクが割り当てられ、即時実行する作業がなければ使用中待機状態になります。
一般には、parthreshold を並列化のオーバーヘッドと等しくなるように設定します。 並列化されたループの計算量が非常に少なく、並列化の設定においてこれらのループを実行するのにかかる時間が 大部分を占める場合は、これらのループを順次実行した方がパフォーマンスはよくなります。
seqthreshold は、parthreshold とは逆の動作をします。
このオプションで指定できる値は、0 から 32 の数字です。 profilefreq を 0 から 32 のいずれかに設定した場合、次の処理が行われます。
動的プロファイル作成は、ユーザー指定の並列ループ (たとえば、PARALLEL DO ディレクティブを指定した ループ) には適用できませんのでご注意ください。
以下の環境変数は、OpenMP 標準に含まれており、並列コードの実行を制御できます。
OMP_DYNAMIC 環境変数は、 並列領域の実行に使用できるスレッドの数を動的に調整できるようにしたり、 できないようにしたりします。 この環境変数の構文は次のとおりです。
>>-OMP_DYNAMIC=--+-TRUE--+------------------------------------->< '-FALSE-'
この環境変数を TRUE に設定すれば、 実行時環境は並列領域を実行するときに使用できるスレッドの数を調整できるため、 システム・リソースをより効率的に使用できるようになります。 この環境変数を FALSE に設定した場合、動的な調整は行えません。
OMP_DYNAMIC のデフォルト値は TRUE です。 そのため、決まった数のスレッドを正確にコードが実行する必要がある場合は、 動的スレッド調整を使用不可にしなければなりません。
omp_set_dynamic サブルーチンは、 OMP_DYNAMIC 環境変数よりも優先されます。
OMP_NESTED 環境変数は、 ネストされた並列処理を行えるようにしたり、 行えないようにしたりします。 この環境変数の構文は次のとおりです。
>>-OMP_NESTED=--+-TRUE--+-------------------------------------->< '-FALSE-'
この環境変数を TRUE に設定した場合、ネストされた並列処理を行うことができます。 つまり、実行時環境は追加のスレッドを展開して、 ネストされた並列領域で使用するためのスレッド・チームを形成できます。 この環境変数を FALSE に設定した場合、 ネストされた並列処理は行えません。
OMP_NESTED のデフォルト値は FALSE です。
omp_set_nested サブルーチンは、 OMP_NESTED 環境変数よりも優先されます。
OMP_NUM_THREADS 環境変数は、 プログラムが実行時に使用するスレッドの数を設定します。 この環境変数の構文は次のとおりです。
>>-OMP_NUM_THREADS=--num---------------------------------------><
プログラムが実行時に使用できるスレッドのデフォルト数は、 マシン上のオンライン・プロセッサーの数です。
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 環境変数は、スケジュール・タイプが RUNTIME の PARALLEL DO ディレクティブと作業共用 DO ディレクティブに適用されます。 この環境変数の構文は次のとおりです。
>>-OMP_SCHEDULE=--sched_type--+---------------+---------------->< '-,--chunk_size-'
この環境変数は、 PARALLEL DO ディレクティブおよび作業共用 DO ディレクティブのスケジュール・タイプが RUNTIME 以外の場合は無視されます。
コンパイル時にディレクティブによってスケジュール・タイプを指定しなかったか、 あるいは実行時に OMP_SCHEDULE 環境変数、 または XLSMPOPTS 環境変数の SCHEDULE オプションによってスケジュール・タイプを指定しなかった場合、 デフォルトのスケジュール・タイプは STATIC となります。 また、デフォルトのチャンク・サイズは、 最初の N - 1 スレッドについては次のように設定されます。
chunk_size = ceiling(Iters/N)
N 番目のスレッドについては、次のように設定されます。 ここで、N はスレッドの合計数、Iters は DO ループ内の反復の合計数です。
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"