cachetest のパフォーマンスデータを収集したことを確認してください。 これらの作業が完了していない場合は、cachetest サンプルのデータ収集を参照して実行してください。
以降では、-O2 と -fast の最適化オプションがプログラムパフォーマンスに及ぼす影響を検討します。 コードに対して行なった変換は、注釈付きソースコードに入っているコンパイラコメントメッセージで示されます。
ソースコードは、dgemv_g1 と dgemv_g2 のソースコードと同じです。 違いは、dgemv_opt1 と dgemv_opt2 がコンパイラオプション -O2 を使用してコンパイルされたという点です。 いずれの関数の場合も、ユーザー CPU 時間と CPU サイクルのどちらにおいても CPU 時間は同じだけ減少しており、実行した命令の数も同じだけ減少していますが、キャッシュの動作はいずれの関数においても向上していません。
ソースコードは、dgemv_opt1 と dgemv_opt2 のソースコードと同じです。 違いは、dgemv_hi1 と dgemv_hi2 がコンパイラオプション -fast を使用してコンパイルされたという点です。 どちらのルーチンも、CPU 時間とキャッシュパフォーマンスは同じです。 CPU 時間とキャッシュストールサイクル時間は、dgemv_opt1 と dgemv_opt2 より減少しています。 読み込みのためのキャッシュ待ち時間は、実行時間のほぼ 80% を占めます。
コンパイラは、はるかに多くの仕事を行なってこのルーチンを最適化します。 コンパイラは、DTLB ミスの原因であるループを交換します。 さらに、1 つのループサイクルに浮動小数点加算演算と浮動小数点乗算演算がより多くあるループを新たに作成し、プリフェッチ命令を挿入してキャッシュ動作を改良しています。
コンパイラコメントメッセージは、ループ交換以外の点では dgemv_hi1 の場合と同じです。 2 つのバージョンの関数に対してコンパイラが生成したアセンブリコードは、基本的には同じものです。
dgemv_g1 または dgemv_opt1 とその逆アセンブリリストを比較します。 dgemv_hi について生成される命令はほかに数多くありますが、3 種類の関数バージョンの中で最も少ない数の命令が実行されます。 最適化の結果、命令の数は多くなり得ますが、その使用方法はより効率的であり、使用頻度は低いのです。
関連項目 | |
---|---|
「関数」タブ 「ソース」タブ 「逆アセンブリ」タブ データフロー問題の調査 |