メイン メモリ、L1 および L2 キャッシュのレイテンシの統計データを扱っているこのリンクを調べていました。
ベンチマーク ツールを使用せずに C/c++ コードを使用して同じことを計算することは可能でしょうか?
メイン メモリ、L1 および L2 キャッシュのレイテンシの統計データを扱っているこのリンクを調べていました。
ベンチマーク ツールを使用せずに C/c++ コードを使用して同じことを計算することは可能でしょうか?
LMBench などのベンチマーク ツールは C で記述されています。そのため、C で実行できるかどうかを尋ねると、答えは単純に「はい」です。
LMBench は、lat_mem_rd.c
ポインターの間接参照を繰り返し実行することにより、メモリ レイテンシ (図中) をテストします。これは、リンクされたリストをたどることと同じことですが、リストにはコンテンツがなく、次のセルへのポインターだけです。
struct cell { struct cell *next };
struct cell *ptr = ...;
for (i = 0; i < count; i++) {
ptr = ptr->next;
ptr = ptr->next;
... 100 of these, unrolled ...
ptr = ptr->next;
ptr = ptr->next;
}
リストのサイズを調整することで、メモリ アクセスが L1 キャッシュ、L2 キャッシュ、またはメイン メモリにヒットするかどうかを制御できます。ただし、L2 キャッシュまたはメイン メモリをテストする場合は、各メモリ アクセスが、再度アクセスするまでに高速なキャッシュから追い出されるほど古いキャッシュ ラインに対して行われるようにする必要があります。一部のキャッシュはプリフェッチもサポートしているため、「ストライド」アプローチは、特定のストライドでより高速なキャッシュにヒットすることを意味する場合もあります。
また、必ず最適化を有効にする必要があります ( -O2
GCC/Clang を使用)。そうptr
しないと、スタックに格納され、レイテンシが増加する可能性があります。ptr
最後に、コンパイラが「死んだ」変数と見なされないようにする必要があります。洗練されたコンパイラは、上記のコードが実際には何もしないことに気付くかもしれません。ベンチマークを作成するとき、コンパイラが敵になることがあります。LMBench コードには、use_pointer()
この目的のためだけの機能があります。