Programmation sur GPU avec CUDA



Documents pareils
. Plan du cours. . Architecture: Fermi ( ), Kepler (12-?)

Introduction à CUDA.

Introduction à la programmation des GPUs

Contrôle Non Destructif : Implantation d'algorithmes sur GPU et multi-coeurs. Gilles Rougeron CEA/LIST Département Imagerie Simulation et Contrôle

Une bibliothèque de templates pour CUDA

Segmentation d'images à l'aide d'agents sociaux : applications GPU

Architecture des ordinateurs

Calcul multi GPU et optimisation combinatoire

M2-Images. Rendu Temps Réel - OpenGL 4 et compute shaders. J.C. Iehl. December 18, 2013

Initiation au HPC - Généralités

Génération de code binaire pour application multimedia : une approche au vol

Hiérarchie matériel dans le monde informatique. Architecture d ordinateur : introduction. Hiérarchie matériel dans le monde informatique

Architecture des calculateurs

<Insert Picture Here> Solaris pour la base de donnés Oracle

Software and Hardware Datasheet / Fiche technique du logiciel et du matériel

Retour d expérience, portage de code Promes dans le cadre de l appel à projets CAPS-GENCI

Le signal GPS. Les horloges atomiques à bord des satellites GPS produisent une fréquence fondamentale f o = Mhz

Comment reproduire les résultats de l article : POP-Java : Parallélisme et distribution orienté objet

TP: Représentation des signaux binaires. 1 Simulation d un message binaire - Codage en ligne

Introduction à MATLAB R

VMware ESX : Installation. Hervé Chaudret RSI - Délégation Centre Poitou-Charentes

Robot WIFIBOT Lab V3. 4 roues motrices

I. Programmation I. 1 Ecrire un programme en Scilab traduisant l organigramme montré ci-après (on pourra utiliser les annexes):

Master première année. Mention : Statistiques et Traitement de Données «STD» Rapport de stage

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Exemple PLS avec SAS

Séminaire RGE REIMS 17 février 2011

Introduction au calcul parallèle avec OpenCL

Potentiels de la technologie FPGA dans la conception des systèmes. Avantages des FPGAs pour la conception de systèmes optimisés

Caractéristiques principales:

CONTEC CO., LTD. Novembre 2010

Info0804. Cours 6. Optimisation combinatoire : Applications et compléments

INSTRUMENTS DE MESURE SOFTWARE. Management software for remote and/or local monitoring networks

Quantification d incertitude et Tendances en HPC

Rapport de stage Master 2

27/11/12 Nature. SDK Python et Java pour le développement de services ACCORD Module(s)

Programmation C. Apprendre à développer des programmes simples dans le langage C

Installation de VirtualPOPC-1 sur Ubuntu Server LTS 64bits

MapReduce. Malo Jaffré, Pablo Rauzy. 16 avril 2010 ENS. Malo Jaffré, Pablo Rauzy (ENS) MapReduce 16 avril / 15

Post-processing of multimodel hydrological forecasts for the Baskatong catchment

Lamia Oukid, Ounas Asfari, Fadila Bentayeb, Nadjia Benblidia, Omar Boussaid. 14 Juin 2013

Evaluation des performances de programmes parallèles haut niveau à base de squelettes

Exercices sur SQL server 2000

LABO 5 ET 6 TRAITEMENT DE SIGNAL SOUS SIMULINK

Outil d aide au choix Serveurs Lot 4 Marché Groupement de Recherche

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Modèle de troncature gauche : Comparaison par simulation sur données indépendantes et dépendantes

Journée Utiliateurs Nouvelles du Pôle ID (Informatique) Pierre Neyron, LIG/CNRS

Structure de base d un ordinateur

Tests de performance du matériel

Optimisation de logiciels de modélisation sur centre de calcul

Principe de symétrisation pour la construction d un test adaptatif

Anticiper et prédire les sinistres avec une approche Big Data

Chapitre 1. Infrastructures distribuées : cluster, grilles et cloud. Grid and Cloud Computing

Expérience de Stern et Gerlach et décohérence: l'ordinateur quantique est-il vraiment possible?

XtremWeb-HEP Interconnecting jobs over DG. Virtualization over DG. Oleg Lodygensky Laboratoire de l Accélérateur Linéaire

Maarch Framework 3 - Maarch. Tests de charge. Professional Services. 11, bd du Sud Est Nanterre

La Forge INRIA : bilan et perspectives. Hervé MATHIEU - 11 mai 2010

Simulation de variables aléatoires

Kick Off SCC EMC l offre EXTREMIO. fmarti@fr.scc.com Philippe.rolland@emc.com. Vers de nouveaux horizons

Backup , l intégration du backup sur disque

Limitations of the Playstation 3 for High Performance Cluster Computing

Sur un ordinateur portable ou un All-in-One tactile, la plupart des éléments mentionnés précédemment sont regroupés. 10) 11)

Architecture des Ordinateurs. Partie II:

Notes du cours MTH1101 Calcul I Partie II: fonctions de plusieurs variables

Ordinateur portable GAMER - GE620DX

Exigences système Edition & Imprimeries de labeur

I00 Éléments d architecture

PACKZ System Requirements. Version: Version: Copyright 2015, PACKZ Software GmbH. 1

HAUTE DISPONIBILITÉ DE MACHINE VIRTUELLE AVEC HYPER-V 2012 R2 PARTIE CONFIGURATION OPENVPN SUR PFSENSE

Fiche technique CPU 315SN/PN (315-4PN33)

3.2. Matlab/Simulink Généralités

IFT Systèmes d exploitation - TP n 1-20%

Initiation. àl algorithmique et à la programmation. en C

Object Removal by Exemplar-Based Inpainting

Budget Constrained Resource Allocation for Non-Deterministic Workflows on a IaaS Cloud

Surveillance de Scripts LUA et de réception d EVENT. avec LoriotPro Extended & Broadcast Edition

ESXi: Occupation RAM avec VM_Windows et VM_Linux. R. Babel, A. Ouadahi April 10, 2011

Exigences système Edition & Imprimeries de labeur

Python - introduction à la programmation et calcul scientifique

TPs Architecture des ordinateurs DUT Informatique - M4104c SUJETS. R. Raffin Aix-Marseille Université romain.raffin-at-univ-amu.fr

Baccalauréat ES Pondichéry 7 avril 2014 Corrigé

Un modèle stochastique du taux d intérêt implicite en microcrédit

Institut français des sciences et technologies des transports, de l aménagement

INTRODUCTION AUX SGBD/R LUW

StruxureWare Power Monitoring v7.0. La nouvelle génération en matière de logiciel de gestion complète d énergie

Agenda. Exemple : données et back à Eurecom SANs and NAS. Les bases: SANs. Back-up Partage de fichier. Disques et Raid SCSI et FCP

ERESI : une plate-forme d'analyse binaire au niveau noyau. The ERESI team

Machines Virtuelles. et bazard autour. Rémi Forax

Cours 7 : Utilisation de modules sous python

Introduction au pricing d option en finance

Chapitre 4 : Les mémoires

Improving the breakdown of the Central Credit Register data by category of enterprises

Eléments d architecture des machines parallèles et distribuées

Z-Axis Compliance Device Compliance en z

SQL Parser XML Xquery : Approche de détection des injections SQL

Forthcoming Database

Rapport d activité. Mathieu Souchaud Juin 2007

Quantification Scalaire et Prédictive

Transcription:

Programmation sur GPU avec CUDA Initiation François Cuvelier Laboratoire d'analyse Géométrie et Applications Institut Galilée Université Paris XIII. 24 mars 2014 Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 1 / 37

Avant d'oublier! Ecole Doctorale / Module Calcul Scientique la séance du 10 avril est décalée au mardi 29 avril! Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 2 / 37

Plan 1 Présentation GPU pour le calcul scientique GPU Nvidia, Langage CUDA Exemple d'utilisation Calcul GPU sur magi 2 Objectifs 3 Exercices Exercice 0 : DeviceQuery Exercice 1 : vectoradd Exercice 2 : axpbyvector Exercice 3 : Thrust Exercice 4 : axpbyvectorthrust Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 3 / 37

GPU GPU : Graphics Processing Unit ou processeur graphique. Massivement parallèle (plusieurs centaines de coeurs), Opérations sur les vecteurs, matrices et textures à grandes vitesses, outils de programmation : AMD APP SDK, Nvidia CUDA, OpenCL,... Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 4 / 37

Plan 1 Présentation GPU pour le calcul scientique GPU Nvidia, Langage CUDA Exemple d'utilisation Calcul GPU sur magi 2 Objectifs 3 Exercices Exercice 0 : DeviceQuery Exercice 1 : vectoradd Exercice 2 : axpbyvector Exercice 3 : Thrust Exercice 4 : axpbyvectorthrust Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 5 / 37

CUDA Le CPU ou host demande au GPU ou device d'eectuer certains calculs. Un kernel CUDA est une portion parallèle de code à exécuter sur le GPU par un ensemble de threads (processus, tâche,...) Ÿ Ÿ Ÿ Tous les threads exécute le même code. Chaque thread peut être identier de manière unique. Un kernel lance une grid (ou grille) constituée de blocks (ou blocs). Chaque block est constitué de threads. Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 6 / 37

Plan 1 Présentation GPU pour le calcul scientique GPU Nvidia, Langage CUDA Exemple d'utilisation Calcul GPU sur magi 2 Objectifs 3 Exercices Exercice 0 : DeviceQuery Exercice 1 : vectoradd Exercice 2 : axpbyvector Exercice 3 : Thrust Exercice 4 : axpbyvectorthrust Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 7 / 37

Thèse de N. Belaribi (2012) Sur une classe d'edp à coecients irréguliers : Existence, unicité, représentation probabiliste, propagation du chaos, Thèse dirigée par F. Russo soutenue le 29 novembre 2012. Probabilistic and deterministic algorithms for space multidimensional irregular porous media equation Belaribi, N., Cuvelier, F. and Russo, F. Stochastic Partial Dierential Equations : Analysis and Computations March 2013, Volume 1, Issue 1, pp 3-62. DOI 10.1007/s40072-013-0001-7 A probabilistic algorithm approximating solutions of a singular PDE of porous media type Belaribi, N., Cuvelier, F. and Russo, F. Monte Carlo Methods and Applications, Volume 17 (2011), Issue 4, Pages 317-369. DOI 10.1515/mcma.2011.014 Quel rapport avec les GPU? Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 8 / 37

Thèse de N. Belaribi (2012) Extrait simplié d'un code Matlab (EDP 2D en espace) x1=-5:1/10:5;x2=x1; for k=1:nt % Boucle en temps X1=X1+... % vecteur aleatoire dimension N>>1 X2=X2+... % vecteur aleatoire dimension N>>1 z=ksdensity2d(x1,x2,x1,x2,...)... end Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 9 / 37

Thèse de N. Belaribi (2012) Extrait simplié d'un code Matlab (EDP 2D en espace) x1=-5:1/10:5;x2=x1; for k=1:nt % Boucle en temps X1=X1+... % vecteur aleatoire dimension N>>1 X2=X2+... % vecteur aleatoire dimension N>>1 z=ksdensity2d(x1,x2,x1,x2,...)... end problème majeur : durée d'éxécution > semaine! Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 9 / 37

Thèse de N. Belaribi (2012) Extrait simplié d'un code Matlab (EDP 2D en espace) x1=-5:1/10:5;x2=x1; for k=1:nt % Boucle en temps X1=X1+... % vecteur aleatoire dimension N>>1 X2=X2+... % vecteur aleatoire dimension N>>1 z=ksdensity2d(x1,x2,x1,x2,...)... end problème majeur : durée d'éxécution > semaine! raison : fonction ksdensity2d très couteuses ( 95% du temps CPU) Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 9 / 37

Thèse de N. Belaribi (2012) Extrait simplié d'un code Matlab (EDP 2D en espace) x1=-5:1/10:5;x2=x1; for k=1:nt % Boucle en temps X1=X1+... % vecteur aleatoire dimension N>>1 X2=X2+... % vecteur aleatoire dimension N>>1 z=ksdensity2d(x1,x2,x1,x2,...)... end problème majeur : durée d'éxécution > semaine! raison : fonction ksdensity2d très couteuses ( 95% du temps CPU) objectif : utiliser, de manière transparente, un GPU pour ce calcul. Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 9 / 37

Thèse de N. Belaribi (2012) For a bivariate random sample X 1, X 2,..., X N kernel density estimate is dened by drawn from a density f, the F X px; Hq 1 N Ņ i1 K H px X i q where x px 1, x 2 q t and X i px i,1, X i,2q t, @i P v1, Nw. Here K H pxq H 1{2 KpH 1{2 xq and K is the kernel which is a symmetric probability density function, H is the bandwidth matrix which is symmetric and positive-denite. We take Kpxq 1 2π expp 1 xx, xyq the standard 2 normal density. Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 10 / 37

Thèse de N. Belaribi (2012) Usual bivariate distributions U pra 1, b 1 s ra 2, b 2 sq : bivariate uniform distribution over ra 1, b 1 s ra 2, b 2 s. Density function : f pxq 1 ra 1,b1s ra2,b2spxq. N pm, Sq : bivariate normal distribution (mean vector m P R 2 and covariance matrix S P M 2,2 prq) Density function : f px; m, Sq 1 @ D 2π detpsq expp 1 S 1 px mq, x m q 1{2 2 Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 11 / 37

y Cuvelier F. (Ecole Doctorale) Figure: Programmation Probabilitysur density GPU avecfunction CUDA D 1 24 mars 2014 12 / 37 Thèse de N. Belaribi (2012) bivariate distribution sample D 1 0.50 U pr 1.00, 1.00s r 1.00, 1.00sq 0.00 0.30 0.00 0.25 N ; 0.00 0.00 0.70 0.50 0.10 0.00 0.25 N ; 0.50 0.00 0.30 2 Probability density function D 1 (x,y) 1.5 0.35 1 0.3 0.5 0.25 0 0.2 0.5 1 0.15 1.5 0.1 2 0.05 2.5 1.5 1 0.5 0 0.5 1 1.5 x

Thèse de N. Belaribi (2012) Comparison of several versions of ksdensity2d function implemented in Matlab : ksdensity2d_optv0 : code without Toolbox. ksdensity2d_optv1 : code using mvnpdf function from Matlab Statistics Toolbox. ksdensity2d_gpuv0 : code using GPU under Matlab (version 0) Ñ CUDA kernel function + Matlab PCT Toolbox. ksdensity2d_gpuv1 : code using GPU under Matlab (version 1) Ñ CUDA kernel function with shared memory + Matlab PCT Toolbox. Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 13 / 37

Thèse de N. Belaribi (2012) 10000 20000 30000 40000 50000 60000 70000 80000 90000 100000 N OptV1 OptV0 44.919 (s) x 1.00 94.996 (s) x 1.00 139.311 (s) x 1.00 190.900 (s) x 1.00 235.426 (s) x 1.00 246.112 (s) x 1.00 296.531 (s) x 1.00 368.510 (s) x 1.00 425.157 (s) x 1.00 460.035 (s) x 1.00 23.691 (s) x 1.90 37.137 (s) x 2.56 55.307 (s) x 2.52 65.643 (s) x 2.91 68.924 (s) x 3.42 68.362 (s) x 3.60 101.305 (s) x 2.93 120.110 (s) x 3.07 115.732 (s) x 3.67 128.837 (s) x 3.57 GpuV0 (sm_20) 0.743 (s) x 60.42 1.472 (s) x 64.52 2.201 (s) x 63.30 2.929 (s) x 65.17 3.658 (s) x 64.37 4.386 (s) x 56.11 5.116 (s) x 57.96 5.843 (s) x 63.07 6.575 (s) x 64.67 7.410 (s) x 62.08 GpuV1 (sm_20) 0.053 (s) x 841.88 0.082 (s) x 1154.91 0.111 (s) x 1255.52 0.140 (s) x 1368.38 0.169 (s) x 1394.52 0.197 (s) x 1247.24 0.226 (s) x 1314.19 0.255 (s) x 1447.94 0.283 (s) x 1502.20 0.314 (s) x 1465.49 Table: ksdensity2d - Probability Density : D 1 - time and speedup Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 14 / 37

Plan 1 Présentation GPU pour le calcul scientique GPU Nvidia, Langage CUDA Exemple d'utilisation Calcul GPU sur magi 2 Objectifs 3 Exercices Exercice 0 : DeviceQuery Exercice 1 : vectoradd Exercice 2 : axpbyvector Exercice 3 : Thrust Exercice 4 : axpbyvectorthrust Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 15 / 37

GPU sur magi Sur MAGI, 4 GPU (devices) de type "Nvidia Tesla T10 Processor" de 2008. GPU Mém. coeurs bande passante Pic perf. T10 (2008) 4Go 240 102 GB/s 0.19 Tops K40 (2013) 12Go 2880 288 GB/s 1.43 Tops CUDA version 5.5 (répertoire /usr/local/cuda) et exemples dans /usr/local/cuda/samples/. Compilateur nvcc, répertoire /usr/local/cuda/bin et librairies dans répertoire /usr/local/cuda/lib64. ñ LD_LIBRARY_PATH et PATH à congurer si besoin. Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 16 / 37

Objectifs Apprendre à compiler et exécuter les exemples fournis avec CUDA ñ Exercices 0 et 1. Utiliser le GPU sur une partie d'un code existant ñ Exercice 2 Utilisation des librairies Thrust et curand ñ Exercices 3 et 4 Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 17 / 37

Plan 1 Présentation GPU pour le calcul scientique GPU Nvidia, Langage CUDA Exemple d'utilisation Calcul GPU sur magi 2 Objectifs 3 Exercices Exercice 0 : DeviceQuery Exercice 1 : vectoradd Exercice 2 : axpbyvector Exercice 3 : Thrust Exercice 4 : axpbyvectorthrust Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 18 / 37

Exo00 : DeviceQuery Récupération des codes : $ mkdir exo00 $ cd exo00 $ cp -R /usr/local/cuda/samples/1_utilities/devicequery/*. $ make clean Modication du Makefile : Ÿ ligne 103, remplacer par : INCLUDES := -I$(CUDA_PATH)/samples/common/inc Ÿ lignes 128 et 129 à commenter. Compilation $ make Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 19 / 37

Exo00 : DeviceQuery Execution du programme sur magi : $ srun -p GPU --gres=gpu:4 devicequery En sortie, on obtient devicequery Starting... CUDA Device Query (Runtime API) version (CUDART static linking) Detected 4 CUDA Capable device(s) devicequery, CUDA Driver = CUDART, CUDA Driver Version = 5.5, CUDA Runtime Version = 5.5, NumDevs = 4, D Device 0: "Tesla T10 Processor" CUDA Driver Version / Runtime Version 5.5 / 5.5 CUDA Capability Major/Minor version number: 1.3 Total amount of global memory: 4096 MBytes (4294770688 bytes) (30) Multiprocessors, ( 8) CUDA Cores/MP: 240 CUDA Cores GPU Clock rate: 1296 MHz (1.30 GHz) Memory Clock rate: 800 Mhz Memory Bus Width: 512-bit Maximum Texture Dimension Size (x,y,z) 1D=(8192), 2D=(65536, 32768), 3D=(2048, 2048, 2048) Maximum Layered 1D Texture Size, (num) layers 1D=(8192), 512 layers Maximum Layered 2D Texture Size, (num) layers 2D=(8192, 8192), 512 layers Total amount of constant memory: 65536 bytes Total amount of shared memory per block: 16384 bytes... Result = PASS Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 20 / 37

Exo00 : DeviceQuery Compilation avec le compilateur Nvidia nvcc : $ nvcc -o devicequery devicequery.cpp Compilation avec le compilateur gcc : $ g++ -c devicequery.cpp -I /usr/local/cuda-5.5/include -I /usr/local/cuda-5.5/samples/common/inc $ g++ -o devicequery devicequery.o -L/usr/local/cuda-5.5/lib64 -lcudart Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 21 / 37

Plan 1 Présentation GPU pour le calcul scientique GPU Nvidia, Langage CUDA Exemple d'utilisation Calcul GPU sur magi 2 Objectifs 3 Exercices Exercice 0 : DeviceQuery Exercice 1 : vectoradd Exercice 2 : axpbyvector Exercice 3 : Thrust Exercice 4 : axpbyvectorthrust Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 22 / 37

Exo00 : DeviceQuery Récupération des codes : $ mkdir exo01 $ cd exo01 $ cp -R /usr/local/cuda/samples/0_simple/vectoradd/*. $ make clean Modication du Makefile : Ÿ ligne 103, remplacer par : INCLUDES := -I$(CUDA_PATH)/samples/common/inc Ÿ lignes 128 et 129 à commenter. Compilation $ make Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 23 / 37

Exo01 : vectoradd Execution du programme sur magi : $ srun -p GPU --gres=gpu:1 vectoradd En sortie, on obtient [Vector addition of 50000 elements] Copy input data from the host memory to the CUDA device CUDA kernel launch with 196 blocks of 256 threads Copy output data from the CUDA device to the host memory Test PASSED Done Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 24 / 37

Exo01 : vectoradd Compilation avec le compilateur Nvidia nvcc : $ Exo01 : vectoradd Que fait le programme? Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 25 / 37

Exo01 : vectoradd Compilation avec le compilateur Nvidia nvcc : $ Exo01 : vectoradd Que fait le programme? Allocation mémoire de h_a, h_b et h_c sur le host (CPU). Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 25 / 37

Exo01 : vectoradd Compilation avec le compilateur Nvidia nvcc : $ Exo01 : vectoradd Que fait le programme? Allocation mémoire de h_a, h_b et h_c sur le host (CPU). Initialisation de h_a et h_b. Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 25 / 37

Exo01 : vectoradd Compilation avec le compilateur Nvidia nvcc : $ Exo01 : vectoradd Que fait le programme? Allocation mémoire de h_a, h_b et h_c sur le host (CPU). Initialisation de h_a et h_b. Allocation mémoire de d_a, d_b et d_c sur le device (GPU). Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 25 / 37

Exo01 : vectoradd Compilation avec le compilateur Nvidia nvcc : $ Exo01 : vectoradd Que fait le programme? Allocation mémoire de h_a, h_b et h_c sur le host (CPU). Initialisation de h_a et h_b. Allocation mémoire de d_a, d_b et d_c sur le device (GPU). Copie de h_a dans d_a et de h_b dans d_b. Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 25 / 37

Exo01 : vectoradd Compilation avec le compilateur Nvidia nvcc : $ Exo01 : vectoradd Que fait le programme? Allocation mémoire de h_a, h_b et h_c sur le host (CPU). Initialisation de h_a et h_b. Allocation mémoire de d_a, d_b et d_c sur le device (GPU). Copie de h_a dans d_a et de h_b dans d_b. Utilisation du kernel vectoradd pour calculer d_c ( "d_a" + "d_b"). Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 25 / 37

Exo01 : vectoradd Compilation avec le compilateur Nvidia nvcc : $ Exo01 : vectoradd Que fait le programme? Allocation mémoire de h_a, h_b et h_c sur le host (CPU). Initialisation de h_a et h_b. Allocation mémoire de d_a, d_b et d_c sur le device (GPU). Copie de h_a dans d_a et de h_b dans d_b. Utilisation du kernel vectoradd pour calculer d_c ( "d_a" + "d_b"). Copie de d_c dans h_c. Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 25 / 37

Exo01 : vectoradd Compilation avec le compilateur Nvidia nvcc : $ Exo01 : vectoradd Que fait le programme? Allocation mémoire de h_a, h_b et h_c sur le host (CPU). Initialisation de h_a et h_b. Allocation mémoire de d_a, d_b et d_c sur le device (GPU). Copie de h_a dans d_a et de h_b dans d_b. Utilisation du kernel vectoradd pour calculer d_c ( "d_a" + "d_b"). Copie de d_c dans h_c. Liberation de la mémoire alluée sur GPU puis sur CPU. Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 25 / 37

Exo01 : vectoradd Sources du kernel vectoradd 1 global v o i d 2 v e c t o r A d d ( c onst f l o a t A, c onst f l o a t B, f l o a t C, 3 i n t numelements ) 4 { 5 i n t i = blockdim. x b l o c k I d x. x + t h r e a d I d x. x ; 6 7 i f ( i < numelements ) 8 { 9 C [ i ] = A [ i ] + B [ i ] ; 10 } 11 } Appel du kernel vectoradd vectoradd <<<b l o c k s P e r G r i d, t h r e a d s P e r B l o c k >>>(d_a, d_b, d_c, numelements ) ; global : kernel exectuable sur le device depuis le host. griddim : nombre de blocks dans la grid. blockdim : nombre de threads dans un block. blockidx.x : numéro du block dans la grid. threadidx.x : numéro du thread dans le block. Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 26 / 37

Plan 1 Présentation GPU pour le calcul scientique GPU Nvidia, Langage CUDA Exemple d'utilisation Calcul GPU sur magi 2 Objectifs 3 Exercices Exercice 0 : DeviceQuery Exercice 1 : vectoradd Exercice 2 : axpbyvector Exercice 3 : Thrust Exercice 4 : axpbyvectorthrust Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 27 / 37

Exo02 : axpbyvector On dispose d'un code en Langage C eectuant les opération suivantes : 1 Allocation et initialisation de deux vecteurs aléatoires x et y (loi uniforme r0, 1s) de dimension 2 10 7. 2 Allocation du vecteur z de dimension 2 10 7. 3 z Ð 2 x 3 y via l'appel axpbyvector(n,2.,x,3., y,z ); 4 Calcul des moyennes de chacun des vecteurs. Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 28 / 37

Exo02 : axpbyvector On dispose d'un code en Langage C eectuant les opération suivantes : 1 Allocation et initialisation de deux vecteurs aléatoires x et y (loi uniforme r0, 1s) de dimension 2 10 7. 2 Allocation du vecteur z de dimension 2 10 7. 3 z Ð 2 x 3 y via l'appel axpbyvector(n,2.,x,3., y,z ); 4 Calcul des moyennes de chacun des vecteurs. Objectif : Remplacer la fonction axpbyvector par son équivalent sur GPU! Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 28 / 37

Exo02 : axpbyvector Récupération et compilation des codes : $ wget http://www.math.univ-paris13.fr/~cuvelier/docs/ Ðâ Informatique/CUDA/TPs_5.5/exo02/exo02.tar.gz $ tar zxvf exo02.tar.gz $ cd exo02 $ make Execution du code CPU : srun -n 1./axpbyVector Time to generate datas (N=20000000) : 509.0570(ms) Time for axpbyvector function (N=20000000) : 155.0580(ms) mean(x)=0.499947, mean(y)=0.500003, mean(z)=2.4999 Time for means computation : 215.1300(ms) Memory used by each vector : 160 Mo Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 29 / 37

Exo02 : axpbyvector Objectif : Remplacer la fonction axpbyvector par son équivalent sur GPU! 1 Allocation et initialisation de deux vecteurs aléatoires x et y (loi uniforme r0, 1s) de dimension N 2 10 7. 2 Allocation du vecteur z de dimension N. 3 z Ð 2 x 3 y via l'appel axpbyvector(n,2.,x,3., y,z ); 4 Calcul des moyennes de chacun des vecteurs. Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 30 / 37

Exo02 : axpbyvector Objectif : Remplacer la fonction axpbyvector par son équivalent sur GPU! 1 Allocation et initialisation de deux vecteurs aléatoires x et y (loi uniforme r0, 1s) de dimension N 2 10 7. 2 Allocation du vecteur z de dimension N. 3 1 Allocation des vecteurs d_x, d_y et d_z sur GPU (dimension N) 2 Transfert des vecteurs x et y dans respectivement d_x et d_y 3 d_z Ð 2 d_x 3 d_y via l'appel du kernel : axpbygpuvector<<<128, 128>>>(N,2.,d_x,3.,d_y,d_z); 4 Transfert du vecteur d_z dans z 4 Calcul des moyennes de chacun des vecteurs. Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 30 / 37

Exo02 : axpbyvector Execution du code pure CPU : srun -n 1./axpbyVector Time to generate datas (N=20000000) : 509.0570(ms) Time for axpbyvector function (N=20000000) : 155.0580(ms) mean(x)=0.499947, mean(y)=0.500003, mean(z)=2.4999 Time for means computation : 215.1300(ms) Memory used by each vector : 160 Mo Execution du code CPU/GPU : srun -p GPU --gres=gpu:1 axpbyvectorgpu Time to generate datas (N=20000000) : 687.9780(ms) Time for transfert CPU->GPU : 158.8030(ms) Time for axpbygpuvector function (N=20000000) : 5.9350(ms) Time for transfert GPU->CPU : 162.6770(ms) mean(x)=0.50005, mean(y)=0.500049, mean(z)=2.50025 Memory used by each vector : 160 Mo Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 31 / 37

Exo02 : axpbyvector Execution du code pure CPU : srun -n 1./axpbyVector Time to generate datas (N=20000000) : 509.0570(ms) Time for axpbyvector function (N=20000000) : 155.0580(ms) mean(x)=0.499947, mean(y)=0.500003, mean(z)=2.4999 Time for means computation : 215.1300(ms) Memory used by each vector : 160 Mo Execution du code CPU/GPU : srun -p GPU --gres=gpu:1 axpbyvectorgpu Time to generate datas (N=20000000) : 687.9780(ms) Time for transfert CPU->GPU : 158.8030(ms) Time for axpbygpuvector function (N=20000000) : 5.9350(ms) Time for transfert GPU->CPU : 162.6770(ms) mean(x)=0.50005, mean(y)=0.500049, mean(z)=2.50025 Memory used by each vector : 160 Mo Conclusion? Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 31 / 37

Plan 1 Présentation GPU pour le calcul scientique GPU Nvidia, Langage CUDA Exemple d'utilisation Calcul GPU sur magi 2 Objectifs 3 Exercices Exercice 0 : DeviceQuery Exercice 1 : vectoradd Exercice 2 : axpbyvector Exercice 3 : Thrust Exercice 4 : axpbyvectorthrust Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 32 / 37

Exo03 : Thrust Thrust : a C++ template library for CUDA based on the Standard Template Library STL. version 1.7 fourni en standard avec CUDA, exemples fournis sur le site http://thrust.github.io informations supplémentaires https://github.com/thrust/thrust/wiki/quick-start-guide Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 33 / 37

Exo03 : Thrust Téléchargement des exemples : $ wget http://www.math.univ-paris13.fr/~cuvelier/docs/ Ðâ Informatique/CUDA/TPs_5.5/Thrust-1.7-examples.tar.gz $ tar zxvf Thrust-1.7-examples.tar.gz $ cd Thrust-1.7-examples Compilation de basic_vector.cu nvcc -o basic_vector basic_vector.cu Execution de basic_vector srun -p GPU --gres=gpu:1 basic_vector Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 34 / 37

Plan 1 Présentation GPU pour le calcul scientique GPU Nvidia, Langage CUDA Exemple d'utilisation Calcul GPU sur magi 2 Objectifs 3 Exercices Exercice 0 : DeviceQuery Exercice 1 : vectoradd Exercice 2 : axpbyvector Exercice 3 : Thrust Exercice 4 : axpbyvectorthrust Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 35 / 37

Exo04 : axpbyvectorthrust Objectif : Intégralité des calculs de l'exemple axpbyvector sur GPU avec utilisation des les librairies Thrust et curand fournies avec CUDA. Récupération et compilation des codes : $ wget http://www.math.univ-paris13.fr/~cuvelier/docs/ Ðâ Informatique/CUDA/TPs_5.5/exo04/exo04.tar.gz $ tar zxvf exo04.tar.gz $ cd exo04 $ make Remarque : chier axpbyvectorthrust.cu (GPU) 98 lignes et chier axpbyvector.c (CPU) 85 lignes! Performances? Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 36 / 37

Exo04 : axpbyvectorthrust Execution du code pure CPU : srun -n 1./axpbyVector Time to generate datas (N=20000000) : 509.0570(ms) Time for axpbyvector function (N=20000000) : 155.0580(ms) mean(x)=0.499947, mean(y)=0.500003, mean(z)=2.4999 Time for means computation : 215.1300(ms) Memory used by each vector : 160 Mo Execution du code GPU : srun -p GPU --gres=gpu:1 axpbyvectorthrust Time to generate datas (N=20000000) : 68.46(ms) Time for saxpby_fast function (N=20000000) : 5.796(ms) mean(x)=0.500044, mean(y)=0.499966, mean(z)=2.49999 Time for means computation : 7.897(ms) Memory used by each vector : 160 Mo Cuvelier F. (Ecole Doctorale) Programmation sur GPU avec CUDA 24 mars 2014 37 / 37