dynamic parallelism
この新技術の説明から、ケプラーに関する情報はほとんどありませんが、同じワープでのスレッド制御フローの発散の問題が解決されたことを意味しますか?
デバイスrecursion
コードからカーネルをランチすることができますが、異なるスレッドの制御パスを同時に実行できるということですか?
dynamic parallelism
この新技術の説明から、ケプラーに関する情報はほとんどありませんが、同じワープでのスレッド制御フローの発散の問題が解決されたことを意味しますか?
デバイスrecursion
コードからカーネルをランチすることができますが、異なるスレッドの制御パスを同時に実行できるということですか?
動的並列処理、フロー発散、および再帰は、別個の概念です。動的並列処理は、スレッド内でスレッドを起動する機能です。これは、たとえば、これを行うことができることを意味します
__global__ void t_father(...) {
...
t_child<<< BLOCKS, THREADS>>>();
...
}
私はこの分野で個人的に調査しました。このようなことを行うと、t_fatherがt_childを起動すると、vgaリソース全体がそれらの間で再び分散され、t_fatherはすべてのt_childが終了するまで待機してから続行できます(このペーパーのスライド25も参照してください)。 )。
再帰はFermi以降で利用可能であり、他のスレッド/ブロックの再構成なしでスレッドが自分自身を呼び出す機能です。
フローの発散に関しては、ワープ内のスレッドが異なるコードを同時に実行することは決してないでしょう。
いいえ。ワープの概念はまだ存在します。ワープ内のすべてのスレッドはSIMD(単一命令複数データ)です。つまり、同時に1つの命令を実行します。子カーネルを呼び出す場合でも、GPUは1つ以上のワープを呼び出しに指定します。動的並列処理を使用するときは、次の3つのことを念頭に置いてください。
あなたが行くことができる最も深いのは24です(CC = 3.5)。
同時に実行される動的カーネルの数は制限されていますが(デフォルトは4096)、増やすことができます。
子カーネルを呼び出した後は、親カーネルをビジー状態に保ちます。そうしないと、リソースを浪費する可能性が高くなります。
スライド9のこのNVidiaプレゼンテーションには、サンプルのcudaソースがあります。
__global__ void convolution(int x[])
{
for j = 1 to x[blockIdx]
kernel<<< ... >>>(blockIdx, j)
}
さらに、CUDA制御コードの一部がGPUに移動される方法を示します。これにより、カーネルは、さまざまなサイズの部分的なドプートドメインで他のカーネル関数を生成できます(スライド14)。
グローバルコンピューティングドメインとそのパーティション化はまだ静的であるため、評価関数の最後に到達していないため、GPU計算中にこれを実際に変更して、より多くのカーネル実行を生成することはできません。代わりに、特定のカーネルで生成するスレッドの数を保持する配列を提供します。