ソース・プログラムをコンパイルするには、xlf90、xlf90_r、xlf95、xlf95_r、xlf、xlf_r、f77、fort77、f90、 または f95 コマンドを次の形式で 使用します。
.----------------------------------. V | >>-+-xlf90---+----+--------------+----input_file---+----------->< +-xlf90_r-+ '-cmd_line_opt-' +-xlf95---+ +-xlf95_r-+ +-xlf-----+ +-xlf_r---+ +-f77-----+ +-fort77--+ +-f90-----+ '-f95-----'
これらのコマンドはすべて、本質的に同じ Fortran 言語を受け入れます。 主要な違いは、別のデフォルト・オプション (/etc/opt/ibmcmp/xlf/9.1/xlf.cfg ファイルを参照) を使用していることです。
呼び出しコマンドは、Fortran ソース・ファイルをコンパイルするのに必要なステップを実行し、 すべての .s ファイルをアセンブルして、 オブジェクト・ファイルとライブラリーをリンクして 1 つの実行可能プログラムを作成します。 特に、xlf_r、 xlf90_r、 および xlf95_r コマンドは、スレッド・セーフ・コンポーネント (ライブラリー など) を使用してオブジェクト・ファイルのリンクおよびバインドを行います。
以下に示す表では、使用できる呼び出しコマンドを要約します。
ドライバー 呼び出し | パスまたは 位置 | 主な機能 | リンクされる ライブラリー |
---|---|---|---|
xlf90 | /opt/ibmcmp/xlf/9.1/bin | Fortran 90 | libxlf90.so |
xlf90_r | /opt/ibmcmp/xlf/9.1/bin | スレッド・セーフ Fortran 90 | libxlf90_r.so |
xlf95 | /opt/ibmcmp/xlf/9.1/bin | Fortran 95 | libxlf90.so |
xlf95_r | /opt/ibmcmp/xlf/9.1/bin | スレッド・セーフ Fortran 95 | libxlf90_r.so |
xlf | /opt/ibmcmp/xlf/9.1/bin | FORTRAN 77 | libxlf90.so |
xlf_r | /opt/ibmcmp/xlf/9.1/bin | スレッド・セーフ FORTRAN 77 | libxlf90_r.so |
f77 あるいは fort77 | /opt/ibmcmp/xlf/9.1/bin | FORTRAN 77 | libxlf90.so |
f90 | /opt/ibmcmp/xlf/9.1/bin | Fortran 90 | libxlf90.so |
f95 | /opt/ibmcmp/xlf/9.1/bin | Fortran 95 | libxlf90.so |
呼び出しコマンドには、ディレクティブ・トリガーが以下のようになるという意味があります。
-qsmp コンパイラー・オプションを指定すると、 以下のようになります。
XL Fortran は、ライブラリー libxlf90_t.so に加え、 libxlf90_r.so を提供します。 ライブラリー libxlf90_r.so は libxlf90_t.so のスーパーセットです。 ファイル xlf.cfg は、xlf90_r、 xlf95_r、 および xlf_r コマンドの使用時に、 libxlf90_r.so に自動的にリンクするようにセットアップされています。
libxlf90_t.so は、部分的スレッド・サポート実行時ライブラリーです。 このライブラリーは、使用に関する制限が 1 つ付いた状態で /opt/ibmcmp/lib/libxlf90_t.so としてインストールされます。 これは、ライブラリーのルーチンはスレッド再入可能ルーチンではなく、1 つの Fortran のスレッドだけが、 I/O オペレーションを実行したり、ライブラリーを使用するマルチスレッド・アプリケーションに Fortran の 組み込み機能を呼び出すことができるからです。 スレッドの同期によるオーバーヘッドが libxlf90_r.so で生じないようにするには、Fortran スレッドが 1 つだけ存在しているマルチスレッド・アプリケーションで libxlf90_t.so を使用することができます。
マルチスレッドの実行可能プログラムを複数の Fortran スレッドとバインドする場合は、 ルーチンにリンクする目的で、-lxlf90_t または -lxlf90 の代わりに -lxlf90_r を コマンド行に指定する必要があります。 xlf_r、xlf90_r、 または xlf95_r 呼び出しコマンドを使用することによって、正しいリンクが保証されることに注意してください。
f90、xlf90、および xlf90_r コマンドを使用するほうが、xlf、xlf_r、および f77/fort77 コマンドを使用するよりも、Fortran 90 標準にプログラムをより準拠させることができます。 f95、xlf95 および xlf95_r コマンドを使用するほうが、xlf、xlf_r、および f77/fort77 コマンドを使用するよりも、Fortran 95 標準にプログラムをより準拠させることが できます。 f90、xlf90、xlf90_r、f95、xlf95、および xlf95_r は、新しいプログラムをコンパイルする場合の推奨コマンドです。 これらのコマンドはどちらも Fortran 90 の自由ソース形式がデフォルトで使用できます。 これを固定ソース形式に使用するには、-qfixed オプションを使用する必要があります。 I/O 形式は、これらのコマンドとそれ以外のコマンドではわずかに異なっています。 また I/O 形式も、 xlf90 および xlf90_r コマンドのセットと、 xlf95 および xlf95_r コマンドのセットで異なっています。 できる限り、データ・ファイルに関しては Fortran 95 形式に切り替えることをお勧めします。
デフォルトでは、xlf90 および xlf90_r コマンドは Fortran 90 標準に完全に準拠しているわけではありません。 さらに、xlf95 および xlf95_r コマンドも デフォルトで Fortran 95 標準に完全に準拠しているわけではありません。 完全コンパイルを必要とする場合は、次のコンパイラー・オプション (およびサブオプション) の いずれかを指定してコンパイルしてください。
-qnodirective -qnoescape -qextname -qfloat=nomaf:nofold -qnoswapomp -qlanglvl=90std -qlanglvl=95std
また、プログラムを実行する前に、次のようなコマンドを使用して実行時オプションを指定してください。
export XLFRTEOPTS="err_recovery=no:langlvl=90std"
デフォルト設定は、パフォーマンスと使いやすさの最善の組み合わせが得られるように設計されています。 したがって、通常、デフォルト設定は必要な場合にだけ変更するようにしてください。 上記のオプションの一部は、非常に特殊な状況で適合性を得るためにだけ必要です。 たとえば、-qextname は、共通ブロックやサブプログラムなどの外部シンボルの 1 つに main という 名前が付いている場合にだけ必要になります。
xlf_r、 xlf90_r、 または xlf95_r コマンドを使用して、XL Fortran SMP プログラムをコンパイルできます。 xlf_r コマンドと xlf、xlf90_r コマンドと xlf90 コマンド、また xlf95_r コマンドと xlf95 コマンドは、それぞれほとんど同じです。 主な違いは、xlf_r、xlf90_r、または xlf95_r コマンドを 指定した場合、スレッド・セーフ・コンポーネントが オブジェクト・ファイルのリンクおよびバインドに使用される点です。
これらのコマンドの 1 つを 単独で使用すると、並列処理が行われないことに注意してください。 SMP ディレクティブを認識して並列化を活動化するコンパイラーの 場合は、-qsmp も指定する必要があります。 または、これらの 6 つの呼び出しコマンドのいずれか 1 つと一緒に -qsmp オプションを指定することは可能です。 -qsmp を指定すると、 ドライバーは構成ファイルのアクティブ・スタンザにある smplibraries 行で指定されたライブラリーにリンクします。
XL Fortran では 、IEEE 1003.1-2001 (POSIX) 標準 pthreads API を使用したスレッド・プログラミングが サポートされます。
標準インターフェース・ライブラリーを指定してプログラムをコンパイルおよびリンクするには、 xlf_r、xlf90_r、または xlf95_r コマンドを使用します。 たとえば、次のように指定します。
xlf95_r test.f
モジュールを使用するプログラム・ユニット、サブプログラム、またはインターフェース・ボディがある場合、 先にモジュールをコンパイルする必要があります。 モジュール、およびモジュールを使用するコードが別個のファイルに入っている場合、 モジュールが入っているファイルを最初にコンパイルする必要があります。 同じファイルに入っている場合は、モジュールは、 ファイル内のモジュールを使用するコードの前になければなりません。 モジュールにあるエンティティーを変更する場合、 そのモジュールを使用するファイルをすべて再コンパイルする必要があります。
コンパイルの完了前にコンパイラーを停止するには、 対話モードで Ctrl+C を入力するか、 kill コマンドを使用してください。
コンパイラーへの入力ファイルには次のものがあります。
インクルード・ファイルもソースを含んでいて、.f 以外のサフィックスを持っていることがしばしばあります。
構成ファイルのカスタマイズおよび -qsuffix オプションに記載されている fsuffix および cppsuffix 属性を 使用する場合は、別のサフィックスを選択します。
osuffix 属性 (構成ファイルのカスタマイズおよび -qsuffix オプションに説明されている) を使用して、 別のサフィックスを選択することができます。
デフォルトの構成ファイルは /etc/opt/ibmcmp/xlf/9.1/xlf.cfg です。
-qpdf1 オプションは、 以降のコンパイルで使用する、実行時プロファイル情報を作成します。 この情報は、 パターン「.*pdf*」に一致する名前で 1 つまたは複数の隠しファイルに格納されます。
XL Fortran が提供する出力ファイルは、以下のとおりです。
3 つの位置のいずれかにコンパイラー・オプションを指定することができます。
有効範囲と優先順位は、使用する位置で定義されます。
(XL Fortran は、SOURCEFORM などの、オプション設定を指定できるコメント・ディレクティブも持っています。
そのようなディレクティブの有効範囲と優先順位に関する一般的な規則はありません。)
位置 | 有効範囲 | 優先順位 |
---|---|---|
構成ファイルのスタンザの中 | 実際にそのスタンザでコンパイルされたすべてのファイル内のすべてのコンパイル単位。 | 下位 |
コマンド行 | そのコマンドでコンパイルされたすべてのファイル内のすべてのコンパイル単位。 | 中間 |
@PROCESS ディレクティブ (XL Fortran は、SOURCEFORM などの、オプション設定を指定できるコメント・ディレクティブも持っています。 そのようなディレクティブの有効範囲と優先順位に関する一般的な規則はありません。) | 次のコンパイル単位 | 上位 |
異なる設定で複数回オプションが指定されると、通常は最後の設定が効力を発します。 例外はどれも XL Fortran コンパイラー・オプションの詳細記述の個々の説明に示され、「競合オプション」という索引が付けられています。
XL Fortran は、従来の UNIX によるコマンド行オプションの指定方法をサポートしています。 この方法では、次のように、負符号の後に 1 つまたは複数の文字 (フラグといいます) を指定します。
xlf95 -c file.f
多くの場合、複数のフラグを連結することも、個々に指定することもできます。
xlf95 -cv file.f # These forms xlf95 -c -v file.f # are equivalent
(例外がいくつかあります。たとえば、-pg。 これは単一オプションで、-p -g と同じではありません。)
フラグの中には、引き数ストリングがさらに必要なものもあります。 また、XL Fortran はそれらのフラグの解釈で柔軟性を持っています。 最後に引き数を指定したフラグであれば、複数のフラグを連結することができます。 フラグを指定する方法について、以下の例で示します。
# All of these commands are equivalent. xlf95 -g -v -o montecarlo -p montecarlo.f xlf95 montecarlo.f -g -v -o montecarlo -p xlf95 -g -v montecarlo.f -o montecarlo -p xlf95 -g -v -omontecarlo -p montecarlo.f # Because -o takes a blank-delimited argument, # the -p cannot be concatenated. xlf95 -gvomontecarlo -p montecarlo.f # Unless we switch the order. xlf95 -gvpomontecarlo montecarlo.f
他のコンパイラー、特に XL ファミリーのコンパイラーに精通していれば、 すでにこれらのフラグの多くにも精通していることでしょう。
覚えやすい形式で多数のコマンド行オプションを指定して、コンパイル・スクリプトおよび makefiles を理解しやすく することができます。
>>- -q--option_keyword--+---------------------------------------+->< | .-:------------------------------. | | V | | '-=----suboption--+-----------------+-+-' | .-,--------. | | V | | '-=----argument-+-'
この形式では、ブランクの挿入に関しては、より制限的です。 それぞれの -q オプションはブランクで区切らなければならず、 -q オプションと、その後に続く引き数ストリングとの間にブランクがあってはなりません。 フラグ・オプションの名前とは異なり、-q オプション名には、 q が小文字でなければならないことを除いて、大文字と小文字の区別がありません。 -q オプションとこれが必要としている引き数を分離するには等号を使用し、 引き数ストリング内のサブオプションを分離するにはコロンを使用してください。
たとえば、次のようになります。
xlf95 -qddim -qXREF=full -qfloat=nomaf:rsqrt -O3 -qcache=type=c:level=1 file.f
ソース・ファイルに @PROCESS ディレクティブを入れることによって、 個々のコンパイル単位に影響を与えるようにコンパイラー・オプションを指定することができます。 @PROCESS コンパイラー・ディレクティブによって、構成ファイル、デフォルト設定、 またはコマンド行で指定したオプションをオーバーライドすることができます。
.-+---+--------------------------. | '-,-' | V | >>-@PROCESS----option--+--------------------+-+---------------->< '-( suboption_list )-'
固定ソース形式では、@PROCESS は 1 桁目から、または 6 桁目より後に開始できます。 自由ソース形式では、@PROCESS コンパイラー・ディレクティブはどの桁からでも開始できます。
ステートメント・ラベルまたはインライン・コメントを @PROCESS コンパイラー・ディレクティブと同じ行に入れることはできません。
デフォルト時には、@PROCESS コンパイラー・ディレクティブで指定するオプション設定は、 ステートメントが存在するコンパイル単位に対してのみ有効です。 ファイルが複数のコンパイル単位を持っている場合は、オプション設定は、 次の単位がコンパイルされる前に、元の状態にリセットされます。 DIRECTIVE オプションによって指定されたトリガー定数は、 ファイルの終わりまで (または NODIRECTIVE が処理されるまで) 有効です。
@PROCESS コンパイラー・ディレクティブは、通常、 コンパイル単位の最初のステートメントの前になければなりません。 唯一の例外は、SOURCE および NOSOURCE を指定する場合です。 この 2 つは、コンパイル単位内のいかなる場所にある @PROCESS ディレクティブでも使用することができます。
コンパイラーは、コンパイル中に必要に応じて他のコマンド (たとえば ld および as) を自動的に実行するので、 通常は、これらのコマンドのオプションにユーザーが関与する必要はありません。 これらの個々のコマンドに対してオプションを選択したい場合は、次のようにできます。
xlf95 --print-map file.f # --print-map is passed to ld
xlf95 -Wl,--print-map file.f # --print-map is passed to ld
この例では、ld オプション --print-map は リンカー (-Wl オプションの l で指示される) の実行時にリンカーに渡されます。
この形式は、前の形式よりも一般的です。 なぜなら、-W オプションの後にさまざまな英字を使用することにより、as コマンドおよび コンパイル中に呼び出される他のコマンドに代わって機能するからです。
たとえば、 /etc/opt/ibmcmp/xlf/9.1/xlf.cfg の xlf95 スタンザに以下の行
asopt = "W" ldopt = "M"
を入れて、次のコマンド を発行すると、
xlf95 -Wa,-Z -Wl,-s -w produces_warnings.s uses_many_symbols.f
を発行すると、produces_warnings.s ファイルはオプション -W と -Z (警告を出して、コンパイル・エラーがあってもオブジェクト・ファイルを作成する) でアセンブルされ、 オプション -s と -M (最終実行可能ファイルを除去し、ロード・マップを作成する) で リンカーが呼び出されます。 を発行すると、
strings コマンドは、以下のようにいくつかのバイナリー・ファイルに エンコードされている情報を読み取ります。
たとえば、/opt/ibmcmp/xlf/9.1/exe/xlfentry にエンコードされた情報を見るには、次のコマンドを発行します。
strings /opt/ibmcmp/xlf/9.1/exe/xlfentry | grep "@(#)"
-qarch および -qtune を使用して、 特殊なアーキテクチャー に特定のコードを生成するように コンパイラーに指示するプログラムを作成することができます。 これにより、コンパイラーは、マシン特定の命令を活用してパフォーマンスを向上させることができます。 -qarch オプションは、コンパイル後のプログラムが実行できるアーキテクチャーを判別します。 オプション -qtune と -qcache は、プラットフォーム固有の 最適化の程度を改善します。
デフォルト時には、-qarch を設定すると、サポートされているすべての アーキテクチャーに共通の命令のみを使用するコードが作成され、結果として -qtune と -qcache の 設定値は、これに伴って一般的なものとなります。 特定のプロセッサー・セットまたはアーキテクチャーのパフォーマンスを調整するために、これらのオプションの 1 つ または複数に別の設定値を指定する必要がある場合もあります。 通常の試行過程では、まず -qarch を使用して、次に -qtune を追加し、次に -qcache を 追加します。 -qarch のデフォルト値は -qtune や -qcache のデフォルト値にも影響するため、 -qarch オプション以外は必要でない場合がしばしばあります。
コンパイル中のマシンがターゲット・アーキテクチャーでもある場合は、-qarch=auto によって、 コンパイル中のマシンの設定値が自動的に検出されます。 このコンパイラー・オプションの設定値の詳細については、-qarch オプションを参照してください。 -O オプションの -O4 と -O5 も参照してください。
プログラムのほとんどを、特定のアーキテクチャーで実行するようにしている場合は、これらのオプションの うちの 1 つ以上を構成ファイルに追加しておけば、それをすべてのコンパイルのデフォルトにすることができます。
一般的なプログラミングの慣例では、 C プリプロセッサー (cpp) によってファイルを引き渡します。 cpp は、ユーザーが指定した条件に基づいて出力ファイルに行を 組み込んだり、出力ファイルから行を削除したり (『条件付きコンパイル』) できます。 また、ストリングを置換 (『マクロ展開』) することも可能です。
XL Fortran は cpp を使用して、コンパイル前にファイルを プリプロセスすることができます。
特定のファイルについて cpp を呼び出すには、 ファイル・サフィックス .F を使用してください。 -d オプションを指定すると、個々の .F ファイル filename.F は、 中間ファイル Ffilename.f にプリプロセスされて、これがコンパイルされます。 -d オプションを指定しないと、中間ファイルの名前は /tmpdir/F8xxxxxx になります。 ここで、x は英数字です。 tmpdir は、TMPDIR 環境変数に入れられている値であり、TMPDIR に値が 指定されていない場合は /tmp になります。 中間ファイルは、-d コンパイラー・オプションを指定することによって保管することができます。 このオプションを指定しないと、ファイルは削除されます。 プリプロセスは行いたいが、オブジェクト・ファイルや実行可能ファイルは作成したくない場合は、 -qnoobject オプションも指定してください。
XL Fortran がファイルに cpp を使用するとき、プリプロセッサーは #line ディレクティブを 出力します。 これは、-d オプションを指定すると行われません。 #line ディレクティブは、cpp かそれ以外の Fortran ソース・コード・ジェネレーターにより 作成されたコードと、作成した入力コードを関連づけます。 プリプロセッサーによって、コードの行が挿入されたり削除されたりする場合があります。 コードの行を出力する #line ディレクティブは、オリジナルのソースで使用された行番号をリストして、 プリプロセスされたコードに検出されるソース・ステートメントを識別するため、エラーの報告書作成および デバッグの際に役に立ちます。
_OPENMP C プリプロセッサー・マクロを使用すれば、 コードを条件付きで組み込めます。 このマクロは、 -qsmp=omp コンパイラー・オプションが指定してあれば、 C プリプロセッサーが呼び出されるときに定義されます。 このマクロの例を以下に示します。
program par_mat_mul implicit none integer(kind=8) ::i,j,nthreads integer(kind=8),parameter ::N=60 integer(kind=8),dimension(N,N) ::Ai,Bi,Ci integer(kind=8) ::Sumi #ifdef _OPENMP integer omp_get_num_threads #endif common/data/ Ai,Bi,Ci !$OMP threadprivate (/data/) !$omp parallel forall(i=1:N,j=1:N) Ai(i,j) = (i-N/2)**2+(j+N/2) forall(i=1:N,j=1:N) Bi(i,j) = 3-((i/2)+(j-N/2)**2) !$omp master #ifdef _OPENMP nthreads=omp_get_num_threads() #else nthreads=8 #endif !$omp end master !$omp end parallel !$OMP parallel default(private),copyin(Ai,Bi),shared(nthreads) !$omp do do i=1,nthreads call imat_mul(Sumi) enddo !$omp end do !$omp end parallel end
条件付きコンパイルの詳細については、「XL Fortran ランゲージ・リファレンス」 の言語エレメントの節にある『条件付き コンパイル』を参照してください。
cpp プリプロセスをカスタマイズできるようにするため、 構成ファイルは属性 cpp、cppsuffix、および cppoptions を受け入れます。
文字 F は、 オプション -t および -W を持つ C プリプロセッサーを表します。
マクロ展開は、予期しない結果 (たとえば、FORMAT ステートメントの変更や、固定ソース形式で 72 文字よりも長い行の作成など) を招いてデバッグが困難になる場合があるため、cpp は主に Fortran プログラムの 条件付きコンパイルに使用することをお勧めします。 条件付きコンパイルに最も頻繁に使用される cpp ディレクティブは、#if、#ifdef、#ifndef、#elif、#else、#endif です。
コンパイラーは -I 以外の cpp オプションをコマンド行上で直接認識しないので、 このようなオプションは、-W オプションを使用して渡す必要があります。 たとえば、 LNXV1 という名前のシンボルの存在をテストする #ifdef ディレクティブがプログラムに含まれている場合は、 次のようなコマンドでコンパイルすることにより、このシンボルを cpp に定義することができます。
xlf95 conditional.F -WF,-DLNXV1
Fortran と C では、一部の文字列の処理が異なるため、/* や */ を使用する場合は 注意して使用してください。 (これらは C のコメント区切り文字として解釈される場合があり、Fortran コメントの内部で使用した場合でも 問題が起こる可能性があります。) また、?? で始まる 3 文字の文字列にも注意が必要です。 (これは C の 3 文字表記と解釈される可能性があります。)
次の例を考慮します。
program testcase character a character*4 word a = '?' word(1:2) = '??' print *, word(1:2) end program testcase
プリプロセッサーが、ご使用の文字の組み合わせとそれに対応した 3 文字表記を突き合わせると、 出力が予期したものとならない場合があります。
XL Fortran コンパイラー・オプション -qnoescape をコードで使用する必要がない 場合は、
解決策として、文字ストリングをエスケープ・シーケンス word(1:2) = '¥?¥?' に置き換えることが
考えられます。
しかし、-qnoescape コンパイラー・オプションを使用している場合は、この解決策は役に立ちません。
その場合は、3 文字表記を無視する cpp が必要です。
XL Fortran は /opt/ibmcmp/xlf/9.1/exe/cpp で見つかった
cpp を使用します。
これは ISO C に準拠しているため、3 文字表記を認識します。