C++ 积分图像的优化

C++ 积分图像的优化,c++,optimization,image-processing,profiling,computer-vision,C++,Optimization,Image Processing,Profiling,Computer Vision,我正在尝试实现一个多通道积分图像算法,但对于核心2四元上的200幅640x480图像来说,它太慢了8秒。我预计200张图片的播放时间将达到1秒 这是超过200个图像的评测结果,n_bins=8: 如何优化*ps=*psu+s 开始检查编译器设置,是否设置为最大性能 相比之下,根据体系结构的不同,积分图像的计算有几个瓶颈 计算本身,一些低成本的CPU不能以良好的性能执行整数运算。没有解决办法 数据流不是最优的。解决方案是提供最佳的数据流,以减少顺序读写流的数量。例如,您可以同时处理2行 算法的数据

我正在尝试实现一个多通道积分图像算法,但对于核心2四元上的200幅640x480图像来说,它太慢了8秒。我预计200张图片的播放时间将达到1秒

这是超过200个图像的评测结果,n_bins=8:

如何优化*ps=*psu+s


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

相比之下,根据体系结构的不同,积分图像的计算有几个瓶颈

计算本身,一些低成本的CPU不能以良好的性能执行整数运算。没有解决办法

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

算法的数据依赖性。在现代CPU上,这可能是最大的问题。解决方法是改变处理算法。例如,计算奇数/偶数像素而不依赖关系计算越多,依赖关系越小

可以使用GPU进行处理


我很难相信这个结果。在此代码中

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

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

您可能不只是为了计算整数映像而计算整数映像

我设想两种情况:

1使用每个像素上的积分图像来计算长方体滤波器或类似滤波器

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

在案例1中,积分图像的计算可能不是应用程序中的瓶颈

在案例2中,您应该想知道计算整个积分图像是否值得

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


您还可以将每个图像拆分为四个,但需要同步线程,而且前缀和受数据依赖性约束,这将使您受到惩罚。您可以将图像拆分为四个并计算单独的整数图像,但在此步骤之后,您需要为四分之三的图像添加一个常量。

它是使用最高优化设置编译的吗?@Tyler是的,它是使用/O2 optionMaximize Speed编译的。您可以发布程序集吗?我想知道编译器对它进行了多少矢量化。@泰勒,谢谢。@泰勒:SSE不支持水平前缀和。模拟它不会提供任何加速。可以有效地实现垂直前缀和。对于整型图像,只有部分算法可以矢量化,并且需要编译器无法发明的转换。谢谢!我认为瓶颈是数据流。我的情况是案例1,类似于盒子过滤器。你是对的,瓶颈不是不可分割的一部分。我会考虑把图像分成四个部分,但我认为增加常数是不够的。谢谢你的建议:-@whenov:处理整个图像要容易得多,而且你的图像太小,无法分割。谢谢你的建议,我会试试的。
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;
}