2

私の問題はここにあります。
一種のルックアップ テーブル ( 32x32x32 ) である 4 つの 3 次元テーブルがあり、C++ でリアルタイムかつ非常に迅速に値を取得する必要があります。
私の主な目標は、非常に大量の操作を行う必要があるため、計算時間です。コードの保守についてあまり心配していないため、優れたプログラミングの実践はこれの二次的なものです。これを達成するために、ほとんどのパソコンで最適なソリューションは何ですか?
データをグローバル変数に保存して別のファイルに入れ、「extern const float first[32][32][32];」のような宣言で使用することを考えました。またはファイルからベクトルをロードします。
しかし、後者は、データがもう1つのポインターを介してアクセスする必要があるため、遅くなると思います。
他の解決策はありますか?

私はウェブで検索を行いましたが、さまざまな真実を読むにつれて、これは私をさらに混乱させました.
たとえば、この 2 つの Web サイトは同じことを示唆していないようです (私が正しく理解している場合): site1site2

4

2 に答える 2

2

多次元配列のデータへのアクセス

float data[32][32][32];
data[i][j][k];

フラット化された配列にアクセスするのとまったく同じです

float data[32768];
data[i * 1024 + j * 32 + k];

追加のポインターは関係なく、配列インデックスの演算だけです。

パフォーマンスに関してはextern const float [32][32][32]、データとその使用方法に完全にアクセスできるため、プログラム全体を最適化する機会がコンパイラに提供されます。

ファイルから動的サイズにデータをロードすると、vector<vector<vector<float>>>データ要素にアクセスするための複数のポインター間接化が発生します。データのサイズがわかっている場合は、データを にロードするstatic float[32][32][32]方が効率的です。

コンパイル時に範囲が不明なデータの場合、適切なオプションはBoost.MultiArrayを使用することです。

typedef boost::multi_array<float, 3> array_type;
array_type A(boost::extents[32][32][32]);

A[i][j][k] = 5.0f;
于 2012-09-19T08:54:13.193 に答える
2

各要素に対して操作を実行している場合、これを並行して実行できる可能性がかなりあります。特にアクセス時間の最適化に関心があるため、アクセスを高速化するために配列を 1D 配列として扱うことを検討できます。

   struct Object32P3 {
     union { 
    struct {float arr3[32][32][32]}; 
    struct {float arr1[32768]}; 
    }; 
    }; 

オフセットによる 1D 配列へのアクセスは、タイトなループでの 3D 配列よりも高速です。

アクセスを最初に試みて最適化するべきではないと私が言う理由は、要素にアクセスした後に何らかの操作を実行していて、それが見て最適化するのに最適な場所だからです。

于 2012-09-19T08:15:35.033 に答える