5.3.2. Cachegrind を使ったキャッシュ使用量のプロファイリング
Cachegrind は、プログラムとマシンのキャッシュ階層、また (オプションで) 分岐予測との対話をシミュレートします。シミュレートされた第一レベルの指示とデータキャッシュの使用を追跡し、このレベルのキャッシュで不十分なコード対話を検出します。また、最後のレベルのキャッシュ (2 番目でも 3 番目でも) でメインメモリへのアクセスを追跡します。このため、Cachegrind で実行されるプログラムは、通常の実行時に比べて 20-100 倍の時間がかかります。
Cachegrind を実行するには、以下のコマンドで program の部分を Cachegrind でプロファイリングするプログラムに置き換えて実行します。
# valgrind --tool=cachegrind program
Cachegrind は、プログラム全体で、またプログラムの各機能ごとに以下の統計を収集します。
- 第 1 レベルの指示キャッシュ読み取り (または実行された指示) と読み取りミス、および最終レベルのキャッシュ指示読み取りミス
- データキャッシュ読み取り (またはメモリ読み取り)、読み取りミス、最終レベルのキャッシュデータ読み取りミス
- データキャッシュ書き込み (またはメモリ書き込み)、書き込みミス、最終レベルのキャッシュ書き込みミス
- 実行済みおよび間違って予測された条件分岐
- 実行済みおよび間違って予測された間接分岐
Cachegrind はこれらの統計のサマリー情報をコンソールに印刷し、ファイル (デフォルトで
cachegrind.out.pid
。ここでの pid は Cachegrind を実行するプログラムのプロセス IDになります) により詳細なプロファイリング情報を書き込みます。このファイルは以下のように、付随する cg_annotate ツールでさらに処理可能です。
# cg_annotate cachegrind.out.pid
注記
cg_annotate は、パスの長さによって 120 文字以上の行を出力することが可能です。出力を明確にして読みやすくするには、前記のコマンドを実行する前に端末ウィンドウを少なくともこの幅に広げておくことが推奨されます。
また、Cachegrind が作成したプロファイルファイルを比較して、変更前後でのプログラムパフォーマンスをより簡単に図表にすることもできます。これを行うには、以下のように cg_diff コマンドを実行し、first を初期プロファイル出力ファイルで、second をその後に続くプロファイル出力ファイルで置き換えます。
# cg_diff first second
このコマンドで組み合わされた出力ファイルが作成され、その詳細は cg_annotate で見ることができます。
Cachegrind には出力をフォーカスする多くのオプションがあります。以下にその例を挙げます。
--I1
- コンマ区切りで最初のレベルの指示キャッシュのサイズ、結合性、行のサイズを指定します:
--I1=size,associativity,line size
. --D1
- コンマ区切りで最初のレベルのデータキャッシュのサイズ、結合性、行のサイズを指定します:
--D1=size,associativity,line size
. --LL
- コンマ区切りで最終レベルのキャッシュのサイズ、結合性、行のサイズを指定します:
--LL=size,associativity,line size
. --cache-sim
- キャッシュアクセスおよびミスの数の収集を有効化/無効化します。デフォルト値は
yes
(有効) です。このオプションと--branch-sim
の両方を無効にすると、Cachegrind には収集する情報がなくなります。 --branch-sim
- 分岐指示および予想を誤った数の収集を有効化/無効化します。これは Cachegrind を約 25% 遅くするので、デフォルトは
no
(無効) に設定されています。このオプションと-cache-sim
の両方を無効にすると、Cachegrind には収集する情報がなくなります。
オプションの全一覧は、
/usr/share/doc/valgrind-version/valgrind_manual.pdf
にある資料を参照してください。