Loading s7crs_l13_multi_cpu...

enib_small.png S7-CRS L13_MultiCpu — Accélération de calculs sur multi-CPU

Les fichiers servant de support à cette expérimentation seront obtenus par la commande $ cp -r /home/TP/sujets/CRS_L13_MultiCpu . depuis les salles de Labo de l'ENIB, ou par la commande $ sftp -P 55555 -r votre_identifiant@sftp.enib.fr:/home/TP/sujets/CRS_L13_MultiCpu . depuis l'extérieur de l'ENIB.

Il s'agit d'une série d'exercices en rapport avec l'utilisation de threads pour exploiter les multiples unités de calcul des machines informatiques.
Au cours de cette séance nous nous mettrons en évidence quelques écueils qui limitent les performances et envisagerons des démarches pour les éviter.

Chaque programme est volontairement très simple afin de se focaliser sur la découverte des services proposés sans être distrait par les détails annexes d'une quelconque application particulière.
Il convient de traiter ces exercices tranquillement, en s'interrogeant à chaque fois sur le propos de la fonctionnalité particulière qui est mise en avant.
Il ne sert strictement à rien d'enchaîner les exercices sans les comprendre en se contentant de “ça compile et ça ne plante pas donc j'ai bon, je passe à la suite...”

La consultation de la documentation est très importante et fait partie intégrante du travail.
Pour ceci vous disposez des pages de manuel indiquées à chaque exercice ainsi que de ces documents de programmation système.
En particulier, le document Threads.pdf contient notamment des informations sur l'API Posix (en langage C) des threads et les ressources en lignes suivantes :
apporteront tous les détails de mise en œuvre en C++.
Le document Intro_Parallelisme.pdf contient des informations liées à l'optimisation des performances d'un programme multi-threads.
Le fichier d'en-tête crsUtils.hpp doit également être consulté très régulièrement puisqu'il fournit, au delà de quelques fonctionnalités utilitaires, la mise à disposition dans une forme facilitée pour les étudiants (limitation des pointeurs, des conversions de types, utilisation de chaînes et vecteurs C++, contrôle des échecs...) des appels et fonctionnalités systèmes que nous utiliserons.

Vous êtes censés savoir refaire et réutiliser tous ces exercices lors des séances ultérieures ; n'hésitez donc pas à poser des questions lors de cette séance et à les refaire tout seul ensuite pour vous entraîner.

  • Nous nous intéressons ici aux performances des diverses solutions explorées.
  • Les mesures de performances n'ont de sens que si le code est compilé en mode “optimisé” ; toutes les options de mise au point sont alors désactivées.
  • Pour tester le fonctionnement de vos programme pendant la mise au point, vous pourrez vous contenter de les fabriquer avec make.
  • En revanche, pour relever les performances il faudra refabriquer l'ensemble avec make rebuild opt=1 pour activer les optimisations.
{1 #cache } Placement des données
{2 #task } Parallélisme de tâches
{3 #data } Parallélisme de données
{4 #lock_free } Synchronisation en mode utilisateur

Nous venons d'approfondir notre découverte des threads et de leurs moyens de synchronisation en constatant notamment l'impact de nos choix sur les performances.
En particulier nous avons constaté que nous avions tout intérêt à répartir équitablement le volume de données à traiter entre les différentes unités de calcul disponibles sur la machine tout en prenant soin d'éloigner très nettement les données utilisées par chaque thread.
Lorsque dans l'application il est prouvé que les étapes de synchronisation sont nécessairement très courtes, il est très profitable d'abandonner les primitives en mode noyau au profit des opérations atomiques.