特定のタイプのメモリでバンク競合が発生する可能性があるかどうかは、明らかにメモリの構造とその目的に依存します。
では、共有メモリがバンクの競合を許容するように設計されているのはなぜでしょうか?
これは比較的単純で、同じメモリへの独立したアクセスを同時に処理できるメモリ コントローラを設計するのは簡単ではありません (ほとんどの場合できないという事実によって証明されています)。したがって、ハーフワープの各スレッドが個別にアドレス指定されたワードにアクセスできるようにするために、メモリはバンクされ、各バンクには独立したコントローラーがあります (少なくともそれについて考えることができますが、実際のハードウェアについてはわかりません)。これらのバンクは、シーケンシャル スレッドがシーケンシャル メモリに高速にアクセスできるようにインターリーブされます。したがって、これらの各バンクは一度に 1 つのリクエストを処理でき、理想的にはハーフワープですべてのリクエストを同時に実行できます (明らかに、このモデルは、これらのバンクが独立しているため、理論的にはより高い帯域幅を維持できます。これもプラスです)。
レジスターはどうですか?
レジスタは、ALU 命令のオペランドとしてアクセスするように設計されているため、非常に短いレイテンシでアクセスする必要があります。したがって、それを可能にするために、より多くのトランジスタ/ビットを取得します。最新のプロセッサでレジスタがどのように正確にアクセスされるかはわかりません (頻繁に必要な種類の情報ではなく、簡単に見つけることもできません)。ただし、レジスタをバンクに編成することは明らかに非現実的です (より単純なアーキテクチャでは、通常、すべてのレジスタが 1 つの大きなマルチプレクサにぶら下がっています)。いいえ、レジスタのバンク競合はありません。
グローバルメモリ
まず第一に、グローバル メモリは共有メモリとは異なる粒度で動作します。メモリは 32、64、または 128 バイトのブロックでアクセスされます (少なくとも GT200 の場合、fermi の場合は常に 128B ですが、キャッシュされます。AMD は少し異なります)。ブロックから何かが必要になるたびに、ブロック全体がアクセス/転送されます。すべてのスレッドが異なるブロックからメモリにアクセスする場合、すべてのブロックを転送する必要があるため、合体アクセスが必要なのはそのためです。
しかし、銀行の競合がないと誰が言いますか? NVIDIA ハードウェアでこれをサポートする実際のソースが見つからないため、これについては完全にはわかりませんが、論理的に思えます: グローバル メモリは通常、複数の RAM チップに分散されます (これは、グラフィックスカード)。これらのチップのそれぞれがローカル メモリのバンクのようなものである場合、同じバンクに複数の同時リクエストがある場合にバンクの競合が発生することは理にかなっています。ただし、その影響は 1 つのことについてはそれほど顕著ではなく (メモリ アクセスに費やされる時間のほとんどは、とにかく A から B にデータを取得するための待ち時間であるため)、「内部」で顕著な影響にはなりません。nvidiaハードウェアのこの理論を証明するために何も読んでいません(ほとんどすべてが合体に焦点を当てていますが、これは自然なデータセットにとって問題にならないため、もちろんより重要です)。ただし、ATI Stream コンピューティング ガイドによると、これは Radeon カードの状況です (5xxx の場合: バンクは 2kb 離れており、アクセス (シミュレート的にアクティブなすべてのワーグループからのアクセス) をすべてのバンクに均等に分散する必要があります)。 NVidia カードも同様に動作すると想像できます。
もちろん、ほとんどのシナリオでは、グローバル メモリでのバンク競合の可能性は問題にならないため、実際には次のように言えます。
- グローバルメモリにアクセスするときの結合に注意してください
- ローカル メモリへのアクセス時にバンクの競合に注意する
- レジスタへのアクセスに問題はありません