2012-07-01 74 views
0

我明白,当我在内核声明一个共享存储器阵列,相同的尺寸的阵列由所有线程声明。代码如CUDA共享存储器寻址

__shared__ int s[5]; 

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

s[10] = 1900; 

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

+0

顾名思义,是在共享存储器中,而不是在每一个线程创建的共享存储器阵列。换句话说,只有一个共享的阵列's',这就是为什么不同的线程共享内存访问同一个地址时,有可能是银行的冲突。 – chaohuang

+0

共享内存由块中的线程共享,而不是内核的所有线程共享。它可以被当作一个可编程的缓存。 – konjac

回答

3

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

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

在你的情况,如果有128个线程,你将不得不

__shared__ int array[5*128]; 

和数组[10]将是该块内的任何线程的有效地址。