Computación Eficiente con Procesadores Gráficos

Daniel González Jiménez | Director Técnico del Área de Información Multimodal

En las últimas dos décadas, el creciente mercado de los videojuegos así como el entusiasmo de los jugadores por tener cada vez gráficos más realistas, han propiciado la aparición de dispositivos hardware dedicados por completo a la tarea de renderizar gráficos. Estos dispositivos, denominados procesadores gráficos (Graphical Processing Unit, GPU), han evolucionado desde una arquitectura completamente rígida hasta una enteramente programable como la que nos encontramos hoy en día en las tarjetas gráficas de consumo (la primera tarjeta gráfica programable fue NVIDIA GeForce3 lanzada en 2001).

Además de una arquitectura enteramente programable, los procesadores gráficos actuales destacan especialmente por el hecho de que su capacidad de cálculo es muy superior a la de los procesadores de propósito general como son los de Intel y Amd. Sin embargo, el incremento en capacidad computacional no es gratuito, ya que se sacrifica gran parte de la zona de control del procesador por unidades de cálculo, más apropiadas para la tarea de renderizar gráficos, la cual es muy exigente en términos de ancho de banda de memoria y operaciones por segundo.

Figura 1. Comparativa de capacidad de cálculo (fuente: www.nvidia.com)

En la figura 2 se pueden ver las diferencias básicas entre la arquitectura de un procesador de propósito general y un procesador gráfico, donde estos últimos están orientados a tareas de cómputo más uniformes y que se puedan paralelizar, en contraposición a los procesadores habituales especializados en controlar múltiples tareas de diversa naturaleza.

Figura 2. Diferencias de arquitectura entre procesadores de propósito general y procesadores gráficos (fuente: www.nvidia.com)

Aprovechando su demostrada eficiencia a la hora de realizar cálculos gráficos, a partir del año 2005 empezó a surgir una comunidad de desarrolladores que intentaban aprovechar la potencia de cálculo de los procesadores gráficos para tareas más generales, no exclusivamente centradas en el renderizado de gráficos. Estas tareas incluyen el procesado de vídeo e imágenes, procesado de señal para comunicaciones digitales, y la resolución de ecuaciones, entre otras. Las prestaciones obtenidas hasta la fecha son en muchos casos espectaculares, llegando a conseguirse reducciones de varios órdenes de magnitud en los tiempos de ejecución, especialmente en los problemas de tipo algorítmico o aquellos que demanden un gran número de operaciones, debido a la capacidad de los procesadores gráficos para ejecutar cálculos matemáticos de forma muy rápida, con gran capacidad de paralelización y un gran ancho de banda de memoria (en los dispositivos más modernos puede rondar los 100GB/s). A este tipo de desarrollo de aplicaciones no gráficas sobre procesadores gráficos se le denomina GPGPU (General-purpose computing on graphics processing unit).

El enorme interés despertado por las aplicaciones GPGPU ha propiciado el desarrollo de lenguajes y tecnologías específicas para facilitar el uso de los procesadores gráficos en tareas de cálculo general, siendo Nvidia la primera en lanzar al público un lenguaje completo denominado CUDA (Compute Unified Device Architecture) en febrero de 2007. Esta tecnología, al permitir el uso de los procesadores gráficos de forma sencilla y sin necesidad de conocer las técnicas usadas en el renderizado de gráficos, ha provocado un gran incremento de la comunidad de desarrolladores, especialmente en el ámbito investigador universitario. Adicionalmente a CUDA, OPENCL es el estándar abierto para lenguajes de programación en GPUs. Microsoft ofrece actualmente su solución DirectCompute, sin haber conseguido por el momento demasiado éxito.

A pesar de todas las ventajas ofrecidas por la conjunción GPU-CUDA, desafortunadamente no todos los problemas se adecúan a la arquitectura de los procesadores gráficos, ya que aquellos que no se puedan paralelizar o que necesiten gran cantidad de instrucciones de control de flujo (p.ej. saltos condicionales) no obtendrán ninguna ventaja por su ejecución en este tipo de arquitecturas.

Para poner algún ejemplo de las típicas aplicaciones que se benefician excelentemente del uso de procesadores gráficos podemos citar múltiples relacionadas con el procesado de imágenes y señales, como son las transformadas de Fourier, autocorrelaciones (donde el tiempo de cálculo se puede reducir entre 15 y 20 veces respecto a los procesadores actuales), técnicas de análisis por componentes principales (PCA), análisis de imágenes médicas, algoritmos de aprendizaje automático, entrenamiento y clasificación de SVM (Support Vector Machine), codificación/decodificación de códigos LPDC (donde el tiempo de ejecución se puede reducir hasta 200 veces con códigos muy largos), factorización de matrices, simulaciones físicas, etc. Por todo lo anterior, los procesadores gráficos se han revelado como una solución potente y competitiva a los procesadores de propósito general para desempeñar tareas de gran intensidad computacional y que puedan soportar algún tipo de paralelización en su ejecución. Actualmente, en Gradiant se está utilizando este tipo de tecnologías para acelerar aquellas operaciones computacionalmente costosas en el campo del reconocimiento de patrones, especialmente en el reconocimiento de caras, para mejorar las prestaciones y el tiempo de respuesta de los mismos. Asimismo, se está estudiando ya su aplicación a otros escenarios de interés para Gradiant en el campo del procesado de señal.

 

Figura 3. Comparación en tiempo de ejecución (fuente: www.geeks3d.com)