Les supports de cours se trouvent ici :
TP 1 : Hello world

Le code se trouve ici.

Compilation :

mpicc -o hellohybrid hellohybrid.c -fopenmp

Exécution :

mpiexec --machinefile machinefile -n 8 ./hellohybrid
TP 2 : maximum global d'un tableau aléatoire

Attention à la génération de nombres aléatoires ! Si tous les threads initialisent le générateur initialisé de la même façon, les nombres tirés aléatoirement seront identiques. Vous trouverez un exemple d'utilisation du générateur ici.

Il faut faire attention à procéder par étapes. On commence par remplir le tableau en parallèle en utilisant une boucle for parallèle. Ce n'est qu'une fois que le tableau est rempli que le calcul commence : utilisation d'une barrière. Puis on utilise une nouvelle boucle for parallèle pour calculer la somme locale des carrés. On utilise une variable privée pour stocker le carré, puis on ajoute cette valeur à la somme locale (qui a été initialisée à 0) ; on utilise alors une section critique.

Une fois la somme locale calculée on peut effectuer le calcul de la somme globale, c'est-à-dire la somme des sommes locales. Pour cela, on utilise un MPI_Allreduce (qui met le résultat à disposition de tous les processus). Attention, seul un thread de chaque processus doit prendre part à la communication collective MPI !

À la fin de l'opération collective, tous les processus disposent du résultat. Si celui-ci est mis dans une variable partagée entre tous les threads, tous les threads disposent du résultat global.

Le code se trouve ici.

Valid XHTML 1.0 Strict