CUDA 共享内存寻址



我知道当我在内核中声明共享内存数组时,所有线程都会声明相同大小的数组。像这样的代码

__shared__ int s[5];

将在每个线程中创建一个 20 字节的数组。我理解寻址共享内存的方式是,它在所有线程中都是通用的。所以,如果我按如下方式处理下标 10

s[10] = 1900;

它是所有线程中完全相同的内存位置。对于下标 10,不同的线程访问不同的共享内存地址不会。这是对的吗?编译器当然会发出下标超出范围的警告。

实际上,

它将为每个块创建一个 20 字节的数组,而不是每个线程。

块中的每个线程都将能够访问这 20 个字节。因此,如果您需要每个线程有 N 个字节,并且一个包含 M 个线程的块,则需要为每个块创建一个N*M缓冲区。

在您的情况下,如果有 128 个线程,您将有

__shared__ int array[5*128];

array[10]将是块内任何线程的有效地址。

最新更新