CUDAでカーネルを起動するストリームを指定する必要があります。カーネルは、カーネルコードで定義されたサイズの共有メモリを使用します。ストリームを指定するがデフォルトの共有メモリサイズを持つカーネルラウチ
static const int cBlockSize = 256;
__global__ fooKernel(void* param)
{
__shared__ uint32_t words[cBlockSize/16];
// implementation follows, using 2 bits of shared memory per thread
}
ただし、shared memory sizeパラメータは、カーネル起動式のstreamパラメータの前にあります。では、CUDAに、カーネルコードで指定された共有メモリサイズを使用し、起動コードに含まれるものを無視するように指示する方法はありますか?
fooKernel<<<N/cBlockSize, cBlockSize, /* What to put here? */, stream>>>(param);
もちろん、私はそこに再び(cBlockSize/16)*sizeof(uint32_t)
を入れてコードの重複を避けるためにしたいと思います。実際には、表現はより複雑です。
@tera、そのメモリはブロック内のスレッド間で実際に共有されているため、 '__shared__'を削除できません。 –
あなたは、カーネルが共有メモリ引数を起動することが*動的に割り当てられたサイズであることを理解していますか?動的に割り振られた共有メモリーがない場合は、ゼロを使用してください – talonmies
申し訳ありませんが、私の脳は欠けている部分を埋めるようにして動的な割り振りを行うため、私のコメントはナンセンスでした。 – tera