DOCUMENTATION

Vous trouverez plus d'informations sur OpenMPI ici.

Pour l'utiliser, il faut charger le module correspondant à la version souhaitée :

module load openmpi/openmpi-4.0.i21

Les noms des compilateurs principaux sont les suivants :

Voici un exemple de code C/MPI, ainsi que la façon de le compiler et de l'exécuter sur les machines du méso-centre.

Hello.c

#include <stdio.h>
#include <mpi.h> //Header MPI

int main (int argc, char *argv[])
{
    int nb_procs;   //Nombre de processus
    int rang;   //Rang du processus
    int ret;    //Retour d'erreur

    ret = MPI_Init(&argc,&argv); //Initialisation de l'environnement MPI

    //Verification d'erreur
    if (ret != MPI_SUCCESS)
    {
        printf("Erreur d'initialisation de MPI\n");
        return(-1);
    }

    MPI_Comm_size( MPI_COMM_WORLD, &nb_procs ); //Nombre total de processus
    MPI_Comm_rank( MPI_COMM_WORLD, &rang );     //Numero du processus

    printf("Hello World de la part du processus : %d/%d\n",rang,nb_procs);

    MPI_Finalize(); //Cloture de l'environnement MPI

    return 0;
}

Compilation

module load openmpi/openmpi-4.0.i21

gcc hello.c -o hello -fopenmp

Script de soumission

#! /bin/bash

#SBATCH -N 1

module load openmpi/openmpi-4.0.i21

mpirun ./hello

Communications entre GPU

Si vous voulez combinez MPI et CUDA, il se peut que vous vouliez passer des données d'un GPU à un autre. Avec une version "classique" de MPI, cette opération ne peut se faire directement. En effet, il faut d'abord copier la mémoire du GPU sur la mémoire du CPU hôte, puis envoyer cette dernière via MPI sur un autre CPU, et faire une dernière copie sur le GPU de destination :

//MPI rank 0
cudaMemcpy(src_cpu,src_gpu,size,cudaMemcpyDeviceToHost); //Copie de la mémoire du GPU vers la mémoire du CPU 
MPI_Send(src_cpu,size,MPI_CHAR,1,100,MPI_COMM_WORLD); //Envoie du message à rank 1
//MPI rank 1 
MPI_Recv(dest_cpu ,size,MPI_CHAR,0,100,MPI_COMM_WORLD, &status); //Réception du message de rank 0
cudaMemcpy(dest_gpu,dest_cpu,size,cudaMemcpyHostToDevice); //Copie de la mémoire du CPU vers la mémoire du GPU

Il existe maintenant des versions de MPI dites "CUDA-Aware", qui permettent de simplifier et d'optimiser cette opération. Vous pouvez ainsi copier directement la mémoire d'un GPU à un autre en passant par MPI, ce qui fait économiser le temps des copies de mémoire. Ces versions d'OpenMPI utilisent la technologie GPUDirect de Nvidia. Le morceau de code précédant devient :

//MPI rank 0
MPI_Send(src_gpu,size,MPI_CHAR,1,100,MPI_COMM_WORLD); //Envoie du message à rank 1
//MPI rank 1
MPI_Recv(dest_gpu,size,MPI_CHAR,0,100,MPI_COMM_WORLD, &status); //Réception du message de rank 0

Pour utiliser ces fonctionnalités au centre de calcul, vous devez charger un module openmpi compilé avec Cuda, par exemple :

module load openmpi-4.0.gcc9-cuda10.1

VERSIONS ET SCRIPTS D'INSTALLATION


TAGS