OpenCL vs. CUDA

A partir de la noticia de que ATI (AMD) ha extendido su implementación de OpenCL para poder paralelizar problemas sobre la GPU también (además de la CPU), me puse a leer sobre OpenCL, en particular sobre la implementación por parte de AMD del estándar.

Dada la similitud entre OpenCL y CUDA, creo que algo que resulta inevitable es comparar ambas tecnologías.


OpenCL Logo

Logo de OpenCL



En principio, OpenCL parece más “a pedal” que CUDA en varios aspectos, por ejemplo, el hecho de que uno debe crear el “contexto” de ejecución, cargar los fuentes de disco y compilar a mano los kernels de OpenCL, mientras que en CUDA uno puede optar por no hacerlo. En este sentido OpenCL es más parecido a GLSL (el lenguaje de Shading de OpenGL) que a CUDA, lo cual no me extraña, dado que tanto OpenCL como OpenGL son especificaciones a cargo del grupo Khronos.

Por otro lado, inmediatamente se puede determinar la ventaja de crear el contexto manualmente: uno puede determinar en tiempo de ejecución si las porciones en paralelo del programa deberían ejecutar sobre la CPU, la GPU o ambas al mismo tiempo. En este sentido OpenCL es superior a CUDA, dado que CUDA únicamente puede ejecutar sus Kernels sobre la GPU (al menos de momento).

También me gustaría realizar una comparación en en cuanto a portabilidad del código. Este es un punto algo engañoso. CUDA es una tecnología capaz de ejecutar únicamente sobre placas de video de NVIDIA, mientras que OpenCL es un estándar que cuenta con implementaciones para tanto GPU’s de ATI como CPU’s x86.

No obstante, el SDK de AMD para OpenCL se encuentra disponible tan solo para Windows (XP, Vista, 7) y algunos Linux (Ubuntu, SuSE), mientras que si uno quiere desarrollar sobre Mac, deberá utilizar la implementación de Apple del estándar. Esto podría traer problemas de portabilidad si ambas implementaciones difieren incluso en lo más mínimo.

Con CUDA, la implementación es única, asegurando siempre la consistencia dentro de una misma versión, pero restringiendo el programa a las plataformas para las que NVIDIA provea un SDK y a GPU’s NVIDIA.

En Algorithmia poseemos gran experiencia trabajando con CUDA, habiendo incluso realizado publicaciones sobre el tema, sin embargo consideramos OpenCL una muy buena herramienta para realizar los requerimientos por parte de nuestros clientes para los cuales CUDA no resulta una opción viable.

This entry was posted in GPGPU, Programacion. Bookmark the permalink.