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 に答える