Département INFormatique 
  CSC4508/M2 : Concepts des systèmes d'exploitation et mise en œuvre sous Unix
    Contenu

Architecture

(Corrigés)


1. Prédiction de branchement

Téléchargez l'archive branch_prediction.tgz et extrayez la. Etudiez le programme branch_prediction.c.
Exécutez (plusieurs fois) le programme avec l'argument 0, puis avec l'argument 1. Comparer la durée d'exécution ainsi que le nombre de branchements incorrectement prédits.

2. SIMD

Téléchargez l'archive simd.tgz et extrayez la. Etudiez le programme simd.c. Exécutez (plusieurs fois) le programme en faisant varier l'argument de 0 à 2. Comparer les durées d'exécution.

3. Jouons avec les caches

Téléchargez l'archive cache.tgz et extrayez la.

3.1. Lignes de cache

Etudiez et lancez le programme cache_line.c.

Estimez le nombre d'accès mémoire nécessaire pour ce programme. Lancez le programme avec valgrind --tool=cachegrind. Le programme utilise-t-il de manière efficace les caches du processeur ?

Modifiez le programme afin de réduire le nombre de cache miss.

3.2. Faux partage

Lancez la commande lstopo (inclue dans le package hwloc) pour voir le nombre de coeurs de votre machines ainsi que les différentes mémoire cache disponibles.

Lancez le programme cache en faisant varier le placement des threads et comparez les temps d'exécution.

Modifiez le programme pour que les performances soient les même quel que soit le placement des threads. Estimez la taille des lignes de cache sur la machine que vous utilisez.

4. Hyper-threading

Téléchargez l'archive smt.tgz et extrayez la. Exécutez le programme en faisant varier le placement des threads ainsi que le type d'unité de calcul exploitée.

5. Optimisation d'un programme

Téléchargez l'archive program_to_optimize.tgz et extrayez la.

Ce programme crée 4 threads chargés de traiter un ensemble de jobs. Le résultat de chaque job est stocké dans une structure event. Lorsque tous les jobs d'un thread ont été traités, une fonction (analyze_events()) en analyse les résultats.

5.1 Analyse de performance

Compilez le programme sans optimisation du compilateur (avec l'option -O0) et comparez son temps d'exécution avec la version optimisée par le compilateur (option -O3). Le but de l'exercice est d'optimiser le programme à la main afin d'obtenir des performances s'approchant des performances de la version optimisée par le compilateur.

5.2 Amélioration de l'utilisation des caches

Analysez le code du programme et modifiez le afin de corriger le problème d'utilisation des caches du programme.

---beginCorr
Il y a un problème de faux partage. On peut le corriger en ajoutant du padding : program_to_optimize.corrige.5.2.c
---endCorr

5.3 Vectorisation

Modifiez la fonction analyze_events afin de vectoriser (à l'aide d'instructions AVX par exemple) la boucle.

Vous pouvez vous aider pour cela du guide des intrinsics Intel qui documente les intrinsics disponibles selon les jeux d'instruction de votre processeur (SSE, AVX, etc.)

---beginCorr
program_to_optimize.corrige.5.3.c
---endCorr

Last modified: Mon May 11 19:16:34 CEST 2015