Ci-dessous, les différences entre deux révisions de la page.
Prochaine révision | Révision précédente | ||
formation:insa2018gpu:insa2018pkdgrav4stretch [2018/11/27 10:33] equemene créée |
formation:insa2018gpu:insa2018pkdgrav4stretch [2018/11/27 15:26] equemene [Compilation d'une version fonctionnelle] |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | [[formation:insa2018gpu|Retour aux travaux pratiques]] | ||
+ | |||
====== Compilation de PKDGRAV3 ====== | ====== Compilation de PKDGRAV3 ====== | ||
- | Au 27 novembre 2018, | + | ===== Une intégration non reproductible, dans le temps ou l'espace ===== |
+ | |||
+ | Au 27 novembre 2018, la compilation de ''PKDGRAV3'' se déroule sans difficulté, dès lors que le compilateur est compatible avec l'environnement CUDA. Seuls les compilateurs GNU 4.9 permettent d'obtenir un exécutable. | ||
+ | |||
+ | Par contre, lors de l'exécution, les choses se corsent : sur la version du 27 novembre, seules les cartes Tesla fonctionnent avec l'exemple, dès lors qu'elles sont bien pointées par la variable ''CUDA_VISIBLE_DEVICES''. En effet, PKDGRAV3 n'est pas multi-gpu : s'il détecte plusieurs périphériques Nvidia à l'exécution, il plante avec le message suivant :<code> | ||
+ | cudaSetDevice error 10 in /local/root/INSA/dpotter-pkdgrav3-f156bcc06373/cudautil.cu(219) | ||
+ | invalid device ordinal | ||
+ | </code> | ||
+ | |||
+ | Aucune des cartes RTX, GTX ou Quadro ne permettent son exécution avec un message d'erreur à rendre perplexe le plus aguerri des intégrateurs :-/ . La sortie offre une bordée d'injures :<code> | ||
+ | Caught signal 11 at address (nil) | ||
+ | Frame 0: ../build/pkdgrav3() [0x4a58af] | ||
+ | Frame 1: ../build/pkdgrav3() [0x4a5a31] | ||
+ | Frame 2: /lib/x86_64-linux-gnu/libpthread.so.0(+0x110c0) [0x2ac2ba61e0c0] | ||
+ | Frame 3: ../build/pkdgrav3(pkdGenerateIC+0x2117) [0x46ebb7] | ||
+ | Frame 4: ../build/pkdgrav3(pltGenerateIC+0x1a1) [0x470031] | ||
+ | Frame 5: ../build/pkdgrav3(mdlHandler+0x8a) [0x4afd5a] | ||
+ | Frame 6: ../build/pkdgrav3(main_ch+0x83) [0x4151b3] | ||
+ | Frame 7: ../build/pkdgrav3() [0x4af7bf] | ||
+ | Frame 8: /lib/x86_64-linux-gnu/libpthread.so.0(+0x7494) [0x2ac2ba614494] | ||
+ | Frame 9: /lib/x86_64-linux-gnu/libc.so.6(clone+0x3f) [0x2ac2bcff5acf] | ||
+ | </code> | ||
+ | |||
+ | A ce jour, la seule version fonctionnelle pour toutes les cartes à disposition est la version du 8 octobre 2018. Heureusement, nous en vons une archive que nous allons exploiter. | ||
+ | |||
+ | PKDGRAV3 est un exemple de programme GPUfié mais en développement tel qu'il n'est pas possible d'en assuré un suivi opérationnel. | ||
+ | |||
+ | ===== Compilation d'une version fonctionnelle ===== | ||
+ | |||
+ | La recette pour compiler PKDGRAV3 ur du Debian Stretch 9.0 est la suivante : | ||
+ | - Définition de la variable TIME pour la métrologie : <code>export TIME=$(cat '/etc/time_command.cfg')</code> | ||
+ | - Création du dossier utilisateur :<code>mkdir -p /local/$USER</code> | ||
+ | - Placement dans le dossier créé :<code>cd /local/$USER</code> | ||
+ | - Récupération du source <code>wget http://www.cbp.ens-lyon.fr/emmanuel.quemener/software/pkdgrav-20181008.tgz</code> | ||
+ | - Expansion de l'archive : <code>tar xzf pkdgrav-20181008.tgz</code> | ||
+ | - Passage dans le dossier de l'archive : <code>cd pkdgrav-20181008</code> | ||
+ | - Création d'une variable positionnant la racine du source : <code>export PKDGRAV3=$PWD</code> | ||
+ | - Création d'un dossier de construction : <code>mkdir build</code> | ||
+ | - Passage dans le dossier de construction : <code>cd build</code> | ||
+ | - Construction des tâches de compilation : <code>CC=gcc-4.9 CXX=g++-4.9 cmake ..</code> | ||
+ | - Compilation du programme en mode parallèle : <code>make -j 16 > pkdgrav3-Compile-$(date "+%Y%m%d-%H%M") 2>&1</code> | ||
+ | |||
+ | ===== Exécution de l'exemple fourni dans l'environnement du CBP ===== | ||
+ | |||
+ | - Déplacement dans le dossier d'exemples : <code>cd $PKDGRAV3/examples</code> | ||
+ | - Lancement de l'exemple sur GPU : <code>/usr/bin/time ../build/pkdgrav3 cosmology.par > cosmology-$(date "+%Y%m%d-%H%M%S").out 2>&1</code> | ||
+ | - Préparation du lancement sur CPU : <code>rm .lockfile example.*</code> | ||
+ | - Lancement de l'exemple sur CPU : <code>/usr/bin/time ../build/pkdgrav3 -cqs 0 cosmology.par > cosmology-$(date "+%Y%m%d-%H%M%S").out 2>&1</code> | ||
+ | |||
+ | Les deux fichiers de sortie en ''*.out'' donnent les informations sur les exécutions et la métrologie associée. Un ''grep'' sur le mot ''Elapsed'' extrait les temps d'exécution sur GPU et CPU. | ||
+ | |||
+ |