我想知道开普勒中全局原子的实现。
看这段代码:
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
我已经跑了好几次了,我总是因为这个变化而受到大约 20 秒的惩罚
更新 似乎没有使用原子的商店总是会在 L2 中产生缺失,而原子版本总是会产生命中......所以我想尝试写入一些被标记为“原子”的位置是不允许的L2 向 gmem 发出另一个请求