CUDA共享内存寻址

时间:2012-07-01 00:31:37

标签: cuda gpu shared-memory addressing

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

这样的代码
__shared__ int s[5];

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

s[10] = 1900;

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

1 个答案:

答案 0 :(得分:3)

实际上它会创建一个20字节的数组每个块,而不是每个线程。

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

在你的情况下,如果有128个线程,你就有了

__shared__ int array[5*128];

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