Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| formation:cbp20190606gpu [2019/06/03 16:00] – [Qu'y a-t-il dans ma machine ?] equemene | formation:cbp20190606gpu [2019/06/11 08:37] (Version actuelle) – [Conclusion] equemene | ||
|---|---|---|---|
| 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:// |
| + | ===== Déroulement de la journée ===== | ||
| + | |||
| + | * 08h30-09h00 Accueil devant la salle M7-1H104 | ||
| + | |||
| + | * 09h00-10h30 Cours d' | ||
| + | * 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**, | * **p100alpha**, | ||
| * **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:// | Jetez un coup d'oeil sur [[http:// | ||
| Ligne 208: | Ligne 222: | ||
| Comme nous l' | Comme nous l' | ||
| - | Sur les stations du CBP, la majorité des implémentations de OpenCL sont disponibles, | + | Sur les stations du CBP, la majorité des implémentations de OpenCL sont disponibles, |
| La commande '' | La commande '' | ||
| Ligne 373: | Ligne 387: | ||
| <note warning> | <note warning> | ||
| - | **Exercice #8 : éditez le source du programme '' | + | **Exercice #9 : éditez le source du programme '' |
| * Identifiez dans '' | * Identifiez dans '' | ||
| Ligne 642: | Ligne 656: | ||
| <note warning> | <note warning> | ||
| - | **Exercice #9 : lancez les '' | + | **Exercice #10 : lancez les '' |
| * Variez le nombre d' | * Variez le nombre d' | ||
| Ligne 661: | 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 '' | * Diminuez la taille aux valeurs suivantes '' | ||
| Ligne 721: | 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 808: | 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 833: | 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' | * Exécutez le programme sur tous (GPU & CPU) avec un nombre d' | ||
| Ligne 855: | 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' | * Exécutez le programme sur tous (GPU & CPU) avec un nombre d' | ||
| Ligne 876: | 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 903: | 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 996: | 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' | * Editez le code source avec l' | ||
| * Identifiez l' | * Identifiez l' | ||
| Ligne 1034: | 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 '' | * Identifiez avec '' | ||
| * 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 1050: | 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 '' | * Identifiez avec '' | ||
| * Exécutez-le d'un PR=< | * Exécutez-le d'un PR=< | ||
| Ligne 1067: | Ligne 1081: | ||
| En relançant le calcul précédent, | En relançant le calcul précédent, | ||
| - | <note warning> | + | <note warning> |
| * Identifiez avec '' | * Identifiez avec '' | ||
| * Exécutez le avec le PR optimal des //Blocks// en CUDA | * Exécutez le avec le PR optimal des //Blocks// en CUDA | ||
| Ligne 1086: | 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 '' | * Exécutez '' | ||
| * Tracez les résultats avec GNUplot | * Tracez les résultats avec GNUplot | ||
| Ligne 1200: | Ligne 1214: | ||
| <note warning> | <note warning> | ||
| - | Exercice #22 : étude du source de '' | + | Exercice #23 : étude du source de '' |
| * 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 1226: | Ligne 1240: | ||
| <note warning> | <note warning> | ||
| - | Exercice #23 : lancement de '' | + | Exercice #24 : lancement de '' |
| * 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' | * Ajoutez l' | ||
| Ligne 1251: | Ligne 1265: | ||
| {{ : | {{ : | ||
| - | <note warning> | + | <note warning> |
| * 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 '' | * Appuyez sur '' | ||
| Ligne 1316: | Ligne 1330: | ||
| export DATADIR=/ | export DATADIR=/ | ||
| sed -i " | sed -i " | ||
| + | # Modification du dossier de sauvegarde de l' | ||
| + | sed -i ' | ||
| # Réduction du nombre d' | # Réduction du nombre d' | ||
| sed -i ' | sed -i ' | ||
| Ligne 1325: | Ligne 1341: | ||
| </ | </ | ||
| - | Le souci, c'est que le temps écoulé ici comprend (la première fois) le téléchargement et l' | + | Voici la sortie sur une machine équipée de GPUs Nvidia RTX 2080 Ti et GTX 1660 Ti. |
| + | |||
| + | < | ||
| + | TIME Command being timed: " | ||
| + | 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 | ||
| + | </ | ||
| + | |||
| + | Le souci, c'est que le temps écoulé ici comprend (la première fois) le téléchargement et l' | ||
| + | |||
| + | Une relance du même apprentissage offre la sortie suivante : | ||
| + | |||
| + | < | ||
| + | TIME Command being timed: " | ||
| + | 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 | ||
| + | </ | ||
| + | |||
| + | Dans le cas d'une exécution uniquement sur CPU (ici 2 Xeon E5-2637 v4 @ 3.50GHz), nous avons comme sortie : | ||
| + | |||
| + | < | ||
| + | TIME Command being timed: " | ||
| + | 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 | ||
| + | </ | ||
| - | <note warning> | + | <note warning> |
| * Préparez votre environnement | * Préparez votre environnement | ||
| - créez le dossier personnel dans ''/ | - créez le dossier personnel dans ''/ | ||
| Ligne 1335: | Ligne 1435: | ||
| - définissez la variable '' | - définissez la variable '' | ||
| - déplacez vous dans le dossier '' | - déplacez vous dans le dossier '' | ||
| - | - modifiez comme précisé | + | - modifiez comme précisé |
| - modifiez le nombre d' | - modifiez le nombre d' | ||
| * Lancez une première fois l' | * Lancez une première fois l' | ||
| Ligne 1344: | Ligne 1444: | ||
| * Lancez une seconde fois l' | * Lancez une seconde fois l' | ||
| - notez les informations de sortie préfixées par '' | - notez les informations de sortie préfixées par '' | ||
| - | * Lancez une seconde fois l' | + | * Lancez une seconde fois l' |
| - notez les informations de sortie | - notez les informations de sortie | ||
| * Comparez les résultats | * Comparez les résultats | ||
| - | * Qu' | + | * Qu' |
| </ | </ | ||
| Ligne 1354: | Ligne 1454: | ||
| Nous allons tenter de reproduire une [[https:// | Nous allons tenter de reproduire une [[https:// | ||
| - | <note warning> | + | <note warning> |
| * La documentation offre ceci : | * La documentation offre ceci : | ||
| - récupérez le source | - récupérez le source | ||
| Ligne 1367: | Ligne 1467: | ||
| </ | </ | ||
| - | En cas de difficultés, | + | En cas de difficultés, |
| - | <note warning> | + | <note warning> |
| * Quel '' | * Quel '' | ||
| * Quel '' | * Quel '' | ||
| Ligne 1381: | Ligne 1481: | ||
| Le code source est accessible par '' | Le code source est accessible par '' | ||
| - | <note warning> | + | <note warning> |
| * La documentation offre ceci : | * La documentation offre ceci : | ||
| - récupérez le source | - récupérez le source | ||
| Ligne 1398: | Ligne 1498: | ||
| L' | L' | ||
| - | <note warning> | + | <note warning> |
| * Passez dans le dossier '' | * Passez dans le dossier '' | ||
| * Exécutez '' | * Exécutez '' | ||
| Ligne 1404: | Ligne 1504: | ||
| </ | </ | ||
| - | En cas de difficultés, | + | En cas de difficultés, |
| ===== Conclusion ===== | ===== Conclusion ===== | ||
| Ligne 1412: | Ligne 1512: | ||
| L' | L' | ||
| - | --- // | + | --- // |