これを確認する最善の方法は、「Compute Visual Profiler」を使用してコードをプロファイリングすることです。これには CUDA ツールキットが付属しています。また、GPU Gems 3には、「39.2.3 バンク競合の回避」という優れたセクションがあります。
「同じワープ内の複数のスレッドが同じバンクにアクセスする場合、ワープのすべてのスレッドが同じ 32 ビット ワード内の同じアドレスにアクセスしない限り、バンク競合が発生します」 - まず、それぞれ 4 バイト幅の 16 のメモリ バンクがあります。基本的に、共有メモリ バンク内の同じ 4 バイトからメモリを読み取るハーフ ワープにスレッドがある場合、バンクの競合やシリアライゼーションなどが発生します。
わかりましたので、最初の例:
まず、配列がint型( 32 ビット ワード)であると仮定します。コードはこれらの int を共有メモリに保存し、K 番目のスレッドが K 番目のメモリ バンクに保存しているハーフ ワープ全体で保存します。たとえば、最初のハーフ ワープのスレッド 0 はshared_a[0]
最初のメモリ バンクに保存され、スレッド 1 は に保存されshared_a[1]
、各ハーフ ワープには 16 のスレッドがあり、これらは 16 の 4 バイト バンクにマップされます。次のハーフ ワープでは、最初のスレッドがその値を最初のスレッドにある shared_a[16] に保存します。メモリバンクを再び。したがって、int、float などの 4 バイト ワードを使用する場合、最初の例ではバンク コンフリクトは発生しません。char などの 1 バイトのワードを使用すると、最初の半分のワープ スレッド 0、1、2、および 3 はすべて、それらの値を共有メモリの最初のバンクに保存し、バンクの競合が発生します。
2 番目の例:
繰り返しますが、これはすべて使用しているワードのサイズに依存しますが、例では 4 バイトのワードを使用します。前半のワープを見ると、次のようになります。
スレッド数 = 32
N = 64
スレッド 0: 0、31、63 に書き込みます スレッド 1: 1、32 に書き込みます
ハーフ ワープ全体のすべてのスレッドが同時に実行されるため、共有メモリへの書き込みによってバンクの競合が発生することはありません。ただし、これを再確認する必要があります。
これがお役に立てば幸いです。大きな返信で申し訳ありません。