2010-10-13 5 views
0

J'ai une file d'attente d'URLs et je passe à une fonction qu'elle parcourt et obtient l'url de chaque URL dans une file d'attente doit être en parallèle et crawl est une classe et start est ma fonction crawls l'url et si je lance le programme les chaque urls est exécuté un par un pas en parallèlece qui ne va pas avec ma programmation parallèle openmp

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

sortie

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 

il semble que le processus parallèle ne peut me dire comment puis-je le faire en parallèle

Répondre

1

Chaque exemple, je l'ai vu et chaque fois que je l'ai utilisé, je l'ai placé le #pragma directement avant la pour:

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

Vous pouvez donner qu'un essai.

Je suppose que ça ne marchera pas comme vous le voulez pour d'autres raisons; la façon dont est configuré a l'air que tous les threads vont commencer sur le membre avant de la file d'attente à la fois, et plus tard essayer de l'éclater ... vous aurez besoin de plus de synchronisation de la file que vous avez montré.

+0

également envvar OMP_NUM_THREADS contrôle le nombre de threads – Anycorn

1

Même après avoir suivi les conseils de @ Peter, votre programme ne va pas s'exécuter en parallèle (comme il le suggère et comme je le propose). Vous pouvez observer que le bon nombre de threads est démarré et qu'ils exécutent tous le programme.

Lorsque vous avez écrit votre code, l'exécution OpenMP répartit les itérations de la boucle for entre les threads. Par exemple, si q.size est 32 et que vous démarrez 4 threads alors n = 0..7 peut être exécuté sur le thread 0, n = 8..15, et ainsi de suite. Ou bien, le thread 0 peut exécuter des itérations 0,8,16, .. et le thread 1 exécuter des itérations 1,9,17, et ainsi de suite.

Dans les deux cas, tous les threads vont exécuter les instructions à l'intérieur de la boucle for. Puisque les instructions sont exécutées ne dépend pas de n, tous les threads vont explorer toute la file d'attente. Puisque q est partagé, j'attends que vous trouviez que votre programme s'exécute plus lentement sur N threads que sur 1 chaque fois que N> 1, car les threads se battront pour avoir accès à la structure de données partagée.

Questions connexes