0

私が理解していることから、shared_mem_size以下のコードの変数は、各ブロックに割り当てられる共有メモリの量です。しかし、共有メモリの合計サイズ ( BLOCKS_GRID * shared_mem_size) が、ハードウェアの使用可能な共有メモリの総容量を超えるとどうなるでしょうか?

__global__ void KernelFunction ()
{
    extern __shared__ s_data[];
}

int main ()
{
    shared_mem_size = THREADS_BLOCK * sizeof(T);
    KernelFunction <<<BLOCK_GRID,THREADS_BLOCK,shared_mem_size>>> ();
}
4

1 に答える 1

3

多くの CUDA プログラムでは、すべてのブロックが同時に実行されるわけではありません。1 つのブロックに対して要求された共有メモリが、SM で使用可能な容量 (現在のハードウェアで 16KB または 48KB) を超えない限り、少なくとも 1 つのブロックをその SM で実行できます。

1024 ブロックのグリッドがあるとします。各ブロックに 32KB の共有メモリが必要だとします。

その場合、各 SM に 1 つのスレッドブロックを常駐 (実行中) にすることができます。4 つの SM を備えたマシンを使用している場合、4 つのスレッドブロックが実行されます。これらのスレッド ブロックが終了すると、1024 個のスレッド ブロックがすべて消費されるまで、さらに多くのスレッド ブロックを起動できます。

1 つのスレッドブロックが使用可能な共有メモリを超えた場合 (たとえば、32KB を要求したが、SM は 16KB のみを提供するように構成されている)、カーネル起動エラー/CUDA API エラーが発生します。

于 2013-11-06T23:59:13.377 に答える