La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Accélération d’algorithmes de convolution sur processeurs graphiques

Présentations similaires


Présentation au sujet: "Accélération d’algorithmes de convolution sur processeurs graphiques"— Transcription de la présentation:

1 Accélération d’algorithmes de convolution sur processeurs graphiques
Traitement de l’information Accélération d’algorithmes de convolution sur processeurs graphiques Programmation massivement parallèle Benoît Pencrec'h Arrière plan: Nvidia.fr

2 1 - Convolution matricielle et processeur graphique : un couple idéal
Accélération d’algorithmes de convolution sur processeurs graphiques 1 - Convolution matricielle et processeur graphique : un couple idéal 1.1 - Convolution et complexité arithmétique 1.2 - Les processeurs graphiques, une architecture taillée pour le calcul 1.3 - Un couple permettant une exécution hautement parallèle 2 - Implémentations et optimisations 2.1 - Programmer sur GPU avec l’API Cuda™ 2.2 - Convolution 2D 2.3 - Convolution 2D optimisée 2.4 - Convolution 3D, une histoire de boucle… 3 - Résultats : qualité, performances et limites 3.1 - Qualité des résultats 3.2 - Benchmark des convolutions 2D et 3D 3.3 - Les transferts mémoires, goulot d’étranglement 3.4 - Un autre moyen d’exécuter la convolution : Fourrier 27/03/2017 Benoît Pencrec'h

3 Convolution et complexité arithmétique
Accélération d’algorithmes de convolution sur processeurs graphiques Convolution matricielle et processeur graphique : un couple idéal Implémentations et optimisations Résultats : performances et limites Convolution et complexité arithmétique La convolution mesure la quantité de chevauchement entre deux fonctions Pour des termes de type discret elle s’exprime La convolution d’un pixel N d’une image I par un noyau K de rayon R s’exprime : 27/03/2017 Benoît Pencrec'h

4 Convolution et complexité arithmétique
Accélération d’algorithmes de convolution sur processeurs graphiques Convolution matricielle et processeur graphique : un couple idéal Implémentations et optimisations Résultats : performances et limites Convolution et complexité arithmétique Noyau Pixel source Pixel résultat 27/03/2017 Benoît Pencrec'h Schéma : université Harvay Mudd

5 Convolution et complexité arithmétique
Accélération d’algorithmes de convolution sur processeurs graphiques Convolution matricielle et processeur graphique : un couple idéal Implémentations et optimisations Résultats : performances et limites Convolution et complexité arithmétique Pour une image de taille m . m et un noyau de taille n . n, la convolution demande n² . m² multiplications 30 s pour convoluer une image Px (noyau 9.9) En 3D, la convolution requiert n³. m³ multiplications ! 7 min 30 s pour convoluer un volume Px (noyau 3.3.3) 27/03/2017 Benoît Pencrec'h

6 * Convolution et complexité arithmétique
Accélération d’algorithmes de convolution sur processeurs graphiques Convolution matricielle et processeur graphique : un couple idéal Implémentations et optimisations Résultats : performances et limites Convolution et complexité arithmétique Il existe une solution pour diminuer le nombre de calculs : la séparation du noyau * abaisse le nombre de multiplications à 2n.m² en 2D et 3n.m³ en 3D 27/03/2017 Benoît Pencrec'h Schémas : réalisation personnelle

7 Les processeurs graphiques, une architecture taillée pour le calcul
Accélération d’algorithmes de convolution sur processeurs graphiques Convolution matricielle et processeur graphique : un couple idéal Implémentations et optimisations Résultats : performances et limites Les processeurs graphiques, une architecture taillée pour le calcul Habituellement destinés aux rendus de scènes 3D (jeux vidéos, CAO, …) Autrefois spécialisé dans la 3D, ils est devenu universel Gère moins d’instructions que le CPU mais possède une puissance de calcul brute bien plus importante 27/03/2017 Benoît Pencrec'h

8 Les processeurs graphiques, une architecture taillée pour le calcul
Accélération d’algorithmes de convolution sur processeurs graphiques Convolution matricielle et processeur graphique : un couple idéal Implémentations et optimisations Résultats : performances et limites Les processeurs graphiques, une architecture taillée pour le calcul Puissance de calcul des GPU Nvidia vs CPU Intel 27/03/2017 Benoît Pencrec'h Graphe : nvidia programming guide

9 Les processeurs graphiques, une architecture taillée pour le calcul
Accélération d’algorithmes de convolution sur processeurs graphiques Convolution matricielle et processeur graphique : un couple idéal Implémentations et optimisations Résultats : performances et limites Les processeurs graphiques, une architecture taillée pour le calcul CPU GPU 27/03/2017 Benoît Pencrec'h Schémas : nvidia programming guide

10 Les processeurs graphiques, une architecture taillée pour le calcul
Accélération d’algorithmes de convolution sur processeurs graphiques Convolution matricielle et processeur graphique : un couple idéal Implémentations et optimisations Résultats : performances et limites Les processeurs graphiques, une architecture taillée pour le calcul 1 thread Stream Processor Exécution séquentielle 2 ko de registres 27/03/2017 Benoît Pencrec'h Schémas : nvidia programming guide

11 Les processeurs graphiques, une architecture taillée pour le calcul
Accélération d’algorithmes de convolution sur processeurs graphiques Convolution matricielle et processeur graphique : un couple idéal Implémentations et optimisations Résultats : performances et limites Les processeurs graphiques, une architecture taillée pour le calcul SIMT (Single Instruction Multiple Threads) 8 threads (bloc) Exécution parallèle 16 ko de mémoire partagée 27/03/2017 Benoît Pencrec'h Schémas : nvidia programming guide

12 Les processeurs graphiques, une architecture taillée pour le calcul
Accélération d’algorithmes de convolution sur processeurs graphiques Convolution matricielle et processeur graphique : un couple idéal Implémentations et optimisations Résultats : performances et limites Les processeurs graphiques, une architecture taillée pour le calcul GPU Complet plusieurs SIMT exécution parallèle mémoire globale 27/03/2017 Benoît Pencrec'h Schémas : nvidia programming guide

13 Un couple permettant une exécution hautement parallèle
Accélération d’algorithmes de convolution sur processeurs graphiques Convolution matricielle et processeur graphique : un couple idéal Implémentations et optimisations Résultats : performances et limites Un couple permettant une exécution hautement parallèle Pour exprimer leur puissance, les GPU requièrent des calculs indépendants La convolution possède cette particularité : chaque pixel résultat est une somme de produits indépendante du résultat voisin L’utilisation de la convolution sur processeurs graphiques est donc pertinente 27/03/2017 Benoît Pencrec'h

14 Programmer sur GPU avec l’API Cuda™
Accélération d’algorithmes de convolution sur processeurs graphiques Convolution matricielle et processeur graphique : un couple idéal Implémentations et optimisations Résultats : performances et limites Programmer sur GPU avec l’API Cuda™ CUDA™ Compute Unified Device Architecture API propriétaire apparue en 2006 avec l’architecture G80 (Ge force 8) Se présente comme une extension du langage C (compilateur spécifique NVCC) Permet d’écrire des fonctions C dénommées Kernels qui seront exécutées N fois en parallèle sur N différents threads 27/03/2017 Benoît Pencrec'h

15 Programmer sur GPU avec l’API Cuda™
Accélération d’algorithmes de convolution sur processeurs graphiques Convolution matricielle et processeur graphique : un couple idéal Implémentations et optimisations Résultats : performances et limites Programmer sur GPU avec l’API Cuda™ // Kernel definition __global__ void VecAdd(float* A, float* B, float* C) { int i = threadIdx.x; C[i] = A[i] + B[i]; } int main() ... // Kernel invocation with N threads VecAdd<<<1, N>>>(A, B, C); Addition de vecteurs en Cuda Kernel GPU Parallèle Code CPU Séquentiel Chaque thread va effectuer une des additions N additions seront exécutées simultanément 27/03/2017 Benoît Pencrec'h Extraits de code : nvidia programming guide

16 Programmer sur GPU avec l’API Cuda™
Accélération d’algorithmes de convolution sur processeurs graphiques Convolution matricielle et processeur graphique : un couple idéal Implémentations et optimisations Résultats : performances et limites Programmer sur GPU avec l’API Cuda™ Pour simplifier l’exécution de tâches plus complexes, les threads bénéficient d’une hiérarchie bien définie. L’indice de thread (threadId) peux prendre une (thradId.x) deux (threadId.y) ou trois (threadId.z) dimensions. Apparaissent dès lors blocs de threads (blockId) à une deux ou trois dimension suivant la même structure. L’ensemble des blocs forment une grille de thread (1D ou 2D mais pas 3D) qui est ensuite envoyée au GPU 27/03/2017 Benoît Pencrec'h

17 Programmer sur GPU avec l’API Cuda™
Accélération d’algorithmes de convolution sur processeurs graphiques Convolution matricielle et processeur graphique : un couple idéal Implémentations et optimisations Résultats : performances et limites Programmer sur GPU avec l’API Cuda™ Représentation de la grille de thread 27/03/2017 Benoît Pencrec'h Schémas : nvidia programming guide

18 Programmer sur GPU avec l’API Cuda™
Accélération d’algorithmes de convolution sur processeurs graphiques Convolution matricielle et processeur graphique : un couple idéal Implémentations et optimisations Résultats : performances et limites Programmer sur GPU avec l’API Cuda™ // Kernel definition __global__ void MatAdd(float A[N][N], float B[N][N], float C[N][N]) { int i = threadIdx.x; int j = threadIdx.y; C[i][j] = A[i][j] + B[i][j]; } int main() ... int numBlocks = 1; dim3 threadsPerBlock(N, N); MatAdd<<<numBlocks, threadsPerBlock>>>(A, B, C); Addition de matrices en Cuda Chaque thread du bloc exécute une addition Appel du kernel avec 1 bloc de N*N threads 27/03/2017 Benoît Pencrec'h Extraits de code : nvidia programming guide

19 Convolution 2D On découpe l’image en blocs de 16*16 threads
Accélération d’algorithmes de convolution sur processeurs graphiques Convolution matricielle et processeur graphique : un couple idéal Implémentations et optimisations Résultats : performances et limites Convolution 2D On découpe l’image en blocs de 16*16 threads Chaque pixel résultat est calculé par un thread Un thread exécute séquentiellement les sommes / produits nécessaires au calcul d’un pixel résultat Tous les pixels résultats sont calculés en parallèle 27/03/2017 Benoît Pencrec'h

20 Convolution 2D Il reste cependant un problème : les effets de bord
Accélération d’algorithmes de convolution sur processeurs graphiques Convolution matricielle et processeur graphique : un couple idéal Implémentations et optimisations Résultats : performances et limites Convolution 2D Il reste cependant un problème : les effets de bord 27/03/2017 Benoît Pencrec'h Schémas : réalisation personnelle

21 Convolution 2D solution : placer des zéros autour de l’image
Accélération d’algorithmes de convolution sur processeurs graphiques Convolution matricielle et processeur graphique : un couple idéal Implémentations et optimisations Résultats : performances et limites Convolution 2D solution : placer des zéros autour de l’image Dans le kernel on choisira de faire des tests sur les indices de thread (plus performant) 27/03/2017 Benoît Pencrec'h Schémas : réalisation personnelle

22 Convolution 2D optimisée
Accélération d’algorithmes de convolution sur processeurs graphiques Convolution matricielle et processeur graphique : un couple idéal Implémentations et optimisations Résultats : performances et limites Convolution 2D optimisée Cette implémentation est basée sur l’exemple ConvolutionSeparable du SDK Nvidia™ Première optimisation : utilisation de la convolution séparable l’exécution est divisée en deux passes (i.e. deux kernels) Une passe horizontale qui traite des rangées de 16 pixels Une passe verticale traite des colonnes 16 pixels 27/03/2017 Benoît Pencrec'h

23 Convolution 2D optimisée
Accélération d’algorithmes de convolution sur processeurs graphiques Convolution matricielle et processeur graphique : un couple idéal Implémentations et optimisations Résultats : performances et limites Convolution 2D optimisée Deuxième optimisation : chargement de l’image directement dans la mémoire partagée du GPU (mémoire shared) Sans mémoire shared Avec mémoire shared 27/03/2017 Benoît Pencrec'h Schémas : nvidia programming guide

24 Convolution 3D, une histoire de boucle…
Accélération d’algorithmes de convolution sur processeurs graphiques Convolution matricielle et processeur graphique : un couple idéal Implémentations et optimisations Résultats : performances et limites Convolution 3D, une histoire de boucle… Solution : On découpe le volume en slices traitées par nos kernels 2D Problème : on ne peux pas définir une grille de thread en 3D z x y Z slices Z slices 27/03/2017 Benoît Pencrec'h Schémas : réalisation personnelle

25 Convolution 3D, une histoire de boucle…
Accélération d’algorithmes de convolution sur processeurs graphiques Convolution matricielle et processeur graphique : un couple idéal Implémentations et optimisations Résultats : performances et limites Convolution 3D, une histoire de boucle… Cette méthode nécessite cependant d’adapter les kernels 2D Le noyau étant 3D, les kernels doivent récupérer les valeurs des slices les entourant 27/03/2017 Benoît Pencrec'h

26 Convolution 3D, une histoire de boucle…
Accélération d’algorithmes de convolution sur processeurs graphiques Convolution matricielle et processeur graphique : un couple idéal Implémentations et optimisations Résultats : performances et limites Convolution 3D, une histoire de boucle… Slice volume n-1 Slice volume n 20 Slice volume n Z Slice volume n+1 noyau n-1 5 noyau n 10 noyau n+1 5 27/03/2017 Benoît Pencrec'h Illustration : réalisation personnelle

27 Accélération d’algorithmes de convolution sur processeurs graphiques
Convolution matricielle et processeur graphique : un couple idéal Implémentations et optimisations Résultats : performances et limites Qualité des résultats La qualité (i.e la justesse) des résultats est constamment vérifiée par : Le calcul de la norme relative entre l’implémentation CPU et la version GPU (contrôle automatique) L’export des images et volumes résultats dans un fichier (contrôle visuel) Image d’origine Image covoluée (Gauss) CPU Image covoluée (Gauss) GPU 27/03/2017 Benoît Pencrec'h Illustration: réalisation personnelle

28 Benchmark des convolutions 2D et 3D
Accélération d’algorithmes de convolution sur processeurs graphiques Convolution matricielle et processeur graphique : un couple idéal Implémentations et optimisations Résultats : performances et limites Benchmark des convolutions 2D et 3D Système de test Fabriquant et modèle Nombre de cœurs Fréquence des cœurs CPU Intel Xeon L5320 4 2.5 GHz GPU Nvidia Geforce GTX295 280 1.24 GHz 27/03/2017 Benoît Pencrec'h

29 Benchmark des convolutions 2D et 3D
Accélération d’algorithmes de convolution sur processeurs graphiques Convolution matricielle et processeur graphique : un couple idéal Implémentations et optimisations Résultats : performances et limites Benchmark des convolutions 2D et 3D x2,5 27/03/2017 Benoît Pencrec'h

30 Benchmark des convolutions 2D et 3D
Accélération d’algorithmes de convolution sur processeurs graphiques Convolution matricielle et processeur graphique : un couple idéal Implémentations et optimisations Résultats : performances et limites Benchmark des convolutions 2D et 3D x3 27/03/2017 Benoît Pencrec'h

31 Les transferts mémoires, goulot d’étranglement
Accélération d’algorithmes de convolution sur processeurs graphiques Convolution matricielle et processeur graphique : un couple idéal Implémentations et optimisations Résultats : performances et limites Les transferts mémoires, goulot d’étranglement x65 ! 27/03/2017 Benoît Pencrec'h

32 Les transferts mémoires, goulot d’étranglement
Accélération d’algorithmes de convolution sur processeurs graphiques Convolution matricielle et processeur graphique : un couple idéal Implémentations et optimisations Résultats : performances et limites Les transferts mémoires, goulot d’étranglement 27/03/2017 Benoît Pencrec'h

33 Un autre moyen d’exécuter la convolution : Fourrier
Accélération d’algorithmes de convolution sur processeurs graphiques Convolution matricielle et processeur graphique : un couple idéal Implémentations et optimisations Résultats : performances et limites Un autre moyen d’exécuter la convolution : Fourrier 27/03/2017 Benoît Pencrec'h

34 Une expérience enrichissante
Accélération d’algorithmes de convolution sur processeurs graphiques Une expérience enrichissante Cuda est un langage simple à mettre en œuvre donnant de bons résultats Au cours de ce stage j’aurai: Acquis une bonne connaissance des GPU et de la programmation parallèle, Appris à interfacer des fonctions C et CUDA avec Matlab, Utilisé un outil de versionning de Code, Familiarisé avec un OS libre, Appris à développer sans IDE en utilisant l’outil Make et les makefiles, Approfondi mes connaissances en langage C. 27/03/2017 Benoît Pencrec'h

35 Sources Index de la documentation Nvidia CUDA
Accélération d’algorithmes de convolution sur processeurs graphiques Sources Index de la documentation Nvidia CUDA Site : Université Harvay Mudd Site : 27/03/2017 Benoît Pencrec'h


Télécharger ppt "Accélération d’algorithmes de convolution sur processeurs graphiques"

Présentations similaires


Annonces Google