我有一个urls队列,我正在传递给它抓取的一个函数并获取url队列中的每个url应该是并行的并且crawl是一个类并且start是我的函数它抓取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
似乎这个过程并不平行,任何人都可以告诉我如何才能并行执行此操作
答案 0 :(得分:1)
我见过的每个例子,每次使用它时,我都将#pragma直接放在for:
之前#pragma omp parallel for
for(int n=0; n<q.size(); ++n) {
crawl.start(q.front());
q.pop();
}
你可以尝试一下。
我怀疑它不会因为其他原因而无法正常工作;设置的方式看起来所有的线程都会立即从队列的前端成员开始,然后尝试弹出它...你需要比你显示的队列更多的同步。
答案 1 :(得分:1)
即使你遵循@ Peter的建议,你的程序也不会并行执行(正如他建议的那样,我建议解释)。您可能会发现正确的线程数已启动,并且它们都执行该程序。
在编写代码时,OpenMP运行时将跨线程分发for循环的迭代。例如,如果q.size为32并且您启动4个线程,则可以在线程0,n = 8..15上执行n = 0..7,依此类推。或者,线程0可能运行迭代0,8,16,..和线程1运行迭代1,9,17,依此类推。
在任何一种情况下,所有线程都将执行for循环内的指令。由于执行哪些指令不依赖于n,因此所有线程都将爬行整个队列。由于q是共享的,我希望你会发现你的程序在N个线程上比在N> 1时运行得慢,因为线程将争取访问共享数据结构。