【问题标题】:How to speed up this code implemented OpenCV如何加速此代码实现的 OpenCV
【发布时间】:2013-02-08 19:04:49
【问题描述】:

我需要对下面需要大量处理时间的示例代码的建议。我正在 OpenCV 上开发项目,并且有这样的代码块(其中一些是图片)。我应该使用什么来提高速度?比如,OpenMP 或 TBB(这是 OpenCV 中的新功能,更复杂,也许一些示例更有帮助)或 GPU(实现整个项目)或 Boost 库或其他我不知道的第三方库。

我之前没有在c++上写过多线程

感谢您现在的帮助

示例代码sn-p:

for ( int j = 0; j < 90000000; j++ )
  for ( int i = 0; i < 90000000; i++ )
    for ( int k = 0; k < 90000000; k++ )
             // float point operations

【问题讨论】:

  • 为了便于理解,我对其进行了简化。在代码块中,可以是其他外部变量。另外,我需要一个建议,你能建议哪个选项可以很容易地遵循吗?
  • 但是,我们不知道真正的瓶颈在哪里。如图所示,这里没有太多需要优化的地方。
  • 首先很抱歉占用了您的时间,其次实际代码块很长,我不知道应该如何在这里发布。因此,我必须了解如何处理双重或三重?我应该使用 tbb 还是 openmp。对于类似情况,哪个选项是最佳解决方案?
  • 例如;你在实现多线程程序时使用什么?这很容易理解,因为我的时间有限。再次感谢
  • ((90 000 000^3) / 8) * bytes = 80 935 258.5 petabytes - 假设您正在索引一个优化存储的位矩阵。你想实际上在这里做什么?

标签: c++ multithreading opencv gpu tbb


【解决方案1】:

首先,您应该确保能够线性访问您的内存。例如,如果您有一个矩阵:

cv::Mat mat(nrows, ncols, CV_32FC1);

线性访问是:

for(int r = 0; r < mat.rows; r++)
{
  for(int c = 0; c < mat.cols; c++)
  {
    mat.at<float>(r,c) ... do something
  }
}

没有线性访问并且速度会慢得多:

for(int c = 0; c < mat.cols; c++)
{
   for(int r = 0; r < mat.rows; r++)
   {
     mat.at<float>(r,c) ... do something
   }
}

因为它拒绝缓存。此外,OpenMP 或 TBB 等技术更可取。但是,如果您能够使用 8 位值进行计算,那么通过 Streaming SIMD Extensions (SSE) 进行并行化也可以将每个内核的代码提高 8 倍。

【讨论】:

  • 对内存进行线性访问并不是什么大问题。对约 8000 万 PB 的线性访问将证明是一个更大的挑战......
【解决方案2】:

OpenMP 是最简单的选项之一。我们可以只使用一些预处理器来并行化 for 循环。 这是一个使用 OpenMP 进行点积的简单示例

double Dot( int n, double x[], double y[] )
{
  int i;
  double dot_product = 0.0;

# pragma omp parallel \
  shared ( n, x, y ) \
  private ( i )

# pragma omp for reduction ( + : dot_product )

  for ( i = 0; i < n; i++ )
  {
    dot_product = dot_product + x[i] * y[i];
  }

  return dot_product;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 2012-01-02
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多