各スレッドが特定のメモリ アドレス (int サイズ) を更新する CUDA カーネルを作成しました。一部のスレッドは、このアドレスを同時に更新する必要がある場合があります。
CUDA はこれをどのように処理しますか? 操作はアトミックになりますか? これにより、アプリケーションのレイテンシが増加しますか? もしそうなら、どのように?
各スレッドが特定のメモリ アドレス (int サイズ) を更新する CUDA カーネルを作成しました。一部のスレッドは、このアドレスを同時に更新する必要がある場合があります。
CUDA はこれをどのように処理しますか? 操作はアトミックになりますか? これにより、アプリケーションのレイテンシが増加しますか? もしそうなら、どのように?
操作はアトミックにはならず、本質的に未定義の動作です。2 つ以上のスレッドが同じ場所に書き込む場合、いずれかの値がその場所に書き込まれますが、どの値かを予測する方法はありません。
変数をインクリメントするなど、読み書きを行っている場合は特に問題になる可能性があります。
CUDA は、役立つ一連のアトミック操作を提供します。
最大値または最小値を見つけるなど、同じ場所に複数の更新がある場合に役立つように、並列リダクションなどの他のコーディング手法を使用することもできます。
更新の順序を気にしない場合、書き込みまたは読み取りをグローバル メモリまたは共有メモリ内の 1 つの場所に自動的に凝縮する新しい GPU のパフォーマンスの問題にはなりませんが、これも指定された動作ではありません。