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:insa2018gpu [2018/11/27 18:11]
equemene
formation:insa2018gpu [2018/12/09 10:42] (Version actuelle)
equemene [Implémentation C/OpenCL]
Ligne 1: Ligne 1:
-====== ​Session ​pratique du cours sur les GPU ======+====== ​INSA 2018 : session ​pratique du cours sur les GPU ======
  
-Session ​pratique ​du [[http://​www.cbp.ens-lyon.fr/​emmanuel.quemener/​documents/​CoursINSA_GPU_181112.pdf|cours du 12/​11/​2018]] réalisé par Emmanuel Quémener.+Cette session ​pratique ​accompagne le [[http://​www.cbp.ens-lyon.fr/​emmanuel.quemener/​documents/​CoursINSA_GPU_181112.pdf|cours du 12/​11/​2018]] réalisé par Emmanuel Quémener.
  
 ===== CQQCOQP : Comment ? Qui ? Quand ? Combien ? Où ? Quoi ? Pourquoi ? ===== ===== CQQCOQP : Comment ? Qui ? Quand ? Combien ? Où ? Quoi ? Pourquoi ? =====
Ligne 73: Ligne 73:
   * Récupérez le modèle du circuit de GPU, dans son nom étendu.   * Récupérez le modèle du circuit de GPU, dans son nom étendu.
   * Récupérez sur le web les informations suivantes pour chaque GPU :   * Récupérez sur le web les informations suivantes pour chaque GPU :
-    * le nombre d'​unités de calcul (les "cudacores" ou les "streamprocessor")+    * le nombre d'​unités de calcul (les "cuda cores" ou les "stream processors")
     * la fréquence de base des coeurs de calcul     * la fréquence de base des coeurs de calcul
     * la fréquence de la mémoire     * la fréquence de la mémoire
Ligne 335: Ligne 335:
 ==== Exploitations de xGEMM  ==== ==== Exploitations de xGEMM  ====
  
-Le dossier ''​bench4gpu/​xGEMM''​ contient peu de fichiers dont les importants sont : un unique programme source, ''​xGEMM.c'',​ et un fichier de construction,​ ''​Makefile''​. C'est ce fichier qui va ''​construire''​ tous les exécutables d'un coup, à la fois pour les différentes implémentations de BLAS, mais aussi pour les deux précisions **SP** (simple précision sur 32 bits) et **DP** (double précision sur 64 bits).+Le dossier ''​bench4gpu/BLAS/​xGEMM''​ contient peu de fichiers dont les importants sont : un unique programme source, ''​xGEMM.c'',​ et un fichier de construction,​ ''​Makefile''​. C'est ce fichier qui va ''​construire''​ tous les exécutables d'un coup, à la fois pour les différentes implémentations de BLAS, mais aussi pour les deux précisions **SP** (simple précision sur 32 bits) et **DP** (double précision sur 64 bits).
  
 === Le source === === Le source ===
  
-Le programme source ''​xGEMM.c''​ a été conçu pour être polyvalent pour toute implémentation. Si vous l'​éditez,​ vous réalisez qu'il n'est pas si simple d'​avoir un programme qui s'​exécute indifféremment quelle que soit la librairie. Même si les appels sont comparables (même nombre d'​attributs dans les fonctions), leur nom change de librairie à librairie. Pour n'​avoir qu'un seul source, les directives sont largement exploitées. C'est donc le ''​Makefile''​ qui va permettre de ne compiler que telle ou telle portion du programme source.+Le programme source ''​xGEMM.c''​ a été conçu pour fonctionner avec n'​importe quelle ​implémentation. Si vous l'​éditez,​ vous réalisez qu'il n'est pas si simple d'​avoir un programme qui s'​exécute indifféremment quelle que soit la librairie. Même si les appels sont comparables (même nombre d'​attributs dans les fonctions), leur nom change de librairie à librairie. Pour n'​avoir qu'un seul source, les directives sont largement exploitées. C'est donc le ''​Makefile''​ qui va permettre de ne compiler que telle ou telle portion du programme source.
  
 <note warning> <note warning>
Ligne 821: Ligne 821:
 {{:​formation:​opencluster2_qpu1024.png?​direct&​400|}} {{:​formation:​opencluster2_qpu1024.png?​direct&​400|}}
  
-Cette seconde expérience montre de manière assez spectaculaire que les GPU ne montrent ​leur puissance "​que"​ pour des régimes de parallélisme élevé. Notons aussi que les implémentations sur CPU ont des performances très très disparates.+Cette seconde expérience montre de manière assez spectaculaire que les GPU ne dévoilent ​leur puissance "​que"​ pour des régimes de parallélisme élevé. Notons aussi que les implémentations sur CPU ont des performances très très disparates.
  
 <note warning> <note warning>
Ligne 834: Ligne 834:
 Dans l'​expérience précédente,​ nous avons exploité un régime de parallélisme sur les processeurs très supérieur au nombre de //Compute Units//, lesquelles sont identifiées comme les coeurs. Il y avait 8 coeurs physiques et nous avons "​chargé"​ chaque coeur à 256 fois leur charge. Que se passe-t-il si nous effectuons la même chose avec les GPU ? Dans l'​expérience précédente,​ nous avons exploité un régime de parallélisme sur les processeurs très supérieur au nombre de //Compute Units//, lesquelles sont identifiées comme les coeurs. Il y avait 8 coeurs physiques et nous avons "​chargé"​ chaque coeur à 256 fois leur charge. Que se passe-t-il si nous effectuons la même chose avec les GPU ?
  
-Dans notre exemple, la GTX 1080 Ti dispose de 3584 //cudacores//. La Quadro K420 de 192 //cudacores//. Explorons ces périphériques avec des  **PR** de 256x ces valeurs (nous sommes obligés de porter les itérations à 1000 milliards) :+Dans notre exemple, la GTX 1080 Ti dispose de 3584 //cuda cores//. La Quadro K420 de 192 //cuda cores//. Explorons ces périphériques avec des  **PR** de 256x ces valeurs (nous sommes obligés de porter les itérations à 1000 milliards) :
  
 ^  Périphérique ​ ^  Durée ​ ^  Itops  ^  Inside ​ ^ ^  Périphérique ​ ^  Durée ​ ^  Itops  ^  Inside ​ ^
Ligne 847: Ligne 847:
 **Exercice #15 : exécution sur tous les périphériques pour un PR optimal** **Exercice #15 : exécution sur tous les périphériques pour un PR optimal**
  
-  * Reprenez les spécifications des GPU et isolez le nombre de //cudacores// +  * Reprenez les spécifications des GPU et isolez le nombre de //cuda cores// 
-  * Exécutez le programme sur les GPU avec un nombre d'​itérations de 100 milliards et un PR de 256x le nombre de //cudacores//+  * Exécutez le programme sur les GPU avec un nombre d'​itérations de 100 milliards et un PR de 256x le nombre de //cuda cores//
   * Repérez les éléments de **durée**, **itops** et **inside**   * Repérez les éléments de **durée**, **itops** et **inside**
   * Tracez l'​histogramme correspondant aux performances sur le modèle ci-dessus   * Tracez l'​histogramme correspondant aux performances sur le modèle ci-dessus
Ligne 988: Ligne 988:
   * ''​Pi_FP32_MWC_xPU_OpenCL_1_128_1_1_1000000000_Device0_InMetro_opencluster2''​   * ''​Pi_FP32_MWC_xPU_OpenCL_1_128_1_1_1000000000_Device0_InMetro_opencluster2''​
  
-Nous ppuvons ​ensuite exploiter l'​outil simple ''​gnuplot''​ pour afficher nos résultats :+Nous pouvons ​ensuite exploiter l'​outil simple ''​gnuplot''​ pour afficher nos résultats :
 <​code>​ <​code>​
 gnuplot gnuplot
Ligne 1009: Ligne 1009:
 </​note>​ </​note>​
  
-Nous pouvons également "​explorer"​ la scalabilité des GPU forts de notre expérience de ''​PiOpenCL''​. Par exemple, du nombre de //cudacores// à ce nombre multiplié par 16, par pas de 128. La commande appelée est la suivante :<​code>​+Nous pouvons également "​explorer"​ la scalabilité des GPU forts de notre expérience de ''​PiOpenCL''​. Par exemple, du nombre de //cuda cores// à ce nombre multiplié par 16, par pas de 128. La commande appelée est la suivante :<​code>​
 python PiXPU.py -d 2 -b 3584 -e $((3584*8)) -s 128 -r 3 -i 100000000000 python PiXPU.py -d 2 -b 3584 -e $((3584*8)) -s 128 -r 3 -i 100000000000
 </​code>​ </​code>​
Ligne 1032: Ligne 1032:
 La seule manière de retrouver une performance comparable en CUDA est de solliciter le second étage de parallélisme des GPU, les //​Threads//​. Avec la commande suivante, avec 1024 Threads, nous plafonnons à **198 Gitops** :<​code>​python PiXPU.py -g CUDA -d 0 -b $((3584*4)) -e $((3584*4)) -f 1024 -l 1024 -r 3 -i 1000000000000</​code>​ La seule manière de retrouver une performance comparable en CUDA est de solliciter le second étage de parallélisme des GPU, les //​Threads//​. Avec la commande suivante, avec 1024 Threads, nous plafonnons à **198 Gitops** :<​code>​python PiXPU.py -g CUDA -d 0 -b $((3584*4)) -e $((3584*4)) -f 1024 -l 1024 -r 3 -i 1000000000000</​code>​
  
-Et ce n'est pas tout ! La distribtion ​Debian utilisée intègre par défaut un CUDA version 8. Pour l'​intégration d'​applications de //Deep Learning//, nous avons été obligé d'​intégrer un CUDA version 9. Nous pouvons charger l'​environnement pour exploiter cette version avec la commande :<​code>​module load cuda/​9.0</​code>​+Et ce n'est pas tout ! La distribution ​Debian utilisée intègre par défaut un CUDA version 8. Pour l'​intégration d'​applications de //Deep Learning//, nous avons été obligé d'​intégrer un CUDA version 9. Nous pouvons charger l'​environnement pour exploiter cette version avec la commande :<​code>​module load cuda/​9.0</​code>​
  
 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.
Ligne 1056: Ligne 1056:
 <note warning> <note warning>
 Exercice #21 : étude de valeurs particulières de PR Exercice #21 : étude de valeurs particulières de PR
-  * Exécutez ''​PiXPU.py''​ autour du PR égal à 4x le nombre de //cudacores// (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
   * Quels sont les PR avec les performances les plus faibles ?   * Quels sont les PR avec les performances les plus faibles ?
Ligne 1259: Ligne 1259:
 </​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:​insa2018gpu:​insa2018gromacs4stretch|recette de Gromacs pour Debian Stretch]] ​;-)
  
 <note warning>​Exercice #26 : Exécutez l'​exemple ''​1536'' ​ <note warning>​Exercice #26 : Exécutez l'​exemple ''​1536'' ​
Ligne 1269: Ligne 1269:
 ==== Intégration et exploitation du code PKDGRAV3 ==== ==== Intégration et exploitation du code PKDGRAV3 ====
  
-Le code PKDGRAV3 est une logiciel de simulation hydrodynamique à la large couverture médiatique en juin 2017. Présenté comme exploitant massivement les GPU, il est disponible sur [[https://​bitbucket.org/​dpotter/​pkdgrav3/​|bitbucket]].+Le code PKDGRAV3 est un logiciel de simulation hydrodynamique à la large couverture médiatique en juin 2017. Présenté comme exploitant massivement les GPU, il est disponible sur [[https://​bitbucket.org/​dpotter/​pkdgrav3/​|bitbucket]].
  
 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
Ligne 1296: Ligne 1296:
 </​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:​insa2018gpu:​insa2018pkdgrav4stretch|recette d'un PKDGRAV3 pour Debian Stretch]] ​;-) 
 + 
 +===== Conclusion ===== 
 + 
 +Comme vous l'​aurez remarqué au cours de ces Travaux Pratiques, l'​exploitation peut être pleine de surprises : une métrologie pertinente ne peut se passer de la connaissance du matériel exploité. 
 + 
 +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 2018/11/26 15:37//
formation/insa2018gpu.1543338680.txt.gz · Dernière modification: 2018/11/27 18:11 par equemene