web-dev-qa-db-ja.com

単一のCUDAカーネルで開始できるスレッドの最大数

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

私のGTX570デバイスクエリは次のように言っています。

  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にジャンクを計算させたり、奇妙な動作をさせたくないということです。

11
smilingbuddha

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

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

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

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

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

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

22
talonmies