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