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:cbp20190606gpu [2019/06/03 17:43] equemene [CBP 2019 : le GPU par la pratique] |
formation:cbp20190606gpu [2019/06/11 10:37] equemene [Conclusion] |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
====== CBP 2019 : le GPU par la pratique ====== | ====== CBP 2019 : le GPU par la pratique ====== | ||
- | Cette session pratique accompagne le cours du 6 juin au matin réalisé par Emmanuel Quémener. | + | Cette session pratique accompagne le [[http://www.cbp.ens-lyon.fr/emmanuel.quemener/documents/PresentationGPU_190606_EQ.pdf|cours]] du 6 juin au matin réalisé par Emmanuel Quémener. |
+ | ===== Déroulement de la journée ===== | ||
+ | |||
+ | * 08h30-09h00 Accueil devant la salle M7-1H104 | ||
+ | |||
+ | * 09h00-10h30 Cours d'introduction aux GPU | ||
+ | * 10h30-10h45 Pause | ||
+ | * 10h45-12h30 TP première partie | ||
+ | |||
+ | * 12h30-13h30 Repas salle 116 | ||
+ | |||
+ | * 13h30-15h15 TP seconde partie | ||
+ | * 15h30-15h45 Pause | ||
+ | * 15h45-17h30 TP troisième partie | ||
===== CQQCOQP : Comment ? Qui ? Quand ? Combien ? Où ? Quoi ? Pourquoi ? ===== | ===== CQQCOQP : Comment ? Qui ? Quand ? Combien ? Où ? Quoi ? Pourquoi ? ===== | ||
Ligne 45: | Ligne 58: | ||
* **p100alpha**, **p100beta** : stations virtuelles disposant d'une Nvidia Tesla P100 | * **p100alpha**, **p100beta** : stations virtuelles disposant d'une Nvidia Tesla P100 | ||
* **k40m** : station virtuelle disposant d'une Nvidia Tesla K40m | * **k40m** : station virtuelle disposant d'une Nvidia Tesla K40m | ||
+ | * **r740gpu1** : station disposant de 2 Tesla P100 (appartenant au PSMN) | ||
Jetez un coup d'oeil sur [[http://styx.cbp.ens-lyon.fr/ganglia/?r=hour&cs=&ce=&m=load_one&s=by+name&c=Workstations|Monitoring des stations de travail]] avant de lancer vos tâches ! De grosses requêtes concurrentielles peuvent entraîner des DoS ! | Jetez un coup d'oeil sur [[http://styx.cbp.ens-lyon.fr/ganglia/?r=hour&cs=&ce=&m=load_one&s=by+name&c=Workstations|Monitoring des stations de travail]] avant de lancer vos tâches ! De grosses requêtes concurrentielles peuvent entraîner des DoS ! | ||
Ligne 208: | Ligne 222: | ||
Comme nous l'avons vu dans l'introduction sur le GPU, leur programmation peut-être réalisée par différentes voies. La première, pour les périphériques Nvidia, est d'utiliser l'environnement CUDA. Le problème sera qu'il est impossible de réexploiter votre programme sur une autre plate-forme (un CPU) ou la comparer avec d'autres GPU. [[https://www.khronos.org/opencl/|OpenCL]] reste une approche beaucoup plus polyvalente ! | Comme nous l'avons vu dans l'introduction sur le GPU, leur programmation peut-être réalisée par différentes voies. La première, pour les périphériques Nvidia, est d'utiliser l'environnement CUDA. Le problème sera qu'il est impossible de réexploiter votre programme sur une autre plate-forme (un CPU) ou la comparer avec d'autres GPU. [[https://www.khronos.org/opencl/|OpenCL]] reste une approche beaucoup plus polyvalente ! | ||
- | Sur les stations du CBP, la majorité des implémentations de OpenCL sont disponibles, autant sur CBP que sur GPU. | + | Sur les stations du CBP, la majorité des implémentations de OpenCL sont disponibles, autant sur CPU que sur GPU. |
La commande ''clinfo'' récupère des informations liées à tous les périphériques OpenCL disponibles. | La commande ''clinfo'' récupère des informations liées à tous les périphériques OpenCL disponibles. | ||
Ligne 300: | Ligne 314: | ||
</note> | </note> | ||
+ | Il est aussi possible de choisir quel GPU Nvidia exploiter avec la variable d'environnement ''CUDA_VISIBLE_DEVICES''. Il existe deux manières de l'exploiter : | ||
+ | * en préfixant la commande à exécuter (ou son programme) par ''CUDA_VISIBLE_DEVICES=#GPU'' | ||
+ | * en //exportant// la variable de manière permanente avec : ''export CUDA_VISIBLE_DEVICES=#GPU'' | ||
+ | |||
+ | La commande ''nvidia-smi'' offrait une liste de périphériques Nvidia identifiés mais les ''ID'' donnés sont dans l'ordre inverse de celui exigé par ''CUDA_VISIBLE_DEVICES''. Par exemple, ''nvidia-smi'' donne comme ''ID'' les nombres ''0'' et ''1''. | ||
+ | <code> | ||
+ | # N'exploiter que le GPU identifie #0 avec nvidia-smi | ||
+ | CUDA_VISIBLE_DEVICES=1 <MonProgramme> | ||
+ | # N'exploiter que le GPU identifie #1 avec nvidia-smi | ||
+ | CUDA_VISIBLE_DEVICES=0 <MonProgramme> | ||
+ | # Exploiter les GPUs identifies #0 et #1 avec nvidia-smi | ||
+ | CUDA_VISIBLE_DEVICES=0,1 <MonProgramme> | ||
+ | # N'exploiter aucun GPU | ||
+ | CUDA_VISIBLE_DEVICES='' <MonProgramme> | ||
+ | </code> | ||
+ | |||
+ | <note warning> | ||
+ | **Exercice #8 : récupérez les informations avec ''clinfo -l'' préfixée de CUDA_VISIBLE_DEVICES** | ||
+ | |||
+ | * Mettez ''CUDA_VISIBLE_DEVICES=0 clinfo -l'' et observez la sortie | ||
+ | * Mettez ''CUDA_VISIBLE_DEVICES=1 clinfo -l'' et observez la sortie | ||
+ | * Mettez ''CUDA_VISIBLE_DEVICES=0,1 clinfo -l'' et observez la sortie | ||
+ | * Mettez ''CUDA_VISIBLE_DEVICES=\'\' clinfo -l'' et observez la sortie | ||
+ | * Avez-vous constaté la sélection des différents périphériques ? | ||
+ | </note> | ||
===== Exploration avec le "coeur" du GPU : xGEMM ===== | ===== Exploration avec le "coeur" du GPU : xGEMM ===== | ||
Ligne 348: | Ligne 387: | ||
<note warning> | <note warning> | ||
- | **Exercice #8 : éditez le source du programme ''xGEMM.c'' et repérez les éléments suivants** | + | **Exercice #9 : éditez le source du programme ''xGEMM.c'' et repérez les éléments suivants** |
* Identifiez dans ''Makefile'' quelles directives (précédées par ''-D'') sont associées aux différentes implémentations | * Identifiez dans ''Makefile'' quelles directives (précédées par ''-D'') sont associées aux différentes implémentations | ||
Ligne 617: | Ligne 656: | ||
<note warning> | <note warning> | ||
- | **Exercice #9 : lancez les ''xGEMM_<precision>_<implementation>'' avec une taille de 1000** | + | **Exercice #10 : lancez les ''xGEMM_<precision>_<implementation>'' avec une taille de 1000** |
* Variez le nombre d'itérations pour obtenir une durée d'exécution d'une dizaine de secondes ? | * Variez le nombre d'itérations pour obtenir une durée d'exécution d'une dizaine de secondes ? | ||
Ligne 636: | Ligne 675: | ||
<note warning> | <note warning> | ||
- | **Exercice #10 : lancez les programmes précédents pour différentes tailles** | + | **Exercice #11 : lancez les programmes précédents pour différentes tailles** |
* Diminuez la taille aux valeurs suivantes ''125'', ''250'', ''500'' et exécutez les programmes | * Diminuez la taille aux valeurs suivantes ''125'', ''250'', ''500'' et exécutez les programmes | ||
Ligne 696: | Ligne 735: | ||
<note warning> | <note warning> | ||
- | **Exercice #11 : exploration du code OpenCL** | + | **Exercice #12 : exploration du code OpenCL** |
* Repérez dans le programme source le **noyau** OpenCL réalisant le calcul | * Repérez dans le programme source le **noyau** OpenCL réalisant le calcul | ||
Ligne 783: | Ligne 822: | ||
<note warning> | <note warning> | ||
- | **Exercice #12 : compilation et première exécution** | + | **Exercice #13 : compilation et première exécution** |
* Compilez le programme avec la ligne de compilation précisée ci-dessus | * Compilez le programme avec la ligne de compilation précisée ci-dessus | ||
Ligne 808: | Ligne 847: | ||
<note warning> | <note warning> | ||
- | **Exercice #13 : exécution sur tous les périphériques pour un PR=1** | + | **Exercice #14 : exécution sur tous les périphériques pour un PR=1** |
* Exécutez le programme sur tous (GPU & CPU) avec un nombre d'itérations de 1 milliard | * Exécutez le programme sur tous (GPU & CPU) avec un nombre d'itérations de 1 milliard | ||
Ligne 830: | Ligne 869: | ||
<note warning> | <note warning> | ||
- | **Exercice #14 : exécution sur tous les périphériques pour un PR=1024** | + | **Exercice #15 : exécution sur tous les périphériques pour un PR=1024** |
* Exécutez le programme sur tous (GPU & CPU) avec un nombre d'itérations de 10 milliards | * Exécutez le programme sur tous (GPU & CPU) avec un nombre d'itérations de 10 milliards | ||
Ligne 851: | Ligne 890: | ||
<note warning> | <note warning> | ||
- | **Exercice #15 : exécution sur tous les périphériques pour un PR optimal** | + | **Exercice #16 : exécution sur tous les périphériques pour un PR optimal** |
* Reprenez les spécifications des GPU et isolez le nombre de //cuda cores// | * Reprenez les spécifications des GPU et isolez le nombre de //cuda cores// | ||
Ligne 878: | Ligne 917: | ||
<note warning> | <note warning> | ||
- | **Exercice #16 : exécution sur tous les périphériques pour un PR optimal en double précision** | + | **Exercice #17 : exécution sur tous les périphériques pour un PR optimal en double précision** |
* Reprenez les expériences ci-dessus en précisant un calcul en double précision | * Reprenez les expériences ci-dessus en précisant un calcul en double précision | ||
Ligne 971: | Ligne 1010: | ||
<note warning> | <note warning> | ||
- | Exercice #17 : récupération des éléments dans le code source | + | Exercice #18 : récupération des éléments dans le code source |
* Editez le code source avec l'outil ''gedit'' | * Editez le code source avec l'outil ''gedit'' | ||
* Identifiez l'appel de la procédure principale OpenCL : ligne | * Identifiez l'appel de la procédure principale OpenCL : ligne | ||
Ligne 1009: | Ligne 1048: | ||
<note warning> | <note warning> | ||
- | Exercice #18 : étude de la scalabilité d'une implémentation CPU | + | Exercice #19 : étude de la scalabilité d'une implémentation CPU |
* Identifiez avec ''python PiXPU.py -h'' un périphérique CPU | * Identifiez avec ''python PiXPU.py -h'' un périphérique CPU | ||
* Exécutez le d'un PR=1 à un PR égal à 8x le nombre de coeurs physiques | * Exécutez le d'un PR=1 à un PR égal à 8x le nombre de coeurs physiques | ||
Ligne 1025: | Ligne 1064: | ||
<note warning> | <note warning> | ||
- | Exercice #19 : étude de la scalabilité d'un GPU | + | Exercice #20 : étude de la scalabilité d'un GPU |
* Identifiez avec ''python PiXPU.py -h'' un périphérique GPU | * Identifiez avec ''python PiXPU.py -h'' un périphérique GPU | ||
* Exécutez-le d'un PR=<NbCudaCores> à un PR égal à 8x<NbCudaCores> par pas de 128 en OpenCL | * Exécutez-le d'un PR=<NbCudaCores> à un PR égal à 8x<NbCudaCores> par pas de 128 en OpenCL | ||
Ligne 1042: | Ligne 1081: | ||
En relançant le calcul précédent, nous parvenons à **271 Gitops** soit plus que l'implémentation OpenCL. | En relançant le calcul précédent, nous parvenons à **271 Gitops** soit plus que l'implémentation OpenCL. | ||
- | <note warning>Exercice #20 : étude de l'implémentation CUDA autour du PR optimal | + | <note warning>Exercice #21 : étude de l'implémentation CUDA autour du PR optimal |
* Identifiez avec ''python PiXPU.py -h'' le périphérique GPU déjà utilisé en CUDA | * Identifiez avec ''python PiXPU.py -h'' le périphérique GPU déjà utilisé en CUDA | ||
* Exécutez le avec le PR optimal des //Blocks// en CUDA | * Exécutez le avec le PR optimal des //Blocks// en CUDA | ||
Ligne 1061: | Ligne 1100: | ||
<note warning> | <note warning> | ||
- | Exercice #21 : étude de valeurs particulières de PR | + | Exercice #22 : étude de valeurs particulières de PR |
* Exécutez ''PiXPU.py'' autour du PR égal à 4x le nombre de //cuda cores// (16 avant et 16 après) | * Exécutez ''PiXPU.py'' autour du PR égal à 4x le nombre de //cuda cores// (16 avant et 16 après) | ||
* Tracez les résultats avec GNUplot | * Tracez les résultats avec GNUplot | ||
Ligne 1175: | Ligne 1214: | ||
<note warning> | <note warning> | ||
- | Exercice #22 : étude du source de ''NBody.py'' | + | Exercice #23 : étude du source de ''NBody.py'' |
* Editez le programme avec gedit | * Editez le programme avec gedit | ||
* Identifiez le bloc de noyaux OpenCL : lignes | * Identifiez le bloc de noyaux OpenCL : lignes | ||
Ligne 1201: | Ligne 1240: | ||
<note warning> | <note warning> | ||
- | Exercice #23 : lancement de ''NBody.py'' pour 32768 particules | + | Exercice #24 : lancement de ''NBody.py'' pour 32768 particules |
* Exécutez le programme pour tous les périphériques détectés | * Exécutez le programme pour tous les périphériques détectés | ||
* Ajoutez l'option pour un calcul en 64 bits et réexécutez | * Ajoutez l'option pour un calcul en 64 bits et réexécutez | ||
Ligne 1226: | Ligne 1265: | ||
{{ :formation:nbody_007.png?400 |}} | {{ :formation:nbody_007.png?400 |}} | ||
- | <note warning>Exercice #24 : lancement de ''NBody.py'' en mode ''-g'' | + | <note warning>Exercice #25 : lancement de ''NBody.py'' en mode ''-g'' |
* Exécutez le programme pour le meilleur des CPU sur 8192 particules | * Exécutez le programme pour le meilleur des CPU sur 8192 particules | ||
* Appuyez sur ''s'' pour passer des positions aux vitesses | * Appuyez sur ''s'' pour passer des positions aux vitesses | ||
Ligne 1291: | Ligne 1330: | ||
export DATADIR=/local/$USER | export DATADIR=/local/$USER | ||
sed -i "s|tfds\.load(name|tfds\.load(data_dir\=\'$DATADIR\'\,name|g" cifar10_input.py | sed -i "s|tfds\.load(name|tfds\.load(data_dir\=\'$DATADIR\'\,name|g" cifar10_input.py | ||
+ | # Modification du dossier de sauvegarde de l'apprentissage | ||
+ | sed -i 's/\/tmp\//$DATADIR/g' cifar10_train.py | ||
# Réduction du nombre d'itérations de 100000 à 10000 | # Réduction du nombre d'itérations de 100000 à 10000 | ||
sed -i 's/100000/10000/g' cifar10_train.py | sed -i 's/100000/10000/g' cifar10_train.py | ||
Ligne 1300: | Ligne 1341: | ||
</code> | </code> | ||
- | Le souci, c'est que le temps écoulé ici comprend (la première fois) le téléchargement et l'expansion des archives. | + | Voici la sortie sur une machine équipée de GPUs Nvidia RTX 2080 Ti et GTX 1660 Ti. |
+ | |||
+ | <code> | ||
+ | TIME Command being timed: "python3 cifar10_train.py" | ||
+ | TIME User time (seconds): 889.04 | ||
+ | TIME System time (seconds): 597.06 | ||
+ | TIME Elapsed (wall clock) time : 234.10 | ||
+ | TIME Percent of CPU this job got: 634% | ||
+ | TIME Average shared text size (kbytes): 0 | ||
+ | TIME Average unshared data size (kbytes): 0 | ||
+ | TIME Average stack size (kbytes): 0 | ||
+ | TIME Average total size (kbytes): 0 | ||
+ | TIME Maximum resident set size (kbytes): 5098888 | ||
+ | TIME Average resident set size (kbytes): 0 | ||
+ | TIME Major (requiring I/O) page faults: 329 | ||
+ | TIME Minor (reclaiming a frame) page faults: 1227196 | ||
+ | TIME Voluntary context switches: 15535406 | ||
+ | TIME Involuntary context switches: 8247917 | ||
+ | TIME Swaps: 0 | ||
+ | TIME File system inputs: 10117019 | ||
+ | TIME File system outputs: 1282614 | ||
+ | TIME Socket messages sent: 0 | ||
+ | TIME Socket messages received: 0 | ||
+ | TIME Signals delivered: 0 | ||
+ | TIME Page size (bytes): 4096 | ||
+ | TIME Exit status: 0 | ||
+ | </code> | ||
+ | |||
+ | Le souci, c'est que le temps écoulé ici comprend (la première fois) le téléchargement et l'expansion des archives. Pour disposer d'une comparaison objective du temps de calcul pour 10000 itérations, il faut relancer l'apprentissage. | ||
+ | |||
+ | Une relance du même apprentissage offre la sortie suivante : | ||
+ | |||
+ | <code> | ||
+ | TIME Command being timed: "python3 cifar10_train.py" | ||
+ | TIME User time (seconds): 827.48 | ||
+ | TIME System time (seconds): 592.54 | ||
+ | TIME Elapsed (wall clock) time : 123.09 | ||
+ | TIME Percent of CPU this job got: 1153% | ||
+ | TIME Average shared text size (kbytes): 0 | ||
+ | TIME Average unshared data size (kbytes): 0 | ||
+ | TIME Average stack size (kbytes): 0 | ||
+ | TIME Average total size (kbytes): 0 | ||
+ | TIME Maximum resident set size (kbytes): 4100296 | ||
+ | TIME Average resident set size (kbytes): 0 | ||
+ | TIME Major (requiring I/O) page faults: 0 | ||
+ | TIME Minor (reclaiming a frame) page faults: 933283 | ||
+ | TIME Voluntary context switches: 15603184 | ||
+ | TIME Involuntary context switches: 8643170 | ||
+ | TIME Swaps: 0 | ||
+ | TIME File system inputs: 5857597 | ||
+ | TIME File system outputs: 49573 | ||
+ | TIME Socket messages sent: 0 | ||
+ | TIME Socket messages received: 0 | ||
+ | TIME Signals delivered: 0 | ||
+ | TIME Page size (bytes): 4096 | ||
+ | TIME Exit status: 0 | ||
+ | </code> | ||
+ | |||
+ | Dans le cas d'une exécution uniquement sur CPU (ici 2 Xeon E5-2637 v4 @ 3.50GHz), nous avons comme sortie : | ||
+ | |||
+ | <code> | ||
+ | TIME Command being timed: "python3 cifar10_train.py" | ||
+ | TIME User time (seconds): 21180.80 | ||
+ | TIME System time (seconds): 1391.54 | ||
+ | TIME Elapsed (wall clock) time : 1711.02 | ||
+ | TIME Percent of CPU this job got: 1319% | ||
+ | TIME Average shared text size (kbytes): 0 | ||
+ | TIME Average unshared data size (kbytes): 0 | ||
+ | TIME Average stack size (kbytes): 0 | ||
+ | TIME Average total size (kbytes): 0 | ||
+ | TIME Maximum resident set size (kbytes): 2804244 | ||
+ | TIME Average resident set size (kbytes): 0 | ||
+ | TIME Major (requiring I/O) page faults: 0 | ||
+ | TIME Minor (reclaiming a frame) page faults: 283823921 | ||
+ | TIME Voluntary context switches: 26722288 | ||
+ | TIME Involuntary context switches: 6182435 | ||
+ | TIME Swaps: 0 | ||
+ | TIME File system inputs: 5857601 | ||
+ | TIME File system outputs: 83979 | ||
+ | TIME Socket messages sent: 0 | ||
+ | TIME Socket messages received: 0 | ||
+ | TIME Signals delivered: 0 | ||
+ | TIME Page size (bytes): 4096 | ||
+ | TIME Exit status: 0 | ||
+ | </code> | ||
- | <note warning>Exercice #25 : appliquez les commandes ci-dessus | + | <note warning>Exercice #26 : appliquez les commandes ci-dessus |
* Préparez votre environnement | * Préparez votre environnement | ||
- créez le dossier personnel dans ''/local'' | - créez le dossier personnel dans ''/local'' | ||
Ligne 1310: | Ligne 1435: | ||
- définissez la variable ''TIME'' pour sa métrologie | - définissez la variable ''TIME'' pour sa métrologie | ||
- déplacez vous dans le dossier ''models/tutorials/image/cifar10'' | - déplacez vous dans le dossier ''models/tutorials/image/cifar10'' | ||
- | - modifiez comme précisé le dossier de téléchargement de TensorFlow | + | - modifiez comme précisé les dossiers de téléchargement et de sauvegarde |
- modifiez le nombre d'itérations | - modifiez le nombre d'itérations | ||
* Lancez une première fois l'apprentissage avec ''cifar10_train.py'' | * Lancez une première fois l'apprentissage avec ''cifar10_train.py'' | ||
Ligne 1319: | Ligne 1444: | ||
* Lancez une seconde fois l'apprentissage | * Lancez une seconde fois l'apprentissage | ||
- notez les informations de sortie préfixées par ''TIME'' | - notez les informations de sortie préfixées par ''TIME'' | ||
- | * Lancez une seconde fois l'apprentissage avec ''CUDA_VISIBLE_DEVICES="" '' | + | * Lancez une seconde fois l'apprentissage avec ''CUDA_VISIBLE_DEVICES=' ' '' |
- notez les informations de sortie | - notez les informations de sortie | ||
* Comparez les résultats | * Comparez les résultats | ||
- | * Qu'apporte le GPU comme performance par rapport au processeur ? | + | * Qu'apporte le GPU comme gain de performance par rapport au processeur ? |
</note> | </note> | ||
Ligne 1329: | Ligne 1454: | ||
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 #26 : appliquez la "recette" de Nvidia | + | <note warning>Exercice #27 : appliquez la "recette" de Nvidia |
* La documentation offre ceci : | * La documentation offre ceci : | ||
- récupérez le source | - récupérez le source | ||
Ligne 1342: | Ligne 1467: | ||
</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:cbp20190606gpu:gromacs4stretch|recette de Gromacs pour Debian Stretch]] ;-) |
- | <note warning>Exercice #27 : Exécutez l'exemple ''1536'' | + | <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 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 1356: | Ligne 1481: | ||
Le code source est accessible par ''git'' à l'adresse : https://bitbucket.org/dpotter/pkdgrav3.git | Le code source est accessible par ''git'' à l'adresse : https://bitbucket.org/dpotter/pkdgrav3.git | ||
- | <note warning>Exercice #28 : Récupérez et compilez le code suivant la documentation fournie | + | <note warning>Exercice #29 : Récupérez et compilez le code suivant la documentation fournie |
* La documentation offre ceci : | * La documentation offre ceci : | ||
- récupérez le source | - récupérez le source | ||
Ligne 1373: | Ligne 1498: | ||
L'exécution du programme s'effectue en associant l'exécutable ''pkdgrav3'' au fichier de paramètres ''cosmology.par'' dans le dossiers ''examples''. | L'exécution du programme s'effectue en associant l'exécutable ''pkdgrav3'' au fichier de paramètres ''cosmology.par'' dans le dossiers ''examples''. | ||
- | <note warning>Exercice #29 : Exécutez l'exemple ''cosmology.par'' | + | <note warning>Exercice #30 : Exécutez l'exemple ''cosmology.par'' |
* Passez dans le dossier ''examples'' | * Passez dans le dossier ''examples'' | ||
* Exécutez ''pkdgrav3'' sur ''cosmology.par'' | * Exécutez ''pkdgrav3'' sur ''cosmology.par'' | ||
Ligne 1379: | Ligne 1504: | ||
</note> | </note> | ||
- | En cas de difficultés, appliquez la [[formation:insa2018gpu:insa2018pkdgrav4stretch|recette d'un PKDGRAV3 pour Debian Stretch]] ;-) | + | En cas de difficultés, appliquez la [[formation:cbp20190606gpu:pkdgrav4stretch|recette d'un PKDGRAV3 pour Debian Stretch]] ;-) |
===== Conclusion ===== | ===== Conclusion ===== | ||
Ligne 1387: | Ligne 1512: | ||
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]] CC BY-NC-SA 2018/11/26 15:37// | + | --- //[[emmanuel.quemener@ens-lyon.fr|Emmanuel Quemener]] CC BY-NC-SA 2019-06-11// |