La plupart des spécialistes de l'informatique scientifique utilisent OpenMP comme un quasi-standard en matière de parallélisation de la mémoire partagée.
Existe-t-il une raison (autre que la lisibilité) d'utiliser OpenMP sur des pthreads? Ce dernier semble plus basique et je suppose qu’il 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 idéal si vous souhaitez simplement ajouter quelques instructions #pragma et disposer rapidement d'une version parallèle de votre code. Si vous voulez faire des choses vraiment intéressantes avec le codage MIMD ou une mise en file d'attente complexe, vous pouvez tout faire avec OpenMP, mais il est probablement beaucoup plus simple d'utiliser le threading dans ce cas. OpenMP présente également des avantages similaires en termes de portabilité, dans la mesure où de nombreux compilateurs de différentes plates-formes le prennent en charge, comme avec pthreads.
Vous avez donc parfaitement raison: si vous avez besoin d'un contrôle précis de votre parallélisation, utilisez pthreads. Si vous voulez paralléliser avec le moins de travail possible, utilisez OpenMP.
Quelle que soit la voie choisie, bonne chance!
Une autre raison: OpenMP est basé sur des tâches, Pthreads est basé sur des threads. Cela signifie qu'OpenMP allouera le même nombre de threads que le nombre de cœurs. Vous obtiendrez donc évolutive solution. Ce n'est pas une tâche facile de le faire en utilisant des threads bruts.
Le deuxième avis: OpenMP fournit des fonctionnalités de réduction: lorsque vous devez calculer des résultats partiels en 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 vous suffit-il? Vous gagnerez 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 à partir de 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, alors que les spécifications OpenMP doivent être implémentées sur des compilateurs; Cela étant dit, il existe diverses implémentations de pthread (par exemple, OpenBSD rthreads, NPTL) et plusieurs compilateurs prenant en charge OpenMP (par exemple, GCC avec le drapeau -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 donc plus facilement évolutif. Vous pouvez également mélanger du code compilé avec OpenMP avec du code à l'aide de pthreads.
Votre question est similaire à la question "Devrais-je programmer C ou Assembly", C étant OpenMP et Assembly étant des pthreads.
Avec pthreads, vous pouvez faire beaucoup mieux la parallélisation, une meilleure signification très étroitement ajustée à 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é.
Existe-t-il une raison (autre que la lisibilité) d'utiliser OpenMP sur des pthreads?
Mike a en quelque sorte abordé ceci:
OpenMP présente également des avantages similaires en termes de portabilité dans la mesure où de nombreux compilateurs de différentes plates-formes le prennent en charge, comme avec pthreads
Crypto ++ est multiplate-forme, c'est-à-dire qu'il s'exécute sous Windows, Linux, OS X et les BSD. Il utilise OpenMP pour la prise en charge des threads dans des endroits où l'opération peut être coûteuse, comme une exponentiation modulaire et une multiplication modulaire (et où des opérations simultanées peuvent être effectuées).
Windows ne supporte pas les pthreads, mais les compilateurs Windows modernes supportent OpenMP. Donc, si vous voulez une portabilité avec les non-nix, OpenMP est souvent un bon choix.
Et comme Mike a également souligné:
OpenMP est idéal si vous souhaitez simplement ajouter quelques instructions #pragma et disposer rapidement d'une version parallèle de votre code.
Vous trouverez ci-dessous un exemple de précalculage par Crypto ++ de certaines valeurs utilisées dans les signatures de Rabin-Williams à l’aide de Tweaked Roots, décrites par Bernstein dans signatures RSA et signatures de 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 du grain fin 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 n'a eu aucun coût dans le code source.
Et si OpenMP estnotdisponible, 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 exécuter la même tâche en parallèle (c'est-à-dire sur plusieurs données), une sorte de machine SIMD (plusieurs instructions à une seule instruction).
Pthreads est nécessaire lorsque vous souhaitez effectuer (de manière très différente) des tâches en parallèle, telles que, par exemple, la lecture de données dans un thread et l'interaction 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. Pthreads est utilisé pour les programmes basés sur les threads. Pthreads ressemble plus à C/FORTRAN en termes de langages de programmation, ce qui signifie que vous avez beaucoup de contrôle alors qu'OpenMP est Java ou Python, ce qui fournit une solution simple, mais nous n’avons pas beaucoup de contrôle à notre disposition.