Je crée une application multi-thread en C en utilisant Linux.
Je ne sais pas si je dois utiliser l'API thread POSIX ou l'API OpenMP.
Quels sont les avantages et les inconvénients de l’utilisation?
Modifier:
Quelqu'un pourrait-il préciser si les deux API créent des threads niveau noya ou niveau utilisateur?
Pthreads et OpenMP représentent deux paradigmes de multitraitement totalement différents.
Pthreads est une API de très bas niveau pour travailler avec les threads. Ainsi, vous avez un contrôle extrêmement fin sur la gestion des threads (créer/joindre/etc), les mutex, etc. C'est assez simple.
D'autre part, OpenMP est beaucoup de niveau supérieur, est plus portable et ne vous limite pas à utiliser C. C'est également beaucoup plus facilement mis à l'échelle que pthreads. Un exemple spécifique de cela est les constructions de partage de travail d'OpenMP, qui vous permettent de diviser le travail sur plusieurs threads avec une relative facilité. (Voir aussi Wikipédia liste des avantages et des inconvénients .)
Cela dit, vous n'avez vraiment fourni aucun détail sur le programme spécifique que vous implémentez, ni sur la façon dont vous prévoyez de l'utiliser, il est donc assez impossible de recommander une API par rapport à l'autre.
Si vous utilisez OpenMP, cela peut être aussi simple que d'ajouter un seul pragma, et vous serez à 90% du chemin vers un code correctement multithread avec une accélération linéaire. Obtenir le même gain de performances avec pthreads demande beaucoup plus de travail.
Mais comme d'habitude, vous obtenez plus de flexibilité avec pthreads.
Fondamentalement, cela dépend de votre application. Avez-vous un algorithme trivialement parallélisable? Ou avez-vous simplement beaucoup de tâches arbitraires que vous souhaitez effectuer simultanément? De combien les tâches ont-elles besoin pour se parler? Combien de synchronisation est nécessaire?
OpenMP a l'avantage d'être multiplateforme et plus simple pour certaines opérations. Il gère le filetage d'une manière différente, en ce qu'il vous offre des options de filetage de niveau supérieur, telles que la parallélisation des boucles, telles que:
#pragma omp parallel for
for (i = 0; i < 500; i++)
arr[i] = 2 * i;
Si cela vous intéresse et si C++ est une option, je recommanderais également Threading Building Blocks .
Pthreads est une API de niveau inférieur pour générer explicitement des threads et la synchronisation. À cet égard, il offre plus de contrôle.
Cela dépend de 2 choses: votre base de code et votre place en son sein. Les questions clés sont- 1) "Votre base de code a-t-elle des threads, des pools de threads et les primitives de contrôle (verrous, événements, etc.)" et 2) "Développez-vous des bibliothèques réutilisables ou des applications ordinaires?"
Si votre bibliothèque possède des outils de thread (presque toujours construits sur une certaine saveur de PThread), UTILISEZ-LES. Si vous êtes développeur de bibliothèque, passez le temps (si possible) à les construire. Cela en vaut la peine - vous pouvez créer un filetage avancé beaucoup plus fin que OpenMP ne vous en donnera.
Inversement, si vous êtes pressé par le temps ou que vous développez simplement des applications ou quelque chose hors d'outils tiers, utilisez OpenMP. Vous pouvez l'encapsuler dans quelques macros et obtenir le parallélisme de base dont vous avez besoin.
En général, OpenMP est assez bon pour le multi-threading de base. Une fois que vous commencez à arriver au point où vous gérez les ressources système directement sur la construction de code hautement asynchrone, son avantage de facilité d'utilisation est évincé par les problèmes de performances et d'interface.