【问题标题】:Optimization of integral image积分图像优化
【发布时间】:2014-04-15 02:54:31
【问题描述】:

我正在尝试实现多通道积分图像算法,但速度太慢(Core 2 Quad 上 200 张图像(640x480)需要 8 秒)。我预计 200 张图像的时间为 1 秒。

这是分析结果(超过 200 张图像,n_bins=8):

如何优化*ps = *psu + s

Plain text version of code

【问题讨论】:

  • 是用最高优化设置编译的吗?
  • @Tyler 是的,它是用 /O2 选项编译的(最大化速度)。
  • 你能发布程序集吗?我想知道编译器做了多少矢量化处理。
  • @Tyler pastebin.com/m66rtk5S,谢谢。
  • @Tyler:SSE 不支持水平前缀和。模拟它不会提供任何加速。可以有效地实现垂直前缀和。在积分图像的情况下,只有部分算法可以向量化,并且需要编译器无法发明的转换。

标签: c++ optimization image-processing profiling computer-vision


【解决方案1】:

开始检查编译器设置,是否设置为最高性能?

然后,根据架构,积分图像的计算有几个瓶颈。

  1. 计算本身,一些低成本 CPU 无法以良好的性能执行整数数学。没有解决方案。

  2. 数据流不是最优的。解决方案是提供最佳数据流(顺序读取和写入流的数量)。例如,您可以同时处理 2 行。

  3. 算法的数据依赖性。在现代 CPU 上,这可能是最大的问题。解决方法是改变处理算法。例如计算不依赖的奇/偶像素(更多的计算,更少的依赖)。

  4. 可以使用 GPU 进行处理。

【讨论】:

  • 谢谢!我认为瓶颈是数据流。
【解决方案2】:

我很难相信个人资料结果。在这段代码中

16      for (int x = 1; x < w + 1; x++, pg++, ps += n_bins, psu += n_bins) {
17          s += *pg;
18          *ps = *psu + s;
19      }

它说大部分时间在第 18 行,在第 17 行很少,在第 16 行几乎没有。 然而,它还在每次迭代中进行比较、两个增量和三个添加。 缓存未命中可能会解释这一点,但仔细检查并没有什么坏处,我使用 this technique 进行。

无论如何,循环都可以展开,例如:

int x = w;
while(x >= 4){

  s += pg[0];
  ps[n_bins*0] = psu[n_bins*0] + s;

  s += pg[1];
  ps[n_bins*1] = psu[n_bins*1] + s;

  s += pg[2];
  ps[n_bins*2] = psu[n_bins*2] + s;

  s += pg[3];
  ps[n_bins*3] = psu[n_bins*3] + s;

  x -= 4;
  pg += 4;
  ps += n_bins*4;
  psu += n_bins*4;
}
for(; --x >= 0;){
  s += *pg;
  *ps = *psu + s;
  pg++;
  ps += n_bins;
  psu += n_bins;
}

如果n_bins 恰好是一个常量,这可以使编译器对while 循环中的代码进行更多优化。

【讨论】:

  • 谢谢你的建议,我试试看。
【解决方案3】:

您可能不会仅仅为了计算积分图像而计算积分图像。

我想象两种情况:

1)您使用每个像素上的积分图像来计算框过滤器或类似的。

2) 你在更少的地方使用它们。

在情况 1) 中,积分图像的计算可能不会成为您应用程序的瓶颈。

在情况 2) 中,您应该想知道是否值得计算整个积分图像。

也就是说,四个线程的并行化也是一种选择。最简单的方法是让每个线程每四个图像计算一次。

您也可以将每个图像一分为四,但您会因为需要同步线程而受到惩罚,而且前缀和受数据依赖性约束的事实也会使您受到惩罚。 (您可以将图像一分为四并计算单独的积分图像,但在此步骤之后,您需要将一个常数添加到三个四分之一图像中。)

【讨论】:

  • 我的情况是case 1,类似于box filter。你是对的,瓶颈不是完整的图像部分。我会考虑将图像分成四个部分,但我认为添加一个常量是不够的。感谢您的建议:-)
  • @whenov:处理整个图像要容易得多,而且您的图像太小而无法分割。
猜你喜欢
  • 2018-08-10
  • 1970-01-01
  • 2020-08-13
  • 2020-06-11
  • 1970-01-01
  • 1970-01-01
  • 2012-10-18
  • 2020-12-05
  • 2013-12-29
相关资源
最近更新 更多