GPU

GPU computing, o GPGPU, es el uso de la GPU (unidad de procesamiento gráfico) para realizar operaciones de cálculo científico o técnico de propósito general.

El modelo empleado para esta tecnología se basa en el uso combinado de una CPU y una GPU en un sistema de coprocesamiento heterogéneo. La parte secuencial de la aplicación se ejecuta en la CPU y las partes de mayor carga computacional se aceleran en la GPU. Para el usuario, la aplicación simplemente se ejecuta más rápido porque utiliza la gran capacidad de la GPU para multiplicar el rendimiento.

A lo largo de los años, la GPU ha evolucionado hasta alcanzar teraflops de rendimiento en las operaciones de cálculo en coma flotante. NVIDIA revolucionó la GPGPU y aceleró el mundo de la informática durante los años 2006-2007 con la introducción de su arquitectura de cálculo paralelo masivo “CUDA”. Esta arquitectura consta de cientos de núcleos de procesamiento que operan de forma conjunta para manejar los datos de la aplicación a mayor velocidad.

El éxito de las GPUGPUs en los últimos años reside en la facilidad del modelo de programación paralela CUDA asociado. En este modelo, el desarrollador de la aplicación modifica ésta para asignar a la GPU los kernels más complejos desde el punto de vista computacional. El resto de la aplicación permanece en la CPU. Asignar una función a la GPU implica reescribir ésta para aprovechar el paralelismo del procesador gráfico y agregar palabras clave de “C” para transferir los datos hacia y desde la GPU. El programador se encarga de lanzar decenas de miles de procesos (threads) de forma simultánea. El hardware de la GPU maneja estos procesos y programa su ejecución.

La GPU Tesla Serie 20 se basa en la nueva arquitectura “Fermi”, que es la tercera generación de la arquitectura CUDA. Fermi está optimizada para acelerar las aplicaciones científicas en la GPU, con aspectos clave tales como un rendimiento de más de 500 gigaflops en operaciones de coma flotante de precisión doble según la norma IEEE, memoria caché L1 y L2, memoria con protección de errores ECC, cachés locales administradas por el usuario y formadas por memoria compartida distribuida por toda la GPU, acceso coalescente a la memoria, etc.

Historia de la GPU como procesador de cálculo

Los chips de gráficos empezaron siendo canales de procesamiento de gráficos con funciones fijas. Con el paso de los años, estos chips se fueron haciendo más programables, lo que permitió a NVIDIA introducir la primera GPU o unidad de procesamiento gráfico del mercado. Entre los años 1999 y 2000, científicos e investigadores de disciplinas como el diagnóstico por imagen o el electromagnetismo empezaron a usar las GPUs para ejecutar aplicaciones de cálculo de propósito general y descubrieron que el enorme rendimiento de la GPU en operaciones de coma flotante producía un extraordinario aumento de la velocidad de ejecución en una gran variedad de aplicaciones científicas. Fue el nacimiento de un nuevo concepto denominado GPGPU o GPU de propósito general.

El problema era que este tipo de procesador tenía que programarse utilizando lenguajes de programación de gráficos como OpenGL y Cg. Los desarrolladores tenían que dar a sus aplicaciones científicas la apariencia de aplicaciones gráficas transformándolas en problemas que dibujasen triángulos y polígonos. Esto limitaba la posibilidad de aprovechar el tremendo rendimiento de las GPUs para usos científicos.

En NVIDIA se dieron cuenta de las ventajas que supondría poner todo este rendimiento al alcance de la comunidad científica y decidieron invertir en modificar la GPU a fin de hacerla totalmente programable para aplicaciones científicas y añadir soporte para lenguajes de alto nivel como C, C++ y Fortran. El resultado fue la arquitectura CUDA para la GPU.

Arquitectura paralela y modelo de programación de CUDA

La arquitectura paralela del hardware de CUDA va acompañada de un modelo de programación compuesto por un conjunto de abstracciones que permiten implementar el paralelismo en el procesamiento de tareas y procesos con diferentes niveles de granularidad. El programador puede expresar ese paralelismo mediante diferentes lenguajes de alto nivel como C, C++ y Fortran, o mediante APIs como OpenCL™ y DirectX™-11 Compute.

En la actualidad, NVIDIA proporciona soporte para programar la GPU con C, C++, Fortran, OpenCL y DirectCompute. Los desarrolladores disponen de una serie de herramientas de desarrollo de software , junto con diferentes librerías y componentes de middleware que se muestran en la figura anterior y a los que se puede acceder a través de este enlace . Estos recursos permiten programar la GPU utilizando C con una cantidad mínima de palabras clave o extensiones. El soporte para Fortran, OpenCL y otros lenguajes se introducirá en breve.

El modelo de programación paralela de CUDA ayuda a los programadores a dividir el problema en múltiples subproblemas que pueden resolverse de forma independiente y concurrente. A estos subproblemas se les aplica un ulterior nivel de granularidad, de forma que cada uno de ellos puede resolverse de forma cooperativa mediante múltiples instrucciones ejecutadas también en paralelo.


En estos momentos, la arquitectura CUDA de la GPU y su correspondiente modelo de cálculo paralelo se utilizan en más de 1000 aplicaciones y en cerca de 1000 artículos de investigación publicados. En la zona CUDA pueden verse muchos de estos documentos y aplicaciones.



OpenCL es una marca comercial de Apple Inc. utilizada mediante la licencia cedida a Khronos Group Inc. DirectX es una marca registrada de Microsoft Corporation.


Fuente: Nvidia

Additional information