[英]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&FORM=Z9LH
http://www.bing.com/?scope=news&FORM=Z9LH2
http://www.bing.com/?scope=video&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.