Initiation à la programmation sur cartes graphiques Exemples du SDK de Nvidia + reconstruction tomographique Nicolas GAC Djafariales au GPI, le 6 Avril 2010 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique 1 2 Architecture des processeurs graphiques GPU : Graphic Processing Unit Avant CUDA / Après CUDA , Programmation sous CUDA Principes généraux Multiplication de matrices 3 Exemples du SDK de CUDA 4 Reconstruction tomographique sur GPUs Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours 2/79 2/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique GPU : Graphic Processing Unit Avant CUDA : pipeline graphique Après CUDA : plein de threads ! 1 Architecture des processeurs graphiques GPU : Graphic Processing Unit Avant CUDA / Après CUDA , 2 Programmation sous CUDA 3 Exemples du SDK de CUDA 4 Reconstruction tomographique sur GPUs 3/79 3/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique GPU : Graphic Processing Unit Avant CUDA : pipeline graphique Après CUDA : plein de threads ! GPU : Graphic Processing Unit Evolution vers une architecture many core A l’origine, architecture dédiée pour le rendu de volume ò Pipeline graphique (prog. en OpenGL/Cg) Depuis 2006, architecture adaptée à la parallélisation de divers calculs scientifiques ò CUDA : Common Unified Device Architecure (prog. en C) 4/79 4/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique GPU : Graphic Processing Unit Avant CUDA : pipeline graphique Après CUDA : plein de threads ! Puissance de calcul 5/79 5/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique GPU : Graphic Processing Unit Avant CUDA : pipeline graphique Après CUDA : plein de threads ! Débit mémoire 6/79 6/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique GPU : Graphic Processing Unit Avant CUDA : pipeline graphique Après CUDA : plein de threads ! Avant CUDA : pipeline graphique Vertex Shader Transformation géométrique Rasterization Polygon − > Fragments Fragment Shader source : [Xu 07] Calcul sur les Pixels 7/79 7/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique GPU : Graphic Processing Unit Avant CUDA : pipeline graphique Après CUDA : plein de threads ! Projection Cone Beam 3D avec le Pipeline Graphique Frame Buffer Yφ Vertex Shader Transformation géométrique ZV Texture 2D YV Source XV Zφ Rasterization Xφ Polygon − > Fragments Fragment Shader Calcul sur les Pixels 8/79 8/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique GPU : Graphic Processing Unit Avant CUDA : pipeline graphique Après CUDA : plein de threads ! Rétroprojection Cone Beam 3D Dectector Plane Yφ ZV Zφ YV Source Xφ XV 9/79 9/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique GPU : Graphic Processing Unit Avant CUDA : pipeline graphique Après CUDA : plein de threads ! Rétroprojection Cone Beam 3D avec le Pipeline Graphique Frame Buffer Vertex Shader Texture 2D Yφ Transformation géométrique ZV YV XV Memoire de texture 2D Projection Volume Zφ Rasterization Xφ Polygon − > Fragments Fragment Shader Calcul sur les Pixels 10/79 10/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique GPU : Graphic Processing Unit Avant CUDA : pipeline graphique Après CUDA : plein de threads ! Rétroprojection Cone Beam 3D avec le Pipeline Graphique Frame Buffer Projection des Vertex Texture 2D Yφ ZV Projection des Fragments Zφ YV Source XV Memoire de texture 2D Projection Volume Xφ Indice de Texture Echantillonage de texture Accumulation 11/79 11/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique GPU : Graphic Processing Unit Avant CUDA : pipeline graphique Après CUDA : plein de threads ! Rétroprojection Cone Beam 3D avec le Pipeline Graphique Frame Buffer Projection des Vertex Texture 2D Yφ ZV Projection des Fragments Zφ YV XV Memoire de texture 2D Projection Volume Xφ Indice de Texture Echantillonage de texture Accumulation 12/79 12/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique GPU : Graphic Processing Unit Avant CUDA : pipeline graphique Après CUDA : plein de threads ! Rétroprojection Cone Beam 3D avec le Pipeline Graphique Fragment Couleur : Indice de texture : Coordonnées 4D : (xφ , yφ , zφ , wφ ) Projection des Vertex Texture 2D Yφ Frame Buffer ZV Projection des Fragments Zφ YV XV Memoire de texture 2D Projection Volume Xφ Indice de Texture Echantillonage de texture Accumulation 13/79 13/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique GPU : Graphic Processing Unit Avant CUDA : pipeline graphique Après CUDA : plein de threads ! Rétroprojection Cone Beam 3D avec le Pipeline Graphique Fragment Couleur : Indice de texture : Coordonnées 4D : (xφ /wφ , yφ /wφ ) (xφ , yφ , zφ , wφ ) Projection des Vertex Texture 2D Yφ Frame Buffer ZV Projection des Fragments Zφ YV XV Memoire de texture 2D Projection Volume Xφ Indice de Texture Echantillonage de texture Accumulation 14/79 14/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique GPU : Graphic Processing Unit Avant CUDA : pipeline graphique Après CUDA : plein de threads ! Rétroprojection Cone Beam 3D avec le Pipeline Graphique Fragment Couleur : bininterp Indice de texture : (xφ /wφ , yφ /wφ ) Coordonnées 4D : (xφ , yφ , zφ , wφ ) Projection des Vertex Texture 2D Yφ Frame Buffer ZV Projection des Fragments Zφ YV XV Memoire de texture 2D Projection Volume Xφ Indice de Texture Echantillonage de texture Accumulation 15/79 15/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique GPU : Graphic Processing Unit Avant CUDA : pipeline graphique Après CUDA : plein de threads ! Rétroprojection Cone Beam 3D avec le Pipeline Graphique Fragment Couleur : bininterp Indice de texture : (xφ /wφ , yφ /wφ ) Coordonnées 4D : (xφ , yφ , zφ , wφ ) Projection des Vertex Texture 2D Yφ Frame Buffer ZV Projection des Fragments Zφ YV XV Memoire de texture 2D Projection Volume Xφ Indice de Texture Echantillonage de texture Accumulation 16/79 16/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique GPU : Graphic Processing Unit Avant CUDA : pipeline graphique Après CUDA : plein de threads ! Rétroprojection Cone Beam 3D avec CUDA Fragment Couleur : bininterp Indice de texture : (xφ /wφ , yφ /wφ ) Coordonnées 4D : (xφ , yφ , zφ , wφ ) Texture 2D Yφ Frame Buffer Projection des Fragments ZV Zφ YV Xφ Indice de Texture XV Echantillonage de texture Memoire de texture 2D Projection Volume Accumulation 17/79 17/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique GPU : Graphic Processing Unit Avant CUDA : pipeline graphique Après CUDA : plein de threads ! Après CUDA : plein de threads ! CUDA : Common Unified Device Architecture Vertex shader + Fragment shader = Streams Processors (SPs) ò Le GPU devient un processeur “many cores” Jusqu’à 240 Stream Processors (Chip GT200 - Juin 2008) 30 coeurs SIMT (Single instructions Multiple Threads) 8 SPs (Stream Processors) par coeur SIMT 3 flop (MADD + MUL) par SP ò soit ∼ 1 Teraflops pour la carte Geforce GTX 285 (SP @1,5 GhZ) 18/79 18/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique GPU : Graphic Processing Unit Avant CUDA : pipeline graphique Après CUDA : plein de threads ! GT200 utilisé en mode graphique 19/79 19/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique GPU : Graphic Processing Unit Avant CUDA : pipeline graphique Après CUDA : plein de threads ! GT200 utilisé en mode CUDA 20/79 20/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique GPU : Graphic Processing Unit Avant CUDA : pipeline graphique Après CUDA : plein de threads ! Coeur SIMT : Single Instruction Multiple Instruction Hardware 8 unités scalaires (Stream Processors) 2 Specific Processor Units (SFUs) : cos(), sin(), exp()... 16 Ko de registres (2 Ko par SP) 16 ko de mémoire locale (shared memory) Accès rapide aux textures : cache 2D + Texture Filtering (TF) 3 coeurs SIMT Ordonnancement des threads Execution par groupes de 32 threads appelés warps 21/79 21/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique GPU : Graphic Processing Unit Avant CUDA : pipeline graphique Après CUDA : plein de threads ! Accès aux mémoire(s) source : [Kirschenmann 08] 22/79 22/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique GPU : Graphic Processing Unit Avant CUDA : pipeline graphique Après CUDA : plein de threads ! Découpage en threads Matériel un Stream Processor (SP) Logiciel un thread Exécution séquentielle (a) un coeur SIMT un bloc de threads (plusieurs warps) parallèle (SIMT) (b) une carte GPU (device) une grille de threads (kernel) parallèle (MIMD) mémoire centralisée (c) Mémoire Mémoire Mémoire Mémoire Mémoire globale 23/79 23/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique GPU : Graphic Processing Unit Avant CUDA : pipeline graphique Après CUDA : plein de threads ! Un id par thread et un id par bloc de threads 24/79 24/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique GPU : Graphic Processing Unit Avant CUDA : pipeline graphique Après CUDA : plein de threads ! Hiérarchie mémoire 25/79 25/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique GPU : Graphic Processing Unit Avant CUDA : pipeline graphique Après CUDA : plein de threads ! PC hote et carte graphique 26/79 26/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique GPU : Graphic Processing Unit Avant CUDA : pipeline graphique Après CUDA : plein de threads ! Supercalculateur personnel SP 1 SP 2 SP 3 SP 4 SP 5 SP 6 SP 7 SP 8 Memoire Shared (16 Ko) Carte graphique 1 Carte graphique 4 Cache 2D (8 Ko) SIMT bus GPU SIMT 1 (100 Go/s) SIMT n SIMT n SIMT 1 Memoire globale Memoire globale (4 Go) (4 Go) bus PCI Express (1 Go/s) Chipset bus externe (100 Mo/s) bus memoire (10 Go/s) CPU Disque dur Coeur 1 Coeur 2 Memoire cache (10 Mo) Coeur 3 Memoire SDRAM (32 Go) − rapide (300 Go) − lent (1 To) Coeur 4 27/79 27/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique GPU : Graphic Processing Unit Avant CUDA : pipeline graphique Après CUDA : plein de threads ! Découpage en threads et en grilles (kernels) Matériel un Stream Processor (SP) Logiciel Exécution un thread séquentielle (a) un processeur SIMT un bloc de threads parallèle (SIMT) (b) une carte GPU (device) une grille de threads (kernel) parallèle (MIMD) mémoire centralisée (c) parallèle (MIMD) mémoire distribuée (d) Mémoire Mémoire Mémoire Mémoire Mémoire Globale Mémoire Mémoire Mémoire Mémoire Globale Mémoire Mémoire Mémoire Mémoire Globale PC multi−carte threads du PC hote via librairie pthread (un thread CPU = un kernel GPU) 28/79 28/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Principes généraux Multiplication de matrices 1 Architecture des processeurs graphiques 2 Programmation sous CUDA Principes généraux Multiplication de matrices 3 Exemples du SDK de CUDA 4 Reconstruction tomographique sur GPUs 29/79 29/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Principes généraux Multiplication de matrices Flot de développement logiciel 30/79 30/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Principes généraux Multiplication de matrices Programmation GPU ¶ Parallélisation de l’algorithme ò nourrir en threads (plus ou moins indépendants) le GPU taux de parallélisation 100 % 99 % 95 % 90 % accélération GTX 200 (240 coeurs) 80 24 6 3 300 code parallèle à 100% code parallèle à 99% code parallèle à 95% code parallèle à 90% 250 Accélération n coeurs (1 Ghz) vs 1 coeur (3 Ghz) 200 150 100 50 0 0 100 200 300 400 Nombres de coeurs 500 31/79 31/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Principes généraux Multiplication de matrices Programmation GPU ¶ Parallélisation de l’algorithme ò nourrir en threads (plus ou moins indépendants) le GPU · Implémentation GPU Selon l’intensité arithmétique du code (puissance de calcul exploitée / débit des données), l’execution sera soit memory bound soit computation bound (ex : calcul X k [Kirschenmann 08]) ò optimisation du code portera alors soit sur les accès mémoire ou soit sur la complexité arithmétique 32/79 32/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Principes généraux Multiplication de matrices Parallélisation du calcul matriciel b0j C =A·B un thread : cij = X bkj aik bkj k bnj ai0 aik ain B cij A C 33/79 33/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Principes généraux Multiplication de matrices Découpage en blocs de threads b0j C =A·B un bloc : bkj CIJ = AI BJ un thread : cij = X aik bkj k bnj ai0 aik ain BJ B cij CIJ AI A C 34/79 34/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Principes généraux Multiplication de matrices kernel = code des threads executés sur le GPU global void matrixMul kernel( float* C, float* A, float* B,int matrix size) { float Csum ; int ifirst ,jfirst ; int i,j; ifirst =blockIdx.x*BLOCK SIZE; jfirst =blockIdx.y*BLOCK SIZE; i=ifirst +threadIdx.x; j=jfirst +threadIdx.y; for (k = 0; k < matrix size; k++) Csum += A[i][k] * B[k][j]; C[i][j] = Csum ; } 35/79 35/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Principes généraux Multiplication de matrices kernel (code réel) global void matrixMul kernel( float* C, float* A, float* B,int matrix size) { float Csum ; int ifirst ,jfirst ; int i,j; int a,b,c; ifirst =blockIdx.x*BLOCK SIZE; jfirst =blockIdx.y*BLOCK SIZE; i=ifirst +threadIdx.x; j=jfirst +threadIdx.y; a=i*matrix size; b=j; c=j+i*matrix size; for (k = 0; k < matrix size; k++){ Csum += A[a] * B[b]; a++; b+=matrix size; } C[c] = Csum ; } 36/79 36/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Principes généraux Multiplication de matrices Lancement du kernel depuis le PC hôte #define BLOCK SIZE 16 void matrixMul host(int N) { ... //setup execution parameters dim3 threads(BLOCK SIZE, BLOCK SIZE); dim3 grid(N /BLOCK SIZE , N /BLOCK SIZE ); //execute the kernel matrixMul<<< grid, threads >>>(C device, A device, B device, N); ... } 37/79 37/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Principes généraux Multiplication de matrices Gestion de la mémoire GPU via le PC hôte #define BLOCK SIZE 16 void matrixMul host(int N) { // allocate host memory int mem size=N2 *sizeof(float); float* A host = (float*) malloc(mem size); float* B host = (float*) malloc(mem size); float* C host = (float*) malloc(mem size); // allocate device memory float* A device,B device,C device; cudaMalloc((void**) &A device, mem size); cudaMalloc((void**) &B device, mem size); cudaMalloc((void**) &C device, mem size); // copy host memory to device cudaMemcpy(A device, A host, mem size,cudaMemcpyHostToDevice); cudaMemcpy(B device, B host, mem size,cudaMemcpyHostToDevice); //setup execution parameters dim3 threads(BLOCK SIZE, BLOCK SIZE); dim3 grid(N /BLOCK SIZE , N /BLOCK SIZE ); // execute the kernel matrixMul<<< grid, threads >>>(C device, A device, B device, N); // copy result from device to host cudaMemcpy(C host, C device, mem size,cudaMemcpyDeviceToHost) ; } 38/79 38/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Principes généraux Multiplication de matrices Temps GPU Matrices de taille 1024·1024 C Cuda Processeur Xeon Quad core 2.5 Ghz Quadro FX 56001 128 PE @1,4 Ghz Temps d’exécution 4.5 s Transfert mémoire 1.7 s < 1% 39/79 39/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Principes généraux Multiplication de matrices Optimisation des accès mémoire b0j C =A·B un bloc : B0J bkj CIJ = AI BJ un thread : cij = X aik bkj k en mémoire shared ai0 aik ain bnj B cij CIJ AI 0 A C 40/79 40/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Principes généraux Multiplication de matrices Optimisation des accès mémoire b0j C =A·B un bloc : bkj CIJ = AI BJ un thread : cij = X aik bkj k en mémoire shared ai0 aik ain bnj BNJ B cij CIJ AIN A C 41/79 41/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Principes généraux Multiplication de matrices Variable type qualifiers device en mémoire globale durée de vie de l’application accessible par tous les threads de la grille et par le hôte via la librairie runtime constant en mémoire globale (accès via cache constante) durée de vie de l’application accessible par tous les threads de la grille et par le hôte via la librairie runtime shared en mémoire shared (locale à un coeur SIMT) durée de vie du bloc de threads seulement accessible par les threads d’un même bloc 42/79 42/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Principes généraux Multiplication de matrices Temps GPU optimisé Matrices de taille 1024·1024 C Cuda Cuda optimisé Processeur Xeon Quad core 2.5 Ghz Quadro FX 56001 128 PE @1,4 Ghz Quadro FX 56001 128 PE @1,4 Ghz Temps d’exécution 4.5 s Transfert mémoire 1.7 s < 1% 36 ms ∼ 30% 43/79 43/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Principes généraux Multiplication de matrices Librairie CUBLAS : CUda Basic Linear Algebra Subprograms #include <cublas.h> #include <cutil.h> int main(void) { float alpha = 1.0f, beta = 0.0f; int N = 1024; int mem size = 1024*1024*sizeof(float); // Allocate host memory float* A host = (float*) malloc(mem size); float* B host = (float*) malloc(mem size); float* C host = (float*) malloc(mem size); cublasInit(); //Allocate device float* A device,B cublasAlloc(N*N, cublasAlloc(N*N, cublasAlloc(N*N, memory device,C device; sizeof(float), (void **)&A device); sizeof(float), (void **)&B device); sizeof(float), (void **)&C device); // copy host memory to device cublasSetMatrix(N,N, sizeof(float), A host, N, A device, N); cublasSetMatrix(N,N, sizeof(float), B host, N, B device, N); //Calcul matriciel sur le GPU cublasSgemm(’n’, ’n’, N, N, N, alpha, A device, N,B device, N, beta, C device, N); //Récupération du résultat sur le PC hôte cublasGetMatrix(N,N, sizeof(float), C device,N, C host, N); } 44/79 44/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Principes généraux Multiplication de matrices Temps CUBLAS Matrices de taille 1024·1024 C Cuda Cuda optimisé CUBLAS Processeur Xeon Quad core 2.5 Ghz Quadro FX 56001 128 PE @1,4 Ghz Quadro FX 56001 128 PE @1,4 Ghz Quadro FX 56001 128 PE @1,4 Ghz Temps d’exécution 4.5 s Transfert mémoire 1.7 s < 1% 36 ms ∼ 30% 24 ms ∼ 50% 45/79 45/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Principes généraux Multiplication de matrices Interface Matlab (1/2) void mexFunction( int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[] ){ unsigned int N = mxGetM(prhs[0]); plhs[0] = mxCreateDoubleMatrix(N,N, mxREAL); // Assign pointers to each input and output. double *A double h,*B double h,*C double h; A double h = mxGetPr(prhs[0]); B double h = mxGetPr(prhs[1]); C double h = mxGetPr(plhs[0]); //Convertion de A et B en float float *A float h,*B float h,*C float h; A float h=(float *)mxMalloc(sizeof(float)*N*N); B float h=(float *)mxMalloc(sizeof(float)*N*N); C float h=(float *)mxMalloc(sizeof(float)*N*N); for (int i=0;i¡N*N;i++){ A float h[i]=(float) A double h[i]; B float h[i]=(float) B double h[i];} // allocate device memory float* A d,B d,C d; cudaMalloc((void**) &A d, N*N*sizeof(float)); cudaMalloc((void**) &B d, N*N*sizeof(float)); cudaMalloc((void**) &C d, N*N*sizeof(float)); // copy host memory to device cudaMemcpy(A d, A float h,N*N*sizeof(float) ,cudaMemcpyHostToDevice) ; cudaMemcpy(B d, B float h,N*N*sizeof(float) ,cudaMemcpyHostToDevice) ; 46/79 46/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Principes généraux Multiplication de matrices Interface Matlab (2/2) // setup execution parameters dim3 threads(BLOCK SIZE, BLOCK SIZE); dim3 grid(N /BLOCK SIZE , N /BLOCK SIZE ); // execute the kernel matrixMul<<< grid, threads >>>(C d, A d, B d, N, N); // copy result from device to host cudaMemcpy(C float h, C d,N*N*sizeof(float) ,cudaMemcpyDeviceToHost) ); //Convertion de C en double for (i=0;i¡N*N;i++){ C double h[i]=(double) C float h[i];} } 47/79 47/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique 1 Architecture des processeurs graphiques 2 Programmation sous CUDA 3 Exemples du SDK de CUDA 4 Reconstruction tomographique sur GPUs 48/79 48/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Exemples du SDK de CUDA [Zone ] (1/2) Algèbre linéaire Multiplication matrice Calcul des valeurs propores Traitement d’image Convolution d’image (noyau separable) Convolution d’image par FFT Filtre de Sobel DCT Débruitage d’image Histogram 49/79 49/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Exemples du SDK de CUDA [Zone ] (2/2) Monte carlo Quasi random generator Simulation Montecarlo pour la finance Mersenne Twister (générateur de nombre aléatoire) Manipulation de données Réduction parallèle Scan (utilisé pour les algorithmes de tri) 50/79 50/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours 1 Architecture des processeurs graphiques 2 Programmation sous CUDA 3 Exemples du SDK de CUDA 4 Reconstruction tomographique sur GPUs Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours 51/79 51/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours Projet TOMOX : Algorithmes innovants pour la reconstruction en nano-tomographie X ? IMAGEUR 3D HAUTE RESOLUTION Objet à imager 1 ACQUISITION − Plateforme de microtomographie X haute résolution CEA−List 2 RECONSTRUCTION − Algorithme innovant (brevet) − Accélération sur processeurs graphiques L2S/Supelec/CNRS/UPS Structure interne de l’objet 52/79 52/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours Projet TOMOX : Algorithmes innovants pour la reconstruction en nano-tomographie X ? 1 phi IMAGEUR 3D HAUTE RESOLUTION Objet à imager 1 ACQUISITION − Plateforme de microtomographie X haute résolution Projections Tomographe CEA−List phi 2 RECONSTRUCTION − Algorithme innovant (brevet) − Accélération sur processeurs graphiques L2S/Supelec/CNRS/UPS Structure interne de l’objet 52/79 52/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours Projet TOMOX : Algorithmes innovants pour la reconstruction en nano-tomographie X ? 1 phi IMAGEUR 3D HAUTE RESOLUTION Objet à imager 1 ACQUISITION − Plateforme de microtomographie X haute résolution Projections Tomographe CEA−List 2 phi 2 RECONSTRUCTION GPU − Algorithme innovant (brevet) − Accélération sur processeurs graphiques L2S/Supelec/CNRS/UPS Structure interne de l’objet 52/79 52/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours Projet TOMOX : Algorithmes innovants pour la reconstruction en nano-tomographie X ? 1 phi IMAGEUR 3D HAUTE RESOLUTION Objet à imager 1 ACQUISITION − Plateforme de microtomographie X haute résolution Tomographe APPLICATIONS − Controle non destructif (réacteurs, pipelines, pièces industrielles...) − Imagerie medicale − Transport − Agro−alimentaire − Micro−électronique (controle qualité) Projections CEA−List 2 phi 2 RECONSTRUCTION GPU − Algorithme innovant (brevet) − Accélération sur processeurs graphiques L2S/Supelec/CNRS/UPS Structure interne de l’objet 52/79 52/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours SANS régularisation bayésienne fn H g = Hf + ĝ = Hf n g δg = g − ĝ Descente de gradient Ht −> N iterations H t δg f n+1 f : volume g : données du tomographe H : modèle d’acquisition : bruit Descente de gradient J(f ) = ||g − Hf ||2 f n+1 = f n − α · ∇J(f n ) ∇J(f ) = −2 · H t (g − Hf ) 53/79 53/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours SANS régularisation bayésienne fn H g = Hf + ĝ = Hf n g δg = g − ĝ Descente de gradient Ht −> N iterations δf = H t δg f n+1 f : volume g : données du tomographe H : modèle d’acquisition : bruit f n : Estimée du volume Descente de gradient J(f ) = ||g − Hf ||2 f n+1 = f n − α · ∇J(f n ) ∇J(f ) = −2 · H t (g − Hf ) 54/79 54/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours SANS régularisation bayésienne fn H g = Hf + ĝ = Hf n g δg = g − ĝ Descente de gradient Ht −> N iterations δf = H t δg f n+1 f : volume g : données du tomographe H : modèle d’acquisition : bruit ĝ : Estimée des données Descente de gradient J(f ) = ||g − Hf ||2 f n+1 = f n − α · ∇J(f n ) ∇J(f ) = −2 · H t (g − Hf ) 55/79 55/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours SANS régularisation bayésienne fn H g = Hf + ĝ = Hf n g δg = g − ĝ Descente de gradient Ht −> N iterations δf = H t δg f n+1 f : volume g : données du tomographe H : modèle d’acquisition : bruit δg : Correction des données Descente de gradient J(f ) = ||g − Hf ||2 f n+1 = f n − α · ∇J(f n ) ∇J(f ) = −2 · H t (g − Hf ) 56/79 56/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours SANS régularisation bayésienne fn H g = Hf + ĝ = Hf n g δg = g − ĝ Descente de gradient Ht −> N iterations δf = H t δg f n+1 f : volume g : données du tomographe H : modèle d’acquisition : bruit δf : Correction du volume Descente de gradient J(f ) = ||g − Hf ||2 f n+1 = f n − α · ∇J(f n ) ∇J(f ) = −2 · H t (g − Hf ) 57/79 57/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours SANS régularisation bayésienne fn H g = Hf + ĝ = Hf n g δg = g − ĝ Descente de gradient Ht −> N iterations δf = H t δg f n+1 f : volume g : données du tomographe H : modèle d’acquisition : bruit f n+1 : Nouvelle estimée du volume Descente de gradient J(f ) = ||g − Hf ||2 f n+1 = f n − α · ∇J(f n ) ∇J(f ) = −2 · H t (g − Hf ) 58/79 58/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours AVEC régularisation bayésienne fn H ĝ = Hf n g = Hf + g δg = g − ĝ Descente de gradient Ht −> N iterations δf = H t δg f n+1 f : volume g : données du tomographe H : modèle d’acquisition : bruit Modèle a priori : f = ∪k fk Segmentation z fk = {r : z(r ) = k} f (r )|z(r ) = k ∼ N (mk , σk2 ) z = 0 : air z = 1 : eau z = 2 : metal 59/79 59/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours AVEC régularisation bayésienne z θ f H ĝ = Hf n g λ∇J2 δg = g − ĝ H t δ1 f = H t δg f δ2 f = λ∇J2 (f n ) n+1 g = Hf + f : volume g : données du tomographe H : modèle d’acquisition : bruit n Descente de gradient avec régularisation −> N iterations Modèle a priori : f = ∪k fk fk = {r : z(r ) = k} f (r )|z(r ) = k ∼ N (mk , σk2 ) Descente de gradient régularisée Segmentation z z = 0 : air z = 1 : eau z = 2 : metal J(f ) = J1 (f ) + J2 (f ) 2 J1 (f ) = ||g − Hf P|| P P ¯ ¯ 0 J2 (f |z, θ) = λ k r ∈Rk r 0 ∈V(r ) φ(f (r ) − f (r )) f (r ) − mk f¯(r ) = σk f n+1 = f n − α1 · ∇J1 (f n ) − α2 · ∇J2 (f n |z, θ) 60/79 60/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours AVEC régularisation bayésienne fi zi θi g = Hf + f : volume g : données du tomographe H : modèle d’acquisition : bruit n f H ĝ = Hf n g λ∇J2 δg = g − ĝ H t δ1 f = H t δg Descente de gradient δ2 f = λ∇J2 (f n ) avec régularisation −> N iterations f n+1 f i+1 zi θi Segmentation −> M iterations θi Segmentation z z = 0 : air z = 1 : eau z = 2 : metal z i+1 Calcul des hyperparametres θi+1 Modèle a priori : f = ∪k fk Reconstruction −> I iterations fk = {r : z(r ) = k} f (r )|z(r ) = k ∼ N (mk , σk2 ) Descente de gradient régularisée J(f ) = J1 (f ) + J2 (f ) 2 J1 (f ) = ||g − Hf P|| P P ¯ ¯ 0 J2 (f |z, θ) = λ k r ∈Rk r 0 ∈V(r ) φ(f (r ) − f (r )) f (r ) − mk f¯(r ) = σk f n+1 = f n − α1 · ∇J1 (f n ) − α2 · ∇J2 (f n |z, θ) 61/79 61/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours Calcul de Hf et H t δg : choix de la méthode ¶ Calcul matriciel ò lecture des coefficients hij dans la mémoire SDRAM volume 20483 − > matrice H = 1 To ! 62/79 62/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours Calcul de Hf et H t δg : choix de la méthode ¶ Calcul matriciel ò lecture des coefficients hij dans la mémoire SDRAM volume 20483 − > matrice H = 1 To ! · Opérateurs géométriques ò calcul en ligne des coefficients hij Paire de projection/rétroprojection en tomographie à émission (géométrie parallèle) u u détecteurs du tomographe phi phi Objet imagé projection Objet reconstruit rétroprojection 62/79 62/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours Rétroprojection 2D : algorithme CALCUL DES COORDONNEES Detecteurs u y g (φ, u) φ x Source Volume for (xn, yn) in Volume do for phi = 0 to phimax − 1 do // Calcul des coordonnées u(phi, xn, yn) = ... // Accumulation f ∗ (xn, yn)+ = g (u, φ) end for end for 63/79 63/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours Rétroprojection 2D : interpolation linéaire CALCUL DES COORDONNEES Detecteurs u ue +1 u(x) ue y g (φ, u) u Source φ x Source Volume for (xn, yn) in Volume do for phi = 0 to phimax − 1 do // Calcul des coordonnées u(phi, xn, yn) = ... // Interpolation linéaire ginterp = (1 − u ) · g (phi, ue ) + u · g (phi, ue + 1) // Accumulation f ∗ (xn, yn)+ = ginterp end for end for 64/79 64/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours Rétroprojection 2D : accès aux données dispersés CALCUL DES COORDONNEES Detecteurs u ue +1 u(x) ue y g (φ, u) u Source φ x Source Volume ACCES AUX DONNEES g (φ, u) φ u Données 2D dans l’espace (φ,u) for (xn, yn) in Volume do for phi = 0 to phimax − 1 do // Calcul des coordonnées u(phi, xn, yn) = ... // Interpolation linéaire ginterp = (1 − u ) · g (phi, ue ) + u · g (phi, ue + 1) // Accumulation f ∗ (xn, yn)+ = ginterp end for end for 65/79 65/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours Rétroprojection 2D : accès aux données dispersés CALCUL DES COORDONNEES Detecteurs u ue +1 u(x) ue y g (φ, u) u Source φ x Source Volume ACCES AUX DONNEES g (φ, u) φ u Données 2D dans l’espace (φ,u) for (xn, yn) in Volume do for phi = 0 to phimax − 1 do // Calcul des coordonnées u(phi, xn, yn) = ... // Interpolation linéaire ginterp = (1 − u ) · g (phi, ue ) + u · g (phi, ue + 1) // Accumulation f ∗ (xn, yn)+ = ginterp end for end for @= u + phi ∗ Wu Données 1D dans la mémoire 66/79 66/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours Rétroprojection 2D : accès aux données dispersés CALCUL DES COORDONNEES Detecteurs u ue +1 u(x) ue y g (φ, u) u Source φ x Source Volume ACCES AUX DONNEES g (φ, u) φ u Données 2D dans l’espace (φ,u) for (xn, yn) in Volume do for phi = 0 to phimax − 1 do // Calcul des coordonnées u(phi, xn, yn) = ... // Interpolation linéaire ginterp = (1 − u ) · g (phi, ue ) + u · g (phi, ue + 1) // Accumulation f ∗ (xn, yn)+ = ginterp end for end for @= u + phi ∗ Wu Données 1D dans la mémoire 67/79 67/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours Rétroprojection 2D par bloc : accès aux données localisés CALCUL DES COORDONNEES Detecteurs u ue +1 u(x) ue y g (φ, u) u Source φ x Source Volume ACCES AUX DONNEES g (φ, u) φ u Données 2D dans l’espace (φ,u) @= u + phi ∗ Wu Données 1D dans la mémoire for (Bx, By) in Volume do for phi = 0 to phimax − 1 do for (xn, yn) in Bloc do // Calcul des coordonnées u(phi, xn, yn) = ... // Interpolation linéaire ginterp = (1 − u ) · g (phi, ue ) + u · g (phi, ue + 1) // Accumulation f ∗ (xn, yn)+ = ginterp end for end for end for 68/79 68/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours Découpage en threads de la rétroprojection 3D z (a) Calcul séquentiel sur un PE Boucle sur z 3 1 3 Boucle sur φ 4 2 4 (b) Calcul parallèle sur un proc. SIMT 2 1 y Boucle sur (x,y) x 4 3 1 (c) Calcul parallèle sur une carte Boucle sur les blocs (Bx,By,Bz) 2 69/79 69/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours Découpage en threads de la rétroprojection 3D z (a) Calcul séquentiel sur un PE Boucle sur z 3 1 3 Boucle sur φ 4 2 4 (b) Calcul parallèle sur un proc. SIMT 2 1 y Boucle sur (x,y) x 4 3 1 (c) Calcul parallèle sur une carte Boucle sur les blocs (Bx,By,Bz) 2 69/79 69/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours Découpage en threads de la rétroprojection 3D z (a) Calcul séquentiel sur un PE Boucle sur z 3 1 3 Boucle sur φ 4 2 4 (b) Calcul parallèle sur un proc. SIMT 2 1 y Boucle sur (x,y) x 4 3 1 (c) Calcul parallèle sur une carte Boucle sur les blocs (Bx,By,Bz) 2 69/79 69/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours Découpage en threads de la rétroprojection 3D z (a) Calcul séquentiel sur un PE Boucle sur z 3 1 3 Boucle sur φ 4 2 4 (b) Calcul parallèle sur un proc. SIMT 2 1 y Boucle sur (x,y) x 4 3 1 (c) Calcul parallèle sur une carte Boucle sur les blocs (Bx,By,Bz) 2 69/79 69/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours Pseudo-code parallèle de la rétroprojection 3D for (Bx.id,By.id,Bz.id)=(0,0) to (NBx − 1, NBy − 1, NBz − 1) for (Tx.id,Ty.id)=(0,0) to (NTx -1,NTy -1) xn=Bx.id ·NTx +Tx.id yn=By.id ·NTy +Ty.id for c b a zn = znfirst to znstop for phi = phistart to phistop un(xn, yn, phi) = ... Ax,y ,φ = ... vn(xn, yn, zn, phi) = Ax,y ,φ · zn @texun,phi = un + phi · Nun B(xn, yn, zn)+ = tex2D(@texun,phi , vn) zn + + end // Accumulation du Bloc BBx.id,By .id // de la mémoire shared dans la mémoire globale end end end 70/79 70/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours Découpage en threads et en grilles de la rétroprojection 3D (a) Calcul séquentiel sur un PE Boucle sur z Boucle sur φ 3 1 3 (b) Calcul parallèle sur un proc. SIMT 4 2 4 x 2 1 4 3 1 Boucle sur (x,y) (c) Calcul parallèle sur une carte 2 Boucle sur les blocs (Bx,By,Bz) (d) Calcul parallèle sur PC multi-cartes Boucle sur les grilles (Gx,Gy) Boucle sur la grille Gφ 71/79 71/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours Pseudo-code parallèle de la rétroprojection 3D for (Gx.id,Gy.id)=(0,0) to (NGx − 1, NGy − 1) for Gφ.id=0 to NG φ − 1 //Copie des Plans Pphistart ..Pphistop de la mémoire CPU dans la mémoire globale du GPU for (Bx.id,By.id,Bz.id)=(0,0) to (NBx − 1, NBy − 1, NBz − 1) c for (Tx.id,Ty.id)=(0,0) to (NTx -1,NTy -1) b xn=Bx.id ·NTx +Tx.id a yn=By.id ·NTy +Ty.id for d phi = phistart to phistop un(xn, yn, phi) = ... Ax,y ,φ = ... vn(xn, yn, zn, phi) = Ax,y ,φ · zn0 @texun,phi = un + phi · Nun for zn = znfirst to znstop B(xn, yn, zn)+ = tex2D(@texun,phi , vn) vn+ = Ax,y ,φ zn + + end // Accumulation du Bloc BBx.id,By .id,Bz.id // de la mémoire shared dans la mémoire globale end end end end //Accumulation de la grille G(Gx.id,Gy .id) de la memoire globale dans la mémoire du PC hote end 72/79 72/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours Projecteur 2D “ray-driven” Detecteurs u ye +1 y(x) ye y y Source φ x Source Volume for (un, phi) in Projection do for xn = 0 to xnmax − 1 do // Calcul des coordonnées yn(xn, un, phi) = ... // Interpolation linéaire finterp = (1 − y ) · f (xn, yne ) + y · f (xn, yne + 1) // Accumulation g ∗ (un, phi)+ = finterp end for end for 73/79 73/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours Temps de reconstruction mono-GPU Reconstruction sur une GTX 295 (240 SPs @1.2 Ghz) volume de 2643 voxels (champs de vue cylindrique) 64 projections de 2562 pixels Rétroprojecteur Projecteur Temps 195 ms (*370 / CPU) 505 ms (*320 / CPU) 74/79 74/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours Temps de reconstruction multi-GPU 75/79 75/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours Temps de reconstruction multi-GPU Reconstruction sur une Tesla S1070 (serveur 4 et 8 GPUs) volume de 10243 voxels (champs de vue cylindrique) 512 projections de 1024 ∗ 1280 pixels Rétroprojecteur Projecteur GPUs 2 4 8 2 4 8 Temps 85 s 44 s 26 s 251 s 133 s 73 s 76/79 76/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours Travaux en cours ¶ Algorithme bayésien avec segmentation (Gauss/Markov/Potts) Validation de la méthode sur données réelles (CEA) Accélération des étapes annexes de calcul sur GPU (convolution 3D, échantillonnage de Potts) · Parallélisation sur machine 8 GPUs de Carri system Parallélisation sur 8 GPUs effectives ¸ Cohérence paire projection/rétroprojection Etude de la convergence de l’algorithme itératif pour plusieurs projecteurs couplés avec un rétroprojecteur voxel driven 77/79 77/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours Merci de votre attention ! 78/79 78/79 Architecture des processeurs graphiques Programmation sous CUDA Exemples du SDK de CUDA Reconstruction tomographique Projet TOMOX Algorithme bayésien itératif du L2S/CEA Implémentation sur GPU Résultats et travaux en cours Références Peter M. Joseph. An Improved Algorithm for Reprojecting Rays through Pixel Images. vol. 1, no. 3, pages 192–196, Nov. 1982. Wilfried Kirschenmann. Parallélisation d’un solveur de neutronique sur GPU. In 2ième Journée Thème Émergeant GPGPU (GDR ASR), December 2008. M. Knaup & M. Kachelrieß. GPU-Based Parallel-Beam and Cone-Beam GPU Forward- and Backprojection using CUDA. In MIC, 2008. Fang Xu & Klaus Mueller. Real-time 3D computed tomographic reconstruction using commodity graphics hardware. Physics in Medicine and Biology, vol. 52, no. 12, pages 3405–3419, 2007. CUDA Zone. http://www.nvidia.com/object/cuda home.html. 79/79 79/79