11.3.6.1.2 : Retour d'expérience
Afin de déterminer la meilleure stratégie d'optimisation, un profilage du programme a été effectué en utilisant plusieurs outils~[115]Performance optimization of the air shower simulation program for the Cherenkov Telescope Array, 2019 (Accepted), Arrabito L. et al.~: Linux perf notehttps://perf.wiki.kernel.org/index.php/Main_Page, GNU gprof notehttps://sourceware.org/binutils/docs/gprof/, Callgrind notehttp://valgrind.org/docs/manual/cl-manual.html et gdb notehttps://poormansprofiler.org/ ainsi que différents outils de visualisation : gprof2dot notehttps://github.com/jrfonseca/gprof2dot, Flame Graph notehttp://www.brendangregg.com/flamegraphs.html. Les résultats de ces profilages sont compatibles entre eux et montrent que la plupart du temps CPU (82%) est utilisé par la fonction cerenk en charge de la production et propagation des photons Cherenkov. En outre, la majorité du temps CPU dans cette fonction est consommée par des appels à des fonctions mathématiques ($\exp$ , $\sin$ , $\cos$ ,~etc.).
Grâce au profilage, un informaticien n'ayant pas de connaissance spécifique du programme est capable d'identifier les parties du programme qui consomment le plus de CPU et sur lesquelles il faut potentiellement focaliser l'effort d'optimisation. Néanmoins l'interaction entre informaticiens et physiciens experts de CORSIKA a permis d'identifier très rapidement les pistes d'optimisation les plus prometteuses. En particulier, le profilage indique qu'on devrait obtenir un gain de performance en optimisant la fonction cerenk. Ensuite, l'observation que cerenk effectue des calculs sur chaque photon de manière indépendante indique qu'il serait éventuellement possible de vectoriser cette fonction.
Pour la vectorisation de cerenk, nous avons choisi l'approche de l'auto-vectorisation. Cette approche consiste à réécrire certaines boucles et à transformer le code de manière que le compilateur soit capable de détecter les parties du code vectorisables. Un des avantages de cette approche réside dans le fait d'obtenir un code portable, sans dépendance de bibliothèques externes et relativement lisible. Enfin, un code vectorisé s'exécute d'ores et déjà efficacement sur la grille de calcul, car la plupart des processeurs dans les centres supportent les instructions vectorielles. Compte tenu du temps CPU utilisé dans les appels à des fonctions mathématiques ($\exp$ , $\sin$ , $\cos$ , $\arcsin$ ,~etc.) une autre optimisation très efficace a été obtenue en utilisant des bibliothèques mathématiques vectorisées~[116]A new open-source SIMD vector libm fully implemented with high-level scalar C, 2016, Lauter C. dans la fonction cerenk. Le gain de performance globale obtenu grâce à la vectorisation est un facteur d'accélération 1,52.
Un point crucial pour les physiciens concerne la validité des résultats obtenus avec la version du code optimisé. En particulier, l'utilisation des bibliothèques mathématiques vectorisées peut en principe produire des résultats numériques légèrement différents. Or, dans ce cas spécifique, nous avons vérifié que la version optimisée produit les mêmes résultats que la version originale. En outre, il a été montré dans~[117]Speeding up hep experiment software with a library of fast and auto-vectorisable mathematical functions, 2014, Piparo D. et al. que dans le cas des applications typiques en physique de particules, l'impact sur la précision numérique dû à l'utilisation de bibliothèques mathématiques vectorisées est négligeable. Enfin, des tests préliminaires montrent que la version de CORSIKA vectorisée s'exécute efficacement sur la grille. Des productions à plus grande échelle sont également prévues afin de confirmer ce résultat.