Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente Prochaine révision Les deux révisions suivantes | ||
formation:insa2020gpu [2020/12/04 12:10] equemene [Intégration et exploitation du code GENESIS] |
formation:insa2020gpu [2020/12/05 23:25] equemene |
||
---|---|---|---|
Ligne 1447: | Ligne 1447: | ||
* Comparez les résultats | * Comparez les résultats | ||
* Qu'apporte le GPU comme gain de performance par rapport au processeur ? | * Qu'apporte le GPU comme gain de performance par rapport au processeur ? | ||
+ | </note> | ||
+ | |||
+ | ==== Intégration et exploitation du code GENESIS ==== | ||
+ | |||
+ | Le code [[https://www.r-ccs.riken.jp/labs/cbrt/|GENESIS]] de l'institut [[https://www.r-ccs.riken.jp/en/|RIKEN Center for Computational Science]] est un logiciel de [[https://fr.wikipedia.org/wiki/Dynamique_mol%C3%A9culaire|dynamique moléculaire]]. | ||
+ | Présenté comme exploitant massivement les GPU, il est disponible sur [[https://bitbucket.org/dpotter/pkdgrav3/|bitbucket]]. | ||
+ | C'est un programme //hybride// (exploitant 2 stratégies de parallélisation), et même //trhybride// dans la mesure où il exploite les GPU de type Nvidia avec CUDA, la distribution sur les coeurs via [[https://fr.wikipedia.org/wiki/OpenMP|OpenMP]] et la distribution sur des noeuds différents via [[https://fr.wikipedia.org/wiki/Message_Passing_Interface|passage de messages MPI]]. | ||
+ | Le code source est accessible à l'adresse : https://www.r-ccs.riken.jp/labs/cbrt/download/genesis-version-1-5/ | ||
+ | |||
+ | <note warning>Exercice #27 : Récupérez et compilez le code suivant la documentation fournie | ||
+ | * Lisez la [[https://www.r-ccs.riken.jp/labs/cbrt/installation/|documentation]] d'installation | ||
+ | * Placez les sources dans le dossier ''/local/$USER/GENESIS'' créé pour l'occasion | ||
+ | * Préparez une compilation pour GPU en simple précision dans le dossier ''/local/$USER/GENESIS/gpu-single'' | ||
+ | * Compilez et installez le programme | ||
+ | * Purgez la compilation précédente | ||
+ | * Préparez une compilation pour CPU en simple précision dans le dossier ''/local/$USER/GENESIS/cpu-single'' | ||
+ | * Compilez et installez le programme | ||
+ | </note> | ||
+ | |||
+ | L'exécution du programme est évaluée en comparant son exécution dans différentes configurations d'exploitation des CPU et des GPU. | ||
+ | Pour cela, l'exemple de la base de [[https://www.r-ccs.riken.jp/labs/cbrt/?smd_process_download=1&download_id=14619|tests de régression]]. Le test ''test_rpath_spdyn/alad_water'' a été modifié pour durer un peu plus longtemps à l'exécution. | ||
+ | |||
+ | De plus, **GENESIS** étant //trhybride//, il est programmé pour se distribuer sur des machines indépendantes qui communiquent par //échanges de messages//. Le test [[http://www.cbp.ens-lyon.fr/emmanuel.quemener/documents/alad_water.tgz|''alad_water'']] exige, par construction de la simulation, quatre exécutions concurrentes lesquelles vont communiquer par MPI. Il faudra donc préfixer l'exécutable de ''mpirun -np 4'' pour exécuter ces quatre tâches. | ||
+ | |||
+ | De plus, ce programme est aussi parallélisé avec OpenMP : il va donc "aussi" exploiter les coeurs disponibles. Le souci, c'est que, par défaut, il va lancer pour chaque tâche MPI autant de sous-tâches OpenMP que de coeurs (même "virtuels") disponibles sur la machine. Ainsi, en exécutant l'exemple ''alad_water'' sur une machine disposant de 8 coeurs Hyperthreadés (donc disposant au total de 16 coeurs logiques), il va lancer 4*16 soit 64 tâches pour seulement 8 "vrais" coeurs : de quoi surcharger la machine. | ||
+ | |||
+ | Pour finir, dans comme ce programme est "aussi" //gépufié// (porté sur GPU), il risque d'y avoir un goulet d'étranglement pour l'accès au GPU pour les 64 tâches simultanées. Ainsi, les programmes "fortement" parallélisés exigent de choisir judicieusement les différents paramètres de parallélisation tout comme nous avons vue que, pour les GPU, il fallait découper la tâche en un nombre optimal de sous-tâches. | ||
+ | |||
+ | <note warning>Exercice #28 : Exécutez l'exemple ''alad_water'' | ||
+ | * Récupérez [[http://www.cbp.ens-lyon.fr/emmanuel.quemener/documents/alad_water.tgz|l'exemple d'exécution]] | ||
+ | * Décompressez l'archive dans ''/local/$USER/GENESIS'' | ||
+ | * Exécutez le programme sur l'exemple avec la version CPU | ||
+ | * ''/usr/bin/time mpirun -np 4 /local/$USER/GENESIS/cpu-single/bin/spdyn inp'' | ||
+ | * Observez pendant l'exécution l'activité des coeurs | ||
+ | * Notez le ''Elapsed Time'' et le ''System Time'' | ||
+ | * Effacez les résultats ''test*'' avec ''rm test*'' | ||
+ | * Exécutez le programme sur l'exemple avec la version GPU | ||
+ | * Exécutez la commande ''/usr/bin/time mpirun -np 4 /local/$USER/GENESIS/gpu-single/bin/spdyn inp'' | ||
+ | * Observez pendant l'exécution l'activité des coeurs et des GPU | ||
+ | * Notez le ''Elapsed Time'' et le ''System Time'' | ||
+ | * Effacez les résultats ''test*'' avec ''rm test*'' | ||
+ | * Déterminez, sachant que 4 tâches MPI simultanément, combien de //threads// lancer | ||
+ | * Définissez ce nombre pour le système avec la fonction suivante : | ||
+ | * ''export OPTIMAL_THREADS=<MonCHoixJudicieux>'' | ||
+ | * Exécutez la commande ''/usr/bin/time mpirun -np 4 -x OMP_NUM_THREADS=$OPTIMAL_THREADS /local/$USER/GENESIS/cpu-single/bin/spdyn inp'' | ||
+ | * Notez le ''Elapsed Time'' et le ''System Time'' | ||
+ | * Effacez les résultats ''test*'' avec ''rm test*'' | ||
+ | * Exécutez la commande ''/usr/bin/time mpirun -np 4 -x OMP_NUM_THREADS=$OPTIMAL_THREADS /local/$USER/GENESIS/gpu-single/bin/spdyn inp'' | ||
+ | * Notez le ''Elapsed Time'' et le ''System Time'' | ||
+ | * Concluez sur la pertinence de l'utilisation de l'option ''-x OMP_NUM_THREADS=$OPTIMAL_THREADS'' | ||
</note> | </note> | ||
Ligne 1453: | Ligne 1503: | ||
Nous allons tenter de reproduire une [[https://www.nvidia.com/en-us/data-center/gpu-accelerated-applications/gromacs/|expérience de Nvidia]] vantant l'efficacité des GPGPU pour le logiciel de [[https://fr.wikipedia.org/wiki/Dynamique_mol%C3%A9culaire|dynamique moléculaire]] [[http://www.gromacs.org/|Gromacs]]. | Nous allons tenter de reproduire une [[https://www.nvidia.com/en-us/data-center/gpu-accelerated-applications/gromacs/|expérience de Nvidia]] vantant l'efficacité des GPGPU pour le logiciel de [[https://fr.wikipedia.org/wiki/Dynamique_mol%C3%A9culaire|dynamique moléculaire]] [[http://www.gromacs.org/|Gromacs]]. | ||
- | <note warning>Exercice #27 : appliquez la "recette" de Nvidia | + | <note warning>Exercice #29 : appliquez la "recette" de Nvidia |
* La documentation offre ceci : | * La documentation offre ceci : | ||
- récupérez le source | - récupérez le source | ||
Ligne 1466: | Ligne 1516: | ||
</note> | </note> | ||
- | En cas de difficultés, appliquez la [[formation:insa2018gpu:insa2018gromacs4stretch|recette de Gromacs pour Debian Stretch]] ;-) | + | En cas de difficultés, appliquez la [[formation:insa2020gpu:insa2020gromacs4buster|recette de Gromacs pour Debian Buster]] ;-) |
- | <note warning>Exercice #28 : Exécutez l'exemple ''1536'' | + | <note warning>Exercice #30 : Exécutez l'exemple ''1536'' |
* Quel ''Elapsed Time'' avez-vous pour l'exécution sur GPU (et CPU) ? | * Quel ''Elapsed Time'' avez-vous pour l'exécution sur GPU (et CPU) ? | ||
* Quel ''Elapsed Time'' avez-vous pour l'exécution uniquement sur CPU ? | * Quel ''Elapsed Time'' avez-vous pour l'exécution uniquement sur CPU ? | ||
Ligne 1474: | Ligne 1524: | ||
</note> | </note> | ||
- | ==== Intégration et exploitation du code GENESIS ==== | ||
- | |||
- | Le code [[https://www.r-ccs.riken.jp/labs/cbrt/|GENESIS]] de l'institut [[https://www.r-ccs.riken.jp/en/|RIKEN Center for Computational Science]] est un logiciel de [[https://fr.wikipedia.org/wiki/Dynamique_mol%C3%A9culaire|dynamique moléculaire]]. | ||
- | Présenté comme exploitant massivement les GPU, il est disponible sur [[https://bitbucket.org/dpotter/pkdgrav3/|bitbucket]]. | ||
- | C'est un programme //hybride// (exploitant 2 stratégies de parallélisation), et même //trhybride// dans la mesure où il exploite les GPU de type Nvidia avec CUDA, la distribution sur les coeurs via [[https://fr.wikipedia.org/wiki/OpenMP|OpenMP]] et la distribution sur des noeuds différents via [[https://fr.wikipedia.org/wiki/Message_Passing_Interface|passage de messages MPI]]. | ||
- | Le code source est accessible à l'adresse : https://www.r-ccs.riken.jp/labs/cbrt/download/genesis-version-1-5/ | ||
- | |||
- | <note warning>Exercice #29 : Récupérez et compilez le code suivant la documentation fournie | ||
- | * Lisez la [[https://www.r-ccs.riken.jp/labs/cbrt/installation/|documentation]] d'installation | ||
- | * Placez les sources dans le dossier ''/local/$USER/GENESIS'' créé pour l'occasion | ||
- | * Préparez une compilation pour GPU en simple précision dans le dossier ''/local/$USER/GENESIS/gpu-single'' | ||
- | * Compilez et installez le programme | ||
- | * Purgez la compilation précédente | ||
- | * Préparez une compilation pour CPU en simple précision dans le dossier ''/local/$USER/GENESIS/cpu-single'' | ||
- | * Compilez et installez le programme | ||
- | </note> | ||
- | |||
- | L'exécution du programme est évaluée en comparant son exécution dans différentes configurations d'exploitation des CPU et des GPU. | ||
- | Pour cela, l'exemple de la base de [[https://www.r-ccs.riken.jp/labs/cbrt/?smd_process_download=1&download_id=14619|tests de régression]]. Le test **test_rpath_spdyn/alad_water** a été modifié pour durer un peu plus longtemps à l'exécution. Il se trouve sur | ||
- | |||
- | <note warning>Exercice #30 : Exécutez l'exemple ''LightCL'' | ||
- | * Récupérez l'exemple d'exécution situé au lien ''http://www.cbp.ens-lyon.fr/emmanuel.quemener/documents/alad_water.tgz'' | ||
- | * Décompressez l'archive | ||
- | * Exécutez la commande ''/usr/bin/time mpirun -np 4 /local/$USER/GENESIS/gpu-single/bin/spdyn inp'' | ||
- | * Observez pendant l'exécution l'activité des coeurs et des GPU | ||
- | * Notez le ''Elapsed Time'' | ||
- | * | ||
- | * Exécutez la commande ''/usr/bin/time mpirun -np 4 -x OMP_NUM_THREADS=$OPTIMAL_THREADS /local/$USER/GENESIS/gpu-single/bin/spdyn inp'' | ||
- | * | ||
- | </note> | ||
===== Conclusion ===== | ===== Conclusion ===== | ||
Ligne 1511: | Ligne 1531: | ||
L'exploitation de "codes métier" vous aura aussi permis d'entrevoir la difficulté d'intégrer et d'exécuter des programmes dans des environnements pourtant bien homogènes : toutes les stations exploitées ont exactement le même système d'exploitation, [[developpement:productions:SIDUS|SIDUS]]. Les "astuces" permettant de simplement pouvoir exécuter les programmes illustraient aussi que, sans expérience, difficile de s'en sortir. | L'exploitation de "codes métier" vous aura aussi permis d'entrevoir la difficulté d'intégrer et d'exécuter des programmes dans des environnements pourtant bien homogènes : toutes les stations exploitées ont exactement le même système d'exploitation, [[developpement:productions:SIDUS|SIDUS]]. Les "astuces" permettant de simplement pouvoir exécuter les programmes illustraient aussi que, sans expérience, difficile de s'en sortir. | ||
- | --- //[[emmanuel.quemener@ens-lyon.fr|Emmanuel Quemener]] 2020/01/01 19:44// | + | --- //[[emmanuel.quemener@ens-lyon.fr|Emmanuel Quemener]] 2020/12/05 23:24// |