Programmation parallèle sur GPU avec CUDA par   Maxime Fromentin Consultant In Fine Consulting le  26/04/2011
SOMMAIRE <ul><li>Introduction  sur les GPUs, CUDA et les domaines d’application </li></ul><ul><li>Explication plus techniq...
<ul><li>PARTIE I : Introduction aux GPUS et CUDA </li></ul>
GPU |  DÉFINITION Déf: 1)  Hardware spécialisé dans le rendu graphique 2) Microprocesseur présent sur les cartes graphique...
GPU | ÉVOLUTION DES PERFORMANCES  <ul><li>Les GPU sont des circuits massivement parallèles </li></ul><ul><ul><li>Des centa...
GPU | COMPARAISON DES ARCHITECTURES G80 GT200 Fermi Transistors 681 millions 1,4 milliards 3,0 milliards CUDA cores 128 24...
CUDA | DÉFINITION  <ul><li>Avec l’évolution des performances,  les GPUs deviennent programmables  </li></ul><ul><li>CUDA  ...
CUDA | DÉFINITION  <ul><li>Plus de 200 millions de périphériques sont capables d’exécuter des applications CUDA ! </li></u...
CUDA ET FINANCE  Plus à voir sur :  http://www.nvidia.fr/object/cuda_app_tesla_fr.html <ul><li>SciFinance : </li></ul><ul>...
<ul><li>PARTIE II : CUDA more in-depth </li></ul><ul><li>Exemple </li></ul>
CUDA | ORGANISATION DES THREADS <ul><li>Les threads sont organisées dans une hiérarchie à 2 niveaux : </li></ul><ul><ul><l...
CUDA | ORGANISATION DES THREADS <ul><li>blockIdx.x  et  blockIdx.y  permet d’identifier le bloc </li></ul><ul><li>La grill...
CUDA | EXÉCUTION DES THREADS <ul><li>Par groupe de 32 (warp) </li></ul><ul><li>Tous les threads d’un warp exécutent la mêm...
CUDA | MODÈLE D’EXÉCUTION
CUDA | STRUCTURE D’UN PROGRAMME <ul><li>Un programme CUDA comprend : </li></ul><ul><ul><li>Des phases s’exécutant sur  l’h...
CUDA | STRUCTURE D’UN PROGRAMME // allocation de la mémoire sur le device cudaMalloc((void**)a_d, size); … // transfert de...
CUDA | EXEMPLE : MULTIPLICATION DE MATRICES <ul><li>A, B, C sont carrées n x n </li></ul><ul><li>C = A * B </li></ul>Code ...
CUDA | EXEMPLE : MULTIPLICATION DE MATRICES
CUDA | EXEMPLE : MULTIPLICATION DE MATRICES …  cudaMemcpy(xd, x, size, cudaMemcpyHostToDevice); cudaMemcpy(yd, y, size, cu...
CUDA | EXEMPLE : MULTIPLICATION DE MATRICES __global__ void multMatKernel(int n, float *x, float *y, float *z) { int xx= b...
CONCLUSION <ul><li>Avantages: </li></ul><ul><ul><li>Des performances entre 5X et 100X supérieures au CPU </li></ul></ul><u...
BIBLIOGRAPHIE <ul><li>Site CUDA:  </li></ul><ul><li>http://www.nvidia.fr/object/cuda_home_new_fr.html </li></ul><ul><li>Ex...
QUESTIONS?
Prochain SlideShare
Chargement dans... 5
×

Programmation sur GPU avec CUDA

7,248

Published on

Published in: Technologies, Affaires
0 commentaires
4 mentions J'aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Total des vues
7,248
Sur Slideshare
0
À partir des ajouts
0
Nombre d'ajouts
2
Actions
Partages
0
Téléchargements
0
Commentaires
0
J'aime
4
Ajouts 0
No embeds

No notes for slide

Programmation sur GPU avec CUDA

  1. 1. Programmation parallèle sur GPU avec CUDA par Maxime Fromentin Consultant In Fine Consulting le 26/04/2011
  2. 2. SOMMAIRE <ul><li>Introduction sur les GPUs, CUDA et les domaines d’application </li></ul><ul><li>Explication plus technique sur CUDA, présentation d’un exemple </li></ul><ul><li>Questions </li></ul>
  3. 3. <ul><li>PARTIE I : Introduction aux GPUS et CUDA </li></ul>
  4. 4. GPU | DÉFINITION Déf: 1) Hardware spécialisé dans le rendu graphique 2) Microprocesseur présent sur les cartes graphiques au sein d’un ordinateur ou d’une console de jeux vidéo <ul><li>Principaux constructeurs : NVIDIA, ATI/AMD, Intel Corporation </li></ul><ul><li>Différence avec les CPUs : </li></ul><ul><ul><li>Hardware spécialisé dans le rendu graphique </li></ul></ul><ul><ul><li>Designer pour supporter un parallélisme de masse </li></ul></ul><ul><ul><li>Créer autant de threads que possible! </li></ul></ul>
  5. 5. GPU | ÉVOLUTION DES PERFORMANCES <ul><li>Les GPU sont des circuits massivement parallèles </li></ul><ul><ul><li>Des centaines de cœurs </li></ul></ul><ul><ul><li>Des milliers de threads </li></ul></ul>Floating-Point Operations per Second entre GPU et CPU
  6. 6. GPU | COMPARAISON DES ARCHITECTURES G80 GT200 Fermi Transistors 681 millions 1,4 milliards 3,0 milliards CUDA cores 128 240 512 Double précision (par cycle) - 30 FMA 256 FMA Simple précision (par cycle) 128 MAD 240 MAD 512 FMA Special Function Units (par SM) 2 2 4 Warp scheduler (par SM) 1 1 2 Shared memory (par SM) 16 Ko 16 Ko 48 Ko ou 16 Ko Cache L1 (par SM) - - 48 Ko ou 16 Ko Cache L2 - - 768 Ko Mémoire ECC Non Non Oui Kernels concurrents Non Non jusqu’à 16 Adresses 32 bits 32 bits 64 bits
  7. 7. CUDA | DÉFINITION <ul><li>Avec l’évolution des performances, les GPUs deviennent programmables </li></ul><ul><li>CUDA – Compute Unified Architecture </li></ul><ul><ul><li>Framework et ensemble d’outils qui permettent le design, l’implémentation et la vérification des applications GPUs </li></ul></ul><ul><ul><li>Extension du langage C </li></ul></ul><ul><ul><li>Toolkit incluant un compilateur spécialisé: </li></ul></ul><ul><ul><ul><li>nvcc : méta-compilateur </li></ul></ul></ul><ul><ul><ul><li>distribue la compilation entre le CPU natif et le GPU </li></ul></ul></ul>CUDA Application Source file: C/C++ (.cpp) Source file: CUDA (.cu) Compiling: Visual C++ Compiling: nvcc Linking: Visual C++ Executable
  8. 8. CUDA | DÉFINITION <ul><li>Plus de 200 millions de périphériques sont capables d’exécuter des applications CUDA ! </li></ul>Des performances entre 5X et 100X supérieures aux CPUs !
  9. 9. CUDA ET FINANCE Plus à voir sur : http://www.nvidia.fr/object/cuda_app_tesla_fr.html <ul><li>SciFinance : </li></ul><ul><li>“ By harnessing the power of NVIDIA GPUs, SciFinance parallel codes for Monte Carlo pricing models run blazingly fast: up to 50x-300x faster than serial code.” </li></ul>
  10. 10. <ul><li>PARTIE II : CUDA more in-depth </li></ul><ul><li>Exemple </li></ul>
  11. 11. CUDA | ORGANISATION DES THREADS <ul><li>Les threads sont organisées dans une hiérarchie à 2 niveaux : </li></ul><ul><ul><li>Grille </li></ul></ul><ul><ul><li>Blocs </li></ul></ul><ul><li>Coordonnées uniques </li></ul><ul><ul><li>Indices de bloc : 2D </li></ul></ul><ul><ul><li>Indices de thread : 3D </li></ul></ul><ul><li>Tous les blocs d’une grille ont les même dimensions </li></ul><ul><li>Une grille par kernel </li></ul>
  12. 12. CUDA | ORGANISATION DES THREADS <ul><li>blockIdx.x et blockIdx.y permet d’identifier le bloc </li></ul><ul><li>La grille comprend gridDim.x x gridDim.y blocs </li></ul><ul><li>threadIdx.x , threadIdx.y , threadIdx.z permettent </li></ul><ul><li>d’identifier le thread à l’intérieur d’un bloc </li></ul><ul><li>Plusieurs contraintes à prendre en compte: </li></ul><ul><ul><li>Maximum sur les coordonnées </li></ul></ul><ul><ul><ul><li>Grille (65536 x 65536) </li></ul></ul></ul><ul><ul><ul><li>Bloc (512, 512, 64) </li></ul></ul></ul><ul><ul><li>Nombre de threads par SM </li></ul></ul><ul><ul><ul><li>Maximum = 512 </li></ul></ul></ul><ul><ul><ul><li>Typiquement 256 </li></ul></ul></ul>
  13. 13. CUDA | EXÉCUTION DES THREADS <ul><li>Par groupe de 32 (warp) </li></ul><ul><li>Tous les threads d’un warp exécutent la même instruction ! </li></ul><ul><ul><li>Si dans if/then/else, un thread du warp prend une autre branche que le reste du groupe, tout le groupe exécute les 2 branches ! (on utilise des predicated instructions pour ne pas stocker les résultats pour les threads concernées). </li></ul></ul><ul><ul><ul><li>DIVERGENCE </li></ul></ul></ul><ul><ul><ul><li>Perte de performance </li></ul></ul></ul>
  14. 14. CUDA | MODÈLE D’EXÉCUTION
  15. 15. CUDA | STRUCTURE D’UN PROGRAMME <ul><li>Un programme CUDA comprend : </li></ul><ul><ul><li>Des phases s’exécutant sur l’hôte (CPU) </li></ul></ul><ul><ul><ul><li>Phases séquentielles, entrées/sorties (interactions avec le système d’exploitation) </li></ul></ul></ul><ul><ul><li>Des phases s’exécutant sur le(s) device (s) (GPU) </li></ul></ul><ul><ul><ul><li>Parallélisme sur les données </li></ul></ul></ul> Limiter les interactions entres CPU et GPU pour augmenter les performances
  16. 16. CUDA | STRUCTURE D’UN PROGRAMME // allocation de la mémoire sur le device cudaMalloc((void**)a_d, size); … // transfert des données du CPU vers le device (GPU) cudaMemcpy(a_d, a, size, cudaMemcpyHostToDevice); … // appel du kernel (programme qui tourne sur le GPU) addVectors<<< xxx, xxx>>>(n, a_d, b_d, c_d); // récupération du résultat cudaMemcpy(c, c_d, size, cudaMemcpyDeviceToHost);
  17. 17. CUDA | EXEMPLE : MULTIPLICATION DE MATRICES <ul><li>A, B, C sont carrées n x n </li></ul><ul><li>C = A * B </li></ul>Code séquentiel en c++ void matmul(int n, float* a, float*b, float* c) { for (int i=0; i<n, i++) { for (int j=0; j<n; j++) { float s = 0; for (int k=0; k<n; k++) s += a[i*n+k] * b[i*k+j]; c[i*n+j] = s; } } }
  18. 18. CUDA | EXEMPLE : MULTIPLICATION DE MATRICES
  19. 19. CUDA | EXEMPLE : MULTIPLICATION DE MATRICES … cudaMemcpy(xd, x, size, cudaMemcpyHostToDevice); cudaMemcpy(yd, y, size, cudaMemcpyHostToDevice); const int threadsPerBlock = 16; int nblocks = (n + threadsPerBlock - 1) / (threadsPerBlock); dim3 dimGrid(nblocks,nblocks,1); dim3 dimBlock(threadsPerBlock,threadsPerBlock,1); multMatKernel<<<dimGrid, dimBlock>>>(n, xd, yd, zd); cudaMemcpy(z, zd, size, cudaMemcpyDeviceToHost); //std::cout << x[0] << &quot; + &quot; << y[0] << &quot; = &quot; << z[0] << std::endl; cudaFree(xd); cudaFree(yd); cudaFree(zd);
  20. 20. CUDA | EXEMPLE : MULTIPLICATION DE MATRICES __global__ void multMatKernel(int n, float *x, float *y, float *z) { int xx= blockIdx.x * blockDim.x + threadIdx.x; int yy= blockIdx.y * blockDim.y + threadIdx.y; if(xx<n && yy <n) { float res =0.0f; for(int i=0;i<n;i++) res+=x[yy+n*i]*y[xx*n+i]; z[xx*n+yy] =res; } }  Des optimisations encore possibles en utilisant la mémoire locale
  21. 21. CONCLUSION <ul><li>Avantages: </li></ul><ul><ul><li>Des performances entre 5X et 100X supérieures au CPU </li></ul></ul><ul><ul><li>Une prise en main dans le domaine scientifique et de l’industrie </li></ul></ul><ul><ul><li>Prix inférieurs à un cluster! </li></ul></ul><ul><ul><li>Moins de place requise </li></ul></ul><ul><li>Inconvénients: </li></ul><ul><ul><li>Une prise en main plus difficile </li></ul></ul><ul><ul><li>Des optimisations plus compliquées à entreprendre (algorithme, mémoire,…) </li></ul></ul><ul><ul><li>et changeantes avec les versions de GPU. </li></ul></ul>
  22. 22. BIBLIOGRAPHIE <ul><li>Site CUDA: </li></ul><ul><li>http://www.nvidia.fr/object/cuda_home_new_fr.html </li></ul><ul><li>Exemples CUDA à télécharger: </li></ul><ul><li>http://developer.download.nvidia.com/compute/cuda/1.1-Beta/x86_website/Computational_Finance.html </li></ul><ul><li>SciFinance </li></ul><ul><li> http://www.scicomp.com/ </li></ul><ul><li>Projet de parallélisation automatique: </li></ul><ul><li>http://www.hpc-project.com/ </li></ul><ul><li>Article: Binomial option pricing model </li></ul><ul><li> http://developer.download.nvidia.com/compute/cuda/1_1/Website/projects/binomialOptions/doc/binomialOptions.pdf </li></ul><ul><li>Blog In Fine Consulting </li></ul><ul><li>http://blog.infine.com/ </li></ul>
  23. 23. QUESTIONS?

×