如何让CUDA并行线程串行编写数组?

时间:2015-12-10 02:37:15

标签: arrays serialization cuda

我们有多个线程计算结果,但需要将结果连续写入一个数组。我们在下面的例子中尝试过使用atomicCAS。在代码的某些部分,它可以工作,在代码的其他部分由于经线发散而挂起。线程写入结果的顺序无关紧要,但它们不应该尝试同时编写数组。

while (atomicCAS(&arrayAccess, AVAILABLE, NOT_AVAILABLE) == NOT_AVAILABLE);

arrayGlobalMemory[count] = result;
count++;

atomicExch(&arrayAccess, AVAILABLE);

下面的答案说这是不可能的。这是非常基本的功能。似乎对数组的并行访问应该是可序列化的?有人可以建议如何修改代码以从并行线程获取序列化数组访问,或者有人可以显示一些正常工作的示例代码吗?

CUDA, mutex and atomicCAS()

1 个答案:

答案 0 :(得分:3)

这听起来像你真正想要的是

unsigned int *arrayGlobalMemory; unsigned int count = 0;

...

int idx = atomicAdd(&count, 1);
arrayGlobalMemory[idx] = result;

即。原子操作不是在数组上执行,而是在数组索引上执行。这可以防止任何两个线程写入arrayGlobalMemory中的相同位置。