Portail informatique 2019-2020

Systèmes d'exploitation

Téléchargez l'archive branch_prediction.tgz et extrayez la. Étudiez le programme branch_prediction.c.

Exécutez (plusieurs fois) le programme avec l'argument 0, puis avec l'argument 1.

Utilisez perf afin de mesurer le nombre de branchement incorrectement prédits:

$ perf stat ./branch_prediction 0

Comparer la durée d'exécution, et calculez le nombre de branchements incorrectement prédits par itération.

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.

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

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.

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.

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.

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.

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.

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

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

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.)

program_to_optimize.corrige.5.3.c