3

CUDA ドキュメントで読んだことによると、共有メモリ バンクの競合は sm_20 以降では無関係です。これは、値が同時に要求されたときにブロードキャストされ、シリアライゼーションの遅延が防止されるためです。

ドキュメント:

コンピュート機能 2.x のデバイスで共有メモリ ハードウェアが改善され、複数のブロードキャスト ワードをサポートし、スレッドあたり 8 ビット、16 ビット、64 ビット、または 128 ビットのアクセスで発生するバンク競合が少なくなりました (セクション G. 4.3)。

誰かが私の主張を確認できますか?

4

1 に答える 1

16

いいえ、それらは「無関係」ではありません。

あなたの混乱は、「銀行」が何らかの形で「場所」と等しいという銀行の競合に関する一般的な誤解から生じている可能性があると思います. 銀行と場所には関係がありますが、必ずしも対等ではありません。

簡単な例を挙げると、4 つのバンクがあるとします (そして、議論を 32 ビット トランザクションに限定し、32 ビット ストレージ (例:intまたは) を自然に整列させますfloat)。銀行と場所 (intまたはfloatインデックス「アドレス」) の関係は次のとおりです。

address:  bank:
       0      0 <-----------------------Thread 0
       1      1
       2      2     ------Thread 1
       3      3    /
       4      0 <---------Thread 2
       5      1
       6      2 
       7      3
       8      0 <-----------------------Thread 3
...

たとえば、アドレス 1 と 5 は同じ銀行にありますが、同じ場所ではありません。

特定のワープ トランザクション (共有メモリからの読み取りなど) の結果として、ワープ内の 2 つ以上のスレッドが同じバンク内のデータにアクセスしようとすると、バンクの競合 (任意のアーキテクチャ上) が発生する可能性があります。

fermi 以前のケースでは、複数のスレッドが同じ場所(つまりアドレス) から読み取ったとしても、これらのスレッドが同じバンクから読み取っていたため、これはバンクの競合でした。

cc2.x 以降の場合、ブロードキャストメカニズムが導入されました。このメカニズムは、1 つの特定のケースを除いて、バンク競合の一般的なケースには影響しません。複数のスレッドが同じ場所から読み取る場合、これはバンクの競合ではなくなり、その場所から読み取るすべてのスレッドは、シリアル化せずに特定のサイクルでデータを受け取ります。

ただし、どのような状況でも、複数のスレッドが同じバンク内の別々の場所から読み取った場合、現在の GPU アーキテクチャではバンク競合が発生します。

上の図で、スレッド 0 がロケーション/アドレス 0 から読み取り、スレッド 3 がロケーション/アドレス 8 から読み取る場合、現在のアーキテクチャでは常にバンク競合が発生します (これは 4 つのバンクのみの単純化された例であるため)。スレッド 1 とスレッド 2 の両方が場所/アドレス 4 から読み取る場合、それは pre-fermi でのバンク競合ですが、すべての fermi デバイス以降ではありません。

実際のバンク構成である 32 バンク配置の場合、共有メモリ内の任意の場所のバンクintは、インデックスの下位 5 ビット、またはその場所へのオフセットによって与えられますfloat

于 2014-07-03T15:16:03.657 に答える