что не так с моим параллельным программированием openmp - PullRequest
0 голосов
/ 13 октября 2010

У меня есть очередь URL-адресов, и я передаю функции, которую она сканирует, и получает URL-адрес, каждый URL-адрес в очереди должен быть параллельным, а сканирование - это класс, а моя функция запускается, она сканирует URL-адрес, и если я запускаюЗапрограммируйте каждый 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 ]

1 голос
/ 13 октября 2010

Даже после того, как вы будете следовать совету Питера, ваша программа не будет выполняться параллельно (как он предлагает и как я предлагаю объяснить). Вы можете заметить, что запущено нужное количество потоков, и все они выполняют программу.

Когда вы написали свой код, среда выполнения 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, поскольку потоки будут бороться за доступ к общей структуре данных.

1 голос
/ 13 октября 2010

Каждый пример, который я видел, и каждый раз, когда я его использовал, я поместил #pragma непосредственно перед формой:

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

Вы можете попробовать это.

Я подозреваю, что это не будет работать так, как вы хотите, по другим причинам;настроенный способ выглядит так, как будто все потоки начнутся сразу же с переднего члена очереди, а затем попробуйте его открыть ... вам потребуется больше синхронизации очереди, чем вы показали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...