A.コンピューティング作業ディストリビューターは、グリッドからSMにブロックを配布します。SMは、ブロックをワープに変換します(すべてのNVIDIAGPUでWARP_SIZE=32)。Fermi 2.0 GPUには、各SMにデータパスのセットを共有する2つのワープスケジューラがあります。サイクルごとに、各ワープスケジューラーはワープを選択し、データパスの1つに命令を発行します(CUDAコアについては考えないでください)。Fermi 2.1 GPUでは、各ワープスケジューラに独立したデータパスと一連の共有データパスがあります。2.1のすべてのサイクルで、各ワープスケジューラーはワープを選択し、各ワープに対して命令を二重に発行しようとします。
ワープスケジューラは、データパスの使用を最適化しようとします。これは、単一のワープが連続したサイクルで複数の命令を実行する可能性があること、またはワープスケジューラがサイクルごとに異なるワープから発行することを選択できることを意味します。
各SMが処理できるワープ/スレッドの数は、CUDAプログラミングガイドv.4.2表F-1で指定されています。これは、768スレッドから2048スレッド(24〜64ワープ)まで拡張できます。
B.起動あたりの最大スレッド数は、最大GridDims*ブロックあたりの最大スレッド数によって定義されます。表F-1を参照するか、cudaGetDevicePropertiesのドキュメントを参照してください。
C.(B)と同じリソースを参照してください。スレッド/ブロックの最適な分散は、アルゴリズムの分割によって定義され、占有率の計算に影響されます。SMのワープの問題セットのサイズと、命令バリアでブロックされた時間(とりわけ)に基づいて、パフォーマンスへの影響が観察されます。手始めに、SMごとに少なくとも2ブロック、最大50%の占有率をお勧めします。