30.07.2015 Views

Actas JP2011 - Universidad de La Laguna

Actas JP2011 - Universidad de La Laguna

Actas JP2011 - Universidad de La Laguna

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Actas</strong> XXII Jornadas <strong>de</strong> Paralelismo (<strong>JP2011</strong>) , <strong>La</strong> <strong>La</strong>guna, Tenerife, 7-9 septiembre 2011Algoritmo 1 Pseudocódigo <strong>de</strong> la aplicación BedpostBedpost1: para todo slice hacer2: para todo voxel hacer3: LevenbergMarquardt()4: MCMC()5: fin para6: fin paraMCMC1: para i = 0 hasta numIteraciones hacer2: para todo parametro hacer3: sample p = generar random()4: sample p n = normalizar(sample p)5: recalcular senal(direcciones)6: aceptarRechazar(sample p n)7: fin para8: fin paracomputando cada uno <strong>de</strong> los voxels <strong>de</strong> un slice <strong>de</strong>forma paralela tal y como muestra la figura 3. Fig. 3. voxels <strong>de</strong> un slice, agrupados en x bloques <strong>de</strong> tamañoy.El diseño <strong>de</strong>l algoritmo <strong>de</strong> Levenberg-Marquar<strong>de</strong>stá implementado en un único kernels basado enesta i<strong>de</strong>a. Cada hilo <strong>de</strong> CUDA sea mapeado con unvoxel, encargándose este <strong>de</strong> a<strong>de</strong>cuar sus valores iniciales.Por lo que tendremos tantos hilos como voxelstenga un slice concreto.Algoritmo 2 Pseudocódigo <strong>de</strong> la aplicaciónBedpost paralelizada en CUDA.1: para todo slice hacer2: bloqs := voxels/tamBloque13: levenbergKernel(bloqs, tamBloque1)4: genNumsKernel(bloqs, tamBloque1)5: ajuteNumsKernel(bloqs, tamBloque1)6: bloqs := (voxels ∗ direcs)/tamBloque27: mcmcKernel(bloqs, tamBloque2)8: fin paraEl caso <strong>de</strong>l algoritmo MCMC es un poco mas complejo.En este caso, el computo se ha divido en treskernels (véase el algoritmo 2).El primer kernel es encargado <strong>de</strong> la generación eficiente<strong>de</strong> números aleatorios. En cada iteración <strong>de</strong>lalgoritmo se <strong>de</strong>ben generar varios números aleatorios(dos por cada parámetro) lo que provoca que en slicescon varios miles <strong>de</strong> voxels se generen cientos <strong>de</strong>millones <strong>de</strong> números aleatorios. Estos números songenerados mediante el uso <strong>de</strong> la librería CURAND [15]<strong>de</strong> CUDA.Posteriormente, la mitad <strong>de</strong> los números pseudoaleatoriosque han sido generados antes <strong>de</strong>ben serajustados a una distribución normal estándar. Estose realiza mediante otro kernel para así po<strong>de</strong>r ejecutarun hilo por cada voxel.Finalmente se ejecuta el kernel MCMC. En este caso,el diseño difiere con los planteados anteriormente.Ahora tenemos tantos hilos como direcciones se quierananalizar para cada voxel, repartimos los voxelesentre los bloques (véase la figura 4). De este modoampliamos el número <strong>de</strong> hilos por bloque hasta alcanzarvalores entre 128 − 256 hilos. <strong>La</strong> existencia <strong>de</strong>slices con un número pequeño <strong>de</strong> voxels hacen queen ciertos casos no se pueda explotar el paralelismo<strong>de</strong> la GPU. A<strong>de</strong>más, este diseño nos beneficia a lahora <strong>de</strong> recalcular el valor <strong>de</strong> la ecuación 1, ya quese podrá realizar en paralelo para cada una <strong>de</strong> lasdirecciones. Fig. 4. m∗n∗direc hilos ejecutados en paralelo para el cálculo<strong>de</strong> m∗n voxels <strong>de</strong> un slice en direc direcciones, agrupadosen x bloques <strong>de</strong> tamaño y, don<strong>de</strong> y es múltiplo <strong>de</strong> direc.V. Evaluación <strong>de</strong> los ResultadosEn esta sección se muestran los resultados obtenidosen la ejecución <strong>de</strong> la aplicación Bedpost <strong>de</strong>lsoftware FSL comparando el tiempo <strong>de</strong> ejecución entreCPU y GPU.En nuestras pruebas se ha utilizado la versión 4.0<strong>de</strong> CUDA sobre una GPU Tesla C2050. Esta GPUse encuentra incorporada en un or<strong>de</strong>nador con dosprocesadores Intel Xeon E5620 a 2.40GHz y con 4GB<strong>de</strong> memoria principal. <strong>La</strong>s pruebas en CPU se hanrealizado utilizando un único hilo mapeado a uno <strong>de</strong>los cores <strong>de</strong>l sistema.Hemos dividido las pruebas en 4 partes, mostrandouna gráfica en escala logarítmica y un análisis <strong>de</strong>los resultados para cada una <strong>de</strong> ellas. Estas partes<strong>JP2011</strong>-162

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!