Le calcul parallèle

Le calcul parallèle est un ensemble de techniques logicielles et matérielles permettant l’exécution simultanée de séquences d’instructions indépendantes, sur des processeurs différents.

Calcul parallèle à mémoire distribuée

Il s’agit de faire travailler ensemble plusieurs ressources, étant disjointes (ne partageant pas le même espace mémoire), comme des serveurs, des accélérateurs. Pour cela on peut utiliser une bibliothèque de calcul parallèle très répandue : MPI (Message Passing Interface).

Implémentation Intel MPI

Elle est accessible au travers de modules, de la forme intel/mpi/20xx.y.zzz.
On dispose de wrappers pour compiler plus facilement les programmes en Fortran C, C++. Les compilateurs (Intel uniquement) sont complétés par des options pour chercher les fichiers d’en-tête ou les bibliothèques à l’édition des liens. Il s’agit de :

  • mpiifort : wrapper pour le Fortran

  • mpiicc : wrapper pour le C

  • mpiicpc : wrapper pour le C++

Implémentation OpenMPI

OpenMPI est une implémentation de la norme MPI et elle peut être compilée par n’importe quel compilateur. Pour cette raison, on a plusieurs sous-familles de modules selon les compilateurs utilisés : Intel, GNU, PGI. Leurs noms ont donc la forme openmpi/<reseau>/<compilateur>/<version>.

  • <réseau> désigne le matériel sous-jacent qui relie les serveurs : Omnipath, Roce, InfiniBand, …​

  • <compilateur> désigne le compilateur utilisé pour compiler la bibliothèque MPI.

  • <version> désigne le numéro de version de la bibliothèque

Compilation avec GNU

Les wrappers sont :

  • mpif90 pour le Fortran

  • mpicc pour le C

  • mpic++ pour le C++

Compilation avec Intel

Les wrappers sont :

  • mpif90 pour le Fortran

  • mpicc pour le C

  • mpic++ pour le C++

Compilation avec PGI

Les wrappers sont :

  • mpif90 pour le Fortran

  • mpicc pour le C

  • mpic++ pour le C++

Implémentation MPIVAPICH

MVAPICH est moins utilisée que les deux précédentes ; elle est une implémentation de la norme MPI et peut être compilée par n’importe quel compilateur. Pour cette raison, on a plusieurs sous-familles de modules selon les compilateurs utilisés : Intel, GNU, PGI. Leurs noms ont donc la forme mvapich/<reseau>/<compilateur>/<version>.

  • <réseau> désigne le matériel sous-jacent qui relie les serveurs : Omnipath, Roce, InfiniBand, …​

  • <compilateur> désigne le compilateur utilisé pour compiler la bibliothèque MPI.

  • <version> désigne le numéro de version de la bibliothèque

Compilation avec GNU

Les wrappers sont :

  • mpif90 pour le Fortran

  • mpicc pour le C

  • mpic++ pour le C++

Compilation avec Intel

Les wrappers sont :

  • mpif90 pour le Fortran

  • mpicc pour le C

  • mpic++ pour le C++

Compilation avec PGI

Les wrappers sont :

  • mpif90 pour le Fortran

  • mpicc pour le C

  • mpic++ pour le C++

Calcul parallèle à mémoire partagée

Il s’agit d’exploiter des ressources qui partagent le même espace mémoire, comme les cœurs au sein d’un seul serveur disposant d’un espace mémoire unique, accessible par tous ses cœurs.
On peut utiliser les threads avec des bibliothèques tierces.
On peut aussi utiliser OpenMP et s’appuyer directement sur les compilateurs.

OpenMP

OpenMP est un modèle de programmation parallèle qui repose sur la mémoire partagée.
L’utilisation d’OpenMP repose sur l’ajout de directives directement dans le code source pour décrire la manière dont les instructions du code sont réparties sur les différents cœurs.

Options de compilation

L’activation des directives se fait en ajoutant une option au compilateur. Chaque compilateur a la sienne :

  • Intel ifort/icc/icpc : -qopenmp

  • GNU gfortran/gcc/g++ : -fopenmp

  • PGI pgf90/pgcc/pgc++ : -mp