【发布时间】:2011-12-31 12:40:12
【问题描述】:
我今天开始使用 CUDA 进行冒险。我正在尝试在所有线程之间共享一个 unsigned int 。所有线程都会修改这个值。我使用 cudaMemcpy 将此值复制到设备。但是,最后当计算完成时,我收到这个值等于 0。
可能有多个线程同时写入这个变量? 我不确定是否应该在线程开始写入时使用任何信号量或锁定此变量。
编辑:
很难说得更详细,因为我的问题通常是如何解决它。其实我没有写任何算法,只是测试CUDA。
但是,如果您愿意...我创建了包含一些值(无符号整数)的向量。我试图做一些事情,比如搜索大于给定共享值的值,但是当向量中的值更大时,我将向量元素加 1 并保存共享值。
看起来像这样:
__global__ void method(unsigned int *a, unsigned int *b, long long unsigned N) {
int idx = blockIdx.x* blockDim.x+ threadIdx.x;
if (a[idx]>*b && idx < N)
*b = a[idx]+1;
}
正如我所说,它不是有用的代码,仅用于测试,但我不知道该怎么做......
【问题讨论】:
-
这里没有足够的细节来真正肯定地说,但是并发写入通常被认为是一件坏事。
-
这看起来像是错误的设计。您希望 CUDA 线程并行工作,因此它们通常不需要访问一块联合内存。
-
想想你说的和你写的代码。当从数组中读取的值大于共享值时,您希望将 1 添加到共享值。您正在做的是将 1 添加到从数组中读取的值,然后将其分配给共享值。是否每个线程都写入同一个地方,即使您有原子操作,每个线程也只会覆盖以前的值,而您将获得的值将是最后一个运行的线程写入的值。没有原子,你只会得到一个未定义的值,也不是你想做的。
-
Nvm,我在做什么。我的问题一般是如何为每个线程使用全局共享内存。