cuda内核中多线程写入序列数组

cuda内核中多线程写入序列数组,cuda,Cuda,我正在编写一个cuda内核,它要求我在设备上分配一个对齐的struct数组。 我从计算中得到了正确的结果,我需要从索引0开始将值写入该数组 当我尝试写入这个数组并将结果显示回主机端时,一些答案显示为零 显然,我并没有按照我的要求增加指数。我尝试使用计数器,我使用atomicAdd()增加计数器,但仍然得到一些值为零 确切地说,我可以在内核中使用1000线程进行计算,但我的输出分配数组的大小可以小于100或大于10000 我的问题是,如何让所有这些线程将值写入数组的一个位置(计算时),并将数组索引

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

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

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

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

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


任何帮助都将不胜感激。提前谢谢

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

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

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

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

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

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

一些说明内核功能的代码将非常有用。一些说明内核功能的代码将非常有用。谢谢……这解决了我的问题。我在将值分配给数组后使用了
atomicAdd()
。是的,这对我的计算非常昂贵。我正在寻找其他技术,这些技术可以加快我的计算速度,同时更有效地利用内存。谢谢……这解决了我的问题。我在将值分配给数组后使用了
atomicAdd()
。是的,我的计算成本很高。我正在寻找其他技术,可以加快我的计算,同时更有效地利用内存。