Procesamiento de imágenes
en GPUs mediante CUDA
Manuel Ujaldón Martínez
Nvidia CUDA Fellow
Departamento de Arquitectura de Computadores Universidad de Málaga
Indice de contenidos
1. Introducción. [2]
2. La GPU en computación heterogénea. [5]
3. La GPU en computación de altas prestaciones. [7] 4. Procesamiento de imágenes en GPU-CUDA [23]:
1. Herramientas y lenguajes a utilizar. [8]
2. Caracterización de la imagen: Extracción de rasgos. [15]
1. Kernels desarrollados [9] 2. Implementación en CUDA [3]
3. Resultados experimentales y análisis [6] 5. Recomendaciones finales [1]
2
I. Introducción
3
El mercado de los chips gráficos y su peso
en el contexto global de la circuitería para PC
Número total de chips gráficos vendidos en un trimestre:
124 millones el último trimestre de 2011. 138.5 millones el penúltimo trimestre de 2011. 114 millones el último trimestre de 2010.
El mercado de los chips gráficos sigue creciendo, aunque se notan los efectos de la crisis.
Comparado con las ventas de PCs, que fueron de 93.5 millones en el último trimestre de 2011, tenemos 1.5 chips gráficos por cada PC, y este porcentaje del 150% viene creciendo de forma sostenida desde el 115% en 2001.
En apenas 5 años, la programación CUDA
está muy extendida y plenamente consolidada
Se publican más de 500 artículos científicos cada año. Más de 500 universidades incluyen CUDA en sus cursos. Más de 350 millones de GPUs se programan con CUDA. Más de 120.000 programadores CUDA en activo.
Más de un millón de descargas del compilador y toolkit.
5
II. La GPU en
computación heterogénea
6 3072 cores 16 coresUtilizar tanto la CPU como la GPU
Cada procesador se encarga de ejecutar aquello en lo que es más eficiente
El eje central de la próxima generación:
Computación heterogénea
7
En lugar de rivalizar, vamos a aprovechar
lo mejor de cada modelo computacional
A favor de la CPU:
!Cachés muy rápidas.
!Buen manejo de las
dependencias de datos y control.
!Muchos paradigmas para
ejecutar hilos y procesos.
!Alto rendimiento sobre un
único hilo de ejecución.
!Mejor cobertura de E/S.
PARALELISMO DE TAREAS
A favor de la GPU:
! Núcleos computacionales muy numerosos.
! Paralelismo masivo.
! Hardware dedicado para
cálculos matemáticos.
! Alto rendimiento ejecutando
tareas paralelas.
! DRAM muy veloz.
PARALELISMO DE DATOS
La unión CPU-GPU permite lograr
un entorno altamente complementario
Gran ancho de banda en las comunicaciones:
Externas: Superior a 10 GB/s (PCI-express 3).
Internas: Superior a 100 GB/s (memoria de vídeo GDDR5 y anchura de bus en torno a 384 bits, que es como un séxtuple canal en CPU).
9
Operación 1 Operación 2 Operación 3
Init Alloc
Función Lib Lib Función Función
CPU
GPU
Ámbitos de aplicación
del modelo heterogéneo
Oil & Gas Finance Medical Biophysics Numerics Audio Video Imaging
GPU (Computación paralela) Gráficos CPU (Computación secuencial) Computación altamente paralela Control y comunicación Aplicaciones de productividad Aplicaciones intensivas en el acceso a datos 10
Cómo encontrar el punto óptimo de
cooperación en computación heterogénea
11
III. La GPU en computación
de altas prestaciones
Los supercomputadores más potentes se
construyen mayoritariamente con GPUs
18 de Junio de 2012: 9 de Noviembre de 2011:
13
Y las herramientas de programación están
también a la altura de estas exigencias
Librerías.
Lenguajes y APIs. Debuggers.
Profilers.
Gestión de tareas y recursos.
14
Millones de
investigadores Tarjeta gráfica 5000 dólaresMenos de Miles de investigadores Cientos de investigadores Entre 50.000 y 1.000.000 de dólares Más de un millón de dólares Cluster preconfigurado de servidores Tesla Cluster a gran escala
Existe una plataforma hardware
para cada perfil de usuario...
15 16 Tesla Computación de altas prestaciones Quadro® Gráficos profesionales: Diseño y creación GeForce® Jugones: Ocio y entretenimiento
Todos ellos basados en una misma microarquitectura
Existen tres perfiles de usuario en Nvidia
dentro de la base de la pirámide anterior
100000 - 1M ! 100x 1x 10000x Cluster tradicional de CPUs Estación de trabajo CPU < 10000 ! Supercomputador personal con GPU
Cluster de nodos Tesla para coprocesamiento
La relación rendimiento/coste
es muy favorable ...
17 Re nd im ie nt o 100 veces más económico Coste 100 veces más potente 100 veces más potente... y el consumo es más eficiente
18 ! " #! #" $! %&'()*+,*+ -*./0()#!1! 18X mejor ratio en rendimiento/vatio respecto a la CPU 2.8/5.6 GFLOPS 4 MB 2 procesadores 2 chips, 1x2x1 5.6/11.2 GFLOPS 1.0 GB (32 chips 4x4x2) 16 computan, 0-2 E/S 90/180 GFLOPS 16 GB 32 Nodos 2.8/5.6 TFLOPS 512 GB 64 Racks, 64x32x32 180/360 TFLOPS 32 TB El armario (rack) El sistema El nodoLas placas base
El chip
Cómo se construye
un supercomputador:
BlueGene/L
19
IV. Procesamiento de imágenes
en GPU mediante CUDA
IV.1 Lenguajes y herramientas
21
Lenguajes y herramientas útiles
para el programador y su evolución
En el contexto de la programación gráfica:
2001: HLSL (programación de shaders - Microsoft). 2003: OpenGL y Cg (C vectorial para shaders - Nvidia). 2006: CUDA (GPGPU para plataformas Nvidia).
2009: OpenCL (GPGPU para todo tipo de plataformas gráficas). 2012: OpenACC (para programadores menos avezados).
En el contexto de la programación paralela de CPUs:
P-threads para las plataformas multi-core. MPI/OpenMP para las plataformas multi-socket.
Veamos cómo se relaciona todo esto basándonos en la programación de nuestras aplicaciones.
22
23
Versiones multicore en CPU y GPU
24
Versiones multinodo
25
Versiones multicore sobre múltiples nodos
26
Ruta seguida por nuestra primera aplicación:
Extracción de rasgos de una imagen
27
Ruta seguida por nuestra segunda aplicación:
Segmentación y clustering de imágenes
28
Ruta seguida por nuestra tercera aplicación:
Registro y reconstrucción 3D
IV.2 Caracterización de la
imagen: Extracción de rasgos
29
IV.2.1 Kernels desarrollados
30
Operadores que vamos a implementar
en CUDA para caracterizar imágenes
Conversiones de formato en tratamiento del color.
Utilizar la representación más adecuada según la aplicación.
Operadores en el entorno de vecindad (stencils).
LBP (Local Binary Pattern).
Matrices de co-ocurrencia.
Cálculo de parámetros estadísticos para el análisis de texturas.
Momentos de Legendre y Zernike.
Reconstrucción de imágenes, filtros/convoluciones y análisis de texturas.
31
Conversiones de formato para el color
Se trata de los operadores más afines a la GPU, catalogados como "streaming".
Utilizados para representar con mayor fidelidad el color en el procesamiento de imágenes, como por ejemplo:
Color por adición (luz en monitores): RGB, XYZ. Color por sustracción (tinta en papel): CMYK. Gestión del color: LUV, LA*B*, HSV.
Almacenamiento digital y fotografía: sRGB, JPEG, PNG. Representación de texturas para renderización (bitmaps).
Se requiere una conversión de formato desde el formato origen a otro más apropiado según el ámbito de trabajo de la aplicación.
Operadores en el entorno de vecindad:
LBP (Local Binary Pattern) (1)
Basado en patrones binarios locales (Ojala, 2002)
Recoge la proporción de micro-rasgos tales como aristas, brillo y puntos oscuros.
Resulta muy utilizado en aplicaciones como el reconocimiento de expresiones faciales.
33
Operadores en el entorno de vecindad:
LBP (Local Binary Pattern) (2)
Es invariante a la rotación de la imagen y a variaciones de intensidad local o global.
Para ello, cada valor obtenido se caracteriza dentro de una de las nueve clases siguientes:
34
Matrices de co-ocurrencia
Ideadas por Haralick (1973).
Histograma de intensidades de pares de píxeles que guardan una determinada relación espacial [dx,dy].
Recoge la variación espacial de intensidades.
Se usa como estructura de datos intermedia para calcular ciertos rasgos: Contraste, correlación, energía, …
Ejemplo para una pequeña imagen con cuatro niveles de intensidad:
35
Variantes para el cálculo de
las matrices de co-ocurrencia
Dependiendo de la aplicación que las utilice:
Se calculan para cada píxel o subimagen a tratar.
Tamaño de ventana a procesar centrada en cada píxel o subimagen: Desde pequeña (4x4) a grande (256x256).
Espacio de color discretizado o completo [0..255].
Calculado para cada canal de color de forma separada o sobre escala de grises de forma conjunta.
Configuración experimental:
Resolución de las imágenes de entrada. Tratamiento hardware: CPU vs GPU.
Estructuras de datos: Matrices densas/dispersas.
Momentos de Legendre y Zernike
Son filtros definidos en el dominio espacial como una forma directa de capturar las propiedades de una textura.
Los polinomios de Legendre y Zernike representan una imagen mediante un conjunto de descriptores mutuamente independientes.
Los polinomios de Zernike son más exigentes
computacionalmente que los de Legendre, pero también son invariantes a transformaciones lineales (escalado, rotación), siendo más atractivos para procesamiento de imágenes.
37
Momentos de Legendre y Zernike (2)
El momento calculado para una ventana centrada en un píxel puede interpretarse como una convolución de la imagen con una máscara.
Cuanto mayor es el número de momentos, mejor es la reconstrucción.
Las implementaciones existentes en CPU se han
optimizado utilizando algoritmos recursivos, lo que plantea un reto a la GPU debido a las dependencias de datos entre iteraciones de los lazos.
La alternativa de cálculo utilizando métodos directos (vs. iterativos) resulta más rápida en GPU, ya que aunque se
requieren más computos, se explota mucho más paralelismo. 38
39
Ejemplo: Momento de Zernike de orden 0
aplicado al canal rojo de 6 ventanas 64x64
Tejido óseo: ! 166.33 ! 146.91 ! 148.53 Cartílago: ! 231.12 ! 234.75 ! 226.33
IV.2.2. La implementación
en CUDA
4041
Las bazas de la GPU para mejorar
implementaciones ya existentes en CPU
! Explotar el paralelismo inherente a la aplicación: Elegir el número de threads óptimo y su despliegue en bloques.
! Utilizar mecanismos específicos para el acceso a memoria en GPU.
!Evitar conflictos en el acceso a bancos de memoria.
!Grandes latencias en el acceso a memoria global, poca capacidad de memoria local y muy cercana a la velocidad del banco de registros.
!Elección de la estructura de datos más adecuada.
! Crear kernels que reutilicen datos.
GPU Multiprocesador N Multiprocesador 2 Multiprocesador 1 Memoria global Memoria compartida Core 1 Regs
…
Core 2 Regs Core M Regs Caché de texturas 42Ejemplo de optimización sobre
la jerarquía de memoria de CUDA
Las matrices de co-ocurrencia tienden a concentrar sus elementos en torno a la diagonal principal.
Algunos ejemplos ilustrativos:
Solución: Utilizar matrices dispersas para minimizar el consumo de memoria.
Regeneración ósea según
diferentes tinciones: Diagnóstico del cáncer
43
Implementación mediante matrices dispersas:
Utilizamos el formato coordenado
Ejemplo:
Resulta algo más difícil de acceder que las listas simple o doblemente enlazadas, pero también es más compacto, que es nuestra prioridad aquí.
IV.2.3. Análisis de rendimiento
45
Procesadores utilizados en la evaluación
experimental de todos estos algoritmos
Parámetro hardware CPU GPU
Modelo comercial Código de referencia Frecuencia de reloj Potencia bruta de cálculo Anchura del bus de memoria Reloj para la memoria Ancho de banda de la memoria Tamaño y tipo de memoria
Intel Core 2 Duo Nvidia GeForce E6400 8800 GTX (G80) 2.13 GHz 575 MHz 10 GFLOPS 520 GFLOPS 64 bits 384 bits 2x333 MHz 2x900 MHz 10.8 GB/sg. 86.4 GB/sg. 2 GB DDR2 768 MB GDDR3 46
Resultados para las conversiones de color
Conversión Tiempo en CPU Tiempo en GPU Aceleración en GPU
RGB to XYZ RGB to Luv RGB to LA*B* RGB to HSV RGB to sRGB sRGB to XYZ sRGB to Luv sRGB to LA*B* 140.01 ms. 1.27 ms. 109.47x 273.83 ms. 1.42 ms. 191.62x 267.92 ms. 2.23 ms. 119.66x 16.60 ms. 0.57 ms. 28.98x 123.51 ms. 1.23 ms. 99.84x 16.50 ms. 0.43 ms. 37.59x 150.31 ms. 0.57 ms. 263.25x 144.41 ms. 1.29 ms. 111.68x 47
Resultados para el operador LBP
Tamaño de
la ventana CPU/C++ GPU/Cg GPU/CUDA Aceleración en GPU
128x128 256x256 512x512 1K x 1K 2K x 2K 3.95 ms. 1.01 ms. 0.07 ms. 54.86 x 17.83 ms. 1.09 ms. 0.14 ms. 127.35 x 76.70 ms. 1.92 ms. 0.41 ms. 184.81 x 310.65 ms. 6.88 ms. 1.56 ms. 198.62 x 1234.96 ms. 23.91 ms. 6.11 ms. 201.98 x
•
Se consiguen mayores aceleraciones a medida queaumenta el tamaño de la ventana.
•
La GPU es más efectiva en ventanas grandes, mientras que CUDA se luce más en tamaños de ventana pequeños.48
Resultados para las matrices de co-ocurrencia.
Mejoras en GPU y usando matrices dispersas
Tamaño de
la ventana densaCPU/ densaGPU/ dispersaGPU/ % de datos no nulos dispersaMejora GPU/CPU
4x4 8x8 16x16 32x32 64x64 128x128 256x256 1.36 7.61 0.10 0.024% 76.10x 13.60x 2.82 7.62 0.16 0.097% 47.62x 17.62x 2.82 7.58 0.39 0.390% 19.43x 7.23x 3.04 7.63 0.74 1.562% 10.31x 4.10x 3.08 7.76 1.74 6.250% 4.45x 1.77x 2.94 8.54 7.70 25% 1.10x 0.38x 2.96 9.19 46.49 100% 0.19x 0.32x
49
Resultados para las matrices de co-ocurrencia.
Mejoras según formato de la matriz dispersa
Tamaño de
la ventana coordenadoFormato Listas simplemente enlazadas Listas doblemente enlazadas
4 x 4 8 x 8 16 x 16 32 x 32 64 x 64 128 x 128 256 x 256 0.10 0.13 0.30 0.14 0.25 0.58 0.36 1.02 1.52 0.45 2.31 4.91 1.13 3.46 6.52 6.58 19.85 23.33 43.19 65.99 78.19
La GPU es más efectiva utilizando formatos
sencillos de matrices dispersas. 50
Resultados para los momentos de Zernike
para toda una imagen de 1K x 1K
Momentos
calculados (nº) Método recursivo óptimo en CPU Método directo en GPU Aceleración en GPU
A4,* (3) A8,* (5) A12,* (7) A16,* (9) A20,* (11) 62.5 ms. 19.0 ms. 3.28 x 54.5 ms. 36.6 ms. 1.48 x 62.5 ms. 50.5 ms. 1.23 x 78.0 ms. 68.2 ms. 1.14 x 93.5 ms. 90.0 ms. 1.03 x
Mayores aceleraciones en GPU en los momentos de orden inferior.
51
Síntesis de resultados. Caracterización
de cada algoritmo sobre la GPU
Rasgo a cuantificar Conversiones
de color de vecindadOperadores coocurrenciaMatrices de de ZernikeMomentos
Entrada Salida Canales de color Rango computacional Peso computacional Tipo de operador Reutilización de datos Localidad de acceso Intensidad aritmética Acceso a memoria Aceleración en GPU
Un píxel Ventana 3x3 Subimagen Ventana variable Un píxel Un solo valor Cto. de valores Matriz de tam. var.
Tres Uno Uno Tres
Por píxel Por píxel Por subimagen Por píxel Muy ligero Ligero Pesado Muy pesado Streaming Streaming Recursivo Recurrente Ninguno Bajo Muy alto Alto Ninguna Baja Alta Muy alta
Muy alta Media Alta Baja
Bajo Medio Alto Muy alto
25-250x 50-200x 1-2x 0.7-1x
52
Recomendaciones finales para optimizar
algoritmos en la GPU usando CUDA
Implementar sobre todo algoritmos de computación regular, fuertemente paralelos y aritméticamente intensivos.
Adaptar el algoritmo para expresarlo mediante un número elevado de hilos lo más ligeros posible.
Rediseñar el algoritmo para evitar recursividades y recurrencias.
Pensar en las optimizaciones específicas de CUDA:
Maximizar el ancho de banda: Coalescing y conflictos en bancos. Maximizar el uso del tamaño de memoria compartida disponible.