2015-12-12 14 views
5

次のコードでは、ここに少しの文脈があります。OpenCV C++のマルチスレッド化スピードアップ

Mat img0; // 1280x960 grayscale 

-

timer.start(); 
for (int i = 0; i < img0.rows; i++) 
{ 
    vector<double> v; 
    uchar* p = img0.ptr<uchar>(i); 
    for (int j = 0; j < img0.cols; ++j) 
    { 
     v.push_back(p[j]); 
    } 
} 
cout << "Single thread " << timer.end() << endl; 

timer.start(); 
concurrency::parallel_for(0, img0.rows, [&img0](int i) { 
    vector<double> v; 
    uchar* p = img0.ptr<uchar>(i); 
    for (int j = 0; j < img0.cols; ++j) 
    { 
     v.push_back(p[j]); 
    } 
}); 
cout << "Multi thread " << timer.end() << endl; 

結果:

Single thread 0.0458856 
Multi thread 0.0329856 

高速化がほとんど目立たです。

私のプロセッサは、Intelのi5 3.10 GHzの

RAM 8ギガバイトDDR3

EDIT

私はまた少し違ったアプローチを試してみましたです。

vector<Mat> imgs = split(img0, 2,1); // `split` is my custom function that, in this case, splits `img0` into two images, its left and right half 

-

timer.start(); 
concurrency::parallel_for(0, (int)imgs.size(), [imgs](int i) { 
    Mat img = imgs[i]; 
    vector<double> v; 
    for (int row = 0; row < img.rows; row++) 
    { 
     uchar* p = img.ptr<uchar>(row); 
     for (int col = 0; col < img.cols; ++col) 
     { 
      v.push_back(p[col]); 
     } 
    } 

}); 
cout << " Multi thread Sectored " << timer.end() << endl; 

そして、私ははるかに良い結果を得る:私は

parallel_for(0, img0.rows, ... 
を実行したときに、私は960件のスレッドか何かを作成していたようなので、

Multi thread Sectored 0.0232881 

は、それが見えます

それはうまくいきませんでした。

(私がここに述べた特定の数字にあまり関連性を持たせないようにしなければならないということです)これらのような小さな間隔を測定するときは高いバリエーションがあります。編集、半分のイメージの分割については、古いアプローチと比較してパフォーマンスが向上しました。)

+1

マルチスレッドにはオーバーヘッドがあります。実行時間が1秒単位(または少なくとも0.1秒単位)になるように、より大きいまたはより大きいCPUの影響を受けるものを試してください。私はあなたがより大きなスピードアップを見ていると思う。 – Kenney

+0

はい、それは本当です。私が得る時間は激しく変化している。私は質問のコードをすべて変更したくないので、今私はそれらに固執しています。 – ancajic

答えて

1

私はあなたの問題はあなたがメモリ帯域幅によって制限されていると思います。あなたの2番目のスニペットは基本的に画像全体から読んでおり、それはメインメモリからキャッシュに出てきています。 (またはL2キャッシュからL1キャッシュへ)。

すべての4つのコアが一度にメモリの同じビットに取り組んでいるように、あなたは(私はあなたがない実際にこのコードを最適化しようとしていると推定 - それはちょうど簡単な例である)あなたのコードを配置する必要があります。

編集:重要な「not」を最後の括弧内の注釈に挿入します。