Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
formation:insa2020gpu [2020/12/04 12:10]
equemene [Intégration et exploitation du code GENESIS]
formation:insa2020gpu [2020/12/07 11:05] (Version actuelle)
equemene [Déroulement de la session]
Ligne 25: Ligne 25:
   * Exploration de "codes métier"​ : [[https://​www.tensorflow.org/​|TensorFlow]],​ [[https://​www.r-ccs.riken.jp/​labs/​cbrt/​|GENESIS]] et [[http://​www.gromacs.org/​|Gromacs]]   * Exploration de "codes métier"​ : [[https://​www.tensorflow.org/​|TensorFlow]],​ [[https://​www.r-ccs.riken.jp/​labs/​cbrt/​|GENESIS]] et [[http://​www.gromacs.org/​|Gromacs]]
  
 +De manière à disposer d'une trace de votre travail et de pouvoir l'​évaluer,​ il est demandé de rédiger un compte-rendu sur la base des questions posées. N'​hésitez pas à faire des copies d'​écran et à les intégrer dans votre rapport. Le rapport devra être rendu le vendredi suivant la seconde séance de travaux pratiques.
 ===== Démarrage de la session ===== ===== Démarrage de la session =====
    
Ligne 375: Ligne 376:
   * ''​Pi''​ : implémentation multiples d'un [[https://​fr.wikipedia.org/​wiki/​M%C3%A9thode_de_Monte-Carlo|Pi Monte Carlo]]   * ''​Pi''​ : implémentation multiples d'un [[https://​fr.wikipedia.org/​wiki/​M%C3%A9thode_de_Monte-Carlo|Pi Monte Carlo]]
   * ''​Splutter''​ : un modèle de ''​postillonneur mémoire'',​ très utile pour évaluer les //fonctions atomiques//   * ''​Splutter''​ : un modèle de ''​postillonneur mémoire'',​ très utile pour évaluer les //fonctions atomiques//
 +  * ''​TrouNoir''​ : un exemple de portage de code de 1994, porté en C en 1997 puis en Python/​OpenCL et Python/CUDA en 2019
  
 De tous ces programmes, seuls ceux présents dans ''​BLAS'',​ ''​NBody''​ et ''​Pi''​ seront exploités dans le cadre de ces travaux pratiques. De tous ces programmes, seuls ceux présents dans ''​BLAS'',​ ''​NBody''​ et ''​Pi''​ seront exploités dans le cadre de ces travaux pratiques.
Ligne 402: Ligne 404:
  
 Nous avons alors 12 exécutables de la forme ''​xGEMM_SP_<​version>''​ ou ''​xGEMM_DP_<​version>''​ :  ​ Nous avons alors 12 exécutables de la forme ''​xGEMM_SP_<​version>''​ ou ''​xGEMM_DP_<​version>''​ :  ​
-  * ''​fblas''​ utilisant la librairie ATLAS, pour CPU 
   * ''​openblas''​ utilisant la librairie OpenBLAS, pour CPU   * ''​openblas''​ utilisant la librairie OpenBLAS, pour CPU
   * ''​gsl''​ utilisant la librairie GSL (pour //GNU Scientific Librairies//​)   * ''​gsl''​ utilisant la librairie GSL (pour //GNU Scientific Librairies//​)
 +  * ''​fblas''​ utilisant la librairie OpenBLAS mais pour des appels fortran, pour CPU
   * ''​cublas''​ utilisant la librairie cuBLAS avec une gestion externe de la mémoire   * ''​cublas''​ utilisant la librairie cuBLAS avec une gestion externe de la mémoire
   * ''​thunking''​ utilisant la librairie cuBLAS avec une gestion interne de la mémoire   * ''​thunking''​ utilisant la librairie cuBLAS avec une gestion interne de la mémoire
Ligne 1447: Ligne 1449:
   * 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 1505:
 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 1518:
 </​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 1526:
 </​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 1533:
 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//
formation/insa2020gpu.1607080237.txt.gz · Dernière modification: 2020/12/04 12:10 par equemene