Pourquoi MPI est-il considéré comme plus difficile que la mémoire partagée et Erlang comme plus facile, quand ils passent tous les deux un message?

StackOverflow https://stackoverflow.com/questions/185444

Question

Erlang suscite actuellement beaucoup d’intérêt en tant que langage permettant d’écrire des programmes parallèles sur multicœur. J'ai entendu des gens dire que le modèle de passage de messages d'Erlang est plus facile à programmer que les modèles de mémoire partagée dominants tels que les threads.

Inversement, dans la communauté informatique haute performance, le modèle de programmation parallèle dominant était MPI, qui implémentait également un modèle de transmission de messages. Toutefois, dans le monde HPC, ce modèle de transmission de messages est généralement considéré comme très difficile à programmer et les gens soutiennent que les modèles de mémoire partagée tels que OpenMP ou UPC sont plus faciles à programmer.

Quelqu'un sait-il pourquoi il existe une telle différence dans la perception de la transmission de messages par rapport à la mémoire partagée dans les mondes informatique et HPC? Est-ce dû à une différence fondamentale dans la manière dont Erlang et MPI implémentent le passage de message qui rend le passage de message de type Erlang beaucoup plus facile que MPI? Ou y a-t-il une autre raison?

Était-ce utile?

La solution

Je suis d’accord avec toutes les réponses précédentes, mais je pense qu’un point clé qui n’est pas clairement expliqué est que l’une des raisons pour lesquelles MPI peut être considéré comme difficile et Erlang easy est la correspondance du modèle avec le domaine.

Erlang est basé sur un concept de mémoire locale, de transmission de messages asynchrone et d'état partagé résolu en utilisant une forme de base de données globale à laquelle tous les threads peuvent accéder. Il est conçu pour les applications qui ne déplacent pas beaucoup de données et qui ne sont pas supposées exploser en 100 000 nœuds distincts nécessitant une coordination.

MPI est basé sur la mémoire locale et la transmission de messages. Il est destiné aux problèmes dans lesquels le transfert de données est un élément clé du domaine. Le calcul haute performance consiste essentiellement à prendre l'ensemble de données pour résoudre un problème et à le répartir entre une multitude de ressources de calcul. Et c’est un travail assez difficile dans un système de transmission de messages car les données doivent être explicitement distribuées avec un équilibre à l’esprit. Pour l'essentiel, MPI peut être considéré comme une admission réticente que la mémoire partagée ne s'adapte pas. Et il cible des calculs hautes performances répartis sur 100 000 processeurs ou plus.

Erlang n’essaie pas d’atteindre les performances les plus élevées possibles, mais plutôt de décomposer un problème naturellement parallèle en un fil naturel. Il a été conçu avec un type de tâches de programmation totalement différent de celui de MPI.

Erlang est donc mieux comparé à pthreads et à d’autres solutions de thread hétérogènes plutôt locales qu’à MPI, qui vise en réalité un ensemble de problèmes très différent (et dans une certaine mesure plus difficile en soi).

Autres conseils

Le parallélisme à Erlang est toujours difficile à mettre en oeuvre. J'entends par là que vous devez encore comprendre comment scinder votre problème, mais quelques petites choses facilitent ce problème par rapport à certaines bibliothèques MPI en C ou C ++.

Premièrement, puisque la transmission de messages d’Erlang est une fonction de langage de premier ordre, le sucre syntaxique facilite les choses.

De plus, les bibliothèques Erlang sont toutes construites autour du message transmis par Erlang. Cette structure de support vous donne un coup de pouce pour les terres à traitement parallèle. Jetez un coup d'œil aux composants d'OTP comme gen_server, gen_fsm, gen_event. Ce sont des structures très faciles à utiliser qui peuvent aider votre programme à devenir parallèle.

Je pense que c’est davantage la robustesse de la bibliothèque standard disponible qui différencie le message d’erlang qui passe des autres implémentations de MPI, et non une caractéristique spécifique du langage lui-même.

Habituellement, la simultanéité dans HPC signifie travailler sur de grandes quantités de données. Ce type de parallélisme est appelé parallélisme des données et est en effet plus facile à mettre en œuvre en utilisant une approche de mémoire partagée comme OpenMP. , car le système d’exploitation prend en charge des tâches telles que la planification et le placement des tâches, qu’il faudrait s’implémenter soi-même si on utilisait un paradigme de transmission de messages.

En revanche, Erlang a été conçu pour faire face au parallélisme des tâches rencontré dans les systèmes téléphoniques, où différentes des éléments de code doivent être exécutés simultanément avec une quantité de communication limitée et des exigences strictes en matière de tolérance aux pannes et de récupération.

Ce modèle est similaire à celui utilisé par la plupart des utilisateurs. Il convient aux applications telles que les serveurs Web, où chaque demande peut être traitée par un thread différent, tandis que les applications HPC font à peu près la même chose avec d’énormes quantités de données qui doivent également être échangées entre les employés.

Je pense que cela a quelque chose à voir avec l'état d'esprit lorsque vous programmez avec MPI et lorsque vous programmez avec Erlang. Par exemple, MPI n'est pas intégré au langage, alors qu'Erlang prend en charge le transfert de messages. Une autre raison possible est la déconnexion entre le simple envoi / réception de messages et le partitionnement de solutions en unités d’exécution simultanées.

Avec Erlang, vous êtes obligé de penser dans un cadre de programmation fonctionnel où les données zèchent d’appel de fonction à appel de fonction - et recevoir est un acte actif qui ressemble à une construction normale du langage. Cela vous permet d’établir un lien plus étroit entre le calcul que vous effectuez et l’envoi / réception de messages.

Avec MPI, par contre, vous êtes obligé de penser uniquement au message qui passe mais pas vraiment à la décomposition du travail. Ce cadre de réflexion nécessite un changement de contexte entre l'écriture de la solution et l'infrastructure de messagerie dans votre code.

La discussion peut continuer, mais le point de vue général est que, si la structure utilisée pour la transmission du message est réellement intégrée au langage de programmation et au paradigme que vous utilisez, il s'agit généralement d'un meilleur moyen d'exprimer la solution par rapport à autre chose. " cloué sur " ou existe en tant qu’add-on à une langue (sous la forme d’une bibliothèque ou d’une extension).

  

Quelqu'un sait-il pourquoi il existe une telle différence dans la perception de la transmission de messages par rapport à la mémoire partagée dans les mondes informatique et HPC? Est-ce dû à une différence fondamentale dans la manière dont Erlang et MPI implémentent le passage de message qui rend le passage de message de type Erlang beaucoup plus facile que MPI? Ou y a-t-il une autre raison?

La raison en est simplement le parallélisme vs la concurrence. Erlang est élevé pour la programmation concurrente. HPC concerne la programmation parallèle. Ce sont des objectifs liés mais différents.

La programmation simultanée est fortement compliquée par un flux de contrôle fortement non déterministe et la latence est souvent un objectif important. L’utilisation par Erlang de structures de données immuables simplifie grandement la programmation simultanée.

La programmation parallèle a un flux de contrôle beaucoup plus simple et l’objectif est tout à fait de débit total maximal et non de latence. Une utilisation efficace du cache est beaucoup plus importante ici, ce qui rend les structures de données Erlang et immuables largement inappropriées. La mutation de la mémoire partagée est à la fois facile à manipuler et nettement meilleure dans ce contexte. En effet, la cohérence du cache fournit des messages accélérés par le matériel.

Enfin, outre ces différences techniques, il existe également un problème politique. Les gars d'Erlang tentent de maîtriser le battage publicitaire multicœur en prétendant qu'Erlang est pertinent pour le multicœur lorsqu'il ne l'est pas. En particulier, ils vantent une grande évolutivité, il est donc essentiel de prendre également en compte les performances absolues. Erlang peut passer facilement d’une performance absolue médiocre d’un cœur à une performance absolue médiocre d’un nombre quelconque de cœurs. Comme vous pouvez l’imaginer, cela n’impressionne pas la communauté HPC (mais cela convient pour beaucoup de code très concurrentiel).

À propos de MPI par rapport à OpenMP / UPC: MPI vous oblige à diviser le problème en petits morceaux et à assumer la responsabilité du transfert des données. Avec OpenMP / UPC, "toutes les données sont là", il vous suffit de déréférencer un pointeur. L'avantage de MPI est que les grappes 32-512 CPU sont beaucoup moins chères que les machines simples 32-512 CPU. De plus, avec MPI, la dépense est initiale lorsque vous concevez l'algorithme. OpenMP / UPC peut masquer les latences que vous obtiendrez au moment de l’exécution, si votre système utilise NUMA (et que tous les grands systèmes le font). Votre programme ne sera pas évolutif et il faudra un certain temps pour comprendre pourquoi.

Cet article l'explique bien, Erlang est ce qu'il y a de mieux lorsque nous envoyons de petites données et que MPI fait beaucoup mieux pour les choses plus complexes. Aussi, le modèle Erlang est facile à comprendre: -)

Erlang contre MPI - Résultats finaux et code source

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