OpenCV parallel_for不使用多个处理器

时间:2012-12-06 03:47:06

标签: opencv tbb parallel-for

我刚刚在新的OpenCV 2.4.3中看到他们添加了一个通用的parallel_for。所以在example之后,我试着自己实现它。我用我的代码完成了所有功能,但是当我按照常规“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;

输出:

Parallel TEST time  0.00415479 

SERIAL Scan time  0.00204597 

3 个答案:

答案 0 :(得分:5)

哇!我找到了答案! “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/

答案 1 :(得分:3)

问题很可能是你的循环体太小了。

看起来你要做的就是将一个向量中的指针分配给另一个向量。

你真的需要把并行作为一个低效的for循环,也就是每次迭代中的工作需要足够大,这样你就不会梦想通过展开循环来获得加速,因为除了通常你可以继续减少,比较和跳转也有一些互锁的指令,也许是一个虚函数调用或两个和一些分配。

因此,不要复制指针,而是尝试做大量的实际数学或处理大量数据。

答案 2 :(得分:0)

在这种情况下,我希望parallel_for更糟糕。创建线程很昂贵。