cuda - 是否有排序的atomicAdd或等效的

标签 cuda gpu gpgpu

我有一个有效的检测和跟踪过程(行和列中的像素图像),但它不能给出完全可重复的结果,因为它使用atomicAdd意味着数据点可以以不同的顺序累积,从而导致计算中的四舍五入错误质心和其他跟踪统计数据。

总的来说,atomicAdd 几乎没有冲突,因此大多数结果是相同的。然而,为了验证和验证,我需要能够使atomicAdd以一致的顺序添加这些冲突的数据点,这样说,当线程3都想使用atomicAdd在第N行上添加一个像素时,线程3将击败线程10正在处理。

是否有一种机制允许atomicAdd在其线程顺序中具有确定性,或者我错过了什么?

最佳答案

查看伯克利大学的“快速再现原子求和”论文。

http://www.eecs.berkeley.edu/~hdnguyen/public/papers/ARITH21_Fast_Sum.pdf

但基本上你可以尝试一些方法,比如找到abs值的总和以及原始总和,将其乘以O(N^2),然后将其减去并添加到原始总和中(sum = (sum - sumAbs * N^2) + sumAbs * N^2) 抵消最低位(不确定的)。正如您所看到的,上限与 N^2 成正比...因此 N(总和中的元素数量)越低,误差范围就越好。

您还可以尝试结合上述方法使用 Kahan 求和来减少误差范围。

关于cuda - 是否有排序的atomicAdd或等效的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11653776/

相关文章:

c++ - 如何使用cub::DeviceReduce::ArgMin()

cuda - 来自 CUDA 代码的 100% GPU 使用率导致屏幕延迟

cuda - GPU 内存带宽的概念理解

performance - 分支分歧真的那么糟糕吗?

crash - 在片段着色器中移动变量会使其不起作用或使PC完全崩溃

opengl - 通过 HDMI 保持视频的 Alpha 透明度

linux - 英特尔 OpenCL Beignet 问题

opencl - 在 Opencl 中为结构中的动态数组分配内存对象

parallel-processing - Matlab GPU计算: Process matrix as one unit

cuda - CUDA 扭曲中的线程是否在多处理器上并行执行?