~~SLIDESHOW yatil~~
====== Utilisation de GPU ======
Cet article donne les instructions pour utiliser les GPU.
Nous ne traitons pas ici du modèle de programmation avec les GPU, la littérature disponible sur Internet est conséquente et suffisante.
===== Noeuds GPU =====
Le cluster comporte plusieurs nœuds GPU :
* ils sont regroupés dans une partition commune nommée ''gpu''
* les GPU disponibles sont des NVidia K20, K40m et GTX1080Ti (voir [[:materiel-cali2| page de description du matériel]])
* certains nœuds font aussi partie de //partitions privatives//, en conséquence un job de la partuition ''gpu'' peut être pré-empté (stoppé et resoumis) pour libérer des ressources.
La section suivante détaille comment sélectionner le type de GPU désiré via //slurm//, ainsi que la pré-emption.
===== Slurm avec les GPU =====
==== Exemple de batch Slurm ====
Vous devez donner le nom de la partition (''gpu'') et **le nombre de GPU**. Les autres ressources à indiquer sont identiques aux exemples usuels de batch.
Pour demander une seule GPU :
#SBATCH --partition=gpu
#SBATCH --gres=gpu
Pour demander **2 GPU**
#SBATCH --partition=gpu
#SBATCH --gres=gpu:2
==== Pour demander un type de GPU spécifique ====
Comme nous l'avons déjà vu, la partition possède des cartes de 3 types, ''K20'', ''K40m'' et ''GTX1080Ti''.
Si vous voulez explicitement utiliser tel ou tel //type// de carte, précisez-le :
#SBATCH --partition=gpu
#SBATCH --gres=gpu:GTX1080Ti:2
==== Eviter la pré-emption ====
Seul le noeud commun ''node29'' possède des ''K20''. En conséquence, si vous demandez des cartes de ce type, votre job sera placé sur un noeud ne faisant pas partie de //partition privative//, et il ne pourra donc pas être //pré-empté// -- Mais K20 sont des cartes très anciennes...
===== Calcul GPU et OpenMP / MPI =====
Sur noeud GPU, vous pouvez utiliser en plus des GPU du parallélisme "classique", par //thread// (OpenMP) ou avec MPI. Attention cependant, il faut garder des ressources pour la gestion des GPU .
===== Démarrer un shell interactif =====
Vous voudrez peut-être tester un code de façon interactive avant de soumettre de gros batchs. Cependant, le noeud frontal ne dispose pas de carte GPU... Vous pouvez demander à slurm l'ouverture d'un shell //bash// interactif sur la partition GPU avec une commande de la forme :
srun --partition=gpu --gres=gpu:1 --nodes=1 --ntasks-per-node=1 --time=01:00:00 --pty bash -i
Ajustez les ressources (nombre de GPU, nombre de taches ou de processeurs, temps, mémoire...) avec les mêmes options que pour un //batch// classique, en prenant en compte vos besoins. Si des ressources sont disponibles immédiatement dans la partition demandée, vous obtenez de suite un shell //bash//. S'il n'y a pas de ressource disponible, la commande vous laisse en attente...
===== Environnement de développement =====
==== Librairie CUDA ====
La librairie [[http://www.nvidia.fr/object/cuda-parallel-computing-fr.html | Nvidia CUDA]] est installée. Versions disponibles :
* 5.0
* 6.5
* 7.0
* 7.5
* 10.0
* 11.2
Pour l'utiliser, vous devez charger le [[:modules | module]] ''nivida/cuda'', par exemple :
module load nvidia/cuda/10.0
==== Compatibilité des versions ====
* CUDA 11.2 ne supporte plus la compilation pour architecture Kepler générique (''sm_30''), mais supporte encore les GPU ''sm_35'' (//deprecated//) -> on peut l'utiliser pour compiler du code pour le noeud commun ''node29''
* CUDA 10 ne supporte pas GCC > 7
*
==== Compilation ====
La compilation d'un programme avec CUDA se fait sur le nœud frontal, avec les compilateurs CUDA (''nvcc'')
Par défaut, ''nvcc'' utilise le compilateur GNU ''gcc'' pour la partie //host//. Vous pouvez compiler cette partie avec la suite Intel via l'option ''-ccbin=icc''
==== Documentations ====
Les documentations sont disponibles sur le site de NVidia, par exemple :
* https://docs.nvidia.com/cuda/archive/9.2/
* https://docs.nvidia.com/cuda/archive/11.2.0/