2016-09-11 4 views
0

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)を入れてコードの重複を避けるためにしたいと思います。実際には、表現はより複雑です。

+0

@tera、そのメモリはブロック内のスレッド間で実際に共有されているため、 '__shared__'を削除できません。 –

+3

あなたは、カーネルが共有メモリ引数を起動することが*動的に割り当てられたサイズであることを理解していますか?動的に割り振られた共有メモリーがない場合は、ゼロを使用してください – talonmies

+0

申し訳ありませんが、私の脳は欠けている部分を埋めるようにして動的な割り振りを行うため、私のコメントはナンセンスでした。 – tera

答えて

3

静的に割り当てられ、動的に割り当てられた共有メモリは、多くの点で別々に扱われます。

動的に割り当てられた共有メモリを使用するつもりがない場合、静的に割り当てられた共有メモリの使用に関する意図にかかわらず、the default valueのゼロを第3のカーネル起動パラメータとして渡すことは安全です。

+2

ストリームパラメータが指定されている場合は、デフォルト値はありません。その場合に0を指定する場合は、明示的に0を渡す必要があります。デフォルトパラメータが有効な唯一の時間は、最後の2つのカーネル起動パラメータが指定されていない場合です。 –

関連する問題