GPU Computing
GPU computing, o cálculo en la GPU, 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 combinar una CPU y una GPU en un sistema de cómputo heterogéneo. La parte secuencial de la aplicación se ejecuta en la CPU y las partes de mayor carga computacional se procesan 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.

El desarrollador de la aplicación tiene que modificar é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” a fin de transferir los datos entre la GPU y el resto del sistema.
El GPU computing se implementa a través de una arquitectura de cálculo paralelo incluida en las GPUs NVIDIA que se denomina 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.
La GPU Tesla Serie 10 se basa en una arquitectura CUDA de segunda generación con funciones optimizadas para aplicaciones científicas, lo que incluye soporte en hardware de la norma IEEE para operaciones en coma flotante de precisión doble, una caché local formada por memoria compartida distribuida por toda la GPU o acceso coalescente a la memoria, entre otras.
Prof. Jack Dongarra
Director del Innovative Computing Laboratory
Universidad de Tennessee
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 y C++. 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.

El primer lenguaje para el que NVIDIA proporcionó soporte fue C. Existe un conjunto de herramientas de desarrollo de software en C para CUDA que 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.
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.