38,760
edits
No edit summary |
(Updating to match new version of source page) |
||
Line 9: | Line 9: | ||
* savoir concentrer vos efforts et réécrire les routines qui exigent beaucoup de temps | * savoir concentrer vos efforts et réécrire les routines qui exigent beaucoup de temps | ||
}} | }} | ||
<div class="mw-translate-fuzzy"> | |||
== Profiler du code == | == Profiler du code == | ||
Pourquoi auriez-vous besoin de profiler du code? Parce que c'est la seule façon de comprendre | Pourquoi auriez-vous besoin de profiler du code? Parce que c'est la seule façon de comprendre | ||
Line 14: | Line 15: | ||
* comprendre la performance du code, | * comprendre la performance du code, | ||
* savoir comment mieux employer votre temps. | * savoir comment mieux employer votre temps. | ||
</div> | |||
<div class="mw-translate-fuzzy"> | |||
Pourquoi est-ce important de connaitre les points critiques dans le code? | Pourquoi est-ce important de connaitre les points critiques dans le code? | ||
D'après la loi d'Amdahl, paralléliser les routines qui exigent le plus de temps d'exécution (les points critiques) produit le plus d'impact. | D'après la loi d'Amdahl, paralléliser les routines qui exigent le plus de temps d'exécution (les points critiques) produit le plus d'impact. | ||
</div> | |||
<div class="mw-translate-fuzzy"> | |||
== Préparer le code pour l'exercice == | == Préparer le code pour l'exercice == | ||
Pour notre exemple, nous utilisons du code provenant de [https://github.com/calculquebec/cq-formation-openacc ces dépôts]. Téléchargez les fichiers et utilisez les répertoires ''cpp'' ou ''f90''. Le but de l'exercice est de compiler et lier le code et d'obtenir un exécutable que nous profilerons. | Pour notre exemple, nous utilisons du code provenant de [https://github.com/calculquebec/cq-formation-openacc ces dépôts]. Téléchargez les fichiers et utilisez les répertoires ''cpp'' ou ''f90''. Le but de l'exercice est de compiler et lier le code et d'obtenir un exécutable que nous profilerons. | ||
</div> | |||
{{Callout | {{Callout | ||
|title=Choix du compilateur | |title=Choix du compilateur | ||
|content= | |content= | ||
En date de mai 2016, relativement peu de compilateurs offraient les fonctionnalités d'OpenACC. Les plus avancés en ce sens sont les compilateurs du [http://www.pgroup.com/ Portland Group] de [http://www.nvidia.com/content/global/global.php NVidia] et ceux de [http://www.cray.com/ Cray]. Pour ce est qui de [https://gcc.gnu.org/wiki/OpenACC GNU], l'implémentation d'OpenACC dans la version 5 était expérimentale et devrait être complète dans la version 6. | <div class="mw-translate-fuzzy"> | ||
En date de mai 2016, relativement peu de compilateurs offraient les fonctionnalités d'OpenACC. Les plus avancés en ce sens sont les compilateurs du [http://www.pgroup.com/ Portland Group] de [http://www.nvidia.com/content/global/global.php NVidia] et ceux de [http://www.cray.com/ Cray]. Pour ce est qui de [https://gcc.gnu.org/wiki/OpenACC GNU], l'implémentation d'OpenACC dans la version 5 était expérimentale et devrait être complète dans la version 6. | |||
</div> | |||
As for the [https://gcc.gnu.org/wiki/OpenACC GNU compilers], since GCC version 6, the support for OpenACC 2.x kept improving. | |||
As of July 2022, GCC versions 10, 11 and 12 support OpenACC version 2.6. | |||
Dans ce tutoriel, nous utilisons la version 16.3 des [http://www.pgroup.com/support/download_pgi2016.php?view=current compilateurs du Portland Group] qui sont gratuits pour des fins de recherche universitaire. | <div class="mw-translate-fuzzy"> | ||
Dans ce tutoriel, nous utilisons la version 16.3 des [http://www.pgroup.com/support/download_pgi2016.php?view=current compilateurs du Portland Group] qui sont gratuits pour des fins de recherche universitaire. | |||
</div> | |||
}} | |||
{{Command | |||
|module load nvhpc/22.7 | |||
|result= | |||
Lmod is automatically replacing "intel/2020.1.217" with "nvhpc/22.7". | |||
The following have been reloaded with a version change: | |||
1) gcccore/.9.3.0 => gcccore/.11.3.0 3) openmpi/4.0.3 => openmpi/4.1.4 | |||
2) libfabric/1.10.1 => libfabric/1.15.1 4) ucx/1.8.0 => ucx/1.12.1 | |||
}} | }} | ||
Line 35: | Line 59: | ||
}} | }} | ||
<div class="mw-translate-fuzzy"> | |||
Une fois l'exécutable créé, nous allons profiler le code. | Une fois l'exécutable créé, nous allons profiler le code. | ||
</div> | |||
{{Callout | {{Callout | ||
|title=Choix du profileur | |title=Choix du profileur | ||
|content= | |content= | ||
<div class="mw-translate-fuzzy"> | |||
Dans ce tutoriel, nous utilisons plusieurs des profileurs suivants : | Dans ce tutoriel, nous utilisons plusieurs des profileurs suivants : | ||
* PGPROF : outil simple mais puissant pour l'analyse de programmes parallèles écrits avec OpenMP, OpenACC ou [https://fr.wikipedia.org/wiki/Compute_Unified_Device_Architecture CUDA]; rappelons que PGPROF est gratuit pour des fins de recherche universitaire. | * PGPROF : outil simple mais puissant pour l'analyse de programmes parallèles écrits avec OpenMP, OpenACC ou [https://fr.wikipedia.org/wiki/Compute_Unified_Device_Architecture CUDA]; rappelons que PGPROF est gratuit pour des fins de recherche universitaire. | ||
* NVVP (NVIDIA Visual Profiler) : outil d'analyse multiplateforme pour des programmes écrits avec OpenACC et CUDA C/C++. | * NVVP (NVIDIA Visual Profiler) : outil d'analyse multiplateforme pour des programmes écrits avec OpenACC et CUDA C/C++. | ||
* NVPROF : version ligne de commande du NVIDIA Visual Profiler. | * NVPROF : version ligne de commande du NVIDIA Visual Profiler. | ||
</div> | |||
}} | }} | ||
<div class="mw-translate-fuzzy"> | |||
< | |||
<br /> | <br /> | ||
<br /> | <br /> | ||
Line 77: | Line 82: | ||
=== NVPROF ligne de commande === | === NVPROF ligne de commande === | ||
La version ligne de commande de NVPROF est semblable à GPU prof. | La version ligne de commande de NVPROF est semblable à GPU prof. | ||
</div> | |||
{{Command | |||
|module load cuda/11.7 | |||
}} | |||
To profile a pure CPU executable, we need to add the arguments <code>--cpu-profiling on</code> to the command line: | |||
{{Command | {{Command | ||
|nvprof --cpu-profiling on ./cg.x | |nvprof --cpu-profiling on ./cg.x | ||
|result= | |result= | ||
... | |||
<Program output > | <Program output > | ||
... | |||
======== CPU profiling result (bottom up): | ======== CPU profiling result (bottom up): | ||
Time(%) Time Name | |||
83.54% 90.6757s matvec(matrix const &, vector const &, vector const &) | |||
83.54% 90.6757s {{!}} main | |||
7.94% 8.62146s waxpby(double, vector const &, double, vector const &, vector const &) | |||
2. | 7.94% 8.62146s {{!}} main | ||
2. | 5.86% 6.36584s dot(vector const &, vector const &) | ||
0. | 5.86% 6.36584s {{!}} main | ||
2.47% 2.67666s allocate_3d_poisson_matrix(matrix&, int) | |||
2.47% 2.67666s {{!}} main | |||
0.13% 140.35ms initialize_vector(vector&, double) | |||
0.13% 140.35ms {{!}} main | |||
... | |||
======== Data collected at 100Hz frequency | ======== Data collected at 100Hz frequency | ||
}} | }} | ||
From the above output, the <code>matvec()</code> function is responsible for 83.5% of the execution time, and this function call can be found in the <code>main()</code> function. | |||
==Renseignements sur le compilateur== | ==Renseignements sur le compilateur== |