我有一个有效的检测和跟踪过程(行和列中的像素图像),但它不能给出完全可重复的结果,因为它使用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/