我正在编写一个cuda内核,它要求我在设备上分配一个对齐struct
的数组。
我从计算中得到了正确的结果,我需要从索引0
开始将值写入此数组。
当我尝试写入此数组并将结果显示回主机端时,某些答案显示为零。
显然,我并没有按照我的要求增加索引。我尝试使用我使用atomicAdd()
增加的计数器,但是我仍然得到一些值为零。
确切地说,我可以在我的内核中使用1000
个线程进行计算,但我的输出分配数组的大小可能小于100
或大于10000
。
我的问题是,如何让所有这些线程将值写入数组的一个位置(因为它们被计算)并将数组索引/计数器递增1
而不覆盖它。
任何帮助将不胜感激。谢谢。
答案 0 :(得分:4)
您可以使用atomicAdd()
。它返回旧值,因此您将该值用作索引:
old_i = atomicAdd(&i, 1);
out_array[old_i] = val
但是,如果许多线程写出结果,那么性能会很差,因为atomicAdd()会(间接地)序列化所有写入。在这种情况下,您应该让每个线程将其结果(如果有的话)写入为该线程预留的插槽,然后使用压缩算法(请参阅thrust::copy_if
)来收集结果。