1

アルゴリズムの1つに動的並列処理を使用したいのですが、CPUから12ブロック* 512スレッドでカーネルを起動します。動的並列処理を使用するときに、各スレッドが新しいカーネルを起動するかどうか疑問に思いました。

void main(){
 dynamic<<<12,512,0>>>(x,y,z);
}

__global__ void dynamic(int x,int y, int z){
preprocessing<<<1,100>>>(x,y);
}

__global__ void preprocessing(int x,int y){

 //do stuff
}

これは、私の〜6000スレッドのそれぞれが100スレッドを起動しようとすることを意味しますか?または、私の最初の動的カーネルは、すべての〜6000スレッドを一時停止し、100スレッドを起動して、以前の6000スレッドで処理される結果を返しますか?

はいの場合、どうすれば100スレッドを使用できますか?次のような条件を使用する必要があります

if(tid==1){
preprocessing<<<1,100>>>(x,y)
}
4

1 に答える 1

4

はい、最初のインスタンスでは、カーネルの起動に遭遇したすべてのスレッドが独自のカーネルを起動します。デバイスカーネルの起動は非同期です。つまり、ホストの場合と同様に、制御は呼び出し元のスレッドにすぐに返されます。したがって、スレッドの一時停止はありません。

親カーネルから単一の子カーネルのみを起動する場合は、2番目の方法が機能します。

動的並列処理プログラミングガイドを読むことをお勧めします。「プログラミングガイドライン」セクションに記載されている簡単な例を試して、カーネル起動パラメーターを変更して、1つまたは複数の子カーネルが起動されることを確認できます。

非同期デバイスカーネルの起動の説明については、プログラミングガイドのp.11を参照してください。

于 2013-03-13T20:02:59.983 に答える