Pthreads vs OpenMP
Je suis de la création d'une application multi-thread en C à l'aide de Linux.
Je ne suis pas sûr si je dois utiliser les threads POSIX de l'API ou de l'API OpenMP.
Quels sont les avantages & les inconvénients de l'utilisation soit?
Edit:
Quelqu'un pourrait-il préciser si les deux Api créer au niveau du noyau ou au niveau de l'utilisateur fils?
- Re: votre édition (du noyau ou du niveau de l'utilisateur?) - il dépend de la mise en œuvre! Une API est juste que - une interface. OpenMP est pas la mise en œuvre - mais ce sont des implémentations. (Il y a un peu d'info en cet article de Wikipédia, trop).
- Fondamentalement, si vous pouvez faire ce que vous avez besoin dans OpenMP, vous devriez le faire en OpenMP.
- OpenMP doit être utilisé pour les boucles qui doivent être calculées sur tous les cœurs. PThread pouvez le faire aussi mais c'est beaucoup de travail et il est très difficile à maintenir, vous utilisez PThread d'habitude, si vous avez besoin pour démarrer un processus séparé ce qui ne devrait pas bloquer le thread principal. Par exemple: vous avez un serveur, les clients se connectent et de garder la connexion avec le serveur et de parler avec elle, vous créer un thread par client et de travailler avec le client dans ce thread sans bloquer le thread principal. C'est comme si vous créez une nouvelle application et de le laisser s'exécuter sur le Système d'Exploitation, sans se soucier de l'application principale.
- double de stackoverflow.com/questions/935467/...
Vous devez vous connecter pour publier un commentaire.
Pthreads et OpenMP sont deux totalement différents de multitraitement paradigmes.
Pthreads est un très API de bas niveau pour travailler avec les threads. Ainsi, vous disposez de très fines de contrôle sur la gestion des threads (créer/rejoindre/etc), mutex, et ainsi de suite. Il est assez dépouillée.
D'autre part, OpenMP est beaucoup niveau plus élevé, est plus portable et ne vous limite pas à l'utilisation de C. Il est aussi beaucoup plus facilement mis à l'échelle de pthreads. Un exemple de ceci est OpenMP du partage du travail des constructions, qui vous permettent de répartir le travail entre plusieurs threads avec une relative facilité. (Voir aussi la page Wikipedia les avantages et les inconvénients de la liste.)
Cela dit, vous avez vraiment fourni aucun détail sur le programme spécifique que vous êtes à la mise en œuvre, ou la façon dont vous prévoyez de l'utiliser, donc c'est assez impossible de recommander une API sur l'autre.
Si vous utilisez OpenMP, il peut être aussi simple que l'ajout d'un seul pragma, et vous serez à 90% de la façon de bien code multithread avec accélération linéaire. Pour obtenir les mêmes performances avec les pthreads prend beaucoup plus de travail.
Mais comme d'habitude, vous obtenez plus de flexibilité avec les pthreads.
Fondamentalement, cela dépend de ce que votre demande est. Avez-vous un trivialement-parallelisable algorithme? Ou avez-vous juste avoir un bon nombre de l'arbitraire des tâches que vous souhaitez en même temps? Quelle est l'étendue des tâches à parler les uns aux autres? Combien de synchronisation est nécessaire?
OpenMP a l'avantage d'être multi-plateforme, et plus simple pour certaines opérations. Il gère le filetage d'une manière différente, en ce qu'il vous donne un niveau plus élevé options de thread, comme la parallélisation des boucles, comme:
Si cela vous intéresse, et si le C++ est une option, je recommande aussi Threading Building Blocks.
Pthreads est une baisse du niveau de l'API pour générer des threads et de synchronisation de manière explicite. À cet égard, il offre plus de contrôle.
Cela dépend de 2 choses - votre base de code et votre place en leur sein. Les questions clés sont - 1) "Ne vous code de base ont des fils, threadpools, et le contrôle des primitives (écluses, des événements, etc.)" et 2) "Êtes-vous le développement de bibliothèques réutilisables ou de l'ordinaire apps?"
Si votre bibliothèque a les outils de la discussion (presque toujours construit sur une sorte de PThread), UTILISEZ-les. Si vous êtes un développeur de la bibliothèque, de passer le temps (si possible) pour les construire. Il en vaut la peine: vous pouvez mettre ensemble beaucoup plus fine, avancé threading que OpenMP vous donner.
À l'inverse, si vous êtes pressé par le temps ou tout simplement le développement d'applications ou de quelque chose hors de la 3ème partie outils, l'utilisation d'OpenMP. Vous pouvez l'envelopper dans un peu de macros et d'obtenir la base de parallélisme dont vous avez besoin.
En général, OpenMP est assez bon pour base le multi-threading. Une fois que vous commencez à obtenir, au point que vous êtes à la gestion des ressources du système directement sur le renforcement de la très async code, sa facilité d'utilisation avantage est la plus fréquentée par les performances et les problèmes d'interface.