多个线程在cuda内核中写入顺序数组

时间:2012-07-18 05:18:29

标签: cuda

我正在编写一个cuda内核,它要求我在设备上分配一个对齐struct的数组。 我从计算中得到了正确的结果,我需要从索引0开始将值写入此数组。

当我尝试写入此数组并将结果显示回主机端时,某些答案显示为零。

显然,我并没有按照我的要求增加索引。我尝试使用我使用atomicAdd()增加的计数器,但是我仍然得到一些值为零。

确切地说,我可以在我的内核中使用1000个线程进行计算,但我的输出分配数组的大小可能小于100或大于10000

我的问题是,如何让所有这些线程将值写入数组的一个位置(因为它们被计算)并将数组索引/计数器递增1而不覆盖它。

任何帮助将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:4)

您可以使用atomicAdd()。它返回旧值,因此您将该值用作索引:

old_i = atomicAdd(&i, 1);
out_array[old_i] = val

但是,如果许多线程写出结果,那么性能会很差,因为atomicAdd()会(间接地)序列化所有写入。在这种情况下,您应该让每个线程将其结果(如果有的话)写入为该线程预留的插槽,然后使用压缩算法(请参阅thrust::copy_if)来收集结果。