2011-10-19 14 views
0

悪いタイトルは申し訳ありません。私はもっ​​と良いものを考え出すことができませんでした。CUDA:開始する仕事は1つだけです

私がCUDAプログラムで見たすべての例には、並列化の準備ができているデータがあらかじめ定義されています。 一般的な例は、2つの行列が既に充填されている2つの行列の和です。しかし、新しい仕事を生み出すプログラムはどうでしょうか?これをCUDAでどのようにモデル化できますか?他のスレッドが処理を開始できるように、どのように結果を渡すのですか?

例: 1つのジョブでカーネルを実行しているとします。このジョブは、10の新しい独立ジョブを生成します。それぞれ10人の新しい独立した仕事などを生み出します。これは、それぞれの仕事が独立しているので、非常に並行している仕事のようです。問題は、CUDAでこれをどのようにモデル化するのか分かりません。 私はCUDAでそれをやってみましたが、スレッドが計算を開始できるかどうかを調べるためにカーネルでwhileループを使っていました。各スレッドにジョブが割り当てられました。しかし、それはうまくいかなかった。 whileループを無視したようだ。

コード例:

On host: 
fill ready array with 0 
ready[0] = 1; 

On device: 
__global__ void kernel(int *ready, int *result) 
{ 
    int tid = threadIdx.x; 
    if(tid < N) 
    { 
     int condition = ready[tid]; 
     while(condition != 1) 
     { 
      condition = ready[tid]; 
     } 

     result[tid] = 3;// later do real computation 

     //children jobs is now ready to work 
     int childIndex = tid * 10; 
     if(childIndex < (N-10)) 
     { 
      ready[childIndex + 1] = 1; ready[childIndex + 2] = 1; 
      ready[childIndex + 3] = 1; ready[childIndex + 4] = 1; 
      ready[childIndex + 5] = 1; ready[childIndex + 6] = 1; 
      ready[childIndex + 7] = 1; ready[childIndex + 8] = 1; 
      ready[childIndex + 9] = 1; ready[childIndex +10] = 1; 
     } 
    } 
} 

答えて

8

あなたは、複数のカーネル・コールを使用したいと思うでしょう。カーネルジョブが終了して子プロセスの作業ユニットが生成されると、その子プロセスは別のカーネルで実行されます。たとえそれがうまくいっていても、ひどいパフォーマンスを得ることになっても、あなたはcudaカーネルのwhileループを使ってポーリングすることは望ましくありません。

私はグーグルのCUDA並列削減の例です。複数のカーネルに分解する方法を示します。唯一の違いは、より多くのことを行うカーネル間の作業を少なくすることです。

+0

ありがとうございました。私はこのように試して見ます。うまくいけばうまくいきます。 –

1

CUDA Dynamic Parallelismのように見えます。

これにより、別のカーネル内のカーネルを呼び出すことができます。つまり、最初のカーネルが終了して10個のタスクの生成が完了すると、直前にそれらのタスクを処理する次のカーネルを呼び出すことができます。

関連する問題