Question

La plupart des gens dans l'utilisation de l'informatique scientifique OpenMP comme un quasi-standard en matière de parallélisation de mémoire partagée.

Y at-il une raison quelconque (autre que la lisibilité) à utiliser OpenMP sur pthreads? Ce dernier semble plus basique et je pense qu'il pourrait être plus rapide et plus facile à optimiser.

Était-ce utile?

La solution

Il se résume essentiellement à quel niveau de contrôle que vous voulez sur votre parallélisation. OpenMP est très bien si tout ce que vous voulez faire est d'ajouter quelques déclarations #pragma et une version parallèle de votre code assez rapidement. Si vous voulez faire des choses vraiment intéressantes avec codage ou faire la queue complexe MIMD, vous pouvez toujours faire tout cela avec OpenMP, mais il est probablement beaucoup plus simple à utiliser le filetage dans ce cas. OpenMP présente également des avantages similaires en matière de portabilité en ce que beaucoup de compilateurs pour différentes plates-formes soutiennent maintenant, comme pthreads.

Vous avez absolument raison - si vous avez besoin de contrôle peaufiné sur votre parallélisation, utilisez pthreads. Si vous voulez paralléliser avec aussi peu de travail que possible, utiliser OpenMP.

Quelle que soit la façon dont vous décidez d'aller, bonne chance!

Autres conseils

Une autre raison: l'OpenMP est basée sur les tâches, Pthreads est basé fil. Cela signifie que OpenMP va allouer le même nombre de fils que le nombre de noyaux. Donc, vous obtiendrez évolutive solution. Il est pas si facile de le faire en utilisant des fils premières.

Le deuxième avis: OpenMP offre des fonctions de réduction: lorsque vous devez calculer les résultats partiels dans les discussions et les combiner. Vous pouvez la mettre en œuvre tout en utilisant une seule ligne de code. Mais l'utilisation de threads premières vous devriez faire plus travail.

Il suffit de penser à vos besoins et essayer de comprendre: est assez OpenMP pour vous? Vous gagnerez beaucoup de temps.

OpenMP nécessite un compilateur qui prend en charge, et travaille avec pragma. L'avantage de cela est que lors de la compilation sans OpenMP-support (par exemple PCC ou Clang / LLVM dès maintenant), le code sera toujours compiler. De plus, jetez un oeil à ce que Charles Leiserson a écrit sur bricolage multithreading.

Pthreads est une norme POSIX ( IEEE POSIX 1003.1c ) pour les bibliothèques, alors que spécifications OpenMP doivent être mises en œuvre sur les compilateurs; Cela étant dit, il existe une variété de mises en œuvre de pthread (par exemple OpenBSD rthreads, NPTL), et un certain nombre de compilateurs qui supportent OpenMP (par exemple GCC avec le drapeau -fopenmp, MSVC ++ 2008).

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

Vous êtes en question est similaire à la question « Dois-je programmer en C ou de l'ensemble », C étant OpenMP et ensemble étant pthreads.

Avec pthreads vous pouvez faire beaucoup mieux parallélisation, ce qui signifie mieux ajusté très bien à votre algorithme et matériel. Ce sera beaucoup de travail cependant.

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

  

Y at-il une raison quelconque (autre que la lisibilité) à utiliser OpenMP sur pthreads?

Mike genre de abordé ceci:

  

OpenMP présente également des avantages similaires en matière de portabilité en ce que beaucoup de compilateurs pour différentes plates-formes soutiennent maintenant, comme pthreads

Crypto est multi-plateforme, ce qui signifie en fonctionne sous Windows, Linux, OS X et les systèmes BSD. Il utilise OpenMP pour enfiler un soutien dans des endroits où l'opération peut être coûteuse, comme exponentiation modulaire et la multiplication modulaire (et où peut être effectué fonctionnement simultané).

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


Et comme Mike a également souligné:

  

OpenMP est très bien si tout ce que vous voulez faire est d'ajouter quelques déclarations #pragma et une version parallèle de votre code assez rapidement.

Voici un exemple de Crypto ++ précalcul des valeurs utilisées dans les signatures Rabin-Williams en utilisant Roots Tweaked comme décrit par Bernstein dans 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);
    }
}

Il correspond à l'observation de Mike - un contrôle précis des grains et la synchronisation était pas vraiment nécessaire. Parallélisation a été utilisé pour accélérer l'exécution et la synchronisation est venu sans frais dans le code source.

Et si OpenMP 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 (qui est, sur plusieurs données), une sorte de machine SIMD (instruction unique de données multiples).

Pthreads est nécessaire lorsque vous souhaitez effectuer (tout à fait différentes tâches en parallèle) telles que, par exemple, la lecture des données dans un thread et d'interagir avec l'utilisateur dans un autre thread.

Voir cette page:

http://berenger.eu / blog / c-cpp-OpenMP-vs-pthread-OpenMP-ou-fil posix /

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top