0

2 つの主要なタスクで構成されるアルゴリズムがあります。両方のタスクは、恥ずかしいほど並行しています。したがって、次のいずれかの方法で、このアルゴリズムを CUDA に移植できます。

>Kernel<<<
Block,Threads>>>()  \\\For task1  
cudaThreadSynchronize();  
>Kerne2<<<
Block,Threads>>>()  \\\For task2

または、次のことができます。

>Kernel<<<
Block,Threads>>>()  
{  
    1.Threads work on task 1.  
    2.syncronizes across device.  
    3.Start for task 2.  
}

最初の方法では CPU に戻る必要がありますが、2 番目の方法では CUDA のすべてのブロックで同期を使用する必要があります。IPDPS 10の論文では、2 番目の方法は、適切な注意を払って実行すると、より良い結果が得られると述べられています。しかし、一般的にどの方法に従うべきでしょうか?

4

1 に答える 1

2

現在、CUDAプログラミングモデルで単一のカーネル実行を使用してスレッドブロック間で同期するための公式にサポートされている方法はありません。私の経験では、そうする方法は脆弱なコードにつながり、さまざまなハードウェアでの実行、ドライバーやCUDAリリースバージョンの変更など、状況の変化の下で誤った動作を引き起こす可能性があります。

学術出版物に何かが掲載されているからといって、それがプロダクションコードにとって安全なアイデアであるとは限りません。

私はあなたがあなたの方法1に固執することをお勧めします、そして私はあなたにこれを尋ねます:あなたはあなたの計算を2つの別々のカーネルに分けることが本当にパフォーマンスの問題を引き起こしていると判断しましたか?2回目のカーネル起動のコストは間違いなくボトルネックですか?

于 2012-08-27T00:09:09.240 に答える