Presentation

publicité
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
Téléchargement