Software para GPUs
En el artículo anterior referido a las GPUs vimos las novedades y los últimos productos de entorno industrial que utilizan la potencia de estos dispositivos.
En este artículo vamos a centrarnos en el software para aceleración de sistemas con uso de GPUs y al final hablaremos de las alternativas para renderizar imágenes.
Una de las herramientas más usadas en la actualidad con GPUs es CUDA®. La plataforma de computación paralela y de programación CUDA usa la arquitectura de cálculo paralelo y aprovecha la gran potencia de la GPU para incrementar el rendimiento del sistema.
Gracias al uso de CUDA, la CPU puede seguir ejecutando las tareas secuenciales, pasando a los múltiples Cores paralelos de GPU la ejecución de las tareas más intensivas (como ya explicamos en el artículo anterior), pudiendo los desarrolladores utilizar los lenguajes de programación más populares como C, C++, Fortran, Python y MATLAB.
NVIDIA ofrece un paquete software gratuito denominado CUDA Toolkit que incluye todas las herramientas necesarias para desarrollar aplicaciones con aceleración por GPU. Dentro del CUDA Toolkit podemos encontrar:
- Librerías para aceleración por GPU (Deep Learning, Algebra lineal, Señal, imagen y video, Algoritmos paralelos)Herramientas de desarrollo (entre ellas el NVIDIA Nsight Eclipse Edition)
- Código de ejemplos
- Documentación
- Páginas de soporte, blogs, etc.
Gracias a las librerías que se incluyen en CUDA Toolkit se pueden acelerar las funciones que desarrollaría un sistema basado únicamente en CPU de 2 a 10 veces simplemente reemplazando las librerías de funciones para sólo CPU como, por ejemplo, MKL, IPP o FFTW por sus equivalentes para sistemas acelerados por GPU.
Por ejemplo, si queremos usar la “CUDA Math Library”, la librería de funciones matemáticas de altas prestaciones en una aplicación CUDA C o CUDA C++, simplemente hay que añadir “#include math.h” en el código fuente para usar estas funciones optimizadas para la arquitectura NVIDIA.
Una desventaja de CUDA es que puede ser usado exclusivamente con GPUs “CUDA enabled”, lo que limita su uso a determinados tipos de GPUs.
OpenCL es una alternativa a CUDA como estándar abierto (licenciado por Khronos), lo que significa que se puede usar con cualquier plataforma hardware o software sin pagar ningún tipo de coste.
A diferencia de CUDA que utiliza la GPU como un coprocesador, OpenCL pasa toda la información a la tarjeta gráfica usándola más como un procesador separado especializado.
La programación es un poco más compleja que en el caso de CUDA donde puedes usar lenguajes populares, pero a cambio no estás atado a los GPUs de NVIDIA CUDA-Enabled, aunque también puede ejecutarse en ellos. Al ser un sistema multiplataforma, el esfuerzo de desarrollar aplicaciones con una programación más compleja se ve compensado con la ventaja de que pueda ser usado en cualquier sistema operativo y con cualquier hardware.
Existen diversas herramientas de desarrollo, como por ejemplo la OpenCL Development Tool, un IDE basado en Eclipse CDT para desarrolladores en lenguajes de programación C, C++ y OpenCL o el Intel SDK for OpenCL Applications.
Intel también ha incluido Open CL en su plataforma de desarrollo multidisciplinar Intel System Studio disponible para sistemas basados en Linux/Android, Windows y con soporte para FreeBSD y VxWorks.
Software para imágenes
Finalmente, una pequeña pincelada para el uso tradicional de GPUs de renderización de imágenes tanto 2D como 3D. En este campo, encontramos dos claros competidores: Direct3D y OpenGL.
Un aspecto importante en cualquiera de los casos, es saber con qué versión es compatible nuestra controladora gráfica, así en las especificaciones encontraremos frases como “graphics controller with support for DirectX 11 and OpenGL® 4.0” de algunos controladores Intel HD o la compatibilidad de GPUs como la NVIDIA Jetson TX2 con “OpenGL 4.5, OpenGL ES 3.2” o como vemos en la hoja de especificaciones de la GPU AMR Radeon E6760, donde leemos la compatibilidad con DirectX11 y OpenGL 4.1.
Direct3D es una API propietaria diseñada por Microsoft, que forma parte de DirectX, para renderizar imágenes tanto 2D como 3D y usar aceleración de hardware si está disponible en la GPU. Microsoft suministra una rutina común que comunica la API de Direct3D con un DDI (Device Driver Interface) a bajo nivel en lugar de estar implementada en el driver suministrado por el vendedor, como pasa en OpenGL.
Direct3D utiliza dependencia con Component Object Model (COM) de Microsoft, lo que hace que la API pueda ser usada en lenguajes como Object Pascal (Delphi) o Microsoft Visual C++, C#, y Visual Basic .NET.
Si nuestra aplicación va a utilizar un sistema operativo tipo Windows, podremos usar tanto Direct3D como OpenGL, pero en otros sistemas operativos como macOS o Linux estaremos limitados a usar OpenGL.
Linux, Windows o macOS incorporan dentro de su sistema operativo el soporte para OpenGL, pero deberemos asegurarnos de que tenemos el driver más reciente para nuestro hardware. Así, por ejemplo, podremos descargar los últimos drivers de Windows para AMD/ATI, Intel o NVidia o de Linux para AMD/ATI, Intel o Nvidia.
A pesar de que el nombre de OpenGL nos lleve a pensar que es un software Open Source, no es cierto. No podemos descargar el código fuente, pero si tenemos acceso a la especificación de OpenGL, por lo que en realidad estamos hablando de una Open Specification mantenida por un comité de Khronos Group denominado OpenGL Architectural Review Board (ARB).
La API de OpenGL solo se ocupa de la renderización de gráficos. No incluye funciones para animaciones, entrada/salida de ficheros, procesado de formato de imágenes, etc.
En cuanto a las herramientas de desarrollo, Khronos Group incluye las siguientes recomendaciones:
- RenderDoc – depurador de gráficos gratuito. Soporta exclusivamente el OpenGL 3.2+ Core Profile. Válido tanto para Windows como Linux.
- Nsight Visual Studio Edition – Nsight 3.0 soporta OpenGL 4.2 Debugging y Profiling, junto con Shader Debugging y Pixel History
Conclusiones
Para cerrar este artículo, podemos resumir en que si solo queremos renderizar imágenes 2D o 3D nos podemos centrar en Direct3D (como parte de DirectX) u OpenGL, dependiendo, entre otras cosas, del sistema operativo a utilizar.
Si queremos usar la GPU como uso general, podemos usar el software de CUDA (siempre que la GPU sea “CUDA enabled” u OpenCL. Si necesitamos ambas funciones, podemos combinar OpenCL y OpenGL, CUDA y OpenGL, …