2

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

我以前没有在 C++ 上写过多线程

谢谢你现在的帮助

示例代码片段:

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

2 回答 2

3

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

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 倍。

于 2013-02-09T20:01:44.107 回答
1

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;
}
于 2013-02-08T21:33:57.387 回答