7ポイントCにおける計算ステンシルキャッシュアクセス(or..map 1Dアレイに3Dアレイ)

StackOverflow https://stackoverflow.com/questions/1883319

  •  19-09-2019
  •  | 
  •  

質問

私はそれに取り組むためにしようとしています問題は7ポイント計算ステンシルが含まれています。知らないかもしれない人のため、これは、3Dグリッドとなり、及び7点はn番目の点であり、東に一点離れて正と負の両方のx、y、z方向における近隣(又は隣人/西/北/南及びアップ/ダウン)。

したがって、これらの6点プラス私が働いている計算に使用され、すべての1次元配列に格納されている。さらに1点

nxはキューブの幅であり、nyは高さであると仮定する。メモリでは、その後、私はそれがそれぞれの方向に隣人です取得するには、その後、そのようAll_points [n]のように、アレイAll_Pointsでポイントにアクセスしていたとき、私はまた、All_points [N-1]、All_pointsを[N + 1]にアクセスしたいです、All_points [N-NX]、All_points [N + NX]、All_points [N-NX NY]、及びAll_points [N + NX のNY]。

だから、これで私の問題は、私はキャッシュミスのトンを取得していますということです。私はこの問題を回避する方法を示し任意のコード例を見つけるように見えることはできません。それは[]などAll_x_pointsなどのx、y、zの座標、ですが、その後、私は更新され、All_points以来[n]の変更を維持しようとして問題に遭遇し、それがないときに理想的には私はバックアップこの配列を分割したいのですがそれはいくつかの他のAll_points [N ']私のXための手段と、YまたはZの値は、それに更新する必要があります。

誰もが前に行ってこの種のものを見たことありますか?

役に立ちましたか?

解決

アクセスパターンはどのようなあなたの7点のステンシルを使用していますか?あなたはキャッシュコヒーレンス問題がある場合、これは聞いて最初の質問です - 。あなたの中心(x、y、z)のアクセスパターン座標が完全にランダムである場合、あなたは運していない可能性があります。

あなたがアクセスパターンをある程度制御を持っている場合、あなたはより多くのキャッシュフレンドリーであることを、それを調整しようとすることができます。ない場合は、期待するのは、アクセスパターンの種類を検討すべきです。あなたは、このアクセスパターンがより良性であるようにデータを配置することができるかもしれません。これら二つの組み合わせは、時には非常に効果的であることができます。

ビットインターリーブアレイレイアウト:

この種のもののために頻繁に有用である特定のデータ配置があります。各座標の大きさが2の累乗であること(簡単にするため)と仮定。次いで、「正常な」レイアウトは各座標のためのビットを連結することによって、インデックスを構築します。しかし、ビットインターリーブ配置は、ラウンドロビン方式で各次元にビットを割り当てます。

3D index coords: (xxxx, yyyy, zzzz)

normal index:    data[zzzzyyyyxxxx]  (x-coord has least-significant bits, then y)
bit-interleaved: data[zyxzyxzyxzyx]  (lsb are now relatively local)

事実上、マイナーなコストがあります:代わりに自分のステップ値により座標を掛けるのは、あなたのオフセットを見つけるために、ルックアップテーブルを使用する必要があります。しかし、あなたはおそらく唯一の(特に3次元配列のために!)非常に短いルックアップテーブルを必要とすることから、それらはすべてキャッシュにうまく収まる必要があります。

3D coords:  (x,y,z)

normal index:      data[x + y*ystep + z*zstep]  where:
  ystep= xsize (possibly aligned-up, if not a power of 2?)
  zsetp= ysize * ystep

bit-interleaved:   data[xtab[x] + ytab[y] + ztab[z]]  where:
  xtab={  0,  1,  8,  9, 64, 65, 72, 73,512...}   (x has bits 0,3,6,9...)
  ytab={  0,  2, 16, 18,128,130,144,146,1024...}  (y has bits 1,4,7,10...)
  ztab={  0,  4, 32, 36,256,260,288,292,2048...}  (y has bits 2,5,8,11...)

結局、これは任意の使用は、あなたのアルゴリズムの要件に完全に依存しているかどうか。しかし、再び、あなたのアルゴリズムは、あまりにもあなたのキャッシュを要求している場合は、あなただけではなく、レイアウトの、アルゴリズムの調整に見てみたいことがありますのでご注意ください。

他のヒント

7ポイント?六は、1つの長さを定義し、座標空間を定義しますか?これらの...スターゲイト座標はありますか?

なぜアレイ(SOA)の構造に構造(AOS)のあなたの配列をオンにしませんか?

int point = points_all[i]; // the point you want
Vec2 points_x[point]; // x and y are the neighbours left and right
Vec2 points_y[point]; // x and y are the neighbours up and down
Vec2 points_z[point]; // x and y are the neighbours front and back
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top