1

画像のサブ領域に対して多くの操作を行います。たとえば、100x100 の画像がある場合、この画像を反復処理して 10x10 ピクセルのブロックを処理したいと思うかもしれません。例えば:

for(each 10x10 block)
{
  for(each pixel in the block)
  {
    do something
  }
}

これに関する問題は、小さなブロックがメモリの連続したチャンクではないことです (つまり、イメージ ピクセルは行優先順で格納されているため、10x10 ブロックにアクセスすると、ブロックの各行のピクセルは連続していますが、行はブロックは連続していません.これらのブロック内のピクセルへのアクセスを高速化するためにできることはありますか?または、このようなデータ構造の領域への高速アクセスを取得することは単に不可能ですか?

私が行った多くの読書から、ループ内の唯一の操作が役立つ可能性があるため、最初にピクセルを読み取るようなもののように聞こえました。

// First read the pixels
vector<float> vals(numPixels);
for(pixels in first row)
{
val[i] = pixels[i];
}

// Then do the operations on the pixels
for(elements of vals)
{
 doSomething(vals[i])
}

私がやっていることは、同時に両方です:

// Read and operate on the pixels
for(pixels in first row)
{
 doSomething(pixels[i])
}

しかし、これを行う方法の実際のコード例 (理論的な説明に対して) を見つけることができませんでした。これに真実はありますか?

4

1 に答える 1

1

gccと呼ばれる組み込み関数があります__builtin_prefetch。その関数にアドレスを渡すことができ、それをサポートするターゲットでは、gccすぐに使用されなくても、そのアドレスがキャッシュに読み込まれるマシン命令を発行します。

多くの最新の画像処理アプリケーションは、説明した(別名 *scanlines) とは対照的に、画像を tile に格納します。たとえば、GIMPはそれを行います。したがって、画像の保存方法を制御できる場合は、タイル化されたアプローチを使用すると局所性が向上する可能性が高く、キャッシュ ミスが減少し、パフォーマンスが向上します。

于 2012-10-20T18:41:21.417 に答える