【问题标题】:How to get CUDA parallel threads to write an array serially?如何让 CUDA 并行线程串行写入数组?
【发布时间】:2015-12-10 02:37:15
【问题描述】:

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

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

arrayGlobalMemory[count] = result;
count++;

atomicExch(&arrayAccess, AVAILABLE);

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

CUDA, mutex and atomicCAS()

【问题讨论】:

  • arrayGlobalMemory是什么类型?
  • 无符号整数 *arrayGlobalMemory;无符号整数计数 = 0;
  • 串行线程。不应有 2 个或更多线程尝试写入数组中的同一元素。
  • 线程可能都在一个块中。但也存在跨多个块的线程需要串行访问数组的情况。

标签: arrays serialization cuda


【解决方案1】:

听起来你真正想要的是

unsigned int *arrayGlobalMemory; unsigned int count = 0;

...

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

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

【讨论】:

  • 是的,这就是我需要的。我检查了它并且它有效。再次感谢 talonmies!
  • 我认为“count”需要“volatile”关键字来避免缓存
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 2018-06-06
  • 2023-03-15
  • 2021-11-04
  • 2011-05-07
相关资源
最近更新 更多