0

同期について少し混乱しています。

  1. を使用__syncthreadsすると、ブロック内のスレッドを同期できます。これ (の使用__syncthreads) は、共有メモリでのみ行う必要がありますか? または、__syncthreads最高のパフォーマンスを持つ共有メモリを使用していますか?
  2. 一般に、スレッドは、同じスレッド ブロック内に存在する場合にのみ、互いに安全に通信できますよね? では、常に共有メモリを使用しないのはなぜでしょうか? 大きくないから?また、共有メモリを使用しない場合、結果が正しいことをどのように保証できるのでしょうか?
  3. 私は時々問題なく実行されるプログラムを持っています (結果が得られます)。時には何も変更せずに「ナン」の結果が得られます。それは同期の問題でしょうか?
4

3 に答える 3

2
  1. の使用に__syncthreadsは共有メモリは含まれず、ブロック内の同期のみが保証されます。ただし、共有メモリを介してスレッドでデータを共有する場合は、スレッドを同期する必要があります。

  2. 共有メモリは非常に小さいため、また、使用頻度が低いとアプリケーションの速度が低下する可能性があるため、常に共有メモリを使用するとは限りません。これは、共有メモリを適切にアドレス指定しない場合の潜在的なバンク競合が原因です。さらに、最近のアーキテクチャ(2.0以降)では、キャッシュと同じハードウェア領域に共有メモリが実装されています。したがって、経験豊富なCUDA開発者の中には、共有メモリを使用せず、キャッシュメカニズムのみに依存することを推奨する人もいます。

  3. することができます。デッドロックかどうかを知りたい場合は、使用しているブロックの数を増やしてみてください。デッドロックの場合は、GPUがフリーズするはずです。そうでない場合は、コードを投稿してください。回答が簡単になります;)

于 2012-07-15T16:17:25.033 に答える
0

__syncthreads()と共有メモリは独立したアイデアであり、一方を使用する必要はありません。私の頭に浮かぶ__syncthreads()を使用するための唯一の要件は、すべてのスレッドが最終的にコード内のポイントに到達する必要があることです。そうしないと、プログラムが単にハングします。

共有メモリに関しては、そうです、それが常に使用されているとは思えないのはおそらくサイズの問題です。私の理解では、共有メモリはすべてのブロックに分割されています。たとえば、100ブロックで1kbの共有メモリを使用してカーネルを起動するには、SMで使用可能なものを超える100kbが必要になります。

于 2012-07-15T15:24:45.153 に答える
0
  1. shared memory__syncthreads()は独立した概念ですが、多くの場合、密接に関連しています。それ以外の場合、スレッドが独立して動作する場合は、 を使用する必要はありません__syncthreads()

  2. の使用を制限する 2 つの側面shared memory: 1)。のサイズshared memoryは限られています 2)。最高のパフォーマンスを実現するには、使用時にバンクの競合を回避する必要がありますshared memory

  3. が不足していることが原因である可能性があり__syncthreads()ます。shared memoryなしで使用__syncthreads()すると、予期しない結果が生じる場合があります。

于 2012-07-15T16:06:27.330 に答える