L2 キャッシュ ミスが CPU の消費電力に与える影響を調べたい。これを測定するには、コア アクティビティ (サイクルごとに実行されるマイクロ操作) と L2 アクティビティ (サイクルごとの L2 要求) が一定のままで、L2 要求に対する L2 ミスの比率が一定になるように、ワーキング セットのサイズを徐々に増やすベンチマークを作成する必要があります。増加します。
「N」回の L2 キャッシュミスを強制する C プログラムの例を誰かに教えてもらえますか?
L2 キャッシュ ミスが CPU の消費電力に与える影響を調べたい。これを測定するには、コア アクティビティ (サイクルごとに実行されるマイクロ操作) と L2 アクティビティ (サイクルごとの L2 要求) が一定のままで、L2 要求に対する L2 ミスの比率が一定になるように、ワーキング セットのサイズを徐々に増やすベンチマークを作成する必要があります。増加します。
「N」回の L2 キャッシュミスを強制する C プログラムの例を誰かに教えてもらえますか?
一般に、キャッシュ レベル1よりも大きなワーキング セットにランダムにアクセスすることで、あるキャッシュ レベルで強制的にキャッシュ ミスを発生させることができます。
任意のロードがミスになる確率は次のようになると予想されます。ここでp(hit) = min(100, C / W)
、とはヒットとミスの確率、は関連するキャッシュ サイズ、はワーキング セット サイズです。したがって、ミス率が 50% の場合は、キャッシュ サイズの 2 倍のワーキング セットを使用します。p(miss) = 1 - p(hit)
p(hit)
p(miss)
C
W
上記の式をざっと見てみると、 W が無限大になると 0 になるだけp(miss)
なので、100% になることは決してないことがC/W
わかります (おそらく無限の RAM を用意する余裕はありません)。したがって、オプションは次のとおりです。
非常に大きなワーキング セット (たとえば、4 GB では 256 KB で 99% 以上のミスの可能性がある) を使用して「十分に近づける」ようにし、ミス率が 100% のふりをします。
数式を適用して、実際に予想されるミス数を決定します。たとえば、256 KB の L2 キャッシュに対して 2560 KB の作業サイズを使用している場合、ミス率は 90% になります。したがって、1,000 回のミスの影響を調べる場合、約 1,000 回のミスを得るには、1000 / 0.9 = ~1111 のメモリ アクセスを行う必要があります。
おおよそのアプローチを使用しますが、CPU のパフォーマンス カウンター ユニットを使用して、発生したミスの数を実際にカウントします。たとえば、Linux ではPAPIを使用でき、Linux と Windows では Intel のPCMを使用できます(Intel ハードウェアを使用している場合)。
「ほぼランダムな」アプローチを使用して、必要なミスの数を強制します。上記の式はランダム アクセスに有効ですが、「最近の」アクセスを繰り返さないという注意を払ってランダムになるようにアクセス パターンを選択すると、100% のミス率を得ることができます。ここで「最近」とは、まだキャッシュ内にある可能性が高いキャッシュ ラインへのアクセスを意味します。それが正確に何を意味するのかを計算するのは難しく、詳細はキャッシュの連想性と置換アルゴリズムに依存しますが、最後のcache_size * 10
アクセスで発生したアクセスを繰り返さなければ、かなり安全なはずです。
C コードに関しては、少なくとも試したことを示す必要があります。基本的な概要は、必要なサイズのバイトや整数などのベクトルを作成し、そのベクトルにランダムにアクセスすることです。各アクセスを以前のアクセスに依存させる場合 (たとえば、整数読み取りを使用して次の読み取りのインデックスを計算する)、そのレベルのキャッシュのレイテンシの大まかな測定値も得られます。アクセスが独立している場合は、キャッシュに対して未解決のミスが一度にいくつか発生し、単位時間あたりのミスが増える可能性があります。どちらに興味があるかは、何を勉強しているかによって異なります。
さまざまなストライドとワーキング セットのサイズでこの種のメモリ テストを行うオープン ソース プロジェクトについては、TinyMemBenchをご覧ください。
1これは、コア間で共有されるキャッシュのレベル (たとえば、最近の Intel チップの通常は L3) では少しトリッキーになりますが、テスト中にマシンが非常に静かな場合はうまく機能するはずです。