在Cuda中,AtomicAdd for double可以使用while循环和AtomicCAS操作实现。但是如何才能有效地为int3类型实现原子添加呢?
经过进一步考虑,我不确定int3
上的atomicAdd与int
位置上的3个单独的atomicAdd
操作有什么不同。为什么不这样做呢?
(在CUDA中,int3
无论如何都不能作为单个数量加载。编译器保证将其拆分为多个加载,因此尽管异步读取int3
会有危险,但无论是否使用原子,这种危险都是存在的。
但是要回答你问的具体问题,使用原子是不可能的。
int3
为96位类型。
CUDA原子仅支持最高64位的操作。以下是float2
(64位类型)的原子添加示例,您可以为short3
或short4
做类似的事情。
您可以选择使用约简方法或临界区。这里有很多关于SOcuda
标签的问题,讨论了约简和临界部分。
减少方法可以实现如下:
-
每个想要对特定
int3
位置进行原子更新的线程都使用这个方法来创建一个原子更新数量的队列或列表。 -
一旦列表生成完成,启动一个内核对列表进行并行约简,从而产生属于该位置的最终约简数量。