2010-10-13 75 views
0

我有一个url队列,我传递给它的一个函数,它抓取并获取url中的每个url应该是并行的并且crawl是一个类,并且start是我的函数它抓取的网址,如果我运行程序的每个网址,是通过执行一个一个不能并行我的openmp并行编程有什么问题

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 

似乎过程并不平行任何一个可以告诉我,我该怎么并行执行此操作

回答

1

我见过的每一个例子,每次我用它的时候,我已经把在#pragma之前直接为:

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

你可以给一个尝试。

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

+0

也envvar OMP_NUM_THREADS控制线程数 – Anycorn 2010-10-13 06:03:39

1

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

当您编写代码时,OpenMP运行时将跨线程分配for循环的迭代。例如,如果q.size是32并且启动4个线程,那么n = 0..7可能在线程0,n = 8..15等等上执行。或者,线程0可以运行迭代0,8,16,..并且线程1运行迭代1,9,17,等等。

无论哪种情况,所有线程都将执行for循环内的指令。由于执行的指令不依赖于n,所有线程都将抓取整个队列。由于q是共享的,我期望你会发现,当N> 1时,你的程序在N个线程上的运行速度要慢于1,因为这些线程将争取访问共享数据结构。