1

各スレッドが特定のメモリ アドレス (int サイズ) を更新する CUDA カーネルを作成しました。一部のスレッドは、このアドレスを同時に更新する必要がある場合があります。

CUDA はこれをどのように処理しますか? 操作はアトミックになりますか? これにより、アプリケーションのレイテンシが増加しますか? もしそうなら、どのように?

4

1 に答える 1

7

操作はアトミックにはならず、本質的に未定義の動作です。2 つ以上のスレッドが同じ場所に書き込む場合、いずれかの値がその場所に書き込まれますが、どの値かを予測する方法はありません。

変数をインクリメントするなど、読み書きを行っている場合は特に問題になる可能性があります。

CUDA は、役立つ一連のアトミック操作を提供します。

最大値または最小値を見つけるなど、同じ場所に複数の更新がある場合に役立つように、並列リダクションなどの他のコーディング手法を使用することもできます。

更新の順序を気にしない場合、書き込みまたは読み取りをグローバル メモリまたは共有メモリ内の 1 つの場所に自動的に凝縮する新しい GPU のパフォーマンスの問題にはなりませんが、これも指定された動作ではありません。

于 2013-08-24T01:13:44.667 に答える