2

dynamic parallelismこの新技術の説明から、ケプラーに関する情報はほとんどありませんが、同じワープでのスレッド制御フローの発散の問題が解決されたことを意味しますか?

デバイスrecursionコードからカーネルをランチすることができますが、異なるスレッドの制御パスを同時に実行できるということですか?

4

3 に答える 3

3

この論文を見てください

動的並列処理、フロー発散、および再帰は、別個の概念です。動的並列処理は、スレッド内でスレッドを起動する機能です。これは、たとえば、これを行うことができることを意味します

__global__ void t_father(...)   {
   ...
   t_child<<< BLOCKS, THREADS>>>();
   ...
}

私はこの分野で個人的に調査しました。このようなことを行うと、t_fatherがt_childを起動すると、vgaリソース全体がそれらの間で再び分散され、t_fatherはすべてのt_childが終了するまで待機してから続行できます(このペーパーのスライド25も参照してください)。 )。

再帰はFermi以降で利用可能であり、他のスレッド/ブロックの再構成なしでスレッドが自分自身を呼び出す機能です。

フローの発散に関しては、ワープ内のスレッドが異なるコードを同時に実行することは決してないでしょう。

于 2012-07-09T08:01:52.800 に答える
0

いいえ。ワープの概念はまだ存在します。ワープ内のすべてのスレッドはSIMD(単一命令複数データ)です。つまり、同時に1つの命令を実行します。子カーネルを呼び出す場合でも、GPUは1つ以上のワープを呼び出しに指定します。動的並列処理を使用するときは、次の3つのことを念頭に置いてください。

  1. あなたが行くことができる最も深いのは24です(CC = 3.5)。

  2. 同時に実行される動的カーネルの数は制限されていますが(デフォルトは4096)、増やすことができます。

  3. 子カーネルを呼び出した後は、親カーネルをビジー状態に保ちます。そうしないと、リソースを浪費する可能性が高くなります。

于 2013-09-17T08:29:43.863 に答える
0

スライド9のこのNVidiaプレゼンテーションには、サンプルのcudaソースがあります。

__global__ void convolution(int x[])
{
   for j = 1 to x[blockIdx]
      kernel<<< ... >>>(blockIdx, j)
}

さらに、CUDA制御コードの一部がGPUに移動される方法を示します。これにより、カーネルは、さまざまなサイズの部分的なドプートドメインで他のカーネル関数を生成できます(スライド14)。

グローバルコンピューティングドメインとそのパーティション化はまだ静的であるため、評価関数の最後に到達していないため、GPU計算中にこれを実際に変更して、より多くのカーネル実行を生成することはできません。代わりに、特定のカーネルで生成するスレッドの数を保持する配列を提供します。

于 2013-11-21T13:33:37.017 に答える