La computación de propósito general en una GPU (unidad de procesamiento de gráficos), mejor conocido como programación de GPU, es el uso de una GPU junto con una CPU (unidad de procesamiento central) para acelerar el cálculo en aplicaciones tradicionalmente manejadas solo por la CPU.Aunque la programación de GPU ha sido prácticamente viable solo durante las últimas dos décadas, sus aplicaciones ahora incluyen prácticamente todas las industrias. Por ejemplo, la programación de GPU se ha utilizado para acelerar el procesamiento de video, imagen digital y señal de audio, física estadística, computación científica, imágenes médicas, visión por computadora, redes neuronales y aprendizaje profundo, criptografía e incluso detección de intrusiones, entre muchas otras áreas.
Este artículo sirve como una introducción teórica dirigida a aquellos que desean aprender a escribir programas acelerados por GPU, así como a aquellos que tienen un interés general en este tema fascinante.
Mucho tiempo antes de que los gráficos 3D de alta fidelidad de alta resolución se convirtieran en la norma, la mayoría de las computadoras no tenían GPU. En su lugar, la CPU llevó a cabo todas las instrucciones de los programas de computadora realizando operaciones básicas de aritmética, lógica, control y entrada/salida (E/S) especificadas por las instrucciones. Por esta razón, la CPU a menudo se describe como el cerebro de la computadora.
Pero en los últimos años, la GPU, que está diseñada para acelerar la creación de imágenes para la salida a un dispositivo de visualización, a menudo ha estado ayudando a la CPU a resolver problemas en áreas que anteriormente fueron manejadas únicamente por la CPU.
El fabricante de tarjetas gráficas NVIDIA proporciona una forma simple de comprender la diferencia fundamental entre una GPU y una CPU: “Una CPU consiste en unos pocos núcleos optimizados para el procesamiento en serie secuencial, mientras que una GPU tiene una arquitectura masivamente paralela que consiste en miles de más pequeños, más eficientes, más eficientes. núcleos diseñados para manejar múltiples tareas simultáneamente."
La capacidad de manejar múltiples tareas al mismo tiempo hace que las GPU sean muy adecuadas para algunas tareas, como buscar una palabra en un documento, mientras que otras tareas, como calcular la secuencia de Fibonacci, no se benefician del procesamiento paralelo en absoluto.
Sin embargo, entre las tareas que se benefician significativamente del procesamiento paralelo es el aprendizaje profundo, una de las habilidades más buscadas en tecnología hoy en día. Los algoritmos de aprendizaje profundo imitan la actividad en capas de neuronas en la neocorteza, permitiendo que las máquinas aprendan a comprender el lenguaje, reconocer patrones o componer música.
Como resultado de la creciente importancia de la inteligencia artificial, la demanda de desarrolladores que entienden la computación de propósito general en una GPU se ha elevado.
Debido a que las GPU entienden los problemas computacionales en términos de primitivas gráficas, los primeros esfuerzos para usar GPU como procesadores de uso general requirieron reformular problemas computacionales en el lenguaje de las tarjetas gráficas.
Afortunadamente, ahora es mucho más fácil hacer computación acelerada con GPU gracias a plataformas informáticas paralelas como CUDA, OpenCl o OpenAcc de Nvidia. Estas plataformas permiten a los desarrolladores ignorar la barrera del idioma que existe entre la CPU y la GPU y, en cambio, se centran en conceptos informáticos de nivel superior.
Cuda
Inicialmente lanzado por NVIDIA en 2007, CUDA (arquitectura de dispositivo unificada de cómputo) es el marco de propiedad dominante hoy en día. "Con CUDA, los desarrolladores pueden acelerar dramáticamente las aplicaciones informáticas al aprovechar el poder de las GPU", describe el marco NVIDIA.
Los desarrolladores pueden llamar a CUDA desde lenguajes de programación como C, C ++, Fortran o Python sin ninguna habilidad en la programación de gráficos. Además, el kit de herramientas CUDA de NVIDIA contiene todo lo que los desarrolladores necesitan para comenzar a crear aplicaciones aceleradas por GPU que superan en gran medida a sus contrapartes unidas a CPU.
El CUDA SDK está disponible para Microsoft Windows, Linux y MacOS. La plataforma CUDA también admite otras interfaces computacionales, incluidas las OpenCL, DirectCompute de Microsoft, OpenGL Compute Shaders y C ++ AMP.
Opencl
Inicialmente lanzado por el Grupo Khronos en 2009, OpenCL es el estándar abierto y libre de regalías más popular para la programación paralela de plataforma cruzada. Según el Grupo Khronos, “OpenCL mejora enormemente la velocidad y la capacidad de respuesta de un amplio espectro de aplicaciones en numerosas categorías de mercado, incluidos títulos de juegos y entretenimiento, software científico y médico, herramientas creativas profesionales, procesamiento de visión y capacitación en redes neuronales e inferencias de inferencias."
Hasta ahora, OpenCl ha sido implementado por Altera, AMD, Apple, Arm, Creative, IBM, Imagination, Intel, Nvidia, Qualcomm, Samsung, Vivante, Xilinx y Ziilabs, y admite todos los sistemas operativos populares en todas las plataformas principales, lo que lo convierte en extremadamente versátil. OpenCl define un lenguaje similar a C para programas de escritura, pero existen API de terceros para otros lenguajes y plataformas de programación como Python o Java.
OpenAcc
OpenAcc es el estándar de programación más joven para la computación paralela descrito en este artículo. Inicialmente fue lanzado en 2015 por un grupo de compañías que comprenden Cray, CAPS, NVIDIA y PGI (el Grupo Portland) para simplificar la programación paralela de sistemas heterogéneos de CPU/GPU.
"OpenACC es un modelo de programación paralelo de rendimiento basado en el rendimiento basado en el usuario, diseñado para científicos e ingenieros interesados en transferir sus códigos a una amplia variedad de plataformas y arquitecturas de hardware HPC heterogéneas con un esfuerzo de programación significativamente menor de lo requerido con un nivel bajo modelo.,”Los estados OpenAcc en su sitio web oficial.
Los desarrolladores interesados en OpenACC pueden anotar el código fuente C, C ++ y Fortran para decirle a la GPU qué áreas deben acelerarse. El objetivo es proporcionar un modelo para la programación de aceleradores que sea portátil en los sistemas operativos y varios tipos de CPU y aceleradores del host.
Cual debería usar?
La elección entre estas tres plataformas informáticas paralelas depende de sus objetivos y el entorno en el que trabaja. Por ejemplo, CUDA se usa ampliamente en la academia, y también se considera el más fácil de aprender. OpenCl es, con mucho, la plataforma de computación paralela más portátil, aunque los programas escritos en OpenCL aún deben optimizarse individualmente para cada plataforma de destino.
https: // linuxhint.com/GPU Programming-Python/
https: // linuxhint.com/GPU Programming-CPP/
Para familiarizarse con CUDA, le recomendamos que siga las instrucciones en la guía de inicio rápido de CUDA, que explica cómo CUDA en funcionamiento en Linux, Windows y MacOS. La guía de programación OpenCL de AMD proporciona una visión general fantástica y profunda de OpenCl, pero supone que el lector está familiarizado con los primeros tres capítulos de la especificación OpenCL. OpenACC ofrece un tutorial introductorio de tres pasos diseñado para demostrar cómo aprovechar la programación de GPU, y se puede encontrar más información en la especificación OpenACC.