実行可能プログラムのデフォルトのファイル名は 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.a と libxlsmp.a ライブラリーが必要です。libxlf.a が必要となるのは、プログラムに XL Fortran バージョン 1 または 2 のオブジェクト・ファイルがリンクされて入っている場合だけです。libxlfpmt*.a と libxlfpad.a が必要となるのは、プログラムが -qautodbl オプションを使用してコンパイルされている場合だけです。ご使用のアプリケーションが libhmd.a に依存している場合は、ライブラリーの依存性の詳細について、 XL Fortran のデバッグ・メモリー・ルーチンの使用を参照してください。
動的にリンクしたプログラムが正しく動作するためには、実行システム上の XL Fortran ライブラリーおよびオペレーティング・システム・レベルがコンパイル・システム上のレベルと同じか、またはそれより新しいレベルでなければなりません。
静的にリンクしたプログラムが正しく動作するためには、実行システム上のオペレーティング・システム・レベルがコンパイル・システム上のレベルと同じでなければならない場合があります。
XL Fortran コンパイラーおよび実行時ライブラリーでは、以下の領域でのバイナリー互換性が提供されています。
xlf95_r7 test.f -lmy_utility -o a.out
AIX バージョン 4.3.3 上で libmy_utility.a を使用する前に、そのアーカイブ・ライブラリーを再生成する必要はありません。
ただし、バイナリー互換性に関する制限事項があります。 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 のスレッドをサポートするライブラリーが 3 種類あります。 libxlf90_r.a ライブラリーは、マルチプロセッサー使用可能バージョンの Fortran 実行時ライブラリーです。 libxlsmp.a ライブラリーは、SMP 実行時ライブラリーです。
以下のライブラリーが使用されます。
XL Fortran では、.mod ファイルで使用する以下のディレクトリーが提供されています。
呼び出しコマンド、またある場合には、コンパイラー・オプションによって、スレッドをサポートするのに適切なライブラリーとインクルード・ファイルのセットがバインドされています。たとえば、次のようになります。
コマンド | 使用されるライブラリー | 使用されるインクルード・ファイル | サポートされている POSIX Pthreads API レベル |
---|---|---|---|
xlf90_r xlf95_r |
/lib/libxlf90.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 プログラムが作成する実行時メッセージ用の言語を選択するには、プログラムの実行前に環境変数 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
C ライブラリー・ルーチン setlocale は、「AIX Technical Reference: Base Operating System and Extensions Volume 1 」の中で定義されています。
XL Fortran プログラム内の内部スイッチは、コンパイラー・オプションがコンパイル時動作を制御する方法と似た方法で、実行時の I/O 動作を制御します。実行時オプションは、プログラム内の環境変数またはプロシージャー・コールによって設定することができます。
次の 2 つの環境変数のどちらかを使用して、すべての XL Fortran の実行時オプションの設定を指定することができます: XLFRTEOPTS および XLSMPOPTS。
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 で指定することができます。
ライブラリーは、チャンクにあるファイル・システムからのデータの読み取りや、それに対するデータの書き込みを、少しずつ行うのではなく、 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; }
入力データ・ファイル (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
|cpu_time_type のサブオプションは、以下のとおりです。 |
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 を指定すると、実行時のエラー・メッセージが作成されます。
同じプログラム内の多重接続が許可されるのは、ディスク・ドライブなどのランダム・アクセス・デバイス上にあるファイルの場合だけです。次のような場合には、同じプログラム内の多重接続は許可されていません。
ファイルに損傷を与えないようにするために、以下の点に注意してください。
したがって、リンクされたファイルは同じファイルと見なされます。
これでプログラムにおいて、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=old では、 langlvl=95std 設定および langlvl=90std 設定はいずれも、非標準 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 は、次の ksh コマンド形式を使用して宣言できます。
.-:------------------------------------------. 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 for AIX ランゲージ・リファレンス 」の NUM_PARTHDS 組み込み関数を参照してください。
詳細については、「XL Fortran for AIX ランゲージ・リファレンス 」の NUM_PARTHDS 組み込み関数を参照してください。
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 回の反復から成るチャンクが割り当てられ、即時実行する作業がなければ使用中待機状態になります。
環境変数 SPINLOOPTIME と YIELDLOOPTIME を使用してパフォーマンスを調整することもできます。これらの変数の詳細については、「AIX パフォーマンス・マネージメント・ガイド 」を参照してください。
一般には、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"