Bonjour.
Je viens juste de me mettre tout doucement à la programmation parallèle avec OpenMP et j'aurai quelques questions. En fait j'ai un programme pour l'instant monotâche que je cherche à paralléliser. Enfin plutôt je cherche à paralléliser 1 boucle pour le moment.
Schématiquement, j'ai un truc dans le genre :
1) Déjà, en ce qui concernent les parties qui doivent rester "monotache" est-ce que j'ai besoin de changer quelque chose du point de vue d'OpenMP ou je n'y touche pas ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 int main() { std::vector<unsigned int> resultat; // // Bout de programme et données qui doivent rester "monotache" // for(i=0;i<N;i++) { algorithme(i,N,resultat) } // // Bout de programme et données qui doivent rester "monotache" // }
2) Ensuite, au niveau de la boucle for, chaque itération est indépendante ... sauf que la fonction "algorithme(unsigned int i,unsigned int N,std::vector<unsigned int> & resultat)" modifie le vecteur "resultat" en faisant des push_back...
L'ordre dans lequel les éléments sont placés dans le vector importe peut puisqu'ensuite de toutes façon je fais un "sort". Mais je me dis que si deux thread veulent faire un push_back en même temps, cela risque de poser problème....
Bref, ça doit être un truc de base, mais comment s'en sortir ?
Merci
EDIT : je viens d'avoir une idée en lisant un tuto sur OpenMP et à mon avis c'est comme cela qu'il faut procéder (par contre je ne sais pas trop comment l'implémenter) :
- chaque thread travaille sur un std::vector privé
- une fois le travail effectué, on ajoute "séquentiellemment" (avec un "ordered" à mon avis) le contenu de chaque std::vector privé dans un grand std::vector global.
Partager