Buscar este blog

viernes, 30 de diciembre de 2011

CUDA vs OpenCL. ¿Cual es mejor?

A la hora de seleccionar una plataforma u otra, deberemos tener en mente qué es exactamente lo que queremos implementar y qué mejoras deseamos obtener.

Por un lado la disponibilidad de plataformas puede ser el único indicador para realizar la elección: CUDA solo está disponible para la arquitectura de nVidia. Así que, esta cuestión es la más importante.

Si puedes hacer una elección entre ambos, la siguiente cuestión es el objetivo de la paralelización, casi siempre suele ser el incremento del speedUp con respecto a la versión serie, o de CPU, si este es el caso, considera utilizar CUDA ya que es más eficiente tanto a la hora de compilar, obteniendo un código mejorado y optimizado, como a la hora de gestionar en tiempo de ejecución transferencias de memoria, estas dos cuestiones conducen a un comportamiento mejor con respecto a su código homólogo en OpenCL.

Puedes ampliar información a este respecto en este paper, en este otro estudio también se expone la mejora en la utilización de CUDA frente a OpenCL.

Un aspecto a destacar sobre OpenCL es que se trataría de un lenguaje portable, válido para cualquier arquitectura, si has leído los enlaces anteriores te habrás dado cuenta que no es oro todo lo que reluce. Desafortunadamente, es necesario realizar ciertos ajustes en el código cuando deseamos cambiar de plataforma, pero no son muy grandes, esto se debe a la capa de plataforma, que es la parte específica que gestiona el interface con cada arquitectura.

Si aceptas mi consejo, utiliza CUDA para mejorar el rendimiento y aplicaciones para la vida real, y mantén OpenCL cerca de ti, trata de experimentar y portar a este lenguaje tus desarrollos, algún día OpenCL será el estandar, aunque para ese entonces llegarán otros gigantes imponiendo su criterio. El grupo Khronos ya sabe de estos casos: ¿OpenGL?

Si el rendimiento no lo es todo, podrías directamente utilizar OpenCL, sobre todo si no cuentas con plataformas de nVidia, aunque también están disponibles las plataformas específicas de amd: su famoso ATI Stream o APP SDK

Espero que esto te ayude a tomar una decisión, cualquier camino que tomes seguro que te conducirá al éxito.  Hasta el próximo post.

jueves, 15 de diciembre de 2011

Estado del Arte III (CUDA)

CUDA[1] es una arquitectura de cálculo paralelo de nVidia que aprovecha la gran potencia de la GPU (unidad de procesamiento gráfico) para proporcionar un incremento extraordinario del rendimiento del sistema. CUDA ha sido recibida con entusiasmo por la comunidad científica. Por ejemplo, se está utilizando para acelerar AMBER, un simulador de dinámica molecular empleado por más de 60.000 investigadores del ámbito académico y farmacéutico de todo el mundo para acelerar el descubrimiento de nuevos medicamentos. En el mercado financiero, Numerix y CompatibL introdujeron soporte de CUDA para una nueva aplicación de cálculo de riesgo de contraparte y, como resultado, se ha multiplicado por 18 la velocidad de la aplicación.

CUDA Toolkit es el conjunto de herramientas y librerías que comprenden el entorno software de la arquitectura. Los componentes básicos son: El compilador C/C++, herramientas para depurar, librerías matemáticas optimizadas para GPU, Primitivas de rendimiento optimizado para GPU, todo ello acompañado de una extensa documentación y abundantes ejemplos. El paquete está disponible para los sistemas operativos más habituales: Windows, Linux y MacOS. Además el desarrollador cuenta con un enorme repertorio de servicios en línea, Webminars, whitepapers y numerosas publicaciones electrónicas y como no, los foros de la comunidad de desarrolladores.

Versiones del toolkit: desde 2006 hasta la fecha han aparecido varias versiones de CUDA que han supuesto un avance en cada una de ellas, la Figura siguiente muestra dicha evolución a lo largo del tiempo.
Evolución de CUDA
En mayo de 2011 se ha publicado la versión 4.0 del toolkit, el cual supone grandes avances en la facilidad de uso y programación, entre otras destacan las siguientes novedades: Se simplifica la portabilidad de aplicaciones: se pueden compartir múltiples GPUs a través de múltiples hilos, se pueden utilizar todas las GPUs de forma concurrente desde el mismo hilo del host. Reserva de memoria de host más rápida, implementación de las funciones C++ new/delete y soporte para funciones virtuales, soporte para código ensamblador inline PTX, librerías para la gestión de vectores y matrices optimizadas, y más.


El siguiente post, tratará de argumentar la elección de CUDA como plataforma de desarrollo frente a otras alternativas existentes.


[1] son las siglas de Compute Unified Device Architecture

sábado, 10 de diciembre de 2011

Estado del Arte II (Software)

A.     Librerías para GPGPU


Han ido de la mano a la aparición del hardware y la presentación de las nuevas librerías gráficas y SDK para el manejo del nuevo hardware. Por un lado los fabricantes han sacado al mercado soluciones específicas para su arquitectura, por otro lado, nos encontramos con la iniciativa del grupo Khronos para crear un lenguaje común para desarrollo de aplicaciones que exploten las tecnologías GPGPU.


Así AMD en 2006 comenzaría con su anuncio de CTM™ ("Close To Metal"). Se trata de un SDK para uso de su arquitectura FireStream recién estrenada por esa misma época. Esta interfaz proporciona a los desarrolladores un completo acceso al conjunto de instrucciones nativas y la memoria de los elementos de cálculo masivamente paralelos de las GPUs de AMD. Con CTM, las GPUs se convierten en poderosas arquitecturas abiertas programables, como las CPUs de hoy. Al liberar la arquitectura, CTM ofrece a los desarrolladores de hardware, un acceso de bajo nivel, determinista y repetible necesario para desarrollar las herramientas esenciales como compiladores, depuradores, bibliotecas de matemáticas y plataformas de aplicaciones. 

En diciembre de 2007 y como continuación con su compromiso con un entorno completo de desarrollo de software que libere el sorprendente poder informático de las GPUs de AMD, AMD presentó ATI Stream SDK. Con ATI Stream SDK, AMD añadió un nuevo lenguaje de alto nivel, denominado ATI Brook+. CTM evolucionó a ATI CAL (nivel de abstracción de cálculo), el nivel de API compatible con Brook+. La aparición de Brook+ significó que AMD fue capaz de ofrecer una completa pila de desarrollo completamente gratis para el desarrollo de ATI Stream.

En junio de 2008, AMD y varios líderes del sector de GPGPUs, así como otras tecnologías de aceleradores, formaron el grupo de trabajo OpenCL bajo la denominación The Khronos Group. Khronos es artífice de otras especificaciones bien conocidas como OpenGL, y realizó la apuesta adecuada al enfocarse en la especificación OpenCL. 

El 9 de diciembre de 2008 The Khronos Group anunció la puesta en el mercado de la especificación OpenCL 1.0. Mientras tanto, AMD también integró bibliotecas de rutinas para CAL en la suite del controlador ATI Catalyst, liberando las capacidades de aceleración de ATI Stream ya incorporadas en millones de tarjetas gráficas ATI Radeon. A principios de 2009, inmediatamente después de la presentación de la especificación OpenCL 1.0, AMD anunció su intención de adoptar rápidamente el estándar de programación OpenCL 1.0 e integrar un compilador y rutinas compatibles en su ATI Stream SDK.

nVidia desde la presentación en 2006 de la GeForce 8800 GTX comenzó la senda de CUDA, que se propone de un entorno software de librerías especializadas para extraer el máximo rendimiento al hardware. Evidentemente este entorno implica una dependencia del fabricante para obtener nuevas características y prestaciones, se discutirá todo esto y más en el siguiente post.

Una iniciativa que recientemente ha terminado  su andadura es Sh o Libsh , se trata de un lenguaje de alto nivel para programación en GPU, con una sintaxis similar a C++, es el resultado de la investigación del laboratorio de gráficos por ordenador de la universidad de Waterloo. Concretamente el lenguaje fue concebido por Michael McCool e implementado por varios miembros del laboratorio.

En el próximo post hablaremos más detalladamente de la evolución de CUDA, hasta entonces!

jueves, 8 de diciembre de 2011

Estado del Arte I (Hardware)

Hoy trataré de hacer una panorámica sobre el estado del arte en paralelización GPGPU tanto en software como en hardware.


Actualmente los fabricantes de tarjetas graficas producen para o están agrupados en 4 rúbricas: AMD[1]/ATI, nVidia, Intel e IBM. Estos cuatro gigantes dominan en la actualidad el mercado de las GPGPUs[2] cada uno de ellos propone su propia arquitectura que va normalmente acompañada de soluciones software especificas para explotar al máximo las capacidades concretas de cada una. Los dos primeros con tendencia a desarrollar dispositivos GPU puros, mientras que los dos segundos se decantan por soluciones hibridas CPU+GPU, solo el futuro revelará cual ha sido la mejor estrategia.

1.       AMD: En noviembre de 2006, AMD revolucionó las GPGPU con la presentación de CTM™ ("Close To Metal"), AMD anunció también la primera generación de AMD FireStream como la primera solución de procesamiento a través de hardware comercialmente disponible. Se trataba de un procesador basado en PCI Express con 1 GB de memory GDDR3 para computación con características de procesamiento de alto rendimiento optimizado. En 2007, AMD presentó también su solución de procesamiento de segunda generación, la AMD FireStream 9170. FireStream 9170 revolucionó la industria de GPGPU al ser la primera solución de procesamiento que ofreció compatibilidad de puntos flotantes en hardware.

Esta GPU alcanza más de 5 GFLOPS/W en precisión normal, y 1 GFLOPS/W en operaciones con doble precisión, 2 GB de memoria GDDR3, 320 núcleos. En agosto de 2008, AMD presentó el primer producto de su línea de soluciones de procesamiento de tercera generación, la AMD FireStream 9250. FireStream 9250 fue la primera solución de procesamiento que rompió la barrera de 1 TFLOPS y además, lo hizo en el espacio de una única ranura PCI-Express. Las soluciones de otros proveedores logran menos rendimiento a un mayor consumo y en mayores tamaños. En el primer trimestre de 2009, AMD anunció AMD FireStream 9270, que satisface las necesidades de los usuarios de alto rendimiento. FireStream 9270 proporciona 1,2 TFLOPS de increíble rendimiento a un consumo típico de 160 W. Destacan sus 800 núcleos de procesamiento, 2 GB de GDDR5, un ancho de banda de memoria de 108,8 GB/s, con un consumo medio de 160 watios.

2.       nVidia.
En noviembre de 2006, nVidia presentó al mercado  la GPU GeForce 8800 GTX con soporte para DirectX 10, supone la adopción de una nueva arquitectura basada en el procesador. Dotada de 138 procesadores y 768MB de memoria de video con un ancho de banda de memoria de 86.4 GB/s.
Esta nueva arquitectura vendría acompañada de la presentación de CUDA®.  A partir de este momento, nVidia trabajará duro para obtener GPU’s para computación de propósito general, la Figura siguiente, muestra la evolución de sus GPGPU y la proyección futura de la compañía.
Evolución de la arquitectura de nVidida



La gama Tesla aparece en 2007, la familia de productos Tesla se ha diseñado para el cálculo paralelo y ofrece funciones de computación exclusivas:
Rendimiento en operaciones de coma flotante de doble precisión: 515 GigaFlops en productos Tesla C2050, M2050 y S2070, Comunicación PCIe más rápida: con dos motores DMA para comunicación PCIe bidireccional. Mayor rendimiento en aplicaciones técnicas con grandes volúmenes de datos: mayor memoria en placa (3 GB y 6 GB).

En 2009 aparece la tecnología Fermi que convertirá el coprocesamiento distribuido entre la GPU y la CPU en algo generalizado porque es capaz de manejar todo tipo de aplicaciones de cálculo en cualquier ámbito de la ciencia o la industria. Fermi incorpora algunas innovaciones importantes: 512 núcleos CUDA, Tecnología Parallel DataCache™ de NVIDIA, Motor GigaThread™ 3.0 de NVIDIA, Soporte completo de ECC.

Se prevé que para finales de 2011 o primeros de 2012, estén disponibles las primeras GPU con tecnología Kepler. Kepler es el sobrenombre utilizado por nVidia para referirse a su núcleo gráfico de nueva generación y, al igual que las GPUs Southern Islands de AMD, estas soluciones serán fabricadas utilizando el nodo de producción 28nm. nVidia prometió que la GPU Kepler y su sucesora, Maxwell, incluirían espacio de memoria virtual y soporte preferente, además de una serie de tecnologías que mejorarán la capacidad de la GPU de procesar datos sin la ayuda del procesador del sistema. Para un horizonte algo más lejano 2013-2014, la compañía tiene previsto lanzar la primera arquitectura basada en 22/20nm, su nombre en clave es "Maxwell".

En respuesta a la tendencia de la competencia en el diseño de soluciones para computación de altas prestaciones basadas en CPU+GPU, se manejan proyectos que pretender sacar al mercado en 2013 – 2015 sus nombres en clave son “Denver” y “Echelon”.

3.       Intel

Larrabee es el nombre en código para un chip GPGPU que Intel está desarrollando separadamente de su actual línea de aceleradores de gráficos integrados. El chip iba a ser lanzado en 2010 como el núcleo de una tarjeta gráfica 3D para los consumidores, pero estos planes fueron cancelados debido a los retrasos y las primeras decepcionantes cifras de rendimiento. Larrabee ahora será lanzado como una plataforma para la investigación y el desarrollo de los gráficos por ordenador y HPC. Una versión futura de Larrabee eventualmente podría llegar a integrarse en una tarjeta de gráficos de consumo, pero Intel no ha discutido los planes específicos.

4.       IBM
Con el nombre de Proyecto Cell , junto a Sony y Toshiba, el gigante azul lanzó una tecnología híbrida para ofrecer Computación de Alto Rendimiento a la industria y la investigación. Con mayor o menor fortuna esta arquitectura no está liderando actualmente las tendencias, y la propia firma está montado soluciones de nVidia para sus servidores de altas prestaciones. 

En el próximo post, analizaremos la situación actual del software para GPGPU.


[1] Advanced Micro Devices, Inc.
[2] General Porpouse Graphics Processor Unit

jueves, 1 de diciembre de 2011

Bienvenidos a desarrollo CUDA

Bienvenidos!

Con este blog quiero compartir mi experiencia paralelizando algoritmos mediante el uso de GPU's. Trataré de presentar aportes cortos que permitan obtener soluciones concretas.

 Lcomputación sobre Unidades de Procesamiento Gráfico (GPU), es sin lugar a dudas, uno de los avances tecnológicos más importantes de los últimos años, que aporta un nuevo paradigma en el campo de la computación en paralelo y la computación de altas prestaciones. Este tipo de hardware (GPU), inicialmente diseñado para representar imágenes en el ordenador, tiene unas características peculiares que ofrecen una capacidad de cómputo inusitada. A diferencia de los actuales procesadores centrales (CPU) en los cuales podemos encontrar configuraciones de unos cuantos procesadores con 2, 4 u 8 núcleos de proceso, las GPU ofrecen configuraciones de  hasta 30 procesadores con hasta 8 núcleos de procesamientos cada uno, permitiendo ejecutar hasta 1536 hilos cada procesador.
Este potencial inicialmente era explotado por librerías gráficas de renderizado y trazadores de rayos para obtener imágenes realistas aplicando geometría computacional. El objetivo fundamental era obtener ciertos los valores para cada punto (en el plano o en el espacio para sistemas tridimensionales) como son: visible o no visible, color y profundidad de color. Así, con objeto de producir imágenes en movimiento se diseñaron sistemas que permitiesen realizar el cálculo de esos valores para cada punto de forma paralela y obtener el resultado de la imagen en tiempos tales que permitan la producción de una ilusión óptica de movimiento al presentar imágenes con una frecuencia mínima de 24 imágenes por segundo. Se trataba de poder calcular todos los valores de la matriz de puntos que forman la imagen en paralelo y de forma independiente del procesador central el cual estaría realizando otro tipo de tareas. Este conjunto de técnicas fueron denominados como Aceleración Gráfica por Hardware. Para poder explotar estas capacidades del nuevo hardware, deberá haber asociado a éste, un controlador que permita un repertorio específico de instrucciones, que serán llamadas utilizando un determinado API[1]. Términos tales como OpenGL® o DitectX® empezaron a sonar como librerías gráficas que eran capaces de explotar las nuevas capacidades de las GPUs.

Con el paso del tiempo cada vez fueron mayores las prestaciones de estas GPUs, aumentando tanto la capacidad de memoria como de los procesadores. Esto permitió aumentar el tipo de operaciones a realizar en dichos dispositivos de modo que además de poder realizar operaciones de dibujo, también se empezaron a realizar operaciones de codificación y decodificación, lo que permitió liberar a los procesadores centrales de tales tareas.

El empleo de procesadores gráficos para la resolución de problemas, comienza en el mundo académico en un principio dando forma gráfica al problema a solucionar, ya que las primitivas y repertorio de instrucciones con el que se contaba eran muy básicos y demasiado orientados al mundo de los gráficos. Actualmente se ha conseguido evolucionar estas librerías para proporcionar soporte a sistemas de desarrollo de propósito general que permiten aplicar con gran éxito la computación sobre GPU a cualquier tipo de problema sea o no de tipo gráfico. 


[1] Application Programming Interface