計算効率の三次元配列のC
-
09-06-2019 - |
質問
っ数値の偏微分方程式を行います。それぞれの方程式は、次の値が未知の点の現在の価値に最も近い点です。
書の効率的なコードをじっくり楽しんで、ポイントであり、三次元であり、一次元モリ空間で、それぞれの値からメモリだけます。
えocttreesが破壊も修復もおもしろくな人に知ってより良い方法です。
解決
Octtreesのかかるものと思われます。まsubdivideの8octants:
1 2 3 4 --- 5 6 7 8
そちらの記憶の1, 2, 3, 4, 5, 6, 7, 8 前述のとおりといたしました。を繰り返しますことを再帰的に各octantまでを一部ベースサイズは、その周辺128バイトではきれいでしたが、狭かったですね--いのプロフィールを決める最適なカットオフます。こられたのがきっかけとなっていより良いキャッシュの能力強化や地域の参考にナイーブをレイアウト。
他のヒント
一つの代替とツリー方法:使用モートンインターナショナルのためのコード化します。
三次元では以下のようになります。の座標成分をinterleave各ビット毎の二つのゼロのビット.ここに示すバイナリ:11111bな1001001001b
Cの関数をこのようになります(機能再構成に成功しました。には、11ビット):
int morton3 (int a)
{
int result = 0;
int i;
for (i=0; i<11; i++)
{
// check if the i'th bit is set.
int bit = a&(1<<i);
if (bit)
{
// if so set the 3*i'th bit in the result:
result |= 1<<(i*3);
}
}
return result;
}
利用することができる機能を組み合わせの位置ようになります:
index = morton3 (position.x) +
morton3 (position.y)*2 +
morton3 (position.z)*4;
これが三次元インデックスに一次元ます。ベストの一部で値に近い3次元空間内で1次元空間です。ご覧になる場合値近くまももの高速化が、モートンインターナショナルのためのエンコーディングが最適なのキャッシュ所
のためのmorton3きを使用しないコードです。小さなテーブルには4点または8ビットで結合されていったといわれている。
希望です ニルス
書籍 基盤の多次元トのデータ構造 できるようデータ構造は最速の範囲問合せ:octrees、kd-木R-木...またデータについて記述していレイアウトを保つためのポイントに集ます。