2015-12-10 28 views
1

我们有多个线程计算结果,但需要将结果串行写入一个数组。我们在下面的例子中尝试使用atomicCAS。在代码的某些部分中,它在代码的其他部分因为翘曲发散而挂起。线程写入结果的顺序并不重要,但它们不应该尝试同时写入数组。如何让CUDA并行线程串行写入数组?

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

arrayGlobalMemory[count] = result; 
count++; 

atomicExch(&arrayAccess, AVAILABLE); 

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

CUDA, mutex and atomicCAS()

+0

'arrayGlobalMemory'是什么类型? – talonmies

+0

unsigned int * arrayGlobalMemory; unsigned int count = 0; – roger1994

+0

串行线程。没有2个或更多线程应该尝试写入数组中的相同元素。 – roger1994

回答

3

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

unsigned int *arrayGlobalMemory; unsigned int count = 0; 

... 

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

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

+0

是的,这就是我需要的。我检查了它,它工作。再次感谢talonmies! – roger1994

+0

我认为它需要“易”关键字“计数”,以避免缓存 – Patric

+2

@Patric它没有。处理原子时,“volatile”是完全不必要的。 –