Programmation parallèle


Objectifs de la section


Afin de nous rendre compte de la programmation des machines parallèles (implicitement du style de programmation pour une Grid) nous allons programmer en langage C ou C++ en utilisant deux API : Ces deux API sont très différentes, voire complémentaire et peuvent s'utiliser ensemble pour la réalisation d'une application (programmation hybride). Dans cette partie on tentera de réaliser des programmes soit avec l'une, soit avec l'autre des API, jamais les deux.
MPI illustre le paradigme de la mémoire distribuée (chaque unité de traitement dispose uniquement de sa propre mémoire) et OpenMP illustre le paradigme de la mémoire partagée.

Installation

Il faut que vous ayez installé le compilateur gcc sur votre machine. Pour OpenMP il n'y a rien à faire, le compilateur gcc implémente déjà cette API. Pour MPI on conseille fortement d'installer l'API depuis le site OpenMPI.

OpenMP

Une application en OpenMP est une application mono-processus avec un thread principal et, éventuellement, d'autres threads lancés en parallèle. Les variables du programmes (dans la fonction main ou toute autre fonction) deviennent des variables communes (shared) ou privé (private).

La compilation se réalise avec :
gcc -fopenmp prog.c ....
L'exécutable s'exécute comme tout exécutable sous Unix/Linux :
executable ou ./executable
Quelques exemples de programmes :

MPI

Une application écrite en C et MPI se composera des plusieurs processus, les processus seront obtenus à partir du même code C (SPMD - Single Program Multiple Data) ou à partir des codes différents (MPMD). Toutefois, on conseille de ne pas utiliser plus de 3 codes (programmes) différents pour une même application.
La compilation se fait avec la commande :
mpicc prog.c -o executable
Chaque programme se compile séparément.

L'exécution d'une application MPI se fait avec la commande :
mpirun -np nb_processus executable
Si l'application se compose des processus issus des programmes différents, on compile avec la commande mpicc chaque programme, chaque programme a sa propre fonction main(), on construit autant d'exécutables que de programmes et on indique dans la commande mpirun le nombre de processus ayant le même exécutable :
mpirun -np n1 executable1 : -np n2 executable2 ...
Quelques exemples de programmes : Regardez attentivement le fonctionnement de ces programmes qui débutent tous pas la détection de numéro d'ordre du processus dans le cadre de son groupe (appelé communicateur).

Problèmes résolus complètement


Je reste à votre disposition pour toute information.