グローバル メモリから読み取る場合、データは最初に L1 キャッシュ (高帯域幅、Fermi では 1.600GB/秒、ただしサイズは制限されています。Fermi では 48KB) で検索され、L1 に存在しない場合は L2 で検索されます。 (帯域幅は低くなりますが、L1 より大きく、Fermi では 768KB)、最後に、L2 に存在しない場合は、グローバル メモリからロードされます*。
グローバル メモリのロードが発生すると、データは L2 に移動されてから L1 に移動されるため、次にグローバル メモリの読み取りが必要になったときに、より高速な方法でデータにアクセスできます。
このようなデータは、その後のグローバル メモリのロードによって削除される可能性がありますが、そうでない可能性もあります。したがって、原則として、データの「小さな」チャンクを読み取る場合は、次回高速な方法でデータにアクセスするために、必ずしもデータを共有メモリに配置する必要はありません。
Fermi と Kepler では、共有メモリが L1 キャッシュの同じ回路によって作成されることを考慮してください。その後、共有メモリを制御された L1 キャッシュとして見ることができます。
次に、データを強制的に共有メモリに配置して、たとえば「利用可能な最速のキャッシュ」に配置する必要があります。同じデータに複数回アクセスする必要があるときはいつでもそうします。
上記は、グローバル メモリ転送の背後にある一般的な考え方であることに注意してください。実装の詳細は、基盤となるアーキテクチャによって異なる場合があります。
*L1 キャッシュ ラインは、コンパイラ オプションによって無効にできることに注意してください。これは、ランダム アクセス データ パターンのパフォーマンスの点で役立ちます。