プログラムに多数のサブプログラム呼び出しがある場合、-Q オプションを使用してインライン化をオンにすることができます。これにより、このような呼び出しのオーバーヘッドが削減されます。 prof または |gprof でそれぞれ -p または -pg オプションを使用して、最も頻繁に呼び出されるサブプログラムを判別し、コマンド行にその名前をリストすることを検討してください。
呼び出す側のサブプログラムと呼び出されたサブプログラムが別のソース・ファイルにある場合に、インライン化を呼び出しに適用させるために、-qipa オプションも入れてください。
# Let the compiler decide (relatively cautiously) what to inline. xlf95 -O3 -Q inline.f # Encourage the compiler to inline particular subprograms. xlf95 -O3 -Q -Q+called_100_times:called_1000_times inline.f # Extend the inlining to calls across files. xlf95 -O3 -Q -Q+called_100_times:called_1000_times -qipa inline.f
特定プログラムに対してインライン化の正しい量を知るには、ユーザー・サイドで行わなければならない作業がいくつかある場合があります。コンパイラーには、インライン化を多量に行うことを避けるために多数の防護手段および限界があります。そうでなければ、コンパイル中のストレージの制約が原因で、コンパイラーが実行する全体にわたる最適化が少なくなったり、その結果作成されたプログラムが大きくなりすぎて、キャッシュ・ミスおよびページ不在がより頻繁になるために実行スピードが遅くなります。ただし、これらの防護手段は、インライン化したいサブプログラムをコンパイラーがインライン化することを妨げることがあります。この事態が発生した場合、パフォーマンス面の恩恵を得るために、分析または作業のやり直し、またはその両方を行う必要があります。
一般的な規則として、最も頻繁に呼び出されるごく少ないサブプログラムを識別して、それらのサブプログラムだけをインライン化することを考えてください。
-Q がサブプログラムをインライン化しない一般的な条件は次のとおりです。
3 つのプロシージャーを例として考えてみましょう。A は呼び出し元で、 B と C は自動インライン化のためのサイズの上限があるものとします。これらはすべて同じファイル内にあり、これは次のようにコンパイルされます。
xlf -Q -Q+c file.f
-Q オプションは、B または C への呼び出しがインライン化できることを意味します。 -Q+c は、C の呼び出しがインライン化されやすいことを意味します。 B および C のサイズが 2 倍である場合、B の呼び出しはインライン化されず、C の呼び出しのいくつかはインライン化されます。
これらの制限は、A から B、または A から C への呼び出しがインライン化されるのを回避しますが、コンパイラーが処理 A を完了した後で、プロセスが再び最初からやり直されます。
インラインを制御するサイズの限界を変更するために、-qipa=limit=n を使用することができます。この n は 0 から 9 です。値をより大きくすれば、さらにインライン化することができます。