私はいくつかのコードを分析し、cachegrindを使用して実行中のキャッシュミス(L2とL3)の数を取得しています。
私の質問は、キャッシュミスに基づいて、キャッシュが準備完了になるのを待つために費やす時間をどのように決定するかです。
「私のコードは90%のCPU使用率を取得します」のようなことを言いたいです
キャッシュグラインド出力に基づいてこれを行うことは可能ですか?
私はいくつかのコードを分析し、cachegrindを使用して実行中のキャッシュミス(L2とL3)の数を取得しています。
私の質問は、キャッシュミスに基づいて、キャッシュが準備完了になるのを待つために費やす時間をどのように決定するかです。
「私のコードは90%のCPU使用率を取得します」のようなことを言いたいです
キャッシュグラインド出力に基づいてこれを行うことは可能ですか?
Cachegrind は単に CPU での実行をシミュレートし、キャッシュと分岐予測子がどのように動作するかをエミュレートします。キャッシュのブロックに費やす時間を知るには、さらに多くの情報が必要です。具体的には、いつ実行を推測できるか、および並列にディスパッチできる命令の数 (およびメモリ メモリ アクセスを同時に調整する方法) を知る必要があります。Cachegrind はこれを行うことができず、プロセッサに大きく依存する可能性のあるツールはすべて実行できません (一方、キャッシュ ミスはプロセッサにあまり依存しません)。
最新の Intel CPU を使用できる場合は、VTune の無料コピーを (非営利目的で) 入手して、内容を確認することをお勧めします。キャッシュ ミスに関するデータを収集するようにプロセッサに指示し、それを報告することができるため、単にシミュレートするのではなく、実際に何が起こったのかを確認できます。コードの各行の命令ごとのクロックを提供します。これを使用すると、キャッシュでブロックされている行 (およびその時間) を確認できます。また、cachegrind が提供できる他のすべての情報も提供できます。
ここで入手できます:
http://software.intel.com/en-us/articles/non-commercial-software-download/
変数は、数クロック サイクルでキャッシュからフェッチできます。
キャッシュにない場合、RAM からフェッチするのに 100 クロック サイクル以上かかることがあります。
確実にする唯一の方法は、CPU のパフォーマンス監視カウンターを使用して特定の CPU を測定することです。それでも、結果は非常に具体的であり、これに基づいて行う最適化は、キャッシュ サイズやバス アーキテクチャが異なる CPU ではパフォーマンスが非常に悪い場合があります。またはメモリ構成。