繁体   English   中英

有关CUDA内存的问题

[英]Questions about CUDA memory

我对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 指针也位于常量存储器中。 所有内核参数都在恒定内存中传递(CC 1.x中除外)。 从理论上讲, ab指向的内存可以是任何东西(设备全局内存,主机固定的内存,UVA可寻址的任何东西)。 用户选择它所在的位置。

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

假设您的代码如下所示:

b[0] = 10; // Executed by all threads

然后是的,这是(良性)竞争条件,因为所有线程都将相同的值写入相同的位置。 定义了写入的结果,但是未指定写入的次数,执行“最终”写入的线程也未指定。 唯一的保证是至少发生一次写操作。 在实践中,我相信每个扭曲都会发出一次写操作,如果您的块包含多个扭曲(它们应该这样做),那将浪费带宽。

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

b[0] = threadIdx.x;

这是普通的未定义行为。

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

是的,通常就是这样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM