次のコードでは、ここに少しの文脈があります。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秒単位(または少なくとも0.1秒単位)になるように、より大きいまたはより大きいCPUの影響を受けるものを試してください。私はあなたがより大きなスピードアップを見ていると思う。 – Kenney
はい、それは本当です。私が得る時間は激しく変化している。私は質問のコードをすべて変更したくないので、今私はそれらに固執しています。 – ancajic