我们有多个线程计算结果,但需要将结果连续写入一个数组。我们在下面的例子中尝试过使用atomicCAS。在代码的某些部分,它可以工作,在代码的其他部分由于经线发散而挂起。线程写入结果的顺序无关紧要,但它们不应该尝试同时编写数组。
while (atomicCAS(&arrayAccess, AVAILABLE, NOT_AVAILABLE) == NOT_AVAILABLE);
arrayGlobalMemory[count] = result;
count++;
atomicExch(&arrayAccess, AVAILABLE);
下面的答案说这是不可能的。这是非常基本的功能。似乎对数组的并行访问应该是可序列化的?有人可以建议如何修改代码以从并行线程获取序列化数组访问,或者有人可以显示一些正常工作的示例代码吗?
答案 0 :(得分:3)
这听起来像你真正想要的是
unsigned int *arrayGlobalMemory; unsigned int count = 0;
...
int idx = atomicAdd(&count, 1);
arrayGlobalMemory[idx] = result;
即。原子操作不是在数组上执行,而是在数组索引上执行。这可以防止任何两个线程写入arrayGlobalMemory
中的相同位置。