Parallélisation: pthreads ou OpenMP?

En informatique scientifique, la plupart des utilisateurs utilisent OpenMP comme quasi-standard pour la parallélisation de la mémoire partagée.

Y a-t-il une raison (autre que la lisibilité) d’utiliser OpenMP sur pthreads? Ce dernier semble plus fondamental et je pense que cela pourrait être plus rapide et plus facile à optimiser.

Cela se résume essentiellement au niveau de contrôle souhaité sur votre parallélisation. OpenMP est génial si vous voulez seulement append quelques instructions #pragma et avoir une version parallèle de votre code assez rapidement. Si vous voulez faire des choses vraiment intéressantes avec le codage MIMD ou les files d’attente complexes, vous pouvez toujours faire tout cela avec OpenMP, mais il est probablement beaucoup plus simple d’utiliser le threading dans ce cas. OpenMP présente également des avantages similaires en matière de portabilité, car de nombreux compilateurs pour différentes plates-formes le prennent en charge maintenant, comme avec pthreads.

Donc, vous avez tout à fait raison: si vous avez besoin d’un contrôle précis sur votre parallélisation, utilisez pthreads. Si vous souhaitez paralléliser avec le moins de travail possible, utilisez OpenMP.

Quelle que soit la manière dont vous décidez de partir, bonne chance!

Une autre raison: l’OpenMP est basé sur des tâches, Pthreads est basé sur des threads. Cela signifie que OpenMP allouera le même nombre de threads que le nombre de cœurs. Vous aurez donc une solution évolutive . Ce n’est pas une tâche facile de le faire en utilisant des threads bruts.

Le second avis: OpenMP fournit des fonctionnalités de réduction: lorsque vous devez calculer des résultats partiels dans les threads et les combiner. Vous pouvez l’implémenter en utilisant une seule ligne de code. Mais en utilisant des threads bruts, vous devriez faire plus de travail.

Pensez simplement à vos besoins et essayez de comprendre: OpenMP est-il suffisant pour vous? Vous économiserez beaucoup de temps.

OpenMP nécessite un compilateur qui le supporte et fonctionne avec des pragmas. L’avantage de ceci est que, lors de la compilation sans support OpenMP (par exemple, PCC ou Clang / LLVM dès maintenant), le code sera toujours compilé. Regardez aussi ce que Charles Leiserson a écrit sur le multithreading DIY .

Pthreads est un standard POSIX ( IEEE POSIX 1003.1c ) pour les bibliothèques, tandis que les spécifications OpenMP doivent être implémentées sur les compilateurs. Cela étant dit, il existe une variété d’implémentations de pthread (par exemple, OpenBSD, NPTL) et un certain nombre de compilateurs prenant en charge OpenMP (par exemple, GCC avec l’indicateur -fopenmp, MSVC ++ 2008).

Les Pthreads ne sont efficaces que pour la parallélisation lorsque plusieurs processeurs sont disponibles, et uniquement lorsque le code est optimisé pour le nombre de processeurs disponibles. Le code pour OpenMP est plus facilement évolutif. Vous pouvez également mélanger du code qui comstack avec OpenMP avec du code en utilisant pthreads.

Votre question est similaire à la question “Devrais-je programmer C ou Assembly”, C étant OpenMP et assembly étant Pthreads.

Avec pthreads, vous pouvez faire beaucoup plus de parallélisation, ce qui signifie que votre sens est très étroitement adapté à votre algorithme et à votre matériel. Ce sera beaucoup de travail cependant.

Avec pthreads, il est également beaucoup plus facile de produire un code mal parallélisé.

Y a-t-il une raison (autre que la lisibilité) d’utiliser OpenMP sur pthreads?

Mike a en quelque sorte touché ceci:

OpenMP présente également des avantages similaires en matière de portabilité dans la mesure où de nombreux compilateurs pour différentes plates-formes le prennent en charge maintenant, comme avec pthreads.

Crypto ++ est multi-plateforme, c’est-à-dire sous Windows, Linux, OS X et les BSD. Il utilise OpenMP pour la prise en charge des threads dans les endroits où l’opération peut être coûteuse, comme une exponentiation modulaire et une multiplication modulaire (et où un fonctionnement simultané peut être effectué).

Windows ne prend pas en charge les pthreads, mais les compilateurs Windows modernes prennent en charge OpenMP. Donc, si vous voulez la portabilité pour les non-nix, alors OpenMP est souvent un bon choix.


Et comme Mike l’a également souligné:

OpenMP est génial si vous voulez seulement append quelques instructions #pragma et avoir une version parallèle de votre code assez rapidement.

Voici un exemple de Crypto ++ précalculant certaines valeurs utilisées dans les signatures Rabin-Williams en utilisant Tweaked Roots comme décrit par Bernstein dans les signatures RSA et les signatures Rabin-Williams … :

 void InvertibleRWFunction::Precompute(unsigned int /*unused*/) { ModularArithmetic modp(m_p), modq(m_q); #pragma omp parallel sections { #pragma omp section m_pre_2_9p = modp.Exponentiate(2, (9 * m_p - 11)/8); #pragma omp section m_pre_2_3q = modq.Exponentiate(2, (3 * m_q - 5)/8); #pragma omp section m_pre_q_p = modp.Exponentiate(m_q, m_p - 2); } } 

Cela correspond à l’observation de Mike – le contrôle fin du grain et la synchronisation n’étaient pas vraiment nécessaires. La parallélisation était utilisée pour accélérer l’exécution et la synchronisation était gratuite dans le code source.

Et si OpenMP n’est pas disponible, le code se réduit à:

 m_pre_2_9p = modp.Exponentiate(2, (9 * m_p - 11)/8); m_pre_2_3q = modq.Exponentiate(2, (3 * m_q - 5)/8); m_pre_q_p = modp.Exponentiate(m_q, m_p - 2); 

OpenMP est idéal lorsque vous devez effectuer la même tâche en parallèle (c’est-à-dire sur plusieurs données), une sorte de machine SIMD (multi-données à instruction unique).

Pthreads est nécessaire lorsque vous souhaitez effectuer des tâches (très différentes) en parallèle, comme par exemple lire des données dans un thread et interagir avec l’utilisateur dans un autre thread.

Voir cette page:

http://berenger.eu/blog/c-cpp-openmp-vs-pthread-openmp-or-posix-thread/

OpenMP est choisi pour la mémoire partagée pour les programmes basés sur des tâches. Pour les programmes basés sur threads, pthreads est utilisé. Pthreads s’apparente plus à C / FORTRAN en termes de langages de programmation, ce qui signifie qu’il y a beaucoup de contrôle entre vos mains alors qu’OpenMP est le Java ou Python qui fournit une solution facile mais nous n’avons pas beaucoup de contrôle.