18

私が理解していないことの1つは、Googleが私を助けていないことです.共有メモリでは銀行の競合が発生する可能性があるのに、グローバルメモリでは発生しないのはなぜですか? レジスタとのバンクの競合はありますか?

更新 うわー、ティビットとグリズリーからの2つの回答に本当に感謝しています。緑のチェック マークを 1 つの回答にしか付けることができないようです。私はスタックオーバーフローに慣れていません。1つの答えを最良のものとして選択する必要があると思います。緑のチェックを付けていない回答に対して、何かお礼をすることはできますか?

4

3 に答える 3

36

簡単な回答: グローバル メモリにもレジスタにもバンクの競合はありません。

説明:

その理由を理解する鍵は、操作の粒度を把握することです。シングル スレッドはグローバル メモリにアクセスしません。グローバル メモリ アクセスは「結合」されます。グローバルメモリは非常に遅いため、ブロック内のスレッドによるアクセスはすべてグループ化され、グローバルメモリへのリクエストができるだけ少なくなります。

共有メモリは、スレッドから同時にアクセスできます。2 つのスレッドが同じバンク内のアドレスにアクセスしようとすると、バンクの競合が発生します。

レジスターは、割り当てられたスレッド以外のスレッドからはアクセスできません。あなたは私のレジスターを読み書きできないので、私がレジスターにアクセスするのをブロックすることはできません。したがって、バンクの競合はありません。

グローバル メモリを読み書きできるのは誰ですか?

Only blocks. シングルスレッドでもアクセスはできますが、トランザクションはブロックレベルで処理されます(実際にはワープ/ハーフワープレベルですが、複雑にならないようにしています)。2 つのブロックが同じメモリにアクセスする場合、時間がかかるとは思えず、最新のデバイスの L1 キャッシュによって高速化される可能性がありますが、これは透過的に明らかではありません。

共有メモリを読み書きできるのは誰ですか?

Any thread within a given block. ブロックごとに 1 つのスレッドしかない場合、バンクの競合は発生しませんが、妥当なパフォーマンスは得られません。バンクの競合が発生するのは、ブロックが複数 (たとえば 512 個) のスレッドに割り当てられ、それらがすべて同じバン​​ク内の異なるアドレス (まったく同じアドレスではない) を求めて争っているからです。CUDA C プログラミング ガイドの最後に、これらの競合の優れた図がいくつかあります -- 図 G2、167 ページ (実際には pdf の 177 ページ)。 バージョン 3.2 へのリンク

レジスタを読み書きできるのは誰ですか?

Only the specific thread to which it is allocated. したがって、一度にアクセスできるスレッドは 1 つだけです。

于 2010-10-02T19:52:47.970 に答える
22

特定のタイプのメモリでバンク競合が発生する可能性があるかどうかは、明らかにメモリの構造とその目的に依存します。

では、共有メモリがバンクの競合を許容するように設計されているのはなぜでしょうか?

これは比較的単純で、同じメモリへの独立したアクセスを同時に処理できるメモリ コントローラを設計するのは簡単ではありません (ほとんどの場合できないという事実によって証明されています)。したがって、ハーフワープの各スレッドが個別にアドレス指定されたワードにアクセスできるようにするために、メモリはバンクされ、各バンクには独立したコントローラーがあります (少なくともそれについて考えることができますが、実際のハードウェアについてはわかりません)。これらのバンクは、シーケンシャル スレッドがシーケンシャル メモリに高速にアクセスできるようにインターリーブされます。したがって、これらの各バンクは一度に 1 つのリクエストを処理でき、理想的にはハーフワープですべてのリクエストを同時に実行できます (明らかに、このモデルは、これらのバンクが独立しているため、理論的にはより高い帯域幅を維持できます。これもプラスです)。

レジスターはどうですか?

レジスタは、ALU 命令のオペランドとしてアクセスするように設計されているため、非常に短いレイテンシでアクセスする必要があります。したがって、それを可能にするために、より多くのトランジスタ/ビットを取得します。最新のプロセッサでレジスタがどのように正確にアクセスされるかはわかりません (頻繁に必要な種類の情報ではなく、簡単に見つけることもできません)。ただし、レジスタをバンクに編成することは明らかに非現実的です (より単純なアーキテクチャでは、通常、すべてのレジスタが 1 つの大きなマルチプレクサにぶら下がっています)。いいえ、レジスタのバンク競合はありません。

グローバルメモリ

まず第一に、グローバル メモリは共有メモリとは異なる粒度で動作します。メモリは 32​​、64、または 128 バイトのブロックでアクセスされます (少なくとも GT200 の場合、fermi の場合は常に 128B ですが、キャッシュされます。AMD は少し異なります)。ブロックから何かが必要になるたびに、ブロック全体がアクセス/転送されます。すべてのスレッドが異なるブロックからメモリにアクセスする場合、すべてのブロックを転送する必要があるため、合体アクセスが必要なのはそのためです。

しかし、銀行の競合がないと誰が言いますか? NVIDIA ハードウェアでこれをサポートする実際のソースが見つからないため、これについては完全にはわかりませんが、論理的に思えます: グローバル メモリは通常、複数の RAM チップに分散されます (これは、グラフィックスカード)。これらのチップのそれぞれがローカル メモリのバンクのようなものである場合、同じバンクに複数の同時リクエストがある場合にバンクの競合が発生することは理にかなっています。ただし、その影響は 1 つのことについてはそれほど顕著ではなく (メモリ アクセスに費やされる時間のほとんどは、とにかく A から B にデータを取得するための待ち時間であるため)、「内部」で顕著な影響にはなりません。nvidiaハードウェアのこの理論を証明するために何も読んでいません(ほとんどすべてが合体に焦点を当てていますが、これは自然なデータセットにとって問題にならないため、もちろんより重要です)。ただし、ATI Stream コンピューティング ガイドによると、これは Radeon カードの状況です (5xxx の場合: バンクは 2kb 離れており、アクセス (シミュレート的にアクティブなすべてのワーグループからのアクセス) をすべてのバンクに均等に分散する必要があります)。 NVidia カードも同様に動作すると想像できます。

もちろん、ほとんどのシナリオでは、グローバル メモリでのバンク競合の可能性は問題にならないため、実際には次のように言えます。

  • グローバルメモリにアクセスするときの結合に注意してください
  • ローカル メモリへのアクセス時にバンクの競合に注意する
  • レジスタへのアクセスに問題はありません
于 2010-10-02T21:52:13.150 に答える
4

同じバンクにアクセスする複数のスレッドは、必ずしもバンクの競合があることを意味するわけではありません。スレッドが同じバンク内の異なる行から同時に読み取りたい場合は、競合が発生します。

于 2011-02-13T15:55:29.753 に答える