c++ - 非连续数据的显式预取

标签 c++ caching

我对图像的子区域做了很多操作。例如,如果我有一张 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/

相关文章:

为多个供应商发现 sql 数据库模式的 C++ 库?

c++ - 为什么占用临时地址是非法的?

c++ - 在继承类的构造函数中调用基类构造函数

caching - 如何为 Sitecore ControllerRendering 启用缓存

Azure Redis 缓存卡在“创建”中

java - Spring 可以缓存组件扫描信息/ Autowiring 以缩短启动时间吗?

c++ - 我该如何进一步优化这个循环?

c++ - QML 无法分配给不存在的属性

ios - Swift iOS 如何在本地存储自定义类型对象?

caching - Sitecore 性能 : Caching. DisableCacheSizeLimits 设置为 "false"