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:cbp20190606gpu [2019/06/03 17:59]
equemene [Qu'y a-t-il dans ma machine ?]
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 323: Ligne 337:
   * Mettez ''​CUDA_VISIBLE_DEVICES=0,​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   * Mettez ''​CUDA_VISIBLE_DEVICES=\'​\'​ clinfo -l''​ et observez la sortie
 +  * Avez-vous constaté la sélection des différents périphériques ?
 </​note>​ </​note>​
 ===== Exploration avec le "​coeur"​ du GPU : xGEMM ===== ===== Exploration avec le "​coeur"​ du GPU : xGEMM =====
Ligne 372: Ligne 387:
  
 <note warning> <note warning>
-**Exercice #: éditez le source du programme ''​xGEMM.c''​ et repérez les éléments suivants**+**Exercice #: é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 641: Ligne 656:
  
 <note warning> <note warning>
-**Exercice #: 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 660: 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 720: 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 807: 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 832: 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 854: 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 875: 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 902: 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 995: 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 1033: 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 1049: 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 1066: 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 1085: 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 1199: 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 1225: 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 1250: 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 1315: 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 1324: 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 1334: 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 1343: 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 1353: 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 1366: 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 1380: 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 1397: 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 1403: 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 1411: 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//
formation/cbp20190606gpu.txt · Dernière modification: 2019/06/11 10:37 par equemene