Importance du réseau dans des architectures MIMD Tout échange entre les processeurs nécessite un...

Preview:

Citation preview

Importance du réseau dans des architectures MIMD

Tout échange entre les processeurs nécessite un transfert de données via le réseau d’interconnections des processeurs.

Le coût d ’un tel transfert :

transittransfert

packlatence tdv

NttjiNt )1(),,(

où d est le nombre de connections directes nécessaire pour passer du processeur i au processeur j.

Granularité des applications :

C ’est le rapport entre le temps passé par l ’application à effectuer des opérations de calcul et le temps passé dans les communications entre les processeurs :

ioncommunicat

calcul

t

t

Si ce rapport est élevé l ’application se prête bien au parallèle, au contraire s ’il est faible l ’application sera difficilement parallélisable.

Exemples de programmations parallèles :

- réactualisation des données : X=X+X

- produit scalaire : ps=(X,Y)

...

Accélération (Speed-up) Sp =

Temps d ’exécution (wall clock) :

),(

)1,(

pNt

Nt

),( pNtoù N est la taille du problème à traiter

et p le nombre de processeurs utilisés

Efficacité =p

Sp La scalabilité est l ’évolution de l’efficacité en fonction du nombre de processeurs.

Critères d’évaluation d’applications parallèles

Les modèles de programmation parallèle

- par des données parallèles [HPF] [Open MP] :

introduction de nouveaux types de données (vecteur parallèle) et de nouvelles instructions (FORALL). Principalement utilisé sur des machines à mémoire partagée et à adressage unique.

Synchronisation importante après chaque instruction scalaire ou parallèle mais implémentation relativement simple.

- par échanges de messages [pvm] [mpi] :

utilisation de librairies contenant des instructions d ’envois, de réceptions de messages plus des instructions de synchronisation .

Le programmeur doit gérer le parallélisme, mais les synchronisations sont moins fréquentes.

Exemple de programmation avec MPI :

#include <mpi.h >

...

MPI_Init(...)

int a=6,b;

MPI_Send(1,&a,1,MPI_INT,...)

MPI_Recv(1,&b,1,MPI_INT,...)

cout << b << endl;

MPI_Finalize()

#include <mpi.h>

MPI_Init(...)

int a=12,b;

MPI_Recv(0,&b,1,MPI_INT;...)

MPI_Send(1,&a,1,MPI_INT,...)

cout << b << endl;

MPI_Finalize()

Proc 0 Proc 1

12 6

Principales fonctions de la librairie MPI :

MPI_Init(...)

MPI_Finalize()

MPI_Comm_rank(...)

MPI_Comm_size(...)

double MPI_Wtime()

MPI_Send(…)

MPI_Recv(…)

MPI_Allreduce(...)

MPI_Bcast(..)

MPI_Isend(…)

MPI_Irecv(...)

MPI_Waitall(..)

MPI_Barrier(...)

MPI_COMM_WORLD

Exemple de programmation parallèle (bis) :

La résolution système linéaire

Recommended