Memory 关于CUDA内存的问题

Memory 关于CUDA内存的问题,memory,cuda,gpgpu,Memory,Cuda,Gpgpu,我是CUDA编程新手,关于内存模型的一些东西我还不太清楚。比如,它是如何工作的?例如,如果我有一个简单的内核 __global__ void kernel(const int* a, int* b){ some computation where different threads in different blocks might write at the same index of b } 所以我想a将在所谓的常量内存中。但是b呢?由于不同块中的不同线程将在其

我是CUDA编程新手,关于内存模型的一些东西我还不太清楚。比如,它是如何工作的?例如,如果我有一个简单的内核

__global__ void kernel(const int* a, int* b){ 
    some computation where different threads in different blocks might      
    write at the same index of b
}
所以我想
a
将在所谓的常量内存中。但是
b
呢?由于不同块中的不同线程将在其中写入,它将如何工作?我在某个地方读到,在同一块中的不同线程在全局内存中并发写入的情况下,可以保证至少会写入一个,但不能保证其他线程。我是否需要担心这一点,例如,让块中的每个线程都写入共享内存,一旦它们全部完成,让一个线程将其全部写入全局内存?还是CUDA在帮我处理

所以我想
a
将在所谓的常量内存中

是的,
a
指针将位于常量内存中,但不是因为它被标记为
const
(这是完全正交的)<代码>b指针也位于恒定内存中。所有内核参数都在常量内存中传递(CC1.x中除外)。理论上,
a
b
指向的内存可以是任何东西(我相信,设备全局内存、主机固定内存、UVA可寻址的任何东西)。它驻留的位置由用户选择

我在某个地方读到,在同一块中的不同线程在全局内存中并发写入的情况下,可以保证至少会写入一个,但不能保证其他线程

假设您的代码如下所示:

b[0] = 10; // Executed by all threads
b[0] = threadIdx.x;
那么是的,这是一种(良性)竞争条件,因为所有线程都将相同的值写入相同的位置。写入的结果是定义的,但是写入的数量是未指定的,执行“最终”写入的线程也是未指定的。唯一的保证是至少发生一次写入。在实践中,我相信每个扭曲一次写入,如果您的块包含多个扭曲(它们应该这样做),这将浪费带宽

另一方面,如果代码如下所示:

b[0] = 10; // Executed by all threads
b[0] = threadIdx.x;
这是明显的未定义行为

我是否需要担心这一点,例如,让块中的每个线程都写入共享内存,一旦它们全部完成,让一个线程将其全部写入全局内存


是的,通常是这样做的。

搜索后没有找到,但如果是这样,我很抱歉。好的,谢谢,这向我提出了进一步的问题。所以我应该这样写:
\uuu synctreads();如果(threadId.x==0)for(i=…)b[i]=s[i]
,假设我有一个共享数组s,其中每个线程写入它必须写入的内容。那么共享内存呢?写是原子的吗?还是我也应该自己拿?谢谢你的回答,如果我的问题是基本的,我很抱歉,我是CUDA的新手。这是一个后续话题,基本上是同一个主题,真的需要创建第二个线程吗?