GPGPU
# GPGPU

La computación de propósito general en unidades de procesamiento gráfico (GPGPU, del inglés general-purpose computing on graphics processing units) es un concepto reciente dentro de la informática que trata de estudiar y aprovechar las capacidades de cómputo de una GPU.

Una GPU es un procesador diseñado para los cómputos implicados en la generación de gráficos 3D interactivos. Algunas de sus características (bajo precio en relación con su potencia de cálculo, gran paralelismo, optimización para cálculos en coma flotante), se consideran atractivas para su uso en aplicaciones fuera de los gráficos por computadora, especialmente en el ámbito científico y de simulación. Así, se han desarrollado técnicas para la implementación de simulaciones de fluidos, bases de datos, algoritmos de clusterización, etc.

## Modelo de programación de GPU

Debido a las diferencias fundamentales entre las arquitecturas de una GPU y una CPU, no todos los problemas se pueden beneficiar de una implementación en la GPU. En concreto, el acceso a memoria plantea las mayores dificultades. Las CPU están diseñadas para el acceso aleatorio a memoria. Esto favorece la creación de estructuras de datos complejas, con punteros a posiciones arbitrarias en memoria. En cambio, en una GPU, el acceso a memoria está mucho más restringido. Por ejemplo, en un procesador de vértices (la parte de una GPU diseñada para transformar vértice en aplicaciones 3D), se favorece el modelo de distribución, en el que el programa lee en una posición predeterminada de la memoria, pero escribe en una o varias posiciones arbitrarias. En cambio, un procesador de píxeles, o fragmentos, favorece el modelo de recolección, pudiendo el programa leer de varias posiciones arbitrarias, pero escribir en sólo una posición predeterminada.

La tarea del diseñador de algoritmos GPGPU consiste principalmente en adaptar los accesos a memoria y las estructuras de datos a las características de la GPU. Generalmente, la forma de almacenar datos es en un búfer 2D, en lugar de lo que normalmente sería una textura. El acceso a esas estructuras de datos es el equivalente a una lectura o escritura de una posición en la textura. Puesto que generalmente no se puede leer y escribir en la misma textura, si esta operación es imprescindible para el desarrollo del algoritmo, éste se debe dividir en varias pasadas.

Pese a que cualquier algoritmo que sea implementable en una CPU lo es también en una GPU, esas implementaciones no serán igual de eficientes en las dos arquitecturas. En concreto, los algoritmos con un alto grado de paralelismo, sin necesidad de estructuras de datos complejas y con una alta intensidad aritmética son los que mayores beneficios obtienen de su implementación en la GPU.

## Herramientas

Tradicionalmente, el desarrollo de software GPGPU se había hecho bien en lenguaje ensamblador, o bien en alguno de los lenguajes específicos para aplicaciones gráficas usando la GPU, como GLSL, Cg o HLSL. Pero recientemente han surgido herramientas para facilitar el desarrollo de aplicaciones GPGPU, al abstraer muchos de los detalles relacionados con los gráficos, y presentar una interfaz de más alto nivel. Una de ellas es BrookGPU, desarrollada en la Universidad de Stanford, consistente en una extensión a ANSI C que proporciona nuevos tipos de datos y operaciones (flujo de datos, núcleo, reducción, etc.) automáticamente convertidos a una implementación que aprovecha la GPU sin intervención explícita por parte del programador. Otra herramienta con objetivos similares es Sh, una extensión de C++ para metaprogramación con una implementación automática en la GPU. La opción más extendida en la actualidad es CUDA, de NVidia, una extensión de C que permite la codificación de algoritmos en GPU de NVidia. Por último, podemos incluir en esta discusión a OpenCL, una combinación de interfaz y lenguaje de programación para el desarrollo de aplicaciones paralelas que puedan ser ejecutadas, de forma transparente, en diversas unidades de procesamiento (CPU multinúcleo, GPU, etc.).

## Críticas

Pese a que las ventajas del uso de la GPU para ciertas aplicaciones es evidente, no faltan las críticas, generalmente referidas a la inconveniencia de usar un procesador para fines completamente diferentes a lo que se pensaba al diseñarlos. Un argumento común es la falta de continuidad de las arquitecturas usadas. Debido a la rápida evolución del hardware gráfico, implementaciones de algoritmos que funcionaban óptimamente en un modelo de GPU, dejan de hacerlo, o lo hacen subóptimamente en un modelo posterior. Otra crítica es la falta de precisión de los registros de coma flotante presentes en las GPU. Generalmente, se utilizan 2 o 4 bytes para representar un número real en una GPU, que en comparación con los 4, 8 o más usados en las CPU modernas, no es suficiente para muchas aplicaciones científicas.

## Otros

Microsoft ha terminado de desarrollar la nueva versión 11 de su API Direct3D. A pesar de que la anterior versión, Direct3D 10, es relativamente nueva, debido a la cantidad de novedades que están apareciendo últimamente en el mundo de las tarjetas gráficas, entre ellas el teselado, Microsoft desarrolló esta nueva versión, en la que cabe destacar la nueva tecnología de computación de sombreadores para permitir que la GPU no sea solamente usada para gráficos 3D y así puedan los desarrolladores tomar ventaja de las tarjetas gráficas como procesadores en paralelo.

El proyecto de computación distribuida Folding@home, creado por la Universidad de Stanford, ha dado soporte para utilizar la potencia computacional de la GPU, además de la CPU. Pruebas recientes hablan de que son posibles ganancias de rendimiento de hasta 40 veces una CPU Pentium 4 de Intel, aunque claro, todo esto depende de la GPU utilizada.

