La programmation parallèle ou parallélisme consiste à mettre en œuvre des architectures permettant de traiter des informations ou algorithmes de manière simultanée ayant pour but de réaliser un grand nombre d’opérations en un temps le plus petit possible.
Pour utiliser le parallélisme, les programmes doivent être réalisés avec cette optique.
La programmation parallèle est très utilisé pour le calcul de la dynamique des fluides, les prédictions météorologiques, la modélisation et simulation de problèmes de dimensions plus grandes, le traitement de l’information et l’exploration de données, le déchiffrement de messages, la recherche de mots de passe, le traitement d’images ou la fabrication d’images de synthèse (ex : lancer de rayon), l’intelligence artificielle et la fabrication automatisée.
Principes
La base de la programmation parallèle consiste en la conception d’un code de calcul capable de résoudre un problème donné en utilisant plusieurs processeurs.
Solutions matérielles
Il existe deux solutions matérielles :
- Mémoire partagée
- Processeurs physiquement sur un même serveur
- Communications internes entre les processeurs
- Solution logicielle : OpenMP
- Mémoire distribuée
- Cluster de calcul
- Communications réseaux sollicitées
- Solution logicielle : MPI
Solutions logicielles
Il est possible d’utiliser la parallélisation sans réécrire le code si celui-ci a besoin de librairies de calcul standards. Dans ce cas il suffit de compiler le code en utilisant des versions parallèles de ces librairies (GNU ou Intel MKL) et le code sera parallélisé à l’exécution lors des appels à ces librairies.
Sur un cluster, chaque nœud est un système à mémoire partagé :
- OpenMP : si les processeurs utilisés sont sur un même nœud
- MPI : si les processeurs utilisés sont sur plusieurs nœuds
Il est quand même possible d’écrire des codes hybrides qui utilisent MPI entre les nœuds et OpenMP au sein même d’un nœud. La solutions est performante mais qui complexe à mettre en œuvre.
OpenMP
OpenMP est une interface de programmation dédiée à la conception de codes sur systèmes à mémoire partagée
- Simple car le code généré reste assez proche du code séquentiel
- Parallélisation OpenMP réalisable depuis un code séquentiel
- Pour compiler avec le support OpenMP,
- ajouter l’option
–openmp
(exemple :ifort –openmp exe.f90 –O exe
) - nombre de processus défini dans une variable d’environnement externe :
OMP_NUM_THREADS
- ajouter l’option
MPI : Message Passing Interface
MPI est une Bibliothèque offrant des routines de communication pour la parallélisation permettant la programmation sur des systèmes à mémoire distribuée (cluster de calcul).
- Complexe car la parallélisation nécessite souvent de réécrire complètement le code
- Disponible pour les langages C, C++ et Fortran
- Les fonctions proposées par MPI permettent de traiter :
- Les communications entre les processus
- La définition et le traitement des variables
- La synchronisation des processus
Les principales implémentations de MPI sont :
- MPICH : Implémentation libre du standard MPI1 (http://www.unix.mcs.anl.gov/mpi/mpich1)
- OpenMPI : Implémentation du standard MPI2 (http://www.open-mpi.org)
- MPICH3 : Implémentation du standard MPI2 (http://www.mcs.anl.gov/research/projects/mpich2)
- Intel MPI : Implémentation propriétaire du standard MPI2
Documentation
https://fr.wikipedia.org/wiki/Parall%C3%A9lisme_(informatique)