問題タブ [papi]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - PAPI の L1_MISS ネイティブ イベント カウンターの予期しない結果の観察
PAPI を使用して L1 キャッシュ アクセスの結果をカウントしています。ほとんどのネイティブ イベントでは期待どおりの結果が得られますが、L1_MISS が正確でない場合が 1 つあります。コードに示すように、サイズが 64 のオブジェクトと 100,000 要素の揮発性配列があります。
2 つの NUMA ノードを備えた Skylake プロセッサでテストしています。プリフェッチャーを無効にしました。gcc -O3 でコンパイルします。シナリオは次のとおりです。NUMA1 に設定されたメイン プロセスから、配列を初期化し、キャッシュ ラインをフラッシュします。次に、ループ関数を呼び出して NUMA2 から同じ配列を読み取る 5 つのスレッドを作成します。それらがすべて終了したら、メイン プロセスから配列をループして各要素を読み取り、L1 キャッシュ アクセスの結果を監視します。
次の 5 つのネイティブ イベント カウンターを読み取ります。
L1_MISS は約 100,000 になると予想されていました。これは、要素がキャッシュにフェッチされず、メインでのこの読み取りによってミスが発生するためです。また、ALL_LOADS は、L1_HIT + L1_MISS + FB_HIT の 3 つのカウンターの合計と等しくありません。この場合、L1D.REPLACEMENT は L1D データ行の置換をカウントすることで理にかなっているように見えますが、有効にするとプリフェッチもカウントされるため、私は納得できません。
この特定のシナリオでのみ、MEM_LOAD_RETIRED.L1_MISS カウンターがメインの読み取り操作によって発生したイベントを認識しない理由がわかりません。たとえば、NUMA2 のスレッドが読み取りの代わりに配列要素を変更すると、同じループで L1_MISS: 99818 が返されます。コードの主要なスケルトンを提供しようとしました。コメントされたポイントの一部が重要な場合は、それらも追加できます。