1

現在、アルゴリズムで 2 つの 2D 配列を使用している領域拡張コードを最適化したいと考えています。1 つの 2D 配列は 2D テクスチャの各ピクセルの訪問済み状態を保持し、1 つの 2D 配列は各ピクセルの「マスクする必要がある」ブール値を保持します。

インテル® VTune™ Amplifier XE を実行して、メソッドのパフォーマンスをプロファイリングしました。512x512 画像の最も重要な統計の下:

  • array2D[x][y] のルックアップには ~10 ~ 15 ミリ秒かかります
  • array2D[x][y] の書き込みには 1 ~ 2 ミリ秒かかります
  • 作成と初期化には、アレイごとに約 8 ~ 10 ミリ秒かかります

さらに、書き込みとほぼ同じ数の読み取りを実行しています。2D 配列の作成は、最も基本的な方法で行われます。

bool** array2D = new bool*[desc.Width];
for(unsigned int i = 0; i < desc.Width; ++i)
    array2D[i] = new bool[desc.Height];

for(unsigned int x = 0; x < desc.Width; x++){
    for(unsigned int y = 0; y < desc.Height; y++){
        array2D[x][y] = false;
    }
}

この情報を保持するためのよりパフォーマンスの高い構造を探しています。コード例だけでなく、一般的なアイデア (guestimates を含む) も歓迎します。

4

2 に答える 2

2

2D 配列から 1D 配列に切り替えることで、読みやすさを犠牲にしてパフォーマンスを最適化することができます。アクセスパターンに応じて、代わりにor (行優先または列優先array2D[x][y]) を使用できます。これにより、個別の割り当てを回避できます。array[x*Height+y]array[x+y*Width]

配列が大きい場合は、ブール値をより大きな整数型にパックすることもできます。これにより、アクセスコードが多少遅くなりますが、フットプリントがかなり小さいため、アクセスの遅さをキャッシュパフォーマンスの向上で補うことができます。

于 2013-03-19T12:43:42.687 に答える
1

2 次元配列を 1 次元配列でラップします。

type* array = new type[width * height];
array[x + y * width] = data_at_x_y;
于 2013-03-19T12:42:55.753 に答える