2

最初に次のことを確認したいと思います。共有メモリへの基本的なグローバル メモリ トランザクションは、32 バイト、64 バイト、または 128 バイトのいずれかですが、メモリ アクセスを結合できる場合に限ります。前のトランザクションのレイテンシはすべて同じです。そうですか?

2 番目の質問: メモリ読み取りを結合できない場合、各スレッドは 4 バイトしか読み取りません (そうですか?) すべてのスレッドのメモリ アクセスはシーケンシャルになりますか?

4

1 に答える 1

1

作業しているアーキテクチャによって異なります。ただし、Fermi と Kepler では次のようになります。

  • メモリ トランザクションは、常にセグメントと呼ばれる 32 バイトまたは 128 バイトです。
  • L2 キャッシュのみを使用する場合は 32 バイトのセグメントが使用され、L2+L1 の場合は 128 バイトのセグメントが使用されます。
  • 同じワープの 2 つのスレッドが同じセグメントに分類される場合、データは 1 回のトランザクションで配信されます
  • 一方、フェッチするセグメントにスレッドが要求していないデータがある場合、とにかく読み取られており、(おそらく) 帯域幅を無駄にします
  • セグメント全体が L1 および L2 キャッシュに分類されるため、隣接するワープが同じセグメントを必要とする場合に帯域幅の負荷が軽減される可能性があります
  • L1 と L2 は、通常提供されるスレッドの数に比べてかなり小さいです。そのため、(CPU プログラミングとは逆に) データの一部がキャッシュに長く留まることを期待すべきではありません。
  • L1 キャッシュを無効にすると、ランダムなメモリ アクセス パターンでオーバーフェッチする場合に役立ちます。

ご覧のとおり、メモリアクセスにかかる時間を決定する変数がいくつかあります。一般的な経験則は次のとおりです。アクセス パターンが密集しているほど、より良い結果が得られます。ストライドやミスアライメントは、以前ほどコストがかからないため、後期段階の最適化を行っていない限り、あまり心配する必要はありません。

于 2013-02-10T02:04:15.643 に答える