0

一部のデータを共有メモリからグローバル メモリに転送しようとしています。一部の連続するスレッドは、1 つのバンクにアクセスします (ただし、同じ 32 ビットにはアクセスしません)。そのため、いくつかの銀行の競合があります。(Visual Profiler を使用して確認しています) ただし、これらのデータも結合されてグローバル メモリに転送されます。(私は Visual Profiler を使用してこれを確認しています) データが合体してグローバル メモリに書き込まれるのはなぜですか? 私の意見では、ストリーミング マルチプロセッサは (銀行の帯域幅に基づいて) 32 ビット ワードを 1 つずつポップします。そのため、メモリ トランザクションをグローバル メモリに結合することはできません。ここでいくつかの間違いを犯す可能性があります。間違いを見つけるのを手伝うか、合理的な説明をしてください。ありがとうございました。

4

1 に答える 1

2

ここでは、2 つの異なる処理が行われています。バンクの競合が発生する読み取りと、結合されない可能性のある書き込みです。共有メモリはグローバルよりもはるかに高速であるため、通常は結合されたアクセスについて最初に考慮する必要があります。

合体とは、スレッドが狭い範囲のメモリ アドレスに書き込みを行っていることを意味します。たとえば、スレッド 1 がアドレス 1 に書き込み、スレッド 2 がアドレス 2 に書き込む場合、これで問題ありません。アドレス* 1 と 4 への書き込みの場合、これはさらに悪化します。それほど重要ではありませんが、スレッドがアドレス 32 と 33 のように、32 の倍数から始まる増加するアドレスに書き込む場合に最適です。

バンクの競合は、複数のスレッドが同じ下位ビット (具体的には mod 16 と同等) を持つ共有メモリ アドレスにアクセスするときに発生します。2 つのスレッドが同じバンクを使用する場合、それらはシリアライズされます。つまり、両方が同時にメモリにアクセスするのではなく、一方が他方の後に実行されます。

于 2011-05-25T08:57:12.007 に答える