Aprende DPC++ en GPUs Nvidia - Demo paso a paso
Contenido
Introducción
Requisitos previos
Compatibilidad del sistema operativo
Instalación de Docker y el kit de herramientas de contenedores de NVIDIA
Ejemplos de CUDA en Sickle
Ejemplo 1: Implementación de un vector adicional básico
Ejemplo 2: Interrupción desde una aplicación Sickle existente con la API de CUDA
Ejemplo 3: Ejemplo avanzado de vector adicional con kernels de CUDA
Ejercicio
Ejercicio 1: Adaptación de código CUDA a Sickle
Conclusiones
Preguntas frecuentes (FAQ)
Pregunta 1: ¿Qué es DPC++ y qué ventajas ofrece?
Pregunta 2: ¿Puedo ejecutar los ejemplos en sistemas operativos distintos a Linux?
Pregunta 3: ¿Es necesario tener conocimientos previos de programación en C++?
Pregunta 4: ¿Dónde puedo encontrar más información sobre Sickle y CUDA?
Pregunta 5: ¿Existe algún recurso adicional para aprender sobre DPC++?
🚀 Introducción
¡Hola a todos y bienvenidos a este ejercicio práctico de DPC++! Mi nombre es Stuart Adams y soy ingeniero de software en Codeplay Software. En este artículo, quiero mostrarles parte del trabajo que mis colegas y yo hemos realizado en el proyecto DPC++. A lo largo de los próximos párrafos, exploraremos algunos ejemplos de Sickle en CUDA y veremos cómo podemos adaptar código CUDA existente a Sickle. ¡Comencemos!
📋 Requisitos previos
Antes de sumergirnos en los ejemplos y ejercicios, es importante asegurarnos de que cumplimos con los requisitos previos. A continuación, discutiremos la compatibilidad del sistema operativo y cómo instalar Docker y el kit de herramientas de contenedores de NVIDIA.
✅ Compatibilidad del sistema operativo
Es fundamental tener en cuenta que estos ejercicios solo funcionarán en máquinas Linux equipadas con tarjetas gráficas NVIDIA. Lamentablemente, Windows y Windows Subsystem for Linux no son compatibles en este caso. Si desean seguir el ejercicio, asegúrense de estar en un entorno Linux con una tarjeta gráfica NVIDIA instalada.
⚙️ Instalación de Docker y el kit de herramientas de contenedores de NVIDIA
Para poder ejecutar los ejemplos sin problemas, les recomiendo que instalen tanto Docker como el kit de herramientas de contenedores de NVIDIA. Estas herramientas les permitirán ejecutar un contenedor con todas las bibliotecas y variables de entorno necesarias para utilizar DPC++ de manera sencilla. Si aún no tienen instalados Docker y el kit de herramientas, no se preocupen, les proporcionaré un enlace a una guía que les ayudará a completar la instalación en tan solo cinco minutos.
Una vez que hayan completado la instalación de Docker y el kit de herramientas de contenedores de NVIDIA, ¡podemos empezar con los ejemplos!
🖥️ Ejemplos de CUDA en Sickle
En esta sección, exploraremos algunos ejemplos de CUDA en Sickle. Cada ejemplo nos permitirá comprender las diferencias entre estas dos API y cómo interactúan entre sí. Veamos los primeros ejemplos.
📄 Ejemplo 1: Implementación de un vector adicional básico
El primer ejemplo que veremos es una implementación básica de una suma de vectores tanto en Sickle como en CUDA. Examinar este ejemplo nos dará una idea clara de las diferencias entre las dos API. Antes de compilarlo, recomendamos crear un directorio de compilación y luego ejecutar CMake. Les sugerimos copiar el comando de CMake proporcionado en el README, ya que necesitaremos especificar el valor de la ruta raíz de Sickle. Una vez que hayamos ejecutado CMake, procedemos a ejecutar Make y veremos que se generan dos aplicaciones: una para CUDA y otra para Sickle.
Pros:
- Permite comprender las diferencias entre Sickle y CUDA.
- Ofrece una base sólida para los ejercicios y adaptaciones posteriores.
Cons:
- Requiere conocimientos previos de C++.
📄 Ejemplo 2: Interrupción desde una aplicación Sickle existente con la API de CUDA
En el segundo ejemplo, aprenderemos cómo interrumpir desde una aplicación Sickle usando la API de CUDA existente. En este caso, la API de CUDA en cuestión es KUBLAS, una biblioteca de álgebra lineal construida sobre CUDA. El ejemplo llama a la función sgm
, que realiza una multiplicación de matrices. Nuevamente, tenemos dos programas para comparar cómo se llama a KUBLAS desde CUDA y Sickle. La aplicación Sickle utiliza algunas de las nuevas características de interrupción introducidas en DPC++, como la tarea de interrupción. Analicemos cómo compilar este ejemplo. Al igual que en el ejemplo anterior, crearemos un directorio de compilación y ejecutaremos CMake. Luego, procedemos a ejecutar Make y obtendremos nuestras dos aplicaciones listas para funcionar.
Pros:
- Muestra cómo se interrumpe desde Sickle con una API de CUDA existente.
- Introduce características de interrupción avanzadas.
Contras:
- Es necesario comprender el funcionamiento de KUBLAS y la multiplicación de matrices.
📄 Ejemplo 3: Ejemplo avanzado de vector adicional con kernels de CUDA
El tercer ejemplo es similar al ejemplo 1, pero con un giro interesante. En lugar de utilizar kernels de Sickle, ahora utilizaremos kernels de CUDA. Si bien el código principal sigue siendo en Sickle y establece todo utilizando la API de Sickle, en lugar de escribir un kernel de Sickle, tenemos un kernel de CUDA. Además, podemos invocar este kernel directamente a través de una tarea de interrupción. Para compilar este ejemplo, simplemente ejecutamos el comando make
, ya que actualmente CMake no ofrece una forma de cambiar el compilador de CUDA.
Pros:
- Demuestra cómo utilizar kernels de CUDA en una aplicación de Sickle.
- Permite comprender el proceso de adaptación de código CUDA a Sickle.
Contras:
- No compatible con CMake, lo que puede presentar limitaciones.
✍️ Ejercicio
Ahora que hemos revisado los ejemplos anteriores, llegó el momento de realizar un ejercicio por cuenta propia. El ejercicio 1 nos invita a adaptar código CUDA existente a Sickle. En el ejemplo proporcionado, se muestra una aplicación CUDA que llama a la función sgm
. La tarea es adaptar este código CUDA y utilizar la función sgmv
en su lugar. Para lograrlo, debemos familiarizarnos con el código del ejemplo 2 y ver cómo se adaptó para funcionar con Sickle. Simplemente debemos aplicar la misma lógica y realizar la llamada a sgmv
en lugar de sgm
.
Espero que, después de revisar los ejemplos y completar el ejercicio, tengan un mayor entendimiento de la programación en DPC++ y cómo se puede interrumpir entre proyectos de Sickle y CUDA.
🎉 Conclusiones
En resumen, este artículo nos ha brindado una introducción práctica a DPC++ y nos ha permitido explorar ejemplos y ejercicios que involucran la interrupción entre Sickle y CUDA. Hemos aprendido cómo compilar y ejecutar ejemplos básicos de vector adicional, así como cómo interrumpir desde una aplicación Sickle con la API de CUDA existente. Además, hemos realizado un ejercicio de adaptación de código CUDA a Sickle. ¡Espero que hayan encontrado esta guía útil y que hayan logrado comprender mejor DPC++!
Si tienen alguna pregunta, estaremos disponibles en el servidor de Discord de DevMash para discutir tanto los ejercicios como el trabajo que hemos realizado en DPC++. También hemos registrado el recorrido de los ejercicios, así que les proporcionaremos un enlace a un video de YouTube para que puedan volver atrás y seguir los pasos a su propio ritmo.
¡Muchas gracias por su atención y espero que hayan aprendido más sobre DPC++!
📚 Preguntas frecuentes (FAQ)
❓ Pregunta 1: ¿Qué es DPC++ y qué ventajas ofrece?
DPC++ es un lenguaje basado en C++ que permite la programación paralela y aceleración de hardware utilizando SYCL, una extensión de C++. DPC++ proporciona una forma sencilla pero potente de aprovechar el rendimiento de los dispositivos aceleradores, como las GPUs de NVIDIA. Al usar DPC++, los desarrolladores pueden escribir un solo código que se puede ejecutar en diferentes dispositivos, lo que facilita la portabilidad y la mejora del rendimiento.
❓ Pregunta 2: ¿Puedo ejecutar los ejemplos en sistemas operativos distintos a Linux?
No, lamentablemente los ejemplos solo son compatibles con sistemas operativos Linux equipados con GPUs de NVIDIA. Otros sistemas operativos, como Windows o Windows Subsystem for Linux, no son compatibles en este caso.
❓ Pregunta 3: ¿Es necesario tener conocimientos previos de programación en C++?
Sí, se requiere una familiaridad básica con el lenguaje de programación C++. DPC++ es una extensión de C++ y los ejemplos y ejercicios presentados en este artículo asumen un conocimiento previo de la sintaxis y las características fundamentales de C++.
❓ Pregunta 4: ¿Dónde puedo encontrar más información sobre Sickle y CUDA?
Pueden encontrar más información sobre Sickle y CUDA en la documentación oficial de Sickle y en la documentación de CUDA proporcionada por NVIDIA. También pueden consultar otros recursos en línea, como tutoriales y libros especializados en programación en CUDA y DPC++.
❓ Pregunta 5: ¿Existe algún recurso adicional para aprender sobre DPC++?
Sí, aparte de la documentación oficial de DPC++, existen numerosos recursos en línea que pueden ayudarlos a aprender más sobre DPC++. Pueden encontrar tutoriales, cursos en línea y libros especializados que les proporcionarán una base sólida para comenzar a utilizar DPC++ en sus proyectos. No duden en buscar recursos específicos según su nivel de experiencia y áreas de interés. ¡Aprender mediante la práctica es la mejor manera de dominar DPC++!