9

ストライドワン方式でメモリにアクセスすることがパフォーマンスに最適であることはよく知られています。

状況で

  • 読み取りのためにメモリの1つの領域にアクセスする必要があります。
  • 私は書くために別の地域にアクセスしなければなりません、そして
  • 私はストライドワン方式で2つの地域のうちの1つにしかアクセスできません。

ストライド1を読むか、ストライド1を書くかを選択する必要がありますか?

単純で具体的な例の1つは、のようなBLASのようなコピーと順列の操作ですy := P x。順列行列Pは、いくつかの順列ベクトルによって完全に定義されq(i)ます。対応する逆順列ベクトルがありqinv(i)ます。前者がストライド1から読み取り、後者がストライド1に書き込むy[qinv(i)] = x[i]場合に、必要なループをコーディングできます。y[i]=x[q(i)]xy

理想的には、常に両方の可能性をコーディングし、代表的な条件下でそれらをプロファイリングし、より高速なバージョンを選択することができます。1つのバージョンしかコーディングできないと仮定します。最新のメモリアーキテクチャの動作に基づいて、どのアクセスパターンが常に高速になると予想しますか?スレッド環境で作業すると、応答が変わりますか?

4

2 に答える 2

7

「ストライド1を書き込む」(y[i]=x[q(i)])という名前のアクセスパターンは、通常は高速です。

メモリがキャッシュされていて、データがキャッシュラインよりも小さい場合、このアクセスパターンに必要なメモリ帯域幅は少なくなります。

最近のプロセッサでは、ストアユニットよりも多くのロード実行ユニットを使用するのが一般的です。そして、Haswellという名前の次のIntelアーキテクチャは、GATHER命令のみをサポートしますが、SCATTERはまだ計画されていません。これはすべて、「ストライド1を書き込む」パターンにも賛成です。

スレッド環境で作業しても、これは変わりません。

于 2012-01-26T17:39:38.657 に答える