Parallélisation: pthreads ou OpenMP?

la plupart des gens dans l'informatique scientifique utilisent OpenMP comme une quasi-norme quand il s'agit de 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 basique et je pense qu'il pourrait être plus rapide et plus facile à optimiser.

41
demandé sur hanno 2009-06-01 19:59:22

7 réponses

il se résume essentiellement à quel niveau de contrôle vous voulez sur votre parallélisation. OpenMP est génial si tout ce que vous voulez faire est d'ajouter quelques déclarations #pragma et avoir une version parallèle de votre code assez rapidement. Si vous voulez faire des choses vraiment intéressantes avec du codage MIMD ou des files d'attente complexes, vous pouvez toujours faire tout cela avec OpenMP, mais il est probablement beaucoup plus simple d'utiliser threading dans ce cas. OpenMP a également des avantages similaires en matière de portabilité en ce que beaucoup de compilateurs pour différentes plateformes le supportent maintenant, comme pthreads.

vous avez donc tout à fait raison - si vous avez besoin d'un contrôle précis de votre parallélisation, utilisez pthreads. Si vous voulez faire un parallèle avec le moins de travail possible, utilisez OpenMP.

quel que soit le chemin que vous choisirez, bonne chance!

37
répondu Mike 2009-06-01 16:10:52

une autre raison: L'OpenMP est basé sur les tâches, Pthreads est basé sur les threads. Cela signifie que OpenMP affectera le même nombre de threads que le nombre de noyaux. Ainsi vous obtiendrez évolutive la solution. Il n'est pas si facile de le faire en utilisant des fils bruts.

la deuxième opinion: OpenMP fournit des fonctionnalités de réduction: lorsque vous avez besoin de calculer des résultats partiels dans des threads et de les combiner. Vous pouvez l'implémenter en utilisant une seule ligne de code. Mais en utilisant des fils bruts, vous devriez faire plus de travail.

réfléchissez à vos besoins et essayez de comprendre: OpenMP est-il suffisant pour vous? Vous permettra d'économiser beaucoup de temps.

20
répondu Vladimir Obrizan 2009-06-20 14:24:46

OpenMP nécessite un compilateur qui le supporte, et fonctionne avec pragmas. L'avantage de ceci est que lors de la compilation sans le support D'OpenMP (par exemple PCC ou Clang/LLVM dès maintenant), le code sera encore compilé. Aussi, jetez un oeil à ce que Charles Leiserson a écrit à propos de BRICOLAGE multithreading.

Pthreads est un standard POSIX (IEEE POSIX 1003.1 c) pour les bibliothèques, tandis que spécifications OpenMP sont à mettre en oeuvre sur les compilateurs; cela étant dit, il existe une variété d'implémentations de pthread (par exemple OpenBSD rthreads, NPTL), et un certain nombre de compilateurs qui prennent en charge OpenMP (par exemple GCC avec le drapeau-fopenmp, MSVC++ 2008).

les Pthreads ne sont efficaces pour la parallélisation que lorsque plusieurs processeurs sont disponibles, et seulement lorsque le code est optimisé pour le nombre de processeurs disponibles. Code OpenMP est plus facilement évolutive. Vous pouvez mélanger du code qui se compile avec OpenMP avec du code en utilisant pthreads, aussi.

6
répondu Anonymous 2015-07-07 01:55:05

votre question est similaire à la question "devrais-je programmer C ou assembler", C étant OpenMP et assembly étant pthreads.

avec pthreads vous pouvez faire une meilleure parallélisation, c'est-à-dire une meilleure adaptation à votre algorithme et à votre matériel. Ce sera beaucoup de travail même si.

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

2
répondu steffen 2012-07-22 11:56:26

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

Mike genre d'allusion à cela:

OpenMP a également des avantages similaires en matière de portabilité en ce sens que beaucoup de compilateurs pour différentes plateformes le supportent maintenant, comme avec pthreads

Crypto++ est multiplateformes, ce qui signifie qu'il fonctionne sous Windows, Linux, OS X et les BSDs. Il utilise OpenMP pour le support de threading dans les endroits où le l'opération peut être coûteuse, comme l'exponentiation modulaire et la multiplication modulaire (et où l'opération simultanée peut être effectuée).

Windows ne supporte pas pthreads, mais les compilateurs Windows modernes supportent OpenMP. Donc, si vous voulez la portabilité vers les non-*nix, alors OpenMP est souvent un bon choix.


Et comme Mike a également souligné:

OpenMP est génial si tout ce que vous voulez faire est d'ajouter un peu de #pragma déclarations et ont un version parallèle de votre code assez rapidement.

ci-dessous est un exemple de Crypto++ précalculant certaines valeurs utilisées dans les signatures Rabin-Williams en utilisant des racines retouchées comme décrit par Bernstein dans signatures RSA et 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 - la régulation fine du grain et la synchronisation n'étaient pas vraiment nécessaires. La parallélisation a été utilisée pour accélérer l'exécution, et la synchronisation est venue sans frais dans le le code source.

et si OpenMP est 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);
1
répondu jww 2015-06-13 22:46:18

OpenMP est idéal lorsque vous avez besoin d'effectuer la même tâche en parallèle (c'est-à-dire sur des données multiples), une sorte de machine SIMD (single-instruction multiple-data).

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 ceci page:

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

0
répondu user1284631 2013-08-02 10:37:58

OpenMP est choisi pour la mémoire partagée pour les programmes basés sur les tâches. Pour les programmes basés sur des threads, pthreads est utilisé. Pthreads ressemble 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 Java ou Python qui fournit une solution facile, mais il n'y a pas beaucoup de contrôle disponible pour nous.

0
répondu Abinav Ravi 2018-07-24 07:39:42