私はCUDAの仕組みについて少し混乱します。スレッドは同じ命令(SIMT)を実行しますが、異なるインデックスでアクセスされる単一のデータを使用していますか?それとも、「別のデータ」とみなされているのですか(SIMDなのでしょうか)。CUDAスレッド、SMX、SP、ブロック、どのように動作するのですか?
SMXはGPUチップ全体ですか? SMXは、一度に1つのスレッドを実行する複数のSPで構成する必要があります。ただ1つのSPに割り当てられたスレッドのブロックですか?
は、私が今
私はCUDAの仕組みについて少し混乱します。スレッドは同じ命令(SIMT)を実行しますが、異なるインデックスでアクセスされる単一のデータを使用していますか?それとも、「別のデータ」とみなされているのですか(SIMDなのでしょうか)。CUDAスレッド、SMX、SP、ブロック、どのように動作するのですか?
SMXはGPUチップ全体ですか? SMXは、一度に1つのスレッドを実行する複数のSPで構成する必要があります。ただ1つのSPに割り当てられたスレッドのブロックですか?
は、私が今
グリッドの打ち上げは、スレッドブロックの1-3次元の打ち上げで少し混乱しています。スレッドブロックは、スレッドの1〜3次元のグループです。 CUDAワークディストリビューターはスレッドブロックをSMXユニットに配布します。ローエンドのデバイスにはSMXユニットが1つあります。ハイエンドデバイスのSMXユニット数は10を超えることがあります。
SMXユニットは、ワープと呼ばれる32個のスレッドのグループ内のスレッドブロックを中断します。 SMXユニットは、最大で64個のワープまたは16個のブロックを時間に割り当てることができます。リソースの制限(ブロック、ワープ、スレッドごとのレジスタ、ブロックあたりの共有メモリ、バリア)により、その数は少なくなる可能性があります。
各SMXユニットには、4つのワープスケジューラがあり、それぞれワープのサブセットを担当します。各サイクルで、ワープスケジューラは適格なワープを選択し、1または2の命令を発行する。二重発行するためには、2つの命令は独立していなければならず、異なる実行ユニットを使用しなければならない。例えば、1つの命令を浮動小数点ユニットにディスパッチすることができ、第2の命令をロードストアユニットにディスパッチすることができる。
ワープスケジューラを二重発行することに加えて、独立した命令をワープに戻すことができます。依存性が検出された場合、または次の命令の実行単位がビジーである場合、またはワープに命令がない場合(フェッチ待ち)、ワープスケジューラは適格であれば異なるワープを選択します。
各スレッドには、汎用レジスタ、条件コード、述語コード、およびローカルメモリの独自のセットがあります。各スレッドはスレッドブロックのメンバーです。すべてのスレッドは、共有メモリおよびバリアを含むスレッドブロックリソースにアクセスできます。グリッド起動のすべてのスレッドは、定数メモリ、テクスチャバインディング、サーフェスバインディングを含むグリッドリソースにアクセスできます。すべてのスレッドはグローバルメモリにアクセスできます。
優れた要約。障壁は限られた資源なのですか?何故ですか? –
PTXバー命令は、スレッドブロック(CTA)あたり16個のバリアをサポートします。効率的であるためには、これらは限られたハードウェア資源である。ほとんどの計算プログラムは1つのバリア(__syncthreads())を使用します。 MAX_BLOCKS_PER_SMに16をサポートする利点は非常に小さく、CUDA C/C++を使用して起こる可能性は低いです。 –