13

Fermi GPU で起動できるスレッドの最大数について混乱しています。

私の GTX 570 デバイス クエリには次のように表示されます。

  Maximum number of threads per block:           1024
  Maximum sizes of each dimension of a block:    1024 x 1024 x 64
  Maximum sizes of each dimension of a grid:     65535 x 65535 x 65535

私の理解では、上記のステートメントを次のように理解しています。

CUDA カーネルの場合、最大で 65536 ブロックを起動できます。起動された各ブロックには、最大 1024 のスレッドを含めることができます。したがって、原則として、65536*1024 (=67108864) スレッドまで起動できます。

これは正しいです?スレッドが多くのレジスタを使用する場合はどうなりますか? この理論上の最大スレッド数にまだ到達できるでしょうか?

CUDA カーネルを作成して起動した後、起動したスレッドとブロックの数が実際にインスタンス化されていることを確認するにはどうすればよいですか。つまり、特定のカーネルで可能な数よりも多くのスレッドをたまたまインスタンス化した場合に、GPU がジャンクを計算したり、奇妙な動作をしたりしたくないということです。

4

1 に答える 1

24

CUDA カーネルの場合、最大で 65536 ブロックを起動できます。起動された各ブロックには、最大 1024 のスレッドを含めることができます。したがって、原則として、65536*1024 (=67108864) スレッドまで起動できます。

いいえ、これは正しくありません。最大 65535 x 65535 x 65535 ブロックのグリッドを起動でき、各ブロックにはブロックごとに最大 1024 のスレッドがありますが、スレッドごとのリソース制限により、ブロックごとのスレッドの合計数がこの最大値未満に制限される場合があります。

スレッドが多くのレジスタを使用する場合はどうなりますか? この理論上の最大スレッド数にまだ到達できるでしょうか?

いいえ、この場合、ブロックあたりの最大スレッド数に達することはできません。NVIDIA CUDA ツールキットの各リリースには、制限ブロック サイズに対するレジスタ プレッシャの影響を確認するために使用できる占有計算スプレッドシートが含まれています。

また、CUDA カーネルを作成して起動した後、起動したスレッドとブロックの数が実際にインスタンス化されていることを確認するにはどうすればよいでしょうか。つまり、その特定のカーネルで可能な数よりも多くのスレッドをたまたまインスタンス化した場合に、GPU がジャンクを計算したり、奇妙な動作をしたりしたくないということです。

不正な実行構成 (ブロック サイズまたはグリッド サイズが正しくない) を選択すると、カーネルは起動せず、ランタイムはcudaErrorInvalidConfigurationエラー メッセージを発行します。標準cudaPeekAtLastError()を使用してcudaGetLastError()、カーネルの起動のステータスを確認できます。

于 2012-08-22T19:03:26.747 に答える