5

各ブロックで1kbの共有メモリを使用するアプリケーションをcudaで作成しました。各SMには16kbの共有メモリしかないため、全体で16ブロックしか収容できません(正しく理解していますか?)。ただし、一度にスケジュールできるのは8つだけですが、一部のブロックがメモリ操作の実行でビジー状態の場合、他のブロックはGPUでスケジュールされますが、すべての共有メモリはすでにそこでスケジュールされている他の16ブロックによって使用されるため、前に割り当てられたブロックが完全に終了しない限り、cudaは同じsmでそれ以上のブロックをスケジュールしませんか?または、一部のブロックの共有メモリをグローバルメモリに移動し、そこに他のブロックを割り当てます(この場合、グローバルメモリアクセスの遅延について心配する必要がありますか?)

4

1 に答える 1

7

そのようには機能しません。単一のSMで任意の時点で実行するようにスケジュールされるブロックの数は、常に次の最小値になります。

  1. 8ブロック
  2. 静的および動的に割り当てられた共有メモリの合計が、GPUアーキテクチャと設定に応じて、16kbまたは48kb未満のブロックの数。共有メモリのページサイズの制限もあります。これは、ブロックごとの割り当てが、ページサイズの次に大きい倍数に切り上げられることを意味します。
  3. アーキテクチャに応じて、ブロックごとのレジスタ使用量の合計が8192/16384/32678未満であるブロックの数。レジスタファイルのページサイズもあります。これは、ブロックごとの割り当てが、ページサイズの次に大きい倍数に切り上げられることを意味します。

それがすべてです。より多くのブロックを収容するための共有メモリの「ページング」はありません。NVIDIAは、ツールキットに付属し、個別にダウンロードできるコンピューティング占有用のスプレッドシートを作成します。含まれている数式で正確なルールを確認できます。それらは、CUDAプログラミングガイドのセクション4.2でも説明されています。

于 2011-04-10T11:35:46.827 に答える