Cuda 是否有已排序的atomicAdd或等效文件

Cuda 是否有已排序的atomicAdd或等效文件,cuda,gpu,gpgpu,Cuda,Gpu,Gpgpu,我有一个有效的检测和跟踪过程(行和列中的像素图像),它不能提供完全可重复的结果,因为它使用atomicAdd意味着数据点可以以不同的顺序累积,导致质心和其他轨迹统计计算中的舍入误差 总的来说,atomicAdd的冲突很少,因此大多数结果是相同的。然而,为了验证和确认,我需要能够使atomicAdd以一致的顺序添加这些冲突数据点,这样说,当两个线程都想使用atomicAdd在他们正在处理的行N上添加一个像素时,线程3将击败线程10 是否有一种机制允许atomicAdd在线程顺序上具有确定性,或者我

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

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

是否有一种机制允许atomicAdd在线程顺序上具有确定性,或者我遗漏了什么?

请查看伯克利的“快速可再现的原子总和”论文

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


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

不,没有办法做到这一点。根本原因是CUDA中的执行顺序未定义。您无法知道线程的执行顺序,也无法对线程并行执行的操作施加任何顺序。@Talonmes,更多的是关于有哪些替代方案可以达到所需的顺序,无论是隐藏的p代码还是额外的指令等,因此,出于测试目的,我们可以验证代码的其他部分以相同的方式运行(并找出哪些区域最容易出现舍入和顺序错误等)。我理解您的问题,但答案是没有。浮点运算(我假设这是我们在这里讨论的浮点运算)是不关联的,如果加上不确定的执行顺序,结果会有一定程度的不可预测性。刚才看到的结果表明,如果计数>1,我可以执行额外的排序步骤,这将使下游代码变得[更多]确定性。目前,我有一个数据转储程序(CPU端),它在发送到日志以进行运行之间的比较(从文件读取的所有输入数据)之前对数据进行预排序,因此可能需要将“排序”移动到atomicAdd(Ugh)中,但这不是我的第一选择。对于验证和确认,你应该只使用误差范围,而不是精确的比较。非常感谢链接。我将有一个阅读它,即使我的项目已经转移,所以我现在不直接在GPU编码工作。但希望很快…事实上,现在我想起来了,abs值的总和本身将是不确定的,所以减法可以稍微偏离。因此,您可能必须使用n*atomicMax(x[i])而不是sum(abs(x[i]))