誰かがこれについて私に教えてもらえますか:ブロックはCUDAで並行して/同時に実行されますか?言い換えると、2つの異なるブロックが同じグローバルアドレス、つまりglobalPtr [12]に書き込もうとした場合、更新が失われる問題がありますか?
(CUDAの並列実行ユニットはwarp = 32スレッドであることを読んだので、これを求めています。)
誰かがこれについて私に教えてもらえますか:ブロックはCUDAで並行して/同時に実行されますか?言い換えると、2つの異なるブロックが同じグローバルアドレス、つまりglobalPtr [12]に書き込もうとした場合、更新が失われる問題がありますか?
(CUDAの並列実行ユニットはwarp = 32スレッドであることを読んだので、これを求めています。)
はい、複数のブロックが並行して実行されるため、複数のスレッドが同じアドレスにアクセスする必要がある場合、グローバルメモリへのアクセスはアトミックである必要があります。これは、同じブロック内の2つのスレッドであろうと、異なるブロック内の2つのスレッドであろうと適用されます。
はい、CUDA デバイスに複数のワープ スケジューラがある場合、複数のブロック間で並列実行できます。
コンピューティング機能 2.1 を備えた CUDA デバイスには 2 つのワープ スケジューラがあるため、2 つの異なるワープ (同じブロックまたは異なるブロックからの命令は関係ありません) からの命令を同時に実行できます。
コンピューティング機能 3.0 を備えた CUDA デバイスには 4 つのワープ スケジューラがあり、実行準備ができているワープごとに 2 つの独立した命令を発行できます。
ワープ間で同時実行がなくても、複数のブロックをスケジューラで使用できるようにしておくと有利です。メモリ操作の完了を待ってワープがブロックされた場合、スケジューラは実行のために別のワープに切り替えることができるため、コアは実行されません。じっと座っている。
スケジューラが切り替える準備ができているコアに常駐できるワープの数は、計算能力によって異なります。
スケジューラーと同数のブロックしか定義しない場合、デバイスの完全なコンピューティングの可能性を実現することはできません。これは、コードに多くのメモリ I/O がある場合に特に当てはまります。メモリ レイテンシを「隠す」方法の 1 つは、十分なブロック/ワープが利用可能であることを確認することです。ワープの 1 つがアイドル状態になり、メモリ I/O を待機します。
複数の warp で同じメモリ アドレスを読み書きする場合は常に、現在のハードウェアが複数の warp を同時に実行できるかどうかに関係なく、アトミック I/O を使用するか、ロックを取得する必要があります。書き込み後書き込みアーティファクト (「失われた更新」) は、タスク切り替えシングル コア実行でも発生する可能性があります。