blo*_*ggg 3 opencv tbb parallel-for
我刚刚在新的OpenCV 2.4.3中看到他们添加了一个通用的parallel_for.所以按照这个例子,我试着自己实现它.我用我的代码完成了所有功能,但是当我按照常规"for"命令以典型的串行方式对其处理时间进行计时时,结果显着更快,或者通常稍慢一点!
我想也许这与我推入向量或其他东西有关(我对并行处理我是一个非常大的菜鸟),所以我设置了一个只运行一个大数字的测试循环,它仍然无法正常工作.
码:
class Parallel_Test : public cv::ParallelLoopBody
{
private:
double* const mypointer;
public:
Parallel_Test(double* pointer)
: mypointer(pointer){
}
void operator() (const Range& range) const
{
//This constructor needs to be here otherwise it is considered an abstract class.
// qDebug()<<"This should never be called";
}
void operator ()(const cv::BlockedRange& range) const
{
for (int x = range.begin(); x < range.end(); ++x){
mypointer[x]=x;
}
}
};
//TODO Loop pixels in parallel
double t = (double)getTickCount();
//TEST PARALELL LOOPING AT ALL
double data1[1000000];
cv::parallel_for(BlockedRange(0, 1000000), Parallel_Test(data1));
t = ((double)getTickCount() - t)/getTickFrequency();
qDebug() << "Parallel TEST time " << t << endl;
t = (double)getTickCount();
for(int i =0; i<1000000; i++){
data1[i]=i;
}
t = ((double)getTickCount() - t)/getTickFrequency();
qDebug() << "SERIAL Scan time " << t << endl;
Run Code Online (Sandbox Code Playgroud)
输出:
Parallel TEST time 0.00415479
SERIAL Scan time 0.00204597
Run Code Online (Sandbox Code Playgroud)
哇!我找到了答案!"parallel_for"和"parallel_for_"(带尾随下划线!)完全不同.您需要使用尾随下划线才能使其正常工作!否则它将只是串行运行你的循环,你将不得不使用BLOCKEDRANGE而不是范围!AHH!
感谢@Daniil Osokin特别是@Vladislav Vinogradov指出这一点!
所以你的代码再次需要看起来像这样:cv :: parallel_for_(Range(0,1000000),Parallel_Test(data1));
更多详细信息,请访问:http://answers.opencv.org/question/3730/how-to-use-parallel_for/