悪いタイトルは申し訳ありません。私はもっと良いものを考え出すことができませんでした。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;
}
}
}
ありがとうございました。私はこのように試して見ます。うまくいけばうまくいきます。 –