MPI vs openMP pour une mémoire partagée

disons qu'il y a un ordinateur avec 4 Processeurs ayant chacun 2 cœurs, donc au total 8 cœurs. Avec ma compréhension limitée, je pense que tous les processeurs partagent la même mémoire dans ce cas. Maintenant, est-il préférable d'utiliser directement openMP ou D'utiliser MPI pour le généraliser afin que le code puisse fonctionner à la fois sur les paramètres distribués et partagés. En outre, si J'utilise MPI pour un paramètre partagé, les performances diminueraient-elles par rapport à openMP?

24
demandé sur Shibli 2012-07-04 19:34:00

4 réponses

avec la plupart des plateformes mémoire distribuées aujourd'hui composées de nœuds SMP ou NUMA, il n'est tout simplement pas logique de ne pas utiliser OpenMP. OpenMP et MPI peut parfaitement fonctionner ensemble; OpenMP alimente les noyaux sur chaque noeud et MPI Communique entre les noeuds. Cela s'appelle de la programmation hybride. Il était considéré comme exotique il y a 10 ans, mais il est maintenant de plus en plus courant dans le calcul haute Performance.

quant à la question elle-même, la bonne réponse, compte tenu de l'information à condition, a toujours été seule et même chose: CELA DÉPEND.

28
répondu Hristo Iliev 2015-07-14 19:33:09

si vous avez besoin ou voulez MPI ou OpenMP (ou les deux) dépend fortement du type d'application que vous utilisez, et si votre problème est principalement lié à la mémoire ou au CPU (ou les deux). De plus, cela dépend du type de matériel que vous utilisez. Quelques exemples:

exemple 1

vous avez besoin de parallélisation parce que vous manquez de mémoire, par exemple vous avez une simulation et la taille du problème est si grande que vos données ne s'adaptent pas la mémoire d'un nœud unique plus. Cependant, les opérations que vous effectuez sur les données sont assez rapides, de sorte que vous n'avez pas besoin de plus de puissance de calcul.

dans ce cas, vous voulez probablement utiliser MPI et lancer un processus MPI sur chaque noeud, en utilisant au maximum la mémoire disponible tout en limitant la communication au strict minimum.

exemple 2

vous avez habituellement de petits ensembles de données et ne veulent accélérer votre application, qui est lourde sur le plan informatique. Aussi, vous ne voulez pas passer beaucoup de temps à penser à la parallélisation, mais plus votre algorithmes en général.

Dans ce cas OpenMP est votre premier choix. Vous n'avez qu'à ajouter quelques instructions ici et là (par exemple devant vos boucles for que vous voulez accélérer), et si votre programme n'est pas trop complexe, OpenMP fera le reste pour vous automatiquement.

exemple 3

Vous le souhaitez. Vous avez besoin de plus de mémoire, c'est-à-dire de plus de noeuds de calcul, mais vous voulez aussi accélérer vos calculs autant que possible, c'est-à-dire exécuter sur plus d'un noyau par noeud.

maintenant votre matériel entre en jeu. D'après mon expérience personnelle, si vous n'avez que quelques noyaux par noeud (4-8), la pénalité de performance créée par la surcharge générale de L'utilisation D'OpenMP (c.-à-d. démarrage des threads D'OpenMP, etc.) est plus que la charge du processeur-MPI interne la communication (c.-à-d. l'envoi de messages MPI entre des processus qui partagent réellement de la mémoire et qui n'auraient pas besoin de MPI pour communiquer).

Cependant, si vous travaillez sur une machine avec plus de noyaux par noeud (16+), Il deviendra nécessaire d'utiliser un hybride approche, c'est-à-dire mise en parallèle avec MPI et OpenMP en même temps. Dans ce cas, la parallélisation hybride sera nécessaire pour utiliser pleinement vos ressources computationnelles, mais il est également le plus difficile de coder et de maintenir.

résumé

Si vous avez un problème qui est assez petit pour être exécuté sur un seul noeud, utilisez OpenMP. Si vous savez que vous avez besoin de plus d'un noeud (et donc certainement besoin de MPI), mais vous favorisez la lisibilité du code/effort sur la performance, utilisez seulement MPI. Si L'utilisation de MPI seulement ne vous donne pas la vitesse que vous voudriez/exigez, vous devez le faire tout et aller hybride.

à votre deuxième question (au cas où cela ne serait pas devenu clair):

Si votre configuration est telle que vous n'avez pas besoin du tout de MPI (parce que vous ne pourrez toujours tourner que sur un seul noeud), utilisez OpenMP car il sera plus rapide. Mais si vous savez que vous avez besoin de MPI de toute façon, je commencerais par cela et n'ajouterais OpenMP que plus tard, quand vous savez que vous avez épuisé toutes les options d'optimisation raisonnables pour MPI.

48
répondu Michael Schlottke-Lakemper 2012-07-05 13:01:44

pour une utilisation sur une seule machine de mémoire partagée comme celle-ci, je recommande OpenMP. Cela simplifie certains aspects du problème.--1--> être plus rapide.

si vous prévoyez de vous déplacer vers une machine à mémoire répartie, utilisez MPI. Ça vous évitera de résoudre le même problème deux fois.

la raison pour laquelle je dis Qu'OpenMP pourrait être plus rapide est parce qu'une bonne implémentation de MPI pourrait être assez intelligente pour détecter qu'il est utilisé dans un environnement de mémoire partagée et optimiser son comportement en conséquence.

4
répondu Hbcdev 2012-07-04 15:42:16

juste pour une vue d'ensemble, la programmation hybride est devenue populaire car OpenMP bénéficie de la topologie de cache, en utilisant le même espace d'adresse. Comme MPI pourrait avoir les mêmes données répliquées sur la mémoire (parce que le processus ne peut pas partager les données) il pourrait souffrir de l'annulation de cache.

d'un autre côté, si vous partitionnez vos données correctement, et que chaque processeur dispose d'un cache privé, il pourrait arriver à un point où votre problème s'insère complètement dans le cache. Dans ce cas, vous avez super linéaire de la vitesse.

en parlant dans le cache, il y a une topologie de cache très différente sur les processeurs récents, et a toujours: CELA DÉPEND...

3
répondu RSFalcon7 2012-07-04 21:30:42