据我所知,当我在内核中声明共享内存数组时,所有线程都会声明相同大小的数组。像
这样的代码__shared__ int s[5];
将在每个线程中创建一个20字节的数组。我理解寻址共享内存的方式是它在所有线程中都是通用的。所以,如果我按如下方式处理下标10
s[10] = 1900;
它是所有线程中完全相同的内存位置。不会是不同的线程访问下标10的不同共享内存地址。这是正确的吗?编译器当然会抛出下标超出范围的警告。
答案 0 :(得分:3)
实际上它会创建一个20字节的数组每个块,而不是每个线程。
块中的每个线程都能够访问这20个字节。因此,如果每个线程需要N个字节,并且需要M个线程的块,则需要为每个块创建一个N * M缓冲区。
在你的情况下,如果有128个线程,你就有了
__shared__ int array[5*128];
并且array [10]将是块中任何线程的有效地址。