変更されたCプログラムが、変更されていない対応プログラムよりも高速に実行される理由を理解しようとしています(追加の作業を実行するためにコード行をほとんど追加していません)。この文脈では、「キャッシュ効果」が主な説明(命令キャッシュ)であると思います。したがって、perf
(https://perf.wiki.kernel.org/index.php/Main_Page)プロファイリングツールに到達しましたが、残念ながら、キャッシュミスに関する出力の意味を理解できません。
キャッシュに関するいくつかのイベントが提供されています。
cache-references [Hardware event]
cache-misses [Hardware event]
L1-dcache-loads [Hardware cache event]
L1-dcache-load-misses [Hardware cache event]
L1-dcache-stores [Hardware cache event]
L1-dcache-store-misses [Hardware cache event]
L1-dcache-prefetches [Hardware cache event]
L1-dcache-prefetch-misses [Hardware cache event]
L1-icache-loads [Hardware cache event]
L1-icache-load-misses [Hardware cache event]
L1-icache-prefetches [Hardware cache event]
L1-icache-prefetch-misses [Hardware cache event]
LLC-loads [Hardware cache event]
LLC-load-misses [Hardware cache event]
LLC-stores [Hardware cache event]
LLC-store-misses [Hardware cache event]
LLC-prefetches [Hardware cache event]
LLC-prefetch-misses [Hardware cache event]
dTLB-loads [Hardware cache event]
dTLB-load-misses [Hardware cache event]
dTLB-stores [Hardware cache event]
dTLB-store-misses [Hardware cache event]
dTLB-prefetches [Hardware cache event]
dTLB-prefetch-misses [Hardware cache event]
iTLB-loads [Hardware cache event]
iTLB-load-misses [Hardware cache event]
branch-loads [Hardware cache event]
branch-load-misses [Hardware cache event]
node-loads [Hardware cache event]
node-load-misses [Hardware cache event]
node-stores [Hardware cache event]
node-store-misses [Hardware cache event]
node-prefetches [Hardware cache event]
node-prefetch-misses [Hardware cache event]
これらのフィールドに関する説明はどこにありますか? cache-missesイベントは常に他のイベントよりも小さくなります。このイベントは何を測定しますか?
次の例で、lsの26,760 L1-icache-load-missesと5,708 cache-missesを解釈する方法は?
perf stat -e L1-icache-load-misses ls
caches caches~ out
Performance counter stats for 'ls':
26,760 L1-icache-load-misses
0.002816690 seconds time elapsed
perf stat -e cache-misses ls
caches caches~ out
Performance counter stats for 'ls':
5,708 cache-misses
0.002822122 seconds time elapsed
cache-misses
イベントは、他のすべての種類のキャッシュミス(L1-dcache-load-misses
など)の合計であると考えているようです。実際にはそうではありません。
cache-misses
イベントは、どのキャッシュでも処理できなかったメモリアクセスの数を表します。
Perfのドキュメントが最善ではないことを認めます。
ただし、perf_event_open()関数のドキュメントを読むことで、CPUとパフォーマンスモニタリングユニットの仕組みについて十分な知識があることを前提として、これについて多くのことを学ぶことができます。
http://web.eece.maine.edu/~vweaver/projects/perf_events/perf_event_open.html
たとえば、それを読むと、パフォーマンスリストに表示されるcache-misses
イベントがPERF_COUNT_HW_CACHE_MISSES
に対応していることがわかります。
いくつかの答え:
L1
はレベル1キャッシュであり、最小かつ最速のキャッシュです。一方、LLC
は キャッシュ階層 の最後のレベルを指し、最大の、ただし最も遅いキャッシュを示します。i
とd
は、命令キャッシュとデータキャッシュを区別します。このようにL1のみが分割され、他のキャッシュはデータと命令間で共有されます。TLB
は、仮想アドレスを物理アドレスにマッピングするときに使用されるキャッシュである translation lookaside buffer を指します。コメントの評判制限により、Mvgのコメントには返信できません。 perf tutorial によると、ハードウェアイベントは、PMU evnetに直接マッピングできるイベントを指します。ただし、ハードウェアキャッシュイベントは、perfによって提供される一部のハードウェアイベントモニカーを指し、CPUによって提供される実際のイベントにマップされる場合があります。