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将发出一条机器指令,导致该地址被加载到缓存中,即使它没有立即使用。

许多现代图像处理应用程序将图像存储在tile中,而不是您描述的(又名 *scanlines)。例如 GIMP就是这样做的。因此,如果您可以控制图像的存储方式,那么使用平铺方法可能会增加局部性,从而减少缓存未命中并提高性能。

于 2012-10-20T18:41:21.417 回答