Kepler でのグローバル アトミックの実装について知りたいです。
このコードを参照してください。
1. if (threadIdx.x < workers) {
2. temp = atomicAdd(dst, temp + rangeOffset);
3. if (isLastPartialCalc(temp)) {
4. atomicAdd(dst,-300000.0f);
5. }
6. }
このために4行目を変更すると:
*dst -= 300000.0f;
性能が落ちる!これ以上スレッドがこの値に書き込むことはないため、変更は安全です (出力は同じです)。
アトミックを使用するカーネル: ~883us gmem を直接使用するカーネル: ~903us
私は何度か実行しましたが、常に変更に対して約 20us のペナルティが発生します。
更新 アトミックを使用しないストアは常にL2でミスを生成するようですが、アトミックバージョンは常にヒットを生成します...したがって、「アトミック」でフラグが立てられた(または何か)場所に書き込もうとすると、 L2 であり、gmem に別のリクエストを行います