0

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

__shared__ int s[5];

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

s[10] = 1900;

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

4

1 回答 1

3

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

块内的每个线程都可以访问这 20 个字节。因此,如果您需要每个线程有 N 个字节,并且需要一个具有 M 个线程的块,则需要为每个块创建一个 N*M 缓冲区。

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

__shared__ int array[5*128];

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

于 2012-07-01T01:22:48.143 回答