Comment convertir des sections OpenMP en fork ()

Je suis nouveau à pthreads et voudrais demander comment exprimer quelque chose comme:

while(imhappy())
{
 #pragma omp sections
 {
  #pragma omp section
  {
   dothis();
  }
  #pragma omp section
  {
   dothat();
  }
 }
}

dans une construction équivalente en utilisant fork() ou vfork ()? Merci à l'avance!

PS: J'ai inclus le pendant autour des sections au cas où il serait plus intelligent de bifurquer avant d'entrer dans la boucle à cause d'un clonage de ressources.

0

2 Réponses

OpenMP fait beaucoup d'autres choses dans les coulisses que de générer simplement des discussions. Il distribue également les segments de code et synchronise les différents threads. Vous avez étiqueté votre question en tant que pthreads bien que vous posiez des questions sur l'implémentation avec fork() ce qui prête à confusion. Dans Linux fork() est très lourd car il crée de nouveaux processus et plutôt clone() est utilisé pour créer des threads.

Néanmoins, l'équivalent approximatif d'une construction de sections OpenMP avec deux threads serait de forker, après quoi une construction if doit suivre et le processus maître devrait exécuter le chemin dothis() tandis que l'enfant va exécuter le chemin dothat() . La valeur de retour de fork() est différente dans les processus parent et dans les processus enfant et peut être utilisée pour prendre la décision pour la branche. Le processus parent attendra ensuite que l'enfant termine avec waitpid() qui sera analogue à la synchronisation de la barrière implicite à la fin de la région omp sections .

Une mise en garde cependant - fork() est implémenté en utilisant les pages COW (copy-on-write). Cela signifie que, bien qu'au début, le contenu de la mémoire de l'enfant soit égal au contenu de la mémoire du parent, les modifications apportées sont privées - l'enfant ne verra pas ce que le parent modifie dans sa propre mémoire et vice versa. La mémoire doit être explicitement partagée entre les deux en utilisant des primitives de mémoire partagée SysV ou des mappages de fichiers partagés.

Vous pourriez vraiment vouloir utiliser l'API des threads POSIX à la place.

vfork() is a syscall designed for completely different purpose and is not suitable for process cloning at all.

0
ajouté
Donc, en considérant pthreads, il deviendrait: pthread_create (& tid1,0, dothis, 0); pthread_create (& tid2,0, dothat, 0); pthread_join (tid1,0); pthread_join (tid2,0); ? cela serait beaucoup plus facile, et si je vois cela correctement, j'ai de la mémoire partagée par défaut? Merci cela pourrait être beaucoup plus facile à la fourche!
ajouté l'auteur litro, source
Pas besoin d'appeler pthread_create deux fois - vous avez déjà l'autre thread :)
ajouté l'auteur Hristo Iliev, source

Je ne pense pas qu'il y ait une simulation directe des sections utilisant la fourche. Cependant, vous pouvez théoriquement le simuler en utilisant un mécanisme de transmission de messages où les variables partagées sont conservées avec une machine racine. Tout le openMP flush arrivera en utilisant la racine. (Rappelez-vous que openMP utilise un modèle de cohérence plus faible que faible).

0
ajouté