3

スレッドがグローバル メモリにアクセスしている場合、なぜ大きなチャンクにアクセスするのでしょうか? この大きなチャンクはどこに保存されますか?

グローバル メモリから合体して読み取る場合、グローバル メモリの共通のチャンクを共有メモリにコピーすることは有益でしょうか、それとも改善はありませんか。

つまり、各スレッドが次の 5、10、または 100 のメモリ ロケーションを読み取り、それらを平均化する場合、グローバル メモリから X ポイントのチャンクを共有メモリに収めることができる場合、1 つを探しているかどうかを示す if ステートメントを記述できませんでした。これらのメモリ値のうち、グローバルではなく共有メモリから読み取られますか? ワープ ダイバージェンス ペナルティは、毎回グローバル メモリから読み取るよりも少ないと想定しています。

ここに画像の説明を入力

4

1 に答える 1

5

グローバル メモリから読み取る場合、データは最初に L1 キャッシュ (高帯域幅、Fermi では 1.600GB/秒、ただしサイズは制限されています。Fermi では 48KB) で検索され、L1 に存在しない場合は L2 で検索されます。 (帯域幅は低くなりますが、L1 より大きく、Fermi では 768KB)、最後に、L2 に存在しない場合は、グローバル メモリからロードされます*。

グローバル メモリのロードが発生すると、データは L2 に移動されてから L1 に移動されるため、次にグローバル メモリの読み取りが必要になったときに、より高速な方法でデータにアクセスできます。

このようなデータは、その後のグローバル メモリのロードによって削除される可能性がありますが、そうでない可能性もあります。したがって、原則として、データの「小さな」チャンクを読み取る場合は、次回高速な方法でデータにアクセスするために、必ずしもデータを共有メモリに配置する必要はありません。

Fermi と Kepler では、共有メモリが L1 キャッシュの同じ回路によって作成されることを考慮してください。その後、共有メモリを制御された L1 キャッシュとして見ることができます。

次に、データを強制的に共有メモリに配置して、たとえば「利用可能な最速のキャッシュ」に配置する必要があります。同じデータに複数回アクセスする必要があるときはいつでもそうします。

上記は、グローバル メモリ転送の背後にある一般的な考え方であることに注意してください。実装の詳細は、基盤となるアーキテクチャによって異なる場合があります。

*L1 キャッシュ ラインは、コンパイラ オプションによって無効にできることに注意してください。これは、ランダム アクセス データ パターンのパフォーマンスの点で役立ちます。

于 2013-06-14T12:56:01.257 に答える