0

この質問は、次のリンクからも開始されます:共有メモリの最適化の混乱

上記のリンクで、talonmies の回答から、実行がスケジュールされるブロック数の最初の条件が「8」であることがわかりました。以下に示すように、3つの質問があります。

  1. 条件2と条件3のブロック数が8を超えると、同時に8ブロックしかスケジューリングできないということですか?cuda環境やGPUデバイス、アルゴリズムなどの条件は問わないのでしょうか?

  2. もしそうなら、場合によっては共有メモリを使用しない方が良いことを意味します。では、共有メモリを使うか使わないかで、どちらが優れているかをどう判断するかを考えなければなりません。グローバルなメモリアクセス制限(メモリ帯域のボトルネック)がないかチェックするのもひとつの方法だと思います。これは、グローバル メモリ アクセス制限がなければ、「共有メモリを使用しない」を選択できることを意味します。それは良いアプローチですか?

  3. 上記の質問2に加えて、私のCUDAプログラムが扱うべきデータが膨大な場合、共有メモリ内では扱いにくいため、「共有メモリを使用しない」方が良いと考えることができます。それも良いアプローチですか?

4

1 に答える 1

3

同時にスケジュールされるブロックの数は、常に何かによって制限されます。

CUDA Occupancy Calculator で遊んでみると、その仕組みが明確になるはずです。3 種類のリソースの使用状況は、同時にスケジュールされるブロックの数に影響します。それらは 、Threads Per BlockRegisters Per ThreadおよびShared Memory Per Blockです。

2.0 で1 Threads Per Block、 1Registers Per Threadおよび 1Shared Memory Per Blockを使用するカーネルをセットアップすると、によって制限されます。これは 8 です。SM ごとに 49152 バイトの共有メモリがあるため、これは約 8 / 49152 = 6144 バイトになります (一部の共有メモリはシステムによって使用され、128 バイトのチャンクで割り当てられるため、少し少なくなります)。Compute CapabilityMax Blocks per MultiprocessorShared Memory Per BlockMax Blocks per MultiprocessorShared Memory Per Block

つまり、制限が 8であるため、制限要因となるMax Blocks per Multiprocessorしきい値を下回っている限り、共有メモリの使用は完全に無料です (同時実行ブロックの数に関連するため) 。Shared Memory Per Block

レジスターの使用についても同様です。

于 2012-04-04T14:46:09.403 に答える