6

提供されたアドレスがブロック共有メモリに存在する場合、アトミック操作はどのように実行されますか? アトミック操作中に、ブロック内の他のスレッドによる同じ共有メモリ バンクへのアクセスを一時停止しますか、または他のスレッドが命令を実行するのを停止しますか、またはアトミック操作が完了するまですべてのブロックでスレッドを停止しますか?

4

2 に答える 2

8

更新: Maxwell (Kepler の後の世代) 以来、NVIDIA は共有メモリでのアトミック操作のハードウェア サポートを組み込みました。競合 (つまり、複数のスレッドが同じ共有メモリ位置で操作しようとしている場合) は、パフォーマンスを低下させる傾向があります。これは、マクスウェル以前のロックで競合が発生した場合にソフトウェアが実行しなければならないループと同じです。

マクスウェル以前:

共有メモリ ハードウェアには、1024 個のロックが含まれています。共有メモリで動作するアトミック組み込み関数を呼び出すと、コンパイラは、ロックを取得して条件付きで解放する短いループを生成するか、ロックが取得されなかった場合はループします。その結果、パフォーマンスは非常にデータに依存する可能性があります。ワープ内の 32 のスレッドすべてが異なるロックを取得しようとすると、それらはすべてアトミック操作を実行し、まったくループせずにロックを解放します。一方、ワープ内の 32 スレッドすべてが同じロックを取得しようとすると、各スレッドがアトミック操作を実行し、他のすべてのスレッドが取得しようとしているロックを解放するため、ワープは 31 回ループします。

取得されるロックは、共有メモリ アドレスのビット 2 ~ 11 によって決定されます。そのため、CUDA のほとんどのメモリ操作と同様に、連続する 32 ビット アドレスを操作すると、通常は良好なパフォーマンスが得られます。

于 2013-10-23T17:43:36.280 に答える
0

CUDA_C_Programming_Guide.pdf (CUDA SDK v5.0) のセクション B.11 Atomic Functions から: 「...操作が完了するまで、他のスレッドはこのアドレスにアクセスできません。」

あなたの質問は次のように要約できます。

アトミック操作を行います:

  1. ブロック内のすべてのスレッドを停止する、または
  2. アトミック操作によって使用されているメモリにアクセスしようとした場合にのみ、すべてのスレッドを停止する、または
  3. すべてのスレッドを (すべてのブロックで) 停止しますか?

私の推測は 2 です。アクティブなアトミック操作によってロックされているメモリにアクセスしようとすると、スレッドが停止します。

タイマー値を書き込んで何が起こっているのかを調査し、それらを処理してブロック動作を判断できます。申し訳ありませんが、私は決定的な答えを持っていません。

于 2013-10-22T05:19:20.190 に答える