VsPerfCmd.exe を使用して、インストルメント化されたネイティブ アプリケーションで分岐の予測ミスと最終レベルのキャッシュ ミスをプロファイリングしようとしています。
設定はTinに記載されているとおりに機能しますが、得られる結果は賢明ではないようです。たとえば、常に 24MB のデータ セットにアクセスする関数は、約 2000 回呼び出されたときに、約 700 のキャッシュ ミスしか発生しないと報告されています。これを概観してみましょう - 関数は、12 バイト要素の 1024*1024 要素の 2 つの配列を直線的にトラバースします。すべての要素について、その前または後の要素 1024 インデックスの情報が必要かどうかをランダムに決定します。つまり、キャッシュ ミスを発生させないためには、CPU は常に、キャッシュ内にこれら両方の配列のそれぞれに 1024*12 バイトの少なくとも 3 つのセクションを持たなければなりません。さらに、各反復の後、プロセスは約 8 ミリ秒間 sleep() を使用して CPU を解放します。ハードウェア プリフェッチャーがこれほど優れた仕事をしているとは想像できません。
このばかげた量のデータが、VsPerfCmd が言うよりも多くの最終レベルのキャッシュ ミスを生成しないのはどうしてでしょうか? 私の i7 には 8MB の共有 L3 キャッシュがありますが、これはほとんどありそうにありません。ここで何が起こっているのかについて、誰か意見を共有できますか? もちろん、「VsPerfCmd.exe はひどい」というのは有効な答えですが、誰かがそう言うなら、少なくとも、この主張の根拠として誰かが経験した同様の経験を聞きたいです。