Computación científica en GPUs con CUDA

Por Eneko Mateo[1,2], Alexander Mendiburu[2], José Miguel-Alonso[2]

Hasta hace poco lo habitual para la computación en paralelo era unir varios procesadores o montar clústeres (grupos de ordenadores comunicados entre sí), pero ¿es el procesador el único elemento del ordenador que realiza cálculos?

Obviamente no. Las tarjetas gráficas realizan gran cantidad de cálculos al tratar las imágenes. A la utilización de estos dispositivos para realizar computación de propósito general se la denomina GPGPU (general-purpose computing on graphics procesing units).

Para entender un poco mejor por qué se pueden realizar estos cálculos, veamos a grandes rasgos la evolución tanto de las tarjetas gráficas  como de los microprocesadores. Las tarjetas gráficas (GPGPUs) tomaron una dirección muy diferente a la de los procesadores (CPUs). Mientras que los procesadores tomaron el camino de ser elementos de computación general, las tarjetas gráficas se especializaron en el tratamiento de imágenes digitales. Esto provocó que ambas arquitecturas se fueran distanciando y, mientras las CPUs se hacían con más memoria cache para almacenar y manejar diferentes datos con mayor facilidad, las GPUs se hacían con más unidades de cálculo (más sencillas que las integradas en las CPUs), puesto que su principal trabajo era realizar las mismas tareas múltiples veces sobre diferentes datos.

Por las cualidades que ofrecen las GPGPUs, ya sea su gran nivel de paralelismo o su reducido coste en comparación con un superordenador, nos ha parecido interesante realizar un acercamiento a esta nueva tecnología para averiguar cuál es su rendimiento, así como hacia dónde podría evolucionar.

 

CUDA

CUDA son las siglas de Compute Unified Device Architecture, que hace referencia tanto a la arquitectura utilizada en tarjetas gráficas NVIDIA como a un conjunto de herramientas de desarrollo creadas por esta compañía. CUDA pone al alcance de los programadores la posibilidad de desarrollar, en un lenguaje de programación común en contextos científico-técnicos (C, Fortran), aplicaciones que exploten el paralelismo masivo ofrecido por las GPUs.

CUDA no es el único modo de crear aplicaciones de propósito general sobre GPUs, pero sí es uno de los primeros; debido a eso hay disponibles múltiples recursos (libros, artículos, páginas web y foros) que ofrecen abundante información [3][4]. La competencia más directa en estos momentos es OpenCL (Open Computing Lenguage o Lenguaje de Computación Abierto) [5], que es un estándar abierto y puede ejecutarse tanto en GPUs como CPUs. Otra ventaja de este estándar emergente es que puede funcionar tanto en tarjetas NVIDIA como AMD/ATI.

CUDA processing flow

Figura. Flujo de Ejecución de CUDA (6)

Como se puede apreciar en la figura, el flujo de ejecución de CUDA es bastante sencillo. En primer lugar se copian los datos desde la memoria principal a la memoria de la GPU (1). Luego el procesador dispara la puesta en marcha de la ejecución en paralelo (2). La tarjeta gráfica se encarga de la ejecución en paralelo (3). Y para terminar se copian los resultados de la memoria de la GPU a la memoria principal (4).

 

El presente e inmediato futuro de la supercomputación está en la hibridación entre miles CPUs y de GPGPUs trabajando de forma cooperativa, las primeras llevando a cabo la lógica principal de la aplicación y las segundas realizando tareas de aceleración de las partes más costosas del código. Las GPUs no son la única alternativa a la computación híbrida: se ha trabajado con procesadores Cell y con FPGAs. Pero, por el momento, es la de más éxito, y la más accesible. Es de gran importancia, por tanto, conocer cómo explotar de forma eficiente estos potentes dispositivos.

 

GPUs en la UPV/EHU

El IZO-SGI dispone de nodos con estás caráterísticas.

 

[1] IZO-SGI.
[2] Intelligent Systems Group.
[3] Nvidia CUDA zone.
[4] Nvidia forum.
[5] Khronos Group. OpenCL.
[6] Wikimedia Commons.

 

1 comment to Computación científica en GPUs con CUDA

Leave a Reply