繁体   English   中英

我的openmp并行编程有什么问题

[英]what is wrong with my openmp parallel programming

我有一个url队列,我传递给一个函数,它爬网并获取url队列中的每个url应该是并行的,并且crawl是一个类,开始是我的函数,它会爬网url,如果我运行程序,则每个网址不是并行执行的,一个接一个地执行

    while(!q.empty())
    {
#pragma omp parallel for
        {
            for(int n=0; n<q.size(); ++n)
            {
                crawl.start(q.front());
                q.pop();
            }
        }
    }

产量

 http://www.bing.com
 http://www.bing.com/?scope=images&amp;FORM=Z9LH
 http://www.bing.com/?scope=news&amp;FORM=Z9LH2
 http://www.bing.com/?scope=video&amp;FORM=Z9LH1
 http://www.bing.com/explore?FORM=BXLH
 http://www.google.co.in
 http://www.google.co.in/advanced_search?hl=en
 http://www.google.co.in/intl/en/about.html
 http://www.google.co.in/intl/en/ads/
 http://www.google.co.in/intl/en/privacy.html

似乎该过程不是并行的,任何人都可以告诉我如何并行执行此操作

我所看到的每个示例以及每次使用它时,我都将#pragma直接放在for之前:

#pragma omp parallel for
for(int n=0; n<q.size(); ++n) {
    crawl.start(q.front());
    q.pop();
}

您可以尝试一下。

我怀疑它由于其他原因不会按您的意愿工作。 设置方式看起来所有线程都将立即从队列的前成员开始,然后尝试将其弹出...您将需要比所示更多的队列同步。

即使在您遵循@Peter的建议之后,您的程序也不会并行执行(正如他的建议和我打算解释的那样)。 您可能会观察到启动了正确数量的线程,并且它们都执行了该程序。

在编写代码后,OpenMP运行时将在线程之间分配for循环的迭代。 例如,如果q.size为32,并且您启动了4个线程,则可能在线程0上执行n = 0..7,n = 8..15,依此类推。 或者,线程0可能运行迭代0,8,16,..,而线程1可能运行迭代1,9,17,依此类推。

无论哪种情况,所有线程都将执行for循环内的指令。 由于执行的指令不依赖于n,因此所有线程都将对整个队列进行爬网。 因为q是共享的,所以我希望您会发现,每当N> 1时,程序在N个线程上运行的速度就会比在1个线程上运行的速度慢,因为线程将争夺对共享数据结构的访问。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM