プログラムの最適化とパフォーマンス

cachetest のパフォーマンスデータを収集したことを確認してください。 これらの作業が完了していない場合は、cachetest サンプルのデータ収集を参照して実行してください。

以降では、-O2-fast の最適化オプションがプログラムパフォーマンスに及ぼす影響を検討します。 コードに対して行なった変換は、注釈付きソースコードに入っているコンパイラコメントメッセージで示されます。

  1. 以下の作業がまだ済んでいない場合には、実行してください。
    1. 「ファイル」 and choose 「実行を開く」を選択して cpi.er を開きます。
    2. 「ファイル」 and choose 「実験ファイルの追加」を選択して dcstall.er を追加します。
    3. 「表示」and choose「データ表示方法の設定」を選択し、時間値としての「CPU サイクル」と「実行した命令」のメトリックを選択します。
    4. 「関数」タブの「名前」欄のヘッダをクリックします。
  2. dgemv_opt1dgemv_opt2 のメトリックを dgemv_g1dgemv_g2 のメトリックと比較します。

    ソースコードは、dgemv_g1dgemv_g2 のソースコードと同じです。 違いは、dgemv_opt1dgemv_opt2 がコンパイラオプション -O2 を使用してコンパイルされたという点です。 いずれの関数の場合も、ユーザー CPU 時間と CPU サイクルのどちらにおいても CPU 時間は同じだけ減少しており、実行した命令の数も同じだけ減少していますが、キャッシュの動作はいずれの関数においても向上していません。

  3. 「関数」タブで dgemv_opt1dgemv_opt2 のメトリックを dgemv_hi1dgemv_hi2 のメトリックと比較します。

    ソースコードは、dgemv_opt1dgemv_opt2 のソースコードと同じです。 違いは、dgemv_hi1dgemv_hi2 がコンパイラオプション -fast を使用してコンパイルされたという点です。 どちらのルーチンも、CPU 時間とキャッシュパフォーマンスは同じです。 CPU 時間とキャッシュストールサイクル時間は、dgemv_opt1dgemv_opt2 より減少しています。 読み込みのためのキャッシュ待ち時間は、実行時間のほぼ 80% を占めます。

  4. dgemv_hi1 をクリックし、「ソース」タブをクリックします。 画面のサイズを変更してスクロールし、dgemv_hi1 全体のソースコードを表示します.

    コンパイラは、はるかに多くの仕事を行なってこのルーチンを最適化します。 コンパイラは、DTLB ミスの原因であるループを交換します。 さらに、1 つのループサイクルに浮動小数点加算演算と浮動小数点乗算演算がより多くあるループを新たに作成し、プリフェッチ命令を挿入してキャッシュ動作を改良しています。

  5. dgemv_hi2 のソースコードが見えるように下方向にスクロールします。

    コンパイラコメントメッセージは、ループ交換以外の点では dgemv_hi1 の場合と同じです。 2 つのバージョンの関数に対してコンパイラが生成したアセンブリコードは、基本的には同じものです。

  6. 「逆アセンブリ」タブをクリックします。

    dgemv_g1 または dgemv_opt1 とその逆アセンブリリストを比較します。 dgemv_hi について生成される命令はほかに数多くありますが、3 種類の関数バージョンの中で最も少ない数の命令が実行されます。 最適化の結果、命令の数は多くなり得ますが、その使用方法はより効率的であり、使用頻度は低いのです。

関連項目
「関数」タブ
「ソース」タブ
「逆アセンブリ」タブ
データフロー問題の調査


著作権と商標について