3

我刚刚在新的 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;

输出:

Parallel TEST time  0.00415479 

SERIAL Scan time  0.00204597 
4

2 回答 2

6

哇!我找到了答案!“parallel_for”和“parallel_for_”(带有尾随下划线!)完全不同。您需要尾随下划线才能使其工作!否则它只会串行运行你的循环,你将不得不使用 BLOCKEDRANGE 而不是范围!啊!

感谢@Daniil Osokin 尤其是@Vladislav Vinogradov 指出这一点!

所以你的代码需要看起来像这样: cv::parallel_for_(Range(0, 1000000), Parallel_Test(data1));

更多更新详情请访问:http ://answers.opencv.org/question/3730/how-to-use-parallel_for/

于 2012-12-13T15:47:32.953 回答
3

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

看来您所做的只是将一个向量中的指针分配给另一个向量。

您确实需要将并行 for 视为低效的 for 循环,即每次迭代中的工作需要足够大,这样您就不会梦想通过展开循环来获得加速,因为除了通常的递减之外,比较并且可以继续进行的跳转还有一些互锁指令,可能还有一个或两个虚拟函数调用和一些分配。

因此,与其复制指针,不如尝试做大量真正的数学运算或处理大量数据。

于 2012-12-06T04:32:06.640 回答