最適化を使用するコンパイル

最適なパフォーマンスを達成するプログラムを生成する最初のステップは、 コンパイラーに組み込まれている基本的な最適化フィーチャーを利用することです。

最適化を指定してコンパイルすることによって、 プログラム・チューニングの結果であるスピードアップを増加することができ、 ある種のチューニングを行う必要がなくなります。

推奨事項

最適化のための以下のガイドラインに従ってください。

  • コンパイルする任意の実動レベルの FORTRAN、C、 または C++ プログラムに -O2 または -O3 -qstrict を使用します。 高性能 FORTRAN (HPF) プログラムの場合には、-qstrict オプションを使用しないでください。
  • ホット・スポットがループであるか、または配列言語であるプログラムの場合には、-qhot オプションを使用してください。 HPF プログラムには常に -qhot オプションを使用してください。
  • コンパイル時間が特に問題にならない場合には、 開発サイクルの最後に近づいてから -qipa オプションを使用してください。

-qipa オプションは、プロシージャー間分析 として知られる最適化のクラスを活動化またはカスタマイズします。 -qipa オプションには幾つかのサブオプションがあります。サブオプションの説明はコンパイラーのマニュアルにあります。 このオプションは、次の 2 つの方法で使用することができます。

  • 最初の方法は、 コンパイルとリンクの両方のステップで、-qipa オプションを使用してコンパイルします。 コンパイル時に、 コンパイラーはプロシージャー間分析情報を .o ファイルに保管します。 リンク時に、-qipa オプションによって、 アプリケーション全体の完全な再コンパイルが実行されます。
  • 2 番目の方法は、-p/-pg オプションを指定して (-qipa を指定して、または指定しないで)、 プロファイルを作成するためにプログラムをコンパイルし、データの典型的なセットに対して実行します。 次に、結果のデータを、-qipa を指定した後続のコンパイルへの入力として使用して、 コンパイラーが、最も頻繁に使用される 2 番目以降のプログラムの最適化に集中できるようにします。

-O4 を使用することは、-O3 -qipa を使用することと同じで、そのプラットフォームに最適なアーキテクチャーとチューニング・オプションが自動生成されます。 -O5 フラグは、-O4 と類似していますが、 -qipa= level = 2 である点が異なります。

コンパイラーの最適化の使用には、以下の利点があります。

分岐の最適化
プログラム・コードを再配置して、分岐のロジックを最小化し、物理的に離れているコードのブロックを結合します。
コードの移動
ループ内の計算で使用される変数がループ内で変更されない場合、 計算をループの外側で実行し、結果をループ内で使用することができます。
共通副次式の除去
共通式では、後続の式で同じ値が再計算されます。 以前の値を使用することによって、重複する式を除去することができます。
定数の伝搬
式内で使用される定数が結合され、新規の定数が生成されます。 整数型と浮動小数点型の間のいくつかの暗黙の型変換が実行されます。
デッド・コードの除去
到達できないコードまたは結果が以後使用されないコードを除去します。
デッド・ストアの除去
保管された値が再び参照されない場合の保管内容を除去します。 例えば、同じロケーションへの 2 回の保管の間にロードがない場合、 最初の保管内容は不要なので除去されます。
グローバル・レジスターの割り当て
変数および式を使用可能なハードウェア・レジスターへ、 「グラフ・カラー化」アルゴリズムを使用して割り当てます。
インライン化
関数呼び出しを実際のプログラム・コードで置換します。
命令のスケジューリング
実行時間を最小化するために、命令の順序を変更します。
プロシージャー間分析
関数呼び出し間の関係を明らかにし、 より単純な最適化では除去できないロード、保管、および計算を除去します。
変化しない IF コードの移動 (スイッチングなし)
ループから変化しない分岐コードを除去して、他の最適化の機会を増やします。
プロファイル主導のフィードバック
サンプル・プログラムの実行の結果が、条件付き分岐近くで、 また、頻繁に実行されるコード・セクションで、最適化の改善に使用されます。
再関連付け
共通式の除去用のより多くの候補を生成するために、 配列添え字式内の一連の計算を再配置します。
保管の移動
保管命令をループから移動します。
強度の削減
非効率的な命令を、より効率的な命令で置換します。 例えば、配列の添え字付けでは、乗算命令を加算命令で置換します。
値の番号付け
定数の伝搬、式の除去、および複数の命令の単一の命令への変換を含みます。

最適化なしでコンパイルする必要がある場合

シンボリック・デバッガーを使用してデバッグするプログラムには、-g オプションの使用の有無に関係なく、-O オプションを使用しないでください。 ただし、最適化は HPF プログラムにとって非常に重要なので、 デバッグ中でも -O3 -qhot を使用してください。

最適化プログラムは、アセンブラー言語命令を再配置するので、 個々の命令を 1 行のソース・コードにマップすることは困難になります。 -g オプションを使用してコンパイルすると、この再配置によって、 シンボリック・デバッガーを使用した場合に、 ソース・レベル・ステートメントが正しくない順序で実行されているかのように見える可能性があります。

いずれかの -O オプションを使用してコンパイルした時に、 プログラムが正しくない結果を生成した場合には、 プログラムのプロシージャー参照で、変数に意図せずに別名を割り当てていないかどうかを調べてください。