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 | ||
formation:insa2020gpu [2020/12/04 12:14] equemene [Intégration et exploitation du code GENESIS] |
formation:insa2020gpu [2020/12/07 11:05] 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 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 | ||
- | * La documentation offre ceci : | ||
- | - récupérez le source | ||
- | - étendez l'archive | ||
- | - créez un dossier pour la construction | ||
- | - passez dans ce dossier | ||
- | - préparez la compilation | ||
- | - compilez le code | ||
- | - installez les exécutables | ||
- | * A quelle étape est-ce que cela bloque ? Quel message avez-vous ? | ||
- | * Trouvez une méthode permettant de régler ce problème. | ||
- | </note> | ||
- | |||
- | En cas de difficultés, appliquez la [[formation:insa2018gpu:insa2018gromacs4stretch|recette de Gromacs pour Debian Stretch]] ;-) | ||
- | |||
- | <note warning>Exercice #28 : 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 uniquement sur CPU ? | ||
- | * Quel ratio de performances existe entre les deux exécutions ? | ||
</note> | </note> | ||
Ligne 1481: | Ligne 1458: | ||
Le code source est accessible à l'adresse : https://www.r-ccs.riken.jp/labs/cbrt/download/genesis-version-1-5/ | 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 | + | <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 | * 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 | * Placez les sources dans le dossier ''/local/$USER/GENESIS'' créé pour l'occasion | ||
Ligne 1494: | Ligne 1471: | ||
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. | 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 ''alad_water'' | + | 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. |
- | <note warning>Exercice #30 : Exécutez l'exemple ''alad_water'' | + | 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. |
- | * 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 | + | 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. |
- | * Exécutez la commande ''/usr/bin/time mpirun -np 4 /local/$USER/GENESIS/gpu-single/bin/spdyn inp'' | + | |
+ | <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 | * Observez pendant l'exécution l'activité des coeurs et des GPU | ||
- | * Notez le ''Elapsed Time'' | + | * Notez le ''Elapsed Time'' et le ''System Time'' |
- | * Déterminez du fait que le programme exécute | + | * 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'' | * 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> | ||
+ | |||
+ | ==== Intégration et exploitation du code 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 #29 : appliquez la "recette" de Nvidia | ||
+ | * La documentation offre ceci : | ||
+ | - récupérez le source | ||
+ | - étendez l'archive | ||
+ | - créez un dossier pour la construction | ||
+ | - passez dans ce dossier | ||
+ | - préparez la compilation | ||
+ | - compilez le code | ||
+ | - installez les exécutables | ||
+ | * A quelle étape est-ce que cela bloque ? Quel message avez-vous ? | ||
+ | * Trouvez une méthode permettant de régler ce problème. | ||
+ | </note> | ||
+ | |||
+ | En cas de difficultés, appliquez la [[formation:insa2020gpu:insa2020gromacs4buster|recette de Gromacs pour Debian Buster]] ;-) | ||
+ | |||
+ | <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 uniquement sur CPU ? | ||
+ | * Quel ratio de performances existe entre les deux exécutions ? | ||
+ | </note> | ||
+ | |||
===== Conclusion ===== | ===== Conclusion ===== | ||
Ligne 1513: | 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// |