スレッドが整数のアトミック インクリメントを使用して、グローバルに発生したイベントの数をカウントするクリティカル コード パスがあります。これはかなり高速ですが、整数を保持するキャッシュ ラインがコア間でバウンスする必要があります。NUMA システムでは、これにより大量の MESI トラフィックが作成されます。
ホットパットの疑似コードは、すべてのスレッドがこれを行うことです:
const int CHECK_VALUE = 42;
int counterNew = counter++;
if (counterNew == CHECK_VALUE) {
Do Final work
}
カウンターは単調に増加し、到達する必要がある値は事前にわかっています。
少なくとも 1 つのスレッドが、CHECK_VALUE
インクリメントした後にグローバル カウンターに到達したと判断する必要がありますcounter
。複数のスレッドがその結論を導き出すことは許容されます (その時点でいつでも同期できます - それはもはやホット パスではないため)。
counter
単調であり、最終値がわかっている場合、アトミックインクリメントを使用して値を追跡するよりもうまくいくことは可能ですか?