我对图像的子区域做了很多操作。例如,如果我有一张 100x100 的图像,我可能想要遍历该图像并处理 10x10 像素的 block 。例如:
for(each 10x10 block)
{
for(each pixel in the block)
{
do something
}
}
这个问题是小块不是连续的内存块(即图像像素按行主要顺序存储,所以当我访问 10x10 block 时, block 的每一行中的像素都是连续的,但是 block 的行不连续。是否可以采取任何措施来加快对这些 block 中像素的访问速度?还是不可能快速访问像这样的数据结构区域?
从我做的大量阅读来看,这听起来像是第一次读取像素,因为循环中唯一的操作可能有用:
// 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])
}
但我无法找到有关如何执行此操作的任何实际代码示例(相对于理论解释)。这有什么道理吗?
最佳答案
gcc
有一个名为 __builtin_prefetch
的内置函数.您可以将地址传递给该函数,并且在支持它的目标上,gcc
将发出一条机器指令,导致该地址被加载到缓存中,即使它没有立即使用也是如此。
许多现代图像处理应用程序将图像存储在tiles 中,而不是您描述的行(也称为*扫描线)。例如。 GIMP does that .因此,如果您可以控制图像的存储方式,那么使用平铺方法可能会增加局部性,从而减少缓存未命中并提高性能。
关于c++ - 非连续数据的显式预取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12990402/