Article de reference

Interface de passage de messages

L' interface de passage de messages ( MPI ) est une norme de communication par messages portable conçue pour fonctionner sur des architectures de calcul parallèle . La norme MPI...

L' interface de passage de messages ( MPI ) est une norme de communication par messages portable conçue pour fonctionner sur des architectures de calcul parallèle . La norme MPI définit la syntaxe et la sémantique des routines de bibliothèque utiles à un large éventail d'utilisateurs développant des programmes portables de communication par messages en C , C++ et Fortran . Plusieurs implémentations MPI open source ont favorisé l'essor d'une industrie du logiciel parallèle et encouragé le développement d'applications parallèles portables et évolutives à grande échelle.

Williamsburg, en Virginie . Les participants à Williamsburg ont discuté des fonctionnalités essentielles à une interface de passage de messages standard et ont créé un groupe de travail pour poursuivre le processus de normalisation. Jack Dongarra , Tony Hey et David W. Walker ont présenté une proposition préliminaire, « MPI1 », en novembre 1992. En novembre 1992, une réunion du groupe de travail MPI s'est tenue à Minneapolis et a décidé de formaliser davantage le processus de normalisation. Le groupe de travail MPI s'est réuni toutes les 6 semaines pendant les 9 premiers mois de 1993. Le projet de norme MPI a été présenté à la conférence Supercomputing '93 en novembre 1993. Après une période de commentaires publics, qui a entraîné quelques modifications de MPI, la version 1.0 de MPI a été publiée en juin 1994. Ces réunions et les discussions par courriel ont constitué le Forum MPI, dont l'adhésion était ouverte à tous les membres de la communauté du calcul haute performance .

Le projet MPI a mobilisé environ 80 personnes issues de 40 organisations, principalement aux États-Unis et en Europe. La plupart des grands fournisseurs de supercalculateurs ont participé à ce projet, en collaboration avec des chercheurs d'universités, de laboratoires gouvernementaux et d'entreprises .

MPI fournit aux fabricants de matériel parallèle un ensemble de routines de base clairement défini et facilement implémentable. Ils peuvent ainsi s'appuyer sur cet ensemble de routines standard de bas niveau pour créer des routines de plus haut niveau destinées à l'environnement de communication à mémoire distribuée de leurs machines parallèles . MPI offre une interface portable et conviviale pour les utilisateurs novices, tout en étant suffisamment puissante pour permettre aux programmeurs d'exploiter les opérations de passage de messages hautes performances disponibles sur les machines avancées.

Afin de créer une norme universelle pour la communication par messages, les chercheurs ne se sont pas basés sur un système unique, mais ont intégré les fonctionnalités les plus utiles de plusieurs systèmes, notamment ceux conçus par IBM, Intel , nCUBE , PVM , Express, P4 et PARMACS. Le paradigme de la communication par messages est attrayant de par sa grande portabilité et peut être utilisé pour la communication entre multiprocesseurs à mémoire distribuée et à mémoire partagée, réseaux de stations de travail et configurations hybrides. Ce paradigme est applicable dans de nombreux contextes, indépendamment de la vitesse du réseau ou de l'architecture mémoire.

Le soutien aux réunions du MPI a été assuré en partie par la DARPA et par la National Science Foundation (NSF) des États-Unis dans le cadre de la subvention ASC-9310330, de l'accord de coopération du NSF Science and Technology Center numéro CCR-8809615, et par la Commission européenne à travers le projet Esprit P6643. L' Université du Tennessee a également apporté une contribution financière au Forum du MPI.

Au cours des années suivantes, la norme MPI a évolué à travers de multiples révisions majeures et mineures, chacune introduisant de nouvelles fonctionnalités et des améliorations. Par exemple, MPI-3.0 a introduit les opérations collectives non bloquantes, des améliorations de la communication unilatérale et des liaisons de langage mises à jour ; MPI-4.0 a ajouté des routines de grand nombre d’opérations, des opérations collectives persistantes et des méthodes d’initialisation raffinées ; et MPI-5.0 a introduit une interface binaire d’application (ABI) standardisée afin d’améliorer l’interopérabilité entre les implémentations.

Aperçu

MPI est un protocole de communication pour la programmation d'ordinateurs parallèles . Il prend en charge la communication point à point et la communication collective. MPI « est une interface de programmation d'applications par passage de messages, accompagnée de spécifications de protocole et sémantiques décrivant le comportement de ses fonctionnalités dans toute implémentation » . Les objectifs de MPI sont la haute performance, l'évolutivité et la portabilité. En 2006, MPI restait le modèle dominant dans le calcul haute performance

Les objectifs de cette norme incluent la haute performance, l'évolutivité et la portabilité sur différentes architectures de calcul parallèle. Bien qu'elle ne soit pas régie par un organisme international de normalisation officiel, MPI est largement considérée comme une norme de facto pour l'échange de messages dans les applications de calcul haute performance.

MPI n'est reconnu par aucun organisme de normalisation majeur ; néanmoins, il est devenu un standard de facto pour la communication entre processus modélisant un programme parallèle s'exécutant sur un système à mémoire distribuée . Les supercalculateurs à mémoire distribuée, tels que les clusters de calcul, exécutent fréquemment de tels programmes.

Le modèle MPI-1 principal ne comporte pas de concept de mémoire partagée , et MPI-2 n'en propose qu'un concept limité , basé sur la mémoire partagée distribuée . Néanmoins, les programmes MPI sont couramment exécutés sur des ordinateurs à mémoire partagée, et MPICH comme Open MPI peuvent utiliser la mémoire partagée pour le transfert de messages lorsqu'elle est disponible. Concevoir des programmes autour du modèle MPI (contrairement aux modèles à mémoire partagée explicite ) présente des avantages lors de l'exécution sur des architectures NUMA , car MPI favorise la localité de la mémoire . La programmation explicite en mémoire partagée a été introduite dans MPI-3.

Bien que MPI appartienne aux couches 5 et supérieures du modèle de référence OSI , les implémentations peuvent couvrir la plupart des couches, avec des sockets et le protocole de contrôle de transmission (TCP) utilisés dans la couche transport.

La plupart des implémentations MPI consistent en un ensemble spécifique de routines directement appelables depuis C , C++ , Fortran (via une API) et tout langage capable d'interagir avec de telles bibliothèques, notamment C# , Java ou Python . Les avantages de MPI par rapport aux anciennes bibliothèques de passage de messages sont sa portabilité (car MPI a été implémenté pour presque toutes les architectures à mémoire distribuée) et sa rapidité (chaque implémentation étant optimisée pour le matériel sur lequel elle s'exécute).

MPI utilise des spécifications indépendantes du langage (LIS) pour les appels et les liaisons de langage. La première norme MPI spécifiait les liaisons ANSI C et Fortran 77 ainsi que les LIS. Le projet a été présenté à Supercomputing 1994 (novembre 1994) et finalisé peu après. Environ 128 fonctions constituent la norme MPI-1.3, publiée en 2008 comme dernière version de la série MPI-1.

C , ISO C++ et Fortran 90. L’interopérabilité des objets a également été ajoutée pour faciliter la programmation multilingue par communication par messages. La normalisation de MPI-2, achevée en 1996, a eu pour effet secondaire de clarifier la norme MPI-1, donnant naissance à MPI-1.2.

MPI-2 est en grande partie un sur-ensemble de MPI-1, bien que certaines fonctions soient obsolètes. Les programmes MPI-1.3 restent compatibles avec les implémentations MPI conformes à la norme MPI-2.

MPI-3.0 introduit des mises à jour importantes de la norme MPI, notamment des versions non bloquantes des opérations collectives, des améliorations des opérations unilatérales et une interface pour Fortran 2008. Il supprime les interfaces C++ obsolètes ainsi que diverses routines et objets obsolètes. Point important : tout programme MPI-2.2 valide qui évite les éléments supprimés reste valide avec MPI-3.0.

MPI-3.1 est une mise à jour mineure axée sur des corrections et des clarifications, notamment pour les liaisons Fortran. Elle introduit de nouvelles fonctions de manipulation application binary interface. This allows for increased interoperability of MPI libraries from different MPI vendors, as well as increased performance in containerized environments.

MPI is often compared with Parallel Virtual Machine (PVM), which was a popular distributed environment and message-passing system developed in 1989, and which was one of the systems that motivated the need for standard parallel message passing. Threaded shared-memory programming models (such as Pthreads and OpenMP) and message-passing programming (MPI/PVM) can be considered complementary and have been used together on occasion in, for example, servers with multiple large shared-memory nodes.

Functionality

synchronization, and communication functionality between a set of processes (that have been mapped to nodes/servers/computer instances) in a language-independent way, with language-specific syntax (bindings), plus a few language-specific features. MPI programs always work with processes, but programmers commonly refer to the processes as processors. Typically, for maximum performance, each CPU (or core in a multi-core machine) will be assigned just a single process. This assignment happens at runtime through the agent that starts the MPI program, normally called mpirun or mpiexec.

MPI supports both point-to-point communication, where messages are exchanged directly between pairs of processes, and collective communication, where groups of processes cooperate on operations such as broadcast and reduction. Language bindings allow MPI routines to be used from multiple programming languages, with the C and Fortran bindings being the most common.

Les fonctions de la bibliothèque MPI incluent, entre autres, les opérations d'envoi/réception de type rendez-vous point à point, le choix entre une topologie de processus logique cartésienne ou de type graphe , l'échange de données entre paires de processus (opérations d'envoi/réception), la combinaison de résultats partiels de calculs (opérations de regroupement et de réduction), la synchronisation de nœuds (opération de barrière), ainsi que l'obtention d'informations réseau telles que le nombre de processus dans la session de calcul, l'identité du processeur auquel un processus est actuellement associé, les processus voisins accessibles dans une topologie logique, etc. Les opérations point à point sont disponibles sous les formes synchrone , asynchrone , tamponnée et prête , permettant ainsi des sémantiques plus ou moins strictes pour la synchronisation lors d'un envoi de type rendez-vous. Dans la plupart des implémentations, de nombreuses opérations en attente peuvent être exécutées en mode asynchrone.

MPI-1 et MPI-2 permettent tous deux des implémentations qui chevauchent communication et calcul, mais la pratique et la théorie diffèrent. MPI spécifie également des interfaces thread-safe , dotées de stratégies de cohésion et de couplage qui contribuent à éviter les états cachés au sein de l'interface. Il est relativement facile d'écrire du code MPI multithread point à point, et certaines implémentations le prennent en charge. La communication collective multithread est optimale avec plusieurs instances de Communicators, comme décrit ci-dessous.

Concepts

MPI offre plusieurs fonctionnalités. Les concepts suivants permettent de comprendre ces fonctionnalités et aident le programmeur à choisir celles à utiliser dans ses applications. Quatre des huit concepts fondamentaux de MPI sont spécifiques à MPI-2.

Communicateur

Les objets communicateurs connectent des groupes de processus dans une session MPI. Chaque communicateur attribue à chaque processus qu'il contient un identifiant unique et organise ses processus inclus selon une topologie ordonnée . MPI propose également des groupes explicites, mais ceux-ci servent principalement à organiser et réorganiser des groupes de processus avant la création d'un nouveau communicateur. MPI prend en charge les opérations intracommunicateurs au sein d'un même groupe, ainsi que la communication bilatérale entre communicateurs. Dans MPI-1, les opérations au sein d'un même groupe sont prédominantes. Les opérations bilatérales apparaissent principalement dans MPI-2, où elles incluent la communication collective et la gestion dynamique au sein des processus.

Les communicateurs peuvent être partitionnés à l'aide de plusieurs commandes MPI. Parmi ces commandes MPI_COMM_SPLIT, on trouve celle qui permet à chaque processus de rejoindre l'un des sous-communicateurs colorés en déclarant lui-même appartenir à cette couleur.

Principes de base du point à point

Plusieurs fonctions importantes de MPI impliquent la communication entre deux processus spécifiques. Un exemple courant est la communication point à point MPI_Send, qui permet à un processus spécifié d'envoyer un message à un autre processus spécifié. Ces opérations point à point sont particulièrement utiles dans les communications structurées ou irrégulières, par exemple dans une architecture parallèle de données où chaque processeur échange régulièrement des portions de données avec d'autres processeurs spécifiques entre les étapes de calcul, ou dans une architecture maître-esclave où le maître envoie de nouvelles données de tâche à un esclave dès que la tâche précédente est terminée.

MPI-1 spécifie des mécanismes pour les mécanismes de communication point à point bloquants et non bloquants, ainsi que le mécanisme dit « prêt à envoyer » selon lequel une requête d'envoi ne peut être faite que lorsque la requête de réception correspondante a déjà été faite.

Bases collectives

Les fonctions collectives impliquent la communication entre tous les processus d'un groupe (qu'il s'agisse de l'ensemble du pool de processus ou d'un sous-ensemble défini par le programme). Une fonction typique est l' MPI_Bcastappel (abréviation de « diffusion »). Cette fonction reçoit des données d'un nœud et les envoie à tous les processus du groupe. L'opération inverse est l' MPI_Reduceappel, qui reçoit des données de tous les processus d'un groupe, effectue une opération (comme une somme) et stocke les résultats sur un nœud. Cette approche MPI_Reduceest souvent utile au début ou à la fin d'un calcul distribué de grande envergure, où chaque processeur traite une partie des données avant de les combiner pour obtenir un résultat.

D'autres opérations effectuent des tâches plus sophistiquées, comme par MPI_Alltoallexemple réorganiser n éléments de données de sorte que le n -ième nœud reçoive le n -ième élément de données de chacun.

Types de données dérivés

De nombreuses fonctions MPI nécessitent la spécification du type de données échangées entre les processus. En effet, MPI vise à prendre en charge les environnements hétérogènes où les types peuvent être représentés différemment selon les nœuds (par exemple, sur des architectures CPU différentes avec un ordre d'octets différent ). Dans ce cas, les implémentations MPI peuvent effectuer une conversion de données . Le langage C ne permettant pas de passer un type directement en paramètre, MPI prédéfinit les constantes `type` MPI_INT, `type`, `type`, etc. MPI_CHAR, MPI_DOUBLEpour correspondre à int`type`, `type` char, `type`, etc.double

Here is an example in C that passes arrays of ints from all processes to one. The one receiving process is called the "root" process, and it can be any designated process but normally it will be process 0. All the processes ask to send their arrays to the root with MPI_Gather, which is equivalent to having each process (including the root itself) call MPI_Send and the root make the corresponding number of ordered MPI_Recv calls to assemble all of these arrays into a larger one:

l'alignement des structures de données , car le compilateur peut ajouter des espaces aux variables d'une classe ou d'une structure de données. La méthode la plus sûre pour calculer la distance entre différents champs consiste à obtenir leurs adresses en mémoire. Ceci est réalisé avec l'opérateur `distance` MPI_Get_address, qui est généralement équivalent à &l'opérateur `distance` du C, mais cela peut ne pas être le cas en présence de segmentation mémoire .

Transmettre une structure de données en un seul bloc est nettement plus rapide que de transmettre un élément à la fois, surtout si l'opération doit être répétée. En effet, les blocs de taille fixe ne nécessitent pas de sérialisation lors du transfert.

Étant donné les structures de données suivantes :

la multiplication matricielle distribuée ), ou lorsqu'il est souhaitable que les tâches puissent équilibrer leur charge pendant que d'autres processeurs traitent des données.

Gestion dynamique des processus

multiplications matrice-vecteur creuses utilisant la bibliothèque MPI I/O montre un gain de performance généralement faible, mais ces résultats restent non concluants. Ce n'est qu'avec l'introduction des E/S collectives dans MPI-IO que cette dernière a connu une adoption généralisée. Les E/S collectives augmentent considérablement la bande passante d'E/S des applications en permettant aux processus de transformer collectivement les opérations d'E/S petites et non contiguës en opérations grandes et contiguës, réduisant ainsi la surcharge liée aux verrous et aux accès disque. Grâce à ses performances nettement supérieures, MPI-IO est également devenu la couche d'E/S sous-jacente de nombreuses bibliothèques d'E/S de pointe, telles que HDF5 et Parallel NetCDF . Sa popularité a également stimulé la recherche sur les optimisations des E/S collectives, comme les E/S prenant en compte la disposition et l'agrégation inter-fichiers.

Mises en œuvre officielles

De nombreux autres projets sont dérivés de MPICH, LAM et d'autres travaux, y compris, mais sans s'y limiter, les implémentations commerciales de HPE , Intel , Microsoft et NEC .

Bien que les spécifications imposent une interface C et Fortran, le langage utilisé pour implémenter MPI n'est pas contraint de correspondre au(x) langage(s) qu'il prend en charge à l'exécution. La plupart des implémentations combinent C, C++ et assembleur, et ciblent les programmeurs C, C++ et Fortran. Des liaisons sont disponibles pour de nombreux autres langages, notamment Perl, Python, R, Ruby, Java et CL (voir #Liaisons de langages ).

L' ABI des implémentations MPI est globalement répartie entre MPICH et les dérivés d'Open MPI , de sorte qu'une bibliothèque d'une famille peut remplacer directement une autre de la même famille, mais un remplacement direct entre familles est impossible. Le CEA français maintient une interface d'encapsulation pour faciliter ces changements.

Matériel

La recherche matérielle sur MPI se concentre sur l'implémentation directe de MPI dans le matériel, par exemple via un processeur en mémoire , en intégrant les opérations MPI dans les microcircuits des puces RAM de chaque nœud. De ce fait, cette approche est indépendante du langage, du système d'exploitation et du processeur, mais ne peut être facilement mise à jour ou supprimée.

Une autre approche a consisté à ajouter une accélération matérielle à une ou plusieurs parties de l'opération, notamment le traitement matériel des files d'attente MPI et l'utilisation de RDMA pour transférer directement des données entre la mémoire et le contrôleur d'interface réseau sans intervention du processeur ou du noyau du système d'exploitation.

Enveloppes de compilateur

mpicc (et de même mpic++ , mpif90 , etc.) est un programme qui s'appuie sur un compilateur existant pour définir les options de ligne de commande nécessaires lors de la compilation de code utilisant MPI. Généralement, il ajoute quelques options permettant de compiler et de lier le code à la bibliothèque MPI.

Liaisons de langage

Les liaisons sont des bibliothèques qui étendent la prise en charge de MPI à d'autres langages en encapsulant une implémentation MPI existante telle que MPICH ou Open MPI.

Infrastructure linguistique commune

Les deux implémentations de l'infrastructure de langage commun (CLI) .NET gérées sont Pure Mpi.NET et MPI.NET , un projet de recherche de l'Université de l'Indiana distribué sous une licence de type BSD . Il est compatible avec Mono et peut tirer pleinement parti des infrastructures réseau MPI sous-jacentes à faible latence.

Java

Bien que Java ne dispose pas d'une interface MPI officielle, plusieurs groupes tentent de les interconnecter, avec des résultats et une compatibilité variables. L'une des premières tentatives fut mpiJava de Bryan Carpenter , qui consiste essentiellement en un ensemble d' interfaces JNI (Java Native Interface) pour une bibliothèque MPI C locale, aboutissant à une implémentation hybride à la portabilité limitée, nécessitant par ailleurs une compilation avec la bibliothèque MPI spécifique utilisée.

Cependant, ce projet initial a également défini l'API mpiJava (une API MPI de facto pour Java, étroitement calquée sur les liaisons C++ équivalentes), adoptée par d'autres projets MPI Java ultérieurs. L'API MPJ, moins utilisée, a été conçue pour être plus orientée objet et plus conforme aux conventions de codage de Sun Microsystems . Au-delà de l'API, les bibliothèques MPI Java peuvent dépendre d'une bibliothèque MPI locale ou implémenter les fonctions de passage de messages en Java. Certaines, comme pair-à-pair et permettent un fonctionnement multiplateforme.

Certaines des difficultés majeures de Java/MPI proviennent des caractéristiques de Java, telles que l'absence de pointeurs explicites et l' espace d'adressage mémoire linéaire de ses objets, ce qui rend le transfert de tableaux multidimensionnels et d'objets complexes inefficace. Les solutions de contournement consistent généralement à transférer ligne par ligne et/ou à effectuer une désérialisation et un transtypage explicites à l'envoi et à la réception, à simuler des tableaux de type C ou Fortran à l'aide d'un tableau unidimensionnel, et à utiliser des tableaux à un seul élément pour les pointeurs vers des types primitifs, aboutissant ainsi à des styles de programmation très éloignés des conventions Java.

MPJ Express est un autre système de messagerie Java. Les versions récentes peuvent être exécutées en cluster et en architecture multicœur. En cluster, il permet d'exécuter des applications Java en parallèle sur des clusters et des clouds. Les sockets Java ou des interconnexions d'E/S spécialisées comme Myrinet assurent la communication entre les processus MPJ Express. Il peut également utiliser l'implémentation C native de MPI. En architecture multicœur, une application Java en parallèle est exécutée sur des processeurs multicœurs. Dans ce mode, les processus MPJ Express sont représentés par des threads Java.

Julia

Il existe un wrapper de langage Julia pour MPI.

MATLAB

Il existe quelques implémentations académiques de MPI utilisant MATLAB . MATLAB possède sa propre bibliothèque d'extension parallèle implémentée à l'aide de MPI et PVM .

OCaml

Le module OCamlMPI implémente un large sous-ensemble de fonctions MPI et est activement utilisé en calcul scientifique. Un programme OCaml de 11 000 lignes a été « MPI-ifié » à l’aide de ce module, avec 500 lignes de code supplémentaires et une légère restructuration, et a été exécuté avec d’excellents résultats sur jusqu’à 170 nœuds d’un supercalculateur.

PARI/GP

PARI/GP peut être construit pour utiliser MPI comme moteur multithread, permettant d'exécuter des programmes PARI et GP en parallèle sur des clusters MPI sans modification.

Python

Les wrappers MPI activement maintenus pour Python incluent : mpi4py, numba-mpi et numba-jax.

Les développements abandonnés comprennent : pyMPI, pypar, MYMPI et le sous-module MPI dans ScientificPython .

R

Les liaisons R de MPI incluent pbdMPI , où Rmpi ​​se concentre sur le parallélisme gestionnaire-travailleurs tandis que pbdMPI se concentre sur le parallélisme SPMD . Les deux implémentations prennent entièrement en charge Open MPI ou MPICH2 .

Exemple de programme

Voici un programme « Hello, World! » en MPI écrit en C. Dans cet exemple, nous envoyons un message « hello » à chaque processeur, le manipulons de manière triviale, renvoyons les résultats au processus principal et affichons les messages.

" , num_procs );/* Envoyer des messages à tous les autres processus */ for ( other_rank = 1 ; other_rank < num_procs ; other_rank ++ ) { sprintf ( buf , "Bonjour %i!" , other_rank ); MPI_Send ( buf , 256 , MPI_CHAR , other_rank , 0 , MPI_COMM_WORLD ); }/* Recevoir les messages de tous les autres processus */ for ( other_rank = 1 ; other_rank < num_procs ; other_rank ++ ) { MPI_Recv ( buf , 256 , MPI_CHAR , other_rank , 0 , MPI_COMM_WORLD , MPI_STATUS_IGNORE ); printf ( "%s " , buf ); }} autre {/* Recevoir un message du processus #0 */ MPI_Recv ( buf , 256 , MPI_CHAR , 0 , 0 , MPI_COMM_WORLD , MPI_STATUS_IGNORE ); assert ( memcmp ( buf , "Hello " , 6 ) == 0 );/* Envoyer un message au processus n° 0 */ sprintf ( buf , "Le processus %i se présente." , my_rank ); MPI_Send ( buf , 256 , MPI_CHAR , 0 , 0 , MPI_COMM_WORLD );}/* Supprimer l'infrastructure de communication */ MPI_Finalize (); return 0 ; }

Lorsqu'il est exécuté avec 4 processus, il devrait produire la sortie suivante :

processus , chacun étant une instance indépendante du programme à l'exécution et se voyant attribuer les rangs (identifiants numériques) 0, 1, 2 et 3. Le nom mpiexecest recommandé par la norme MPI, bien que certaines implémentations proposent une commande similaire sous le nom mpirun. MPI_COMM_WORLDest le communicateur regroupant tous les processus.

A single program, multiple data (SPMD) programming model is thereby facilitated, but not required; many MPI implementations allow multiple, different, executables to be started in the same MPI job. Each process has its own rank, the total number of processes in the world, and the ability to communicate between them either with point-to-point (send/receive) communication, or by collective communication among the group. It is enough for MPI to provide an SPMD-style program with MPI_COMM_WORLD, its own rank, and the size of the world to allow algorithms to decide what to do. In more realistic situations, I/O is more carefully managed than in this example. MPI does not stipulate how standard I/O (stdin, stdout, stderr) should work on a given system. It generally works as expected on the rank-0 process, and some implementations also capture and funnel the output from other processes.

MPI uses the notion of process rather than processor. Program copies are mapped to processors by the MPI runtime. In that sense, the parallel machine can map to one physical processor, or to N processors, where N is the number of available processors, or even something in between. For maximum parallel speedup, more physical processors are used. This example adjusts its behavior to the size of the world N, so it also seeks to scale to the runtime configuration without compilation for each size variation, although runtime decisions might vary depending on that absolute amount of concurrency available.

MPI-2 adoption

Adoption of MPI-1.2 has been universal, particularly in cluster computing, but acceptance of MPI-2.1 has been more limited. Issues include:

  1. MPI-2 implementations include I/O and dynamic process management, and the size of the middleware is substantially larger. Most sites that use batch scheduling systems cannot support dynamic process management. MPI-2's parallel I/O is well accepted.interface binaire d'application (ABI) standard .

    Les architectures évoluent, avec une concurrence interne accrue ( multicœurs ), un contrôle plus précis de la concurrence (threading, affinité) et une hiérarchie mémoire plus étendue . Les programmes multithreadés peuvent tirer parti de ces évolutions plus facilement que les applications monothreadées. Ceci a déjà donné lieu à des normes distinctes et complémentaires pour le multiprocesseur symétrique , notamment OpenMP . MPI-2 définit comment les implémentations conformes à la norme doivent gérer les problématiques multithreadées, mais n'impose pas que les implémentations soient multithreadées, ni même thread-safe. MPI-3 ajoute la possibilité d'utiliser le parallélisme à mémoire partagée au sein d'un nœud. Des implémentations de MPI telles que MPI adaptatif, MPI hybride, MPI à grain fin, MPC et autres proposent des extensions à la norme MPI qui répondent à différents défis liés à MPI.

    L’astrophysicien Jonathan Dursi a publié une tribune qualifiant MPI d’obsolète, citant des technologies plus récentes comme le langage Chapel , Unified Parallel C , Hadoop , Spark et Flink . Parallèlement, la quasi-totalité des projets de l’ Exascale Computing Project s’appuient explicitement sur MPI ; il a été démontré que MPI pouvait s’adapter aux machines les plus puissantes au début des années 2020 et il est largement considéré comme devant rester pertinent pendant longtemps.

Plus d articles de Worldlex Wiki

Revenez a l index pour explorer davantage de pages sur l histoire, la science, la culture, la geographie et la societe en francais.

Explorer l index