XL Fortran プログラムのコンパイル

ソース・プログラムをコンパイルするには、xlf90xlf90_rxlf95xlf95_rxlfxlf_rf77fort77f90、 または 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/10.1/xlf.cfg ファイルを参照) を使用していることです。

呼び出しコマンドは、Fortran ソース・ファイルをコンパイルするのに必要なステップを実行し、 すべての .s ファイルをアセンブルして、 オブジェクト・ファイルとライブラリーをリンクして 1 つの実行可能プログラムを作成します。 特に、xlf_rxlf90_rおよび xlf95_r コマンドは、 スレッド・セーフ・コンポーネント (ライブラリー、 など) を 使用してオブジェクト・ファイルをリンクしたりバインドしたりします。

以下に示す表では、使用できる呼び出しコマンドを要約します。

表 3. XL Fortran 呼び出しコマンド
ドライバー 呼び出し パスまたは 位置 主な機能 リンクされる ライブラリー
xlf90 /opt/ibmcmp/xlf/10.1/bin Fortran 90 libxlf90.so
xlf90_r /opt/ibmcmp/xlf/10.1/bin スレッド・セーフ Fortran 90 libxlf90_r.so
xlf95 /opt/ibmcmp/xlf/10.1/bin Fortran 95 libxlf90.so
xlf95_r /opt/ibmcmp/xlf/10.1/bin スレッド・セーフ Fortran 95 libxlf90_r.so
xlf /opt/ibmcmp/xlf/10.1/bin FORTRAN 77 libxlf90.so
xlf_r /opt/ibmcmp/xlf/10.1/bin スレッド・セーフ FORTRAN 77 libxlf90_r.so
f77 あるいは fort77 /opt/ibmcmp/xlf/10.1/bin FORTRAN 77 libxlf90.so
f90 /opt/ibmcmp/xlf/10.1/bin Fortran 90 libxlf90.so
f95 /opt/ibmcmp/xlf/10.1/bin Fortran 95 libxlf90.so

呼び出しコマンドには、ディレクティブ・トリガーが以下のようになるという意味があります。

-qsmp コンパイラー・オプションを指定すると、 以下のようになります。

XL Fortran は、libxlf90_r.so に加えて、 ライブラリー libxlf90_t.so を提供します。ライブラリー libxlf90_r.so は、libxlf90_t.so のスーパーセットです。 xlf90_rxlf95_r、および xlf_r コマンドを使用するとき、ファイル xlf.cfg は 自動的にセットアップされ、libxlf90_r.so にリンクされます。

libxlf90_t.so は部分的スレッド・サポート・ランタイム・ライブラリーです。このライブラリーは、使用に関する制限が 1 つ付いた状態で /opt/ibmcmp/lib/libxlf90_t.so としてインストールされます。 これは、ライブラリーのルーチンはスレッド再入可能ルーチンではなく、1 つの Fortran のスレッドだけが、 入出力操作を実行したり、ライブラリーを使用するマルチスレッド・アプリケーションに Fortran の 組み込み機能を呼び出すことができるからです。アプリケーションがスレッド化されているときスレッドの同期によるオーバーヘッドを libxlf90_r.so で避けるために、Fortran スレッドが 1 つだけ存在しているマルチスレッド・アプリケーションで libxlf90_t.so を使用できます。

マルチスレッドの実行可能プログラムを複数の Fortran スレッドとバインドする場合は、 libxlf90_r.so を 使用する必要がありますxlf_rxlf90_r または xlf95_r 呼び出しコマンドを使用することによって、正しいリンクが保証されることに注意してください。

Fortran 90 プログラムまたは Fortran 95 プログラムのコンパイル

f90xlf90、および xlf90_r コマンドを使用するほうが、xlfxlf_r、および f77/fort77 コマンドを使用するよりも、Fortran 90 標準にプログラムをより準拠させることができます。 f95xlf95 および xlf95_r コマンドを使用するほうが、xlfxlf_r、および f77/fort77 コマンドを使用するよりも、Fortran 95 標準にプログラムをより準拠させることが できます。 f90xlf90xlf90_rf95xlf95および xlf95_r は、新しいプログラムをコンパイルする場合の推奨コマンドです。 これらのコマンドはどちらも Fortran 90 の自由ソース形式がデフォルトで使用できます。 これを固定ソース形式に使用するには、-qfixed オプションを使用する必要があります。 I/O 形式は、これらのコマンドとそれ以外のコマンドではわずかに異なっています。 また I/O 形式も、 f90xlf90 および xlf90_r コマンドのセットと、 f95, xlf95 および xlf95_r コマンドのセットで異なっています。 できる限り、データ・ファイルに関しては Fortran 95 形式に切り替えることをお勧めします。

デフォルトでは、f90xlf90 および xlf90_r コマンドは Fortran 90 標準に完全に準拠しているわけではありません。 さらに、f95xlf95 および xlf95_r コマンドも デフォルトで Fortran 95 標準に完全に準拠しているわけではありません。 Fortran 90 または Fortran 95 完全準拠が必要な場合、次のコンパイラー・オプション (およびサブオプション) の いずれかを指定してコンパイルしてください。

-qnodirective -qnoescape -qextname -qfloat=nomaf:nofold -qnoswapomp
-qlanglvl=90std
-qlanglvl=95std

また、プログラムを実行する前に、次のようなコマンドの 1 つを使用して実行時オプションを指定してください。

export XLFRTEOPTS="err_recovery=no:langlvl=90std"
export XLFRTEOPTS="err_recovery=no:langlvl=95std"

デフォルト設定は、パフォーマンスと使いやすさの最善の組み合わせが得られるように設計されています。 したがって、通常、デフォルト設定は必要な場合にだけ変更するようにしてください。 上記のオプションの一部は、非常に特殊な状況で適合性を得るためにだけ必要です。 たとえば、-qextname は、共通ブロックやサブプログラムなどの外部シンボルの 1 つに main という 名前が付いている場合にだけ必要になります。

XL Fortran SMP プログラムのコンパイル

xlf_rxlf90_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 行で指定されたライブラリーにリンクします。

POSIX pthreads API サポートのレベル

XL Fortran では 、IEEE 1003.1-2001 (POSIX) 標準 pthreads API を使用したスレッド・プログラミングが サポートされます。

標準インターフェース・ライブラリーを指定してプログラムをコンパイルおよびリンクするには、 xlf_rxlf90_r、または xlf95_r コマンドを使用します。 たとえば、次のように指定します。

xlf95_r test.f

Fortran プログラムのコンパイル順序

モジュールを使用するプログラム単位、サブプログラム、またはインターフェース本体がある場合、 先にモジュールをコンパイルする必要があります。 モジュール、およびモジュールを使用するコードが別個のファイルに入っている場合、 モジュールが入っているファイルを最初にコンパイルする必要があります。 同じファイルに入っている場合は、モジュールは、 ファイル内のモジュールを使用するコードの前になければなりません。 モジュールにあるエンティティーを変更する場合、 そのモジュールを使用するファイルをすべて再コンパイルする必要があります。

コンパイルの取り消し

コンパイルの完了前にコンパイラーを停止するには、 対話モードで Ctrl+C を入力するか、 kill コマンドを使用してください。

XL Fortran 入力ファイル

コンパイラーへの入力ファイルには次のものがあります。

ソース・ファイル (.f または .F サフィックス)
.f.f77.f90.f95 および .F ファイルはすべて、 コンパイル用のソース・ファイルです。 コンパイラーは、指定されたソース・ファイルをコマンド行で指定された順序でコンパイルします。 指定されたソース・ファイルが見つからない場合、コンパイラーはエラー・メッセージを作成し、次のファイルがあれば、その ファイルの処理に移ります。 サフィックス .F を持つファイルは、コンパイルされる前にまず、 C プリプロセッサー (cpp) に渡されます。

インクルード・ファイルもソースを含んでいて、.f 以外のサフィックスを持っていることがしばしばあります。

関連情報:

構成ファイルのカスタマイズおよび -qsuffix オプションに記載されている fsuffix および cppsuffix 属性を 使用する場合は、別のサフィックスを選択します。

オブジェクト・ファイル (.o サフィックス)
.o ファイルはすべてオブジェクト・ファイルです。 コンパイラーはソース・ファイルをコンパイルした後、その結果作成された .o ファイルと、 入力ファイルとして指定した .o ファイル、およびプロダクト・ディレクトリーや システム・ライブラリー・ディレクトリーにあるいくつかの .o ファイルや .a ファイルを、ld コマンドを使用してリンク・エディットし、1 つの実行可能出力ファイルを作成します。
関連情報:

osuffix 属性 (構成ファイルのカスタマイズおよび -qsuffix オプションに説明されている) を使用して、 別のサフィックスを選択することができます。

アセンブラー・ソース・ファイル (.s サフィックス)
コンパイラーは、指定された .s ファイルをアセンブラー (as) に送ります。 アセンブラー出力は、リンク時にリンカーに送られるオブジェクト・ファイルから構成されます。
関連情報:
ssuffix 属性 (構成ファイルのカスタマイズおよび -qsuffix オプションに説明されている) を使用して、 別のサフィックスを選択することができます。
共用オブジェクトまたはライブラリー・ファイル (.so サフィックス)
実行時にマルチプロセスによってロードされ共用されることが可能なオブジェクト・ファイルです。 リンク時に共用オブジェクトが指定されると、 オブジェクトに関する情報は出力ファイルに記録されますが、 共用オブジェクトからのコードは実際に出力ファイルには含まれません。
構成ファイル (.cfg サフィックス)
構成ファイルの内容は、コンパイル・プロセスの多くの面 (最も一般的なのは、 コンパイラーのデフォルト・コンパイル・オプション) を決定します。 構成ファイルによって、各種のデフォルト時コンパイラー・オプションをまとめたり、 1 つのシステム上に複数のレベルの XL Fortran コンパイラーを残すことができます。

デフォルトの構成ファイルは /etc/opt/ibmcmp/xlf/10.1/xlf.cfg です。

関連情報:
構成ファイルの選択に関する情報については、構成ファイルのカスタマイズおよび -F オプションを 参照してください。
モジュール・シンボル・ファイル (modulename.mod)
モジュール・シンボル・ファイルは、モジュールのコンパイルから作成された出力ファイルであり、 そのモジュールを使用するファイルの以降のコンパイル用の入力ファイルになります。 個々のモジュールに対して .mod ファイルが 1 つずつ作成され、したがって、 ソース・ファイルを 1 つコンパイルすると、複数の .mod ファイルが作成できます。
関連情報:
-I オプション -qmoddir オプションを参照してください。
プロファイル・データ・ファイル

-qpdf1 オプションは、 以降のコンパイルで使用する、実行時プロファイル情報を作成します。 この情報は、 パターン「.*pdf*」に一致する名前で 1 つ以上の隠しファイルに格納されます。

関連情報:
-qpdf オプションを参照してください。

XL Fortran 出力ファイル

XL Fortran が提供する出力ファイルは、以下のとおりです。

実行可能ファイル (a.out)
デフォルト時、 XL Fortran は現行ディレクトリーに a.out という名前の実行可能ファイルを作成します。
関連情報:
別の名前を選択することについての情報は -o オプションを、 オブジェクト・ファイルのみを生成することについての情報は -c オプションを それぞれ参照してください。
オブジェクト・ファイル (filename.o)
-c コンパイラー・オプションを指定すると、 コンパイラーは実行可能ファイルを作成する代わりに、 指定された個々の .f ソース・ファイルに対してオブジェクト・ファイルを 1 つ作成し、 アセンブラーは指定された個々の .s ソース・ファイルに対してオブジェクト・ファイルを 1 つ作成します。 デフォルト時には、オブジェクト・ファイルはソース・ファイルと同じファイル名プレフィックスを持ち、 現行ディレクトリーに存在します。
関連情報:
-c オプションおよび XL Fortran プログラムのリンクを参照してください。オブジェクト・ファイルの名前変更についての情報は、-o オプションを参照してください。
アセンブラー・ソース・ファイル (filename.s)
-S コンパイラー・オプションを指定すると、 XL Fortran コンパイラーは実行可能ファイルを作成する代わりに、 指定された個々の .f ソース・ファイルに対して同等のアセンブラー・ソース・ファイルを 1 つ作成します。 デフォルト時には、アセンブラー・ソース・ファイルはソース・ファイルと同じファイル名プレフィックスを持ち、 現行ディレクトリーに存在します。
関連情報:
-S オプションおよび XL Fortran プログラムのリンクを参照してください。アセンブラー・ソース・ファイルの名前変更についての情報は、 -o オプションを参照してください。
コンパイラー・リスト・ファイル (filename.lst)
デフォルト時には、 1 つ以上のリスト関連のコンパイラー・オプションを指定しない限り、リストは作成されません。 リスト・ファイルは現行ディレクトリーに入れられ、 ソース・ファイルと同じファイル名プレフィックスと、 拡張子 .lst を持っています。
関連情報:
モジュール・シンボル・ファイル (modulename.mod)
個々のモジュールには、そのモジュールを使用するプログラム単位、サブプログラム、 インターフェース本体によって必要とされる情報が含まれる関連のシンボル・ファイルがあります。 デフォルト時には、 これらのシンボル・ファイルは現行ディレクトリーに入っている必要があります。
関連情報:
別のディレクトリーに .mod ファイルを書き込むことに関する情報については、 -qmoddir オプションを参照してください。
cpp プリプロセス済みソース・ファイル (Ffilename.f)
サフィックス .F を持つファイルをコンパイルする時に -d オプションを指定すると、 C プリプロセッサー (cpp) によって作成された中間ファイルが削除されないで保管されます。
関連情報:
プロファイル・データ・ファイル (.*pdf*)
これらのファイルは -qpdf1 オプションによって生成され、 それ以後のコンパイルで、実際の実行結果に基づく最適化を調整するために使用されます。
関連情報:
-qpdf オプションを参照してください。

オプション設定の有効範囲と優先順位

3 つの位置のいずれかにコンパイラー・オプションを指定することができます。 有効範囲と優先順位は、使用する位置で定義されます。 (XL Fortran は、SOURCEFORM などの、オプション設定を指定 できるコメント・ディレク ティブも持っています。 そのようなディレク ティブの有効範囲と 優先順位に関する一般的な 規則はありません。)

位置 有効範囲 優先順位
構成ファイルのスタンザの中 実際にそのスタンザでコンパイルされたすべてのファイル内のすべてのコンパイル単位。 下位
コマンド行 そのコマンドでコンパイルされたすべてのファイル内のすべてのコンパイル単位。 中間
@PROCESS ディレクティブ
(XL Fortran は、SOURCEFORM
などの、オプション設定を指定
できるコメント・ディレク
ティブも持っています。
そのようなディレク
ティブの有効範囲と
優先順位に関する一般的な
規則はありません。)
次のコンパイル単位 上位

異なる設定で複数回オプションが指定されると、通常は最後の設定が効力を発します。 例外はどれも XL Fortran コンパイラー・オプションの詳細記述の個々の説明に示され、「競合オプション」という索引が付けられています。

コマンド行でのオプションの指定

XL Fortran は、従来の UNIX(R) によるコマンド行オプションの指定方法をサポートしています。 この方法では、次のように、負符号 (-) の後に 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 )-'
 

option
これは、-q を持たないコンパイラー・オプションの名前です。
suboption
コンパイラー・オプションのサブオプションです。

固定ソース形式では、@PROCESS は 1 桁目から、または 6 桁目より後に開始できます。 自由ソース形式では、@PROCESS コンパイラー指示はどの桁からでも開始できます。

ステートメント・ラベルまたはインライン・コメントを @PROCESS コンパイラー指示と同じ行に入れることはできません。

デフォルト時には、@PROCESS コンパイラー指示で指定するオプション設定は、 文が存在するコンパイル単位に対してのみ有効です。 ファイルが複数のコンパイル単位を持っている場合は、オプション設定は、 次の単位がコンパイルされる前に、元の状態にリセットされます。 DIRECTIVE オプションによって指定されたトリガー定数は、 ファイルの終わりまで (または NODIRECTIVE が処理されるまで) 有効です。

@PROCESS コンパイラー指示は、通常、 コンパイル単位の最初の文の前になければなりません。 唯一の例外は、SOURCE および NOSOURCE を指定する場合です。 この 2 つは、コンパイル単位内のいかなる場所にある @PROCESS ディレクティブでも使用することができます。

コマンド行オプションの「ld」または「as」コマンドへの引き渡し

コンパイラーは、コンパイル中に必要に応じて他のコマンド (たとえば ld および as) を自動的に実行するので、 通常は、これらのコマンドのオプションにユーザーが関与する必要はありません。 これらの個々のコマンドに対してオプションを選択したい場合は、次のようにできます。

関連情報:
-W オプションおよび 構成ファイルのカスタマイズを参照してください。

バイナリー・ファイル内の情報の表示 (strings)

strings コマンドは、以下のようにいくつかのバイナリー・ファイルに エンコードされている情報を読み取ります。

たとえば、/opt/ibmcmp/xlf/10.1/exe/xlfentry にエンコードされた情報を見るには、次のコマンドを発行します。

strings /opt/ibmcmp/xlf/10.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 プリプロセッサーによる Fortran ファイルの引き渡し

一般的なプログラミングの慣例では、 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 プリプロセスをカスタマイズできるようにするため、 構成ファイルは属性 cppcppsuffix、および cppoptions を受け入れます。

文字 F は、 オプション -t および -W を持つ C プリプロセッサーを表します。

関連情報:
-d オプション-t オプション-W オプション、 および 構成ファイルのカスタマイズを参照してください。

XL Fortran プログラムに対する cpp ディレクティブ

マクロ展開は、予期しない結果 (たとえば、FORMAT 文の変更や、固定ソース形式で 72 文字よりも長い行の作成など) を招いてデバッグが困難になる場合があるため、cpp は主に Fortran プログラムの 条件付きコンパイルに使用することをお勧めします。 条件付きコンパイルに最も頻繁に使用される cpp ディレクティブは、#if#ifdef#ifndef#elif#else#endif です。

C プリプロセッサーへのオプションの引き渡し

コンパイラーは -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/10.1/exe/cpp で見つかった cpp を使用します。 これは ISO C に準拠しているため、3 文字表記シーケンスを認識します。