Je viens de m'enseigner un peu OpenMP et cela pourrait être stupide. Fondamentalement, j'essaie de paralléliser un premier programme de recherche de grande envergure en C++, chaque nœud prenant beaucoup de temps à traiter. Voici un exemple de code:Comment dire à OpenMP de ne paralléliser qu'une fonction dans une boucle for?
queue<node*> q;
q.push(head);
while (!q.empty()) {
qSize = q.size();
for (int i = 0; i < qSize; i++) {
node* currNode = q.front();
q.pop();
doStuff(currNode);
q.push(currNode);
}
}
La fonction de traitement doStuff() est assez cher et je veux paralléliser. Cependant, si je parallélise la boucle for en mettant #pragma omp parallel for
juste avant la ligne for, toutes sortes d'erreurs bizarres apparaissent à l'exécution. Je suppose que la raison est que de cette façon q.front()
et q.push()
sera également parallélisé, et plusieurs threads auront probablement le même nœud par q.front()
(parce qu'ils ont tous été traités avant que tout q.push
a été traité).
Comment puis-je contourner le problème?
La recherche étendue en profondeur est intrinsèquement un algorithme séquentiel, puisque chaque étape dépend des résultats des étapes précédentes. Il existe des techniques pour le paralléliser - faire une recherche sur le Web pour "traversée d'arbre parallèle" - mais cela ne va pas être aussi simple qu'un OpenMP 'parallel for'. – Wyzard
@Wyzard vous devez confondre BFS avec DFS. Calculer le front d'un BFS en parallèle est très bien. – Zulan