Objectifs du Bureau d'Etude :
Les
clusters de PC sont aujourd'hui des plates-formes de calculs
opérationnelles et industrielles. La distribution de
tâches indépendantes se fait automatiquement dans certains
environnements de développement, mais la distribution d'une
application nécessitant des échanges de résultats
intermédiaires ou une circulation des données (trop
volumineuses pour être stockées en totalité sur
chaque PC) reste à la charge du développeur. Elle demande
des connaissances en algorithmique parallèle et un savoir-faire
en programmation distribuée.
Ce BE a trois objectifs
- Pratiquer la
programmation des clusters de PC
par envois de messages à l'aide MPI. Il consiste à
implanter l'algorithme du produit de matrices denses sur un anneau de
processeurs (algorithme vu en cours). Les noyaux de calculs seront des
noyaux multithreadés et optimisés (fournis).
- Etudier différents "déploiements" du programme MPI+OpenMP sur un cluster de PC multi-coeurs.
- Etudier et comparer les performances des différents déploiements.
Plate-forme de développement :
Vous travaillerez
sur un des clusters du campus de Metz de Supélec :
- le cluster Kyle (66 PC bi-socket Intel Skylake octo-coeurs hyperthreadés, 10 Gigabit ethernet)
- le
cluster Sarah (32 PC bi-socket Intel Sandy-bridge quadri-coeurs hyperthreadés, 10 Gigabit ethernet) .
- Vous utiliserez vos comptes de TP (ex : "cpucs1_#")
pour toute la durée du TP, et vous allouerez 4 noeuds par OAR en mode interactif.
- sur le cluster Kyle : oarsub -p "cluster='Kyle'" -l nodes=4,walltime=5:00:00 -I
- sur le cluster Sarah : oarsub -p "cluster='Sarah'" -l nodes=4,walltime=5:00:00 -I
Documents à rendre :
Vous rendrez un SEUL document par binôme : un fichier Word (.doc) ou PDF :
- il sera nommé avec vos noms précédés
de "BE2-MPI". Ex : "BE2-MPI-Pignon.pdf"
- il comportera sur la première page :
- vos nom et prénoms, et le nom de votre option de 3A,
- la date de remise du rapport,
- le titre ("BE de programmation MPI par envois de messages bloquants et de déploiement sur clusters de PC multi-coeurs"),
- ... et le début de votre rapport.
- il contiendra en général :
- pour chaque étape : une description de la parallélisation réalisée (pourquoi ? comment ?),
- les
codes sources des parties importantes du code
à chaque étape (ex : les routines de calcul et de communication).vos
mesures de performances (Texec, GigaFlops, SpeedUp) sur un cluster de
PC, pour les plus performants de vos codes,
- des graphiques de synthèse représentant les
performances fonction du nombre de PC utilisés et
éventuellement de la taille du problème,
- votre analyse/synthèse des performances obtenues,
- Taille maximale de vos rapports : <voir taille maximale annoncée en cours>.
- Date limite de remise de vos rapports : <voir date annoncée en cours>.
- Remise par e-mail à Stephane Vialle (Stephane.Vialle@centralesupelec.fr)
Remarques préliminaires
Fichiers à télécharger :
- Code source initial à compléter : ici
- Fichier Excel de relevé des performances : ici
Travail à effectuer :
- Implantez un produit de matrices distribué sur un anneau en utilisant MPI (+ OpenMP) et les routines MPI_Bsend et MPI_Recv, en complétant le code source fourni.
Utilisez des matrices globales de 1024x1024, et testez votre code en utilisant le kernel 1, et en lançant 1, 2 et 4 processus MPI (sans threads) sur le noeud auquel vous êtes connectés :
- mpirun -np 1 ./MatrixProduct -klc 1 -k 1 -nt 1
- Quand votre code MPI+OpenMP produit les bons résultats numériques
pour 1, 2 et 4 processus, faites une campagne de mesures de
performances :
- Générez votre fichier de machines :
sort -u $OAR_NODEFILE > machines.txt
- Testez 4 déploiements différents, avec des matrices de 8192x8192, en utilisant à chaque fois 1, 2 puis 4 machines durant le TP :
mpirun -np X -machinefile machines.txt -map-by ppr:... -rank-by ... -bind-to ... ./MatrixProduct -klc 8 -k 1 -nt Y
- 1
processus MPI par 'socket' (par processeur) avec une numérotation
consécutivement selon les sockets (ex : processus i et i+1 sur les deux
sockets d'un même noeud)
- 1
processus MPI par 'socket' avec une numérotation consécutivement selon
les sockets + une parallélisation OpenMP dans chaque processus
installant un thread par coeur physique
- 1 processus
MPI par coeur physique avec une numérotation consécutive selon les
coeurs (ex : processus i et i+1 sur les deux coeurs d'un même socket) ,
et un seul thread par processus
- 1 processus
MPI par coeur physique avec une numérotation consécutive selon les
noeuds (ex : processus i et i+1 sur deux noeuds successifs)
- Testez les 4 déploiements sur 8, 16, 32 (et 64) noeuds en dehors du TP les soirs et le week end.
- Remplissez le fichier Excel des mesures de performances.
- Tracez
des courbes de performances absolues (Gflops) et relatives (Speedup) en fonction du nombre
de noeuds (nombre de
machines utilisées) :
- Pour les 4 déploiements : sur 1, 2, 4 , 8, 16, 32 (et 64) noeuds et avec des matrices de 8192x8192
- Pour les 2 meilleurs déploiements : sur 1, 2, 4 , 8, 16, 32 (et 64) noeuds et avec des matrices de 16384x16384 (refaites des mesures)
- TRACEZ les courbes de performance PERTINENTES : tracez des performances absolues ET des performances relatives.
- ANALYSEZ les performances obtenues : sont-elles conformes aux attentes théoriques ? que montrent vos courbes de performances ?
- Autres développements si le temps le permet :
- Implantez une parallélisation utilisant la routine MPI_Sendrecv_replace. Mesurez les performances et tracez les courbes pertinentes.
- Implantez une parallélisation utilisant les routines MPI_Ssend et MPI_Recv
(attention : lors de la réception de données veillez
à ne pas écraser des données non-encore
expédiées à leurs destinataires ... ). Mesurez les performances et tracez les courbes pertinentes.