OpenCV C++ 多线程加速
Posted
技术标签:
【中文标题】OpenCV C++ 多线程加速【英文标题】:OpenCV C++ multithreading speedups 【发布时间】:2015-12-12 15:31:55 【问题描述】:对于下面的代码,这里有一点上下文。
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
内存 8 GB DDR3
编辑
我也尝试了一种稍微不同的方法。
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;
我得到了更好的结果:
Multi thread Sectored 0.0232881
所以,看起来我在运行时正在创建 960 个线程之类的东西
parallel_for(0, img0.rows, ...
但效果并不好。
(我必须补充一点,Kenney 的评论是正确的。不要与我在这里所说的具体数字有太多的相关性。在测量这样的小区间时,会有很大的变化。但总的来说,我在编辑中写的,关于将图像分成两半,与旧方法相比提高了性能。)
【问题讨论】:
多线程有开销;尝试使用更大或更密集的 CPU,以便运行时间大约为一秒(或至少 0.1 秒)。我想你会看到更大的加速。 是的,这是真的。我得到的时间变化很大。现在我坚持使用它们,因为我不想更改问题中的所有代码。 【参考方案1】:我认为您的问题是您受到内存带宽的限制。您的第二个 sn-p 基本上是从整个图像中读取,并且必须从主内存中进入缓存。 (或者出L2缓存进入L1缓存)。
您需要安排您的代码,以便所有四个内核同时在同一个内存位上工作(我认为您不是实际上试图优化此代码 - 这只是一个简单的示例)。
编辑:在最后的括号中插入关键的“not”。
【讨论】:
以上是关于OpenCV C++ 多线程加速的主要内容,如果未能解决你的问题,请参考以下文章