Lors de la parallélisation du code sur plusieurs nœuds, OpenMP et MPI (Message Passing Interface) sont deux approches couramment utilisées, mais elles diffèrent dans leurs concepts et méthodologies sous-jacents.
OpenMP (mémoire partagée)
OpenMP est un modèle de programmation principalement utilisé pour la parallélisation de la mémoire partagée. Il vous permet de paralléliser le code à l’intérieur d’un seul nœud ou d’un processeur multi-cœur en répartissant la charge de travail entre plusieurs threads. Cependant, OpenMP ne prend pas en charge nativement la parallélisation entre plusieurs nœuds.
Lorsque vous utilisez OpenMP, une seule instance du programme est exécutée sur un nœud, et plusieurs threads sont créés pour répartir la charge de travail entre les cœurs disponibles. Chaque thread peut accéder à la mémoire partagée, ce qui permet une communication et une synchronisation faciles entre les threads. Cependant, lorsqu’il s’agit de travailler avec plusieurs nœuds, OpenMP seul ne peut pas gérer la communication entre les nœuds.
MPI (mémoire distribuée)
MPI, en revanche, est une bibliothèque de passage de messages utilisée pour la parallélisation de la mémoire distribuée. Il vous permet de paralléliser le code sur plusieurs nœuds d’une grappe ou d’un environnement informatique distribué. Chaque nœud fonctionne de manière indépendante et possède sa propre mémoire. MPI fournit des fonctions de communication et de coordination entre les nœuds.
Avec MPI, vous lancez plusieurs instances du programme, appelées processus MPI ou rangs, chacune s’exécutant sur un nœud séparé. Ces processus communiquent en s’envoyant et en recevant explicitement des messages via des appels de fonctions MPI. Les données sont échangées à l’aide de communications point à point ou d’opérations collectives. MPI prend en charge une large gamme de motifs de communication, permettant une coordination efficace entre les nœuds.
Lors de l’allocation de plusieurs nœuds
OpenMP : Lors de l’utilisation d’OpenMP, vous allouez généralement plusieurs cœurs à l’intérieur d’un seul nœud. OpenMP lui-même ne gère pas directement l’allocation des nœuds. Le système d’exploitation ou un gestionnaire de ressources (comme SLURM, PBS) est responsable de l’attribution des cœurs à vos threads OpenMP.
MPI : Avec MPI, vous allouez explicitement plusieurs nœuds. Vous lancez plusieurs processus MPI, chacun s’exécutant sur un nœud séparé. Le gestionnaire de ressources ou un lanceur MPI spécifique (comme mpirun) gère l’allocation des nœuds pour vous.
En résumé, OpenMP convient à la parallélisation de la mémoire partagée à l’intérieur d’un seul nœud, tandis que MPI est conçu pour la parallélisation de la mémoire distribuée sur plusieurs nœuds. MPI offre un contrôle explicite sur la communication entre les nœuds, tandis qu’OpenMP se concentre sur le parallélisme à l’intérieur d’un noeud.