Ce projet a été réalisé par Yutai Zhao, Lisa Taldir, Chun Qi et Yizhi Yang dans le cadre du Master Calcul Haute Performance et Simulation de l'université Versailles St-Quentin-en-Yvelines.
Nous comparerons ici les résultats expérimentaux obtenus en utilisant l’arrondi stochastique avec ceux obtenus en utilisant l’arrondi déterministe au plus près, pour différents algorithmes.
Pour cela, nous avons organisé ce dépot en plusieurs dossiers:
├──Algo&Tests
├──Exponentiation
├──Exponentiation_etudes_mantisse
├──Lorenz
├──Performance 1er_semestre
├──Performance AWS
├──Sommation
└──Sum_proddont le contenu et l'utilisation sera détaillé ci-dessous.
Installer Vérificarlo et python avec les librairies numpy et matplotlib.
Ce dossier contient :
- les algorithmes naïf récursif, itératif et rapide récursif, itératif (dans
algo_lib/) que nous utiliserons durant tout notre projet - les tests unitaires (dans le fichier
test.cpp) verifiant que nos algorithmes soient valides - les valeurs de références (dans
test_data/) obtenues grace à des fonctions de Python.
Assurer d'abord que :
- le répertoire
Algo&Tests/build/soit vide - le repertoire de travail (working directory) est
Algo&Tests/build/
Pour les caluls d'exponentation (
$ cmake ..
$ make
$ ./algo [x] [n]Ce dossier contient nos travaux autour de l'algorithme d'exponentation (i.e calcul de plots/) contenant les graphes obtenus et un dossier (results/) contenant les résultats bruts.
Concernant le code, on a :
-
run.sh: exécute le main sur 33 itérations pour une valeur de x fixée et stocke les données dans le dossierresults/ -
algo.c: regroupe les algorithmes calculant$x^{n}$ en simple précision -
reference.c: contient un algorithme calculant$x^{n}$ en double précision (on a choisi de garder l'algorithme naïf itératif comme référence pour nos calculs d'erreurs) -
main.c: fichier principal dans lequel on retrouve nos calculs d'erreurs, prenant en arguments, dans l'ordre, [x] : valeur pour laquelle on va calculer$x^{n}$ et [ind] : indicateur pour savoir quelle version de la fonction d'exponentiation exécuter.
ind = 0 pour choisir la version naïve récursive
ind = 1 pour choisir la version naïve itérative
ind = 2 pour choisir la version rapide récursive
ind = 3 pour choisir la version rapide itérative -
plots/plot.py: trace les graphes
Pour obtenir les graphes présents dans le dossier Exponentiation/plots/ faire, en se plaçant dans le répertoire Exponentiation/:
$ ./run.shpour générer les données (cela prend quelques minutes), qui seront ensuite stockées dans le dossier results/.
Puis faire :
$ cd plots
$ python3 plot.pypour générer les graphes.
ATTENTION : LES RESULTATS DE CE DOSSIER NE SONT NI VERIFIES PAR LES ENCADRANTS NI INCLUS DANS LE RAPPORT
Ce dossier contient :
Makefile: pour faciliter la compilation du programmeSR_main.cetUR_main.c: les fonctions principales (main) qui font les calculs en float32ref_main.c: la fonction principale qui font les calculs en float64experience.cetreference.c: les algorithmes de l'exponentiation en float32 et float64erreur.c: pour calculer les erreursstat.c: pour calculer la fonction de densité des mantisses des erreursstat_distribution.c: pour calculer la distribution des mantisses des erreursstat_sign_bit.c: pour calculer la fonction de densité des mantisses significatives des erreursrun.sh: le scirpt pour calculer les erreurs, puis pour ne garder que la mantisse de chaque erreur afin de calculer les fonctions de densité et les distributions.plot/plot.gp: le script pour visualiser les résultats issus destat.cplot/plot_dist.gp: le script pour visualiser les résultats issus destat_distribution.cplot/plot_sig.gp: le script pour visualiser les résultats issus destat_sign_bit.c- Les résultats bruts dans
results/et les graphes dansplot/
Pour obtenir les resultats présents dans le dossier results/ faire :
$ cd Exponentiation_etudes_mantisse
$ ./run.shPour obtenir les graphes faire, en choisissant le script .gp souhaité:
$ cd Exponentiation_etudes_mantisse/plot
$ gnuplot plot.gp
$ gnuplot plot_dist.gp
$ gnuplot plot_sig.gpCe dossier contient :
- la résolution du système de Lorenz en float32 (dans
lorenz_32.c) et en float64 (danslorenz_64.c) Makefile: pour faciliter la compilationrun.sh: le scirpt pour compiler et executer le programme résolvant le système de Lorenzplot.gp: le script pour dessiner les solutions- Les résultats bruts dans
results/et les graphes en.png
Pour obtenir les résultats présents dans le dossier results/ et les graphes faire :
$ cd Lorenz
$ ./run.sh
$ gnuplot plot.gpCe dossier contient :
- les algorithmes dont les performances sont à évaluer (dans
kernels.h) - le programme principal et une fonction benchmark pour l'évaluation et l'affichage des performances (dans
main.c) - les définitions de quelques fonctions utilisées dans le programme principal (dans
tools.c) - les définitions des types de valeurs exprimés autrement (dans
types.h) - les résultats des performances des 4 algorithmes, les résultats sont obtenus en faisant varier les compilateurs gcc (dans
gcc/) clang (dansclang/). - les scripts : un script pour la generation des resultats de performance (
exe.sh), un script pour trier les resultats (pars.sh), un script pour la réalisation des graphes (dansgraphe/graphee.Rmd).
Pour obtenir les resultats présents dans les dossiers gcc/ et clang/ faire :
$ cd Performance
$ ./exe.sh
$ ./pars.shPour obtenir les graphes faire :
$ cd Performance/graphe
$ open graphe.RmdPuis cliquer sur Run All
Ce dossier contient :
log de AWS/: contenant les messages affichés sur le terminal de Amazon EC2timing_version1_1/: Performance mesurée avec n=60 et x = 1.01~1.19 avec 50 exécutions et 500 repétitions, en prennant le temps moyen de ces repétitions par exécutiontiming_version1_2/: Performance mesurée avec n=1000 et x = 1.0001~1.01 avec 50 exécutions et 100 repétitions, en prennant le temps moyen de ces repétitions par exécutiontiming_version2/: Performance mesurée avec n=1000 et x = 1.0001~1.01 avec 33 exécutions et 22 repétitions, en prennant le temps de chaque repétition par exécutiontiming_version3/: NON utilisé. A completer.
Chaque dossier timing_version*/ contient :
README_PLZ: Une note dédiée pour chaque versiontiming_UR/ettiming_SR/: Les résultats de performanceperformance.py: Faire les calculs, mesurer les temps du début et de la fin de chaque calcul, afficher les résultatstraitement_donnees.py: Calculer les temps d'exécutions à partir des temps début/fincalcul.sh: Exécuterperformance.pyavec les variables d'environnement adéquates et enregistrer les résultats affichéstri.sh: Garder que les messages d'affichage interessés (temps début/fin) et exécutertraitement_donnees.pyscript.py: Calculer les min/max/moyenne/mediane/stddev des temps d'exécutions
Pour obtenir les temps d'exécutions faire :
$ cd 'Performance AWS'/[Une version souhaitée sauf la 3]/
$ ./calcul.sh
$ ./tri.shPour obtenir les mesures faire ensuite :
$ ./script.pyCe dossier contient nos travaux autour de l'algorithme de sommation (i.e calcul de plot/) contenant les graphes obtenus et un dossier (results/) contenant les résultats bruts.
Concernant le code, on a :
-
run.sh: exécute le main sur 33 itérations pour une valeur de x fixée et stocke les données dans le dossierresults/ -
algo.c: contient un algorithme calculant$n * x$ en simple précision -
reference.c: contient un algorithme calculant$n * x$ en double précision -
main.c: fichier principal dans lequel on retrouve nos calculs d'erreurs, prenant en argument [x] : valeur pour laquelle on va calculer$n * x$ . -
plot/plot.py: trace les graphes
Pour obtenir les graphes présents dans le dossier Sommation/plot/ faire, en se plaçant dans le répertoire Sommation/:
$ ./run.shpour générer les données, qui seront ensuite stockées dans le dossier results/.
Puis faire :
$ cd plot
$ python3 plot.pypour générer les graphes.
Ce dossier contient les fichiers utiles pour les études d'une fonction définie comme une analogie du produit scalalre de deux vecteurs :
On distinque deux cas : vec_gen.c (dans l'intervalle
-
algo.h,calcul.cetref.ccontiennent l'algorithme en précision floattante que l'on veut étudier (et la référence en précision double). -
main.cle fichier principal pour calculer les erreurs relatives en arrondi au plus près ou en arrondi stochastique. -
stat.cpour calculer la moyenne et l'écart-type des différentes répétitions. -
*.shles scripts pour lancer le programme. On utiliserun_v.shpour valider nos codes car lorsque$x=2$ , il n'y aura pas d'erreur.run_x.sh,run_y.shetrun_z.shreprésentent respectivement les valeurs fixes 1.000001, 0.99999987654321 et 1.00010002, puisrun_r.shpour les vecteurs aléatoires. -
*.gppour tracer les courbes avec les résultats obtenus. -
UR/etSR/contiennent les résultats. -
plot/contient les figures tracées.
Remplacer 'a' par 'v' (
$ cd sum_prod
$ ./run_a.sh
$ gnuplot plot_a.shYizhi Yang
Yutai Zhao
Chun Qi
Lisa Taldir
Merci à Pablo De Oliveira Castro, El-Mehdi El-Arar et Devan Sohier pour leurs conseils et leur encadrement.