atomicAdd
atomicAdd
在 GPU 上对共享内存(通常是 Storage Buffer)中的某个值执行线程安全的原子加法操作,确保在高度并行计算中数据不会因竞争条件而丢失或损坏。
核心优势
从硬件层面保证了“读-改-写”操作的原子性,彻底消除了数据竞争问题,从而能够在 GPU 上实现高性能、高正确性的并行数据聚合算法。
常见用途
实现顺序无关透明度(OIT)时,用作片元链表的原子计数器。
统计粒子或数据的空间分布密度(构建直方图)。
在网格体素化过程中,标记被几何体占据的体素。
如何调整
atomicAdd 的效果是间接的,它修改内存中的数据。要观察其效果,通常需要一个后续的渲染通道来读取该数据并将其可视化。调整其 `valueNode` 参数(要加上的值)会直接影响聚合结果的强度。例如,在粒子密度统计中,将加上的值从 1 增加到 10,会使最终生成的热力图整体亮度(热度)提升 10 倍。
代码示例
1// 计算粒子应归属的网格索引
2const gridIndex = calculateGridIndex( particlePos );
3// 对该网格的计数值执行原子加法
4atomicAdd( densityGridBuffer.element( gridIndex ), 1 );