[英]Explicit prefetching of non-contiguous data
我对图像的子区域做了很多操作。 例如,如果我有一个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])
}
但是我找不到如何执行此操作的任何实际代码示例(相对于理论解释)。 有没有道理呢?
gcc
有一个内置函数__builtin_prefetch
。 您可以将一个地址传递给该函数,并且在支持该函数的目标上, gcc
会发出一条机器指令,即使该地址没有立即使用,它也会将该地址加载到缓存中。
许多现代的图像处理应用程序将图像存储在图块中 ,而不是您描述的行 (也称为*扫描线)。 例如GIMP就是这样做的 。 因此,如果您可以控制图像的存储方式,则使用平铺方法可能会增加局部性,从而减少缓存丢失并提高性能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.