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: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// |