2
CUDAブロック/ワープ/スレッドはどのようにCUDAコアにマッピングしますか?
私は数週間CUDAを使用していますが、ブロック/ワープ/スレッドの割り当てに疑問があります。 私は教訓的な観点から大学を研究しているので(大学のプロジェクト)、ピークパフォーマンスに到達することは私の関心事ではありません。 まず最初に、これらの事実を正直に理解したかどうかを理解したいと思います。 プログラマーはカーネルを作成し、その実行をスレッドブロックのグリッドに編成します。 各ブロックは、ストリーミングマルチプロセッサ(SM)に割り当てられます。いったん割り当てられると、別のSMに移行できません。 各SMは独自のブロックをワープに分割します(現在、最大サイズは32スレッドです)。ワープ内のすべてのスレッドは、SMのリソース上で同時に実行されます。 スレッドの実際の実行は、SMに含まれるCUDAコアによって実行されます。スレッドとコアの間に特定のマッピングはありません。 ワープに20スレッドが含まれているが、現在は16コアしか使用できない場合、ワープは実行されません。 一方、ブロックに48個のスレッドが含まれている場合、十分なメモリが利用可能であれば、2つのワープに分割され、並列に実行されます。 スレッドがコアで開始されると、メモリアクセスまたは長い浮動小数点演算のためにスレッドが停止し、別のコアで実行が再開される可能性があります。 彼らは正しいですか? 現在、私はGeForce 560 Tiを持っているので、仕様によると、それぞれに48個のCUDAコア(合計384個のコア)を含む8つのSMが搭載されています。 私の目標は、アーキテクチャのすべてのコアが同じ命令を実行することを確認することです。私のコードが各SMで利用可能なものよりも多くのレジスターを必要としないと仮定して、私は異なるアプローチを想像しました: 各SMが実行する1つのブロックを持つように、それぞれ48スレッドの8ブロックを作成します。この場合、48スレッドはSMで並列に実行されますか(それらに使用可能な48コアすべてを利用します)? 6スレッドの64ブロックを起動しても違いはありますか?(それらがSM間で均等にマッピングされると仮定) スケジュールされた作業でGPUを「サブマージ」する場合(たとえば、1024スレッドの1024ブロックを作成する場合)、すべてのコアが特定の時点で使用され、同じ計算を実行すると想定するのが妥当です(スレッドがストールしないでください)? プロファイラーを使用してこれらの状況を確認する方法はありますか? このものへの参照はありますか?「大規模並列プロセッサのプログラミング」と「CUDAアプリケーションの設計と開発」で、CUDAプログラミングガイドとハードウェアアーキテクチャ専用の章を読みました。正確な答えは得られませんでした。