2010-10-13 76 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,因爲這些線程將爭取訪問共享數據結構。