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

时间:2010-10-13 05:36:43

标签: c++ openmp

我有一个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&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

似乎这个过程并不平行,任何人都可以告诉我如何才能并行执行此操作

2 个答案:

答案 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时运行得慢,因为线程将争取访问共享数据结构。