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などの手法が推奨されます。ただし、ストリーミングSIMD拡張命令(SSE)を介した並列化は、8ビット値で計算できる場合、コアごとに8倍のコードを改善する可能性があります。

于 2013-02-09T20:01:44.107 に答える
1

OpenMPは最も簡単なオプションの1つです。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 に答える