スレッドブロック内の各スレッドに共有メモリへの独自のポインタを持たせるにはどうすればよいですか?私はそのようなポインタの宣言のいくつかの例を見つけました:
int __shared__ *p;
__shared__ int array[256];
p = &array[threadId];
これは正しいですか、それとも別の方法がありますか?
スレッドブロック内の各スレッドに共有メモリへの独自のポインタを持たせるにはどうすればよいですか?私はそのようなポインタの宣言のいくつかの例を見つけました:
int __shared__ *p;
__shared__ int array[256];
p = &array[threadId];
これは正しいですか、それとも別の方法がありますか?
いいえ、それは正しい方法ではありません。このサンプルコードでは、p
が共有されているため、ブロック内のすべてのスレッドが同じメモリにアクセスしようとします。threadId
ブロックを持つ一意のスレッドインデックスである場合は、次のように実行できます。
int *p;
__shared__ int array[256];
p = &array[threadId];
この場合、コンパイラはレジスタまたはスレッドローカルメモリのいずれかを使用array
して、ブロック内の各スレッドの静的共有メモリ割り当てに要素の一意のアドレスを格納します。
あなたが正しいです。より良い方法は、共有メモリの動的割り当てです。例は仲間としてです:
void __global__ test(){
extern __shared__ int s[];
int *p = &s[xx];
}
...
test<<<x,y, shared memory length>>>();
...