いくつかのタスクを CUDA GPU に「マップ」しようとしています。処理するタスクが n 個あります。(疑似コードを参照)
malloc an boolean array flag[n] and initialize it as false.
for each work-group in parallel do
while there are still unfinished tasks do
Do something;
for a few j_1, j_2, .. j_m (j_i<k) do
Wait until task j_i is finished; [ while(flag[j_i]) ; ]
Do Something;
end for
Do something;
Mark task k finished; [ flag[k] = true; ]
end while
end for
何らかの理由で、別のスレッド ブロックでスレッドを使用する必要があります。
問題は、タスク j_i が完了するまで待機を実装する方法です。タスク k の終了をマークします。CUDAで。私の実装では、ブール配列をフラグとして使用します。次に、タスクが完了したらフラグを設定し、フラグを読み取ってタスクが完了したかどうかを確認します。
しかし、それは小さなケース、1 つの大きなケースでのみ機能し、GPU は不明な理由でクラッシュします。CUDA で待機とマークを実装するより良い方法はありますか。
これは基本的に、CUDA でのスレッド間通信の問題です。