0

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

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

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

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

我的问题是,如何让所有这些线程将值准确写入数组的一个位置(因为它们是计算出来的),并在1不覆盖它的情况下增加数组索引/计数器。

任何帮助将不胜感激。在此先感谢。

4

1 回答 1

4

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

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

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

于 2012-07-18T05:30:11.900 回答