ストライドワン方式でメモリにアクセスすることがパフォーマンスに最適であることはよく知られています。
状況で
- 読み取りのためにメモリの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)]
x
y
理想的には、常に両方の可能性をコーディングし、代表的な条件下でそれらをプロファイリングし、より高速なバージョンを選択することができます。1つのバージョンしかコーディングできないと仮定します。最新のメモリアーキテクチャの動作に基づいて、どのアクセスパターンが常に高速になると予想しますか?スレッド環境で作業すると、応答が変わりますか?