Ejemplos para desarrolladores de CUDA que demuestran las funciones de CUDA Toolkit. Esta versión es compatible con CUDA Toolkit 12.5.
Esta sección describe las notas de la versión de los ejemplos CUDA en GitHub únicamente.
Descargue e instale CUDA Toolkit 12.5 para su plataforma correspondiente. Para conocer los requisitos del sistema y las instrucciones de instalación del kit de herramientas cuda, consulte la Guía de instalación de Linux y la Guía de instalación de Windows.
Usando git, clone el repositorio de muestras CUDA usando el siguiente comando.
git clone https://github.com/NVIDIA/cuda-samples.git
Sin usar git, la forma más sencilla de utilizar estos ejemplos es descargar el archivo zip que contiene la versión actual haciendo clic en el botón "Descargar ZIP" en la página del repositorio. Luego puede descomprimir el archivo completo y utilizar las muestras.
Los ejemplos de Windows se crean utilizando el IDE de Visual Studio. Los archivos de solución (.sln) se proporcionan para cada versión compatible de Visual Studio, con el formato:
*_vs<version>.sln - for Visual Studio <version>
Los archivos completos de la solución de muestra existen en el directorio principal del repositorio:
Cada muestra individual tiene su propio conjunto de archivos de solución en: <CUDA_SAMPLES_REPO>Samples<sample_dir>
Para crear/examinar todas las muestras a la vez, se deben utilizar los archivos de solución completos. Para crear/examinar una sola muestra, se deben utilizar los archivos de solución de muestra individuales.
Los ejemplos de Linux se crean utilizando archivos MAKE. Para usar los archivos MAKE, cambie el directorio actual al directorio de muestra que desea crear y ejecute make:
$ cd <sample_dir>
$ make
Los archivos MAKE de muestra pueden aprovechar ciertas opciones:
TARGET_ARCH= - compilación cruzada dirigida a una arquitectura específica. Las arquitecturas permitidas son x86_64, ppc64le, armv7l, aarch64. De forma predeterminada, TARGET_ARCH está configurado en HOST_ARCH. En una máquina x86_64, no configurar TARGET_ARCH es equivalente a configurar TARGET_ARCH=x86_64.
$ make TARGET_ARCH=x86_64
$ make TARGET_ARCH=ppc64le
$ make TARGET_ARCH=armv7l
$ make TARGET_ARCH=aarch64
Consulte aquí para obtener más detalles sobre la compilación multiplataforma de muestras de cuda.
dbg=1 - compilar con símbolos de depuración
$ make dbg=1
SMS="AB ..." : anula las arquitecturas SM para las que se creará la muestra, donde "AB ..."
es una lista de arquitecturas SM delimitada por espacios. Por ejemplo, para generar SASS para SM 50 y SM 60, utilice SMS="50 60"
.
$ make SMS="50 60"
HOST_COMPILER=<host_compiler> : anula el compilador de host g++ predeterminado. Consulte la Guía de instalación de Linux para obtener una lista de compiladores de host compatibles.
$ make HOST_COMPILER=g++
Ejemplos básicos de CUDA para principiantes que ilustran conceptos clave sobre el uso de CUDA y las API de tiempo de ejecución de CUDA.
Ejemplos de utilidades que demuestran cómo consultar las capacidades del dispositivo y medir el ancho de banda de GPU/CPU.
Ejemplos que demuestran conceptos relacionados con CUDA y técnicas comunes de resolución de problemas.
Ejemplos que demuestran las características de CUDA (grupos cooperativos, paralelismo dinámico de CUDA, gráficos CUDA, etc.).
Ejemplos que demuestran cómo utilizar las bibliotecas de la plataforma CUDA (NPP, NVJPEG, NVGRAPH cuBLAS, cuFFT, cuSPARSE, cuSOLVER y cuRAND).
Muestras específicas del dominio (Gráficos, Finanzas, Procesamiento de imágenes).
Ejemplos que demuestran la optimización del rendimiento.
Ejemplos que demuestran el uso de libNVVVM y NVVM IR.
Algunos ejemplos de CUDA dependen de aplicaciones y/o bibliotecas de terceros, o de funciones proporcionadas por el kit de herramientas y el controlador de CUDA, para su compilación o ejecución. Estas dependencias se enumeran a continuación.
Si una muestra tiene una dependencia de terceros que está disponible en el sistema, pero no está instalada, la muestra se cancelará en el momento de la compilación.
Las dependencias de cada muestra se enumeran en la sección Dependencias de su archivo README.
Algunas muestras de CUDA requieren estas dependencias de terceros. Si están disponibles, estas dependencias se instalan en su sistema automáticamente o se pueden instalar a través del administrador de paquetes de su sistema (Linux) o un sitio web de terceros.
FreeImage es una biblioteca de imágenes de código abierto. FreeImage generalmente se puede instalar en Linux usando el sistema de administración de paquetes de su distribución. FreeImage también se puede descargar desde el sitio web de FreeImage.
Para configurar FreeImage en un sistema Windows, extraiga la distribución DLL de FreeImage en la carpeta ../../../Common/FreeImage/Dist/x64
de modo que contenga los archivos .h y .lib. Copie el archivo .dll en la carpeta bin/win64/Debug
y bin/win64/Release
del nivel raíz.
MPI (Message Passing Interface) es una API para comunicar datos entre procesos distribuidos. Se puede instalar un compilador MPI utilizando el sistema de gestión de paquetes de su distribución de Linux. También está disponible en algunos recursos en línea, como Open MPI. En Windows, para crear y ejecutar aplicaciones MPI-CUDA, se puede instalar MS-MPI SDK.
Algunas muestras sólo se pueden ejecutar en un sistema operativo de 64 bits.
DirectX es una colección de API diseñadas para permitir el desarrollo de aplicaciones multimedia en plataformas Microsoft. Para las plataformas Microsoft, el controlador CUDA de NVIDIA es compatible con DirectX. Varios ejemplos de CUDA para Windows demuestran la interoperabilidad CUDA-DirectX; para crear dichos ejemplos es necesario instalar Microsoft Visual Studio 2012 o superior, que proporciona el SDK de Microsoft Windows para Windows 8.
DirectX 12 es una colección de API de programación avanzada de bajo nivel que pueden reducir la sobrecarga del controlador, diseñada para permitir el desarrollo de aplicaciones multimedia en plataformas Microsoft a partir del sistema operativo Windows 10 en adelante. Para las plataformas Microsoft, el controlador CUDA de NVIDIA es compatible con DirectX. Pocas muestras de CUDA para Windows demuestran la interoperabilidad CUDA-DirectX12; para crear dichas muestras es necesario instalar el SDK de Windows 10 o superior, con VS 2015 o VS 2017.
OpenGL es una biblioteca de gráficos utilizada para renderizado 2D y 3D. En sistemas que admiten OpenGL, la implementación OpenGL de NVIDIA se proporciona con el controlador CUDA.
OpenGL ES es una biblioteca de gráficos de sistemas integrados que se utiliza para renderizado 2D y 3D. En sistemas que admiten OpenGL ES, la implementación OpenGL ES de NVIDIA se proporciona con el controlador CUDA.
Vulkan es una API de computación y gráficos 3D multiplataforma de baja sobrecarga. Vulkan apunta a aplicaciones de gráficos 3D en tiempo real de alto rendimiento, como videojuegos y medios interactivos en todas las plataformas. En los sistemas que admiten Vulkan, la implementación de Vulkan de NVIDIA se proporciona con el controlador CUDA. Para crear y ejecutar aplicaciones Vulkan, es necesario instalar el SDK de Vulkan.
OpenMP es una API para programación multiprocesamiento. OpenMP se puede instalar utilizando el sistema de gestión de paquetes de su distribución de Linux. Suele venir preinstalado con GCC. También se puede encontrar en el sitio web de OpenMP.
Screen es un sistema de ventanas que se encuentra en el sistema operativo QNX. La pantalla generalmente se encuentra como parte del sistema de archivos raíz.
X11 es un sistema de ventanas que se encuentra comúnmente en sistemas operativos de estilo *-nix. X11 se puede instalar utilizando el administrador de paquetes de su distribución de Linux y viene preinstalado en los sistemas Mac OS X.
EGL es una interfaz entre las API de renderizado de Khronos (como OpenGL, OpenGL ES u OpenVG) y el sistema de ventanas de la plataforma nativa subyacente.
EGLOutput es un conjunto de extensiones de EGL que permiten que EGL se represente directamente en la pantalla.
EGLSync es un conjunto de extensiones de EGL que proporciona objetos de sincronización que son primitivos de sincronización y representan eventos cuya finalización se puede probar o esperar.
NvSci es un conjunto de bibliotecas de interfaz de comunicación a partir de las cuales CUDA interopera con NvSciBuf y NvSciSync. NvSciBuf permite que las aplicaciones asignen e intercambien buffers en la memoria. NvSciSync permite que las aplicaciones administren objetos de sincronización que coordinan cuándo comienzan y finalizan las secuencias de operaciones.
NvMedia proporciona un potente procesamiento de datos multimedia para una verdadera aceleración de hardware en dispositivos NVIDIA Tegra. Las aplicaciones aprovechan la interfaz de programación de aplicaciones (API) de NvMedia para procesar los datos de imágenes y videos.
Algunas muestras de CUDA necesitan estas características de CUDA. Los proporciona CUDA Toolkit o CUDA Driver. Es posible que algunas funciones no estén disponibles en su sistema.
Las rutinas de devolución de llamada CUFFT son rutinas del kernel proporcionadas por el usuario a las que CUFFT llamará al cargar o almacenar datos. Estas rutinas de devolución de llamada solo están disponibles en sistemas Linux x86_64 y ppc64le.
CDP (CUDA Dynamic Parallellism) permite que los kernels se inicien desde subprocesos que se ejecutan en la GPU. CDP solo está disponible en GPU con arquitectura SM 3.5 o superior.
Los grupos cooperativos de bloques múltiples (MBCG) amplían los grupos cooperativos y el modelo de programación CUDA para expresar la sincronización entre bloques. MBCG está disponible en GPU con Pascal y arquitectura superior.
Los grupos cooperativos de dispositivos múltiples amplían los grupos cooperativos y el modelo de programación CUDA, lo que permite que los bloques de subprocesos que se ejecutan en múltiples GPU cooperen y se sincronicen mientras se ejecutan. Esta función está disponible en GPU con Pascal y arquitectura superior.
CUBLAS (Subrutinas de álgebra lineal básica CUDA) es una versión acelerada por GPU de la biblioteca BLAS.
IPC (Comunicación entre procesos) permite que los procesos compartan punteros de dispositivos.
CUFFT (CUDA Fast Fourier Transform) es una biblioteca FFT acelerada por GPU.
CURAND (CUDA Random Number Generation) es una biblioteca RNG acelerada por GPU.
CUSPARSE (CUDA Sparse Matrix) proporciona subrutinas de álgebra lineal utilizadas para cálculos de matrices dispersas.
La biblioteca CUSOLVER es un paquete de alto nivel basado en las bibliotecas CUBLAS y CUSPARSE. Combina tres bibliotecas independientes bajo un mismo paraguas, cada una de las cuales se puede utilizar de forma independiente o en conjunto con otras bibliotecas del kit de herramientas. La intención de CUSOLVER es proporcionar funciones útiles similares a LAPACK, como factorización matricial común y rutinas de resolución triangular para matrices densas, un solucionador de mínimos cuadrados dispersos y un solucionador de valores propios. Además, cuSolver proporciona una nueva biblioteca de refactorización útil para resolver secuencias de matrices con un patrón de dispersión compartido.
NPP (NVIDIA Performance Primitives) proporciona funciones de procesamiento de señales, vídeos e imágenes aceleradas por GPU.
NVGRAPH es una biblioteca de análisis de gráficos acelerada por GPU.
La biblioteca NVJPEG proporciona funcionalidad de decodificación JPEG acelerada por GPU de alto rendimiento para formatos de imagen comúnmente utilizados en aplicaciones multimedia de hiperescala y aprendizaje profundo.
NVRTC (CUDA RunTime Compilation) es una biblioteca de compilación en tiempo de ejecución para CUDA C++.
Stream Priorities permite la creación de flujos con prioridades específicas. Stream Priorities solo está disponible en GPU con arquitectura SM 3.5 o superior.
UVM (Memoria virtual unificada) habilita la memoria a la que pueden acceder tanto la CPU como la GPU sin necesidad de realizar copias explícitas entre las dos. UVM sólo está disponible en sistemas Linux y Windows.
FP16 es un formato de punto flotante de 16 bits. Se utiliza un bit para el signo, cinco bits para el exponente y diez bits para la mantisa.
Compatibilidad NVCC con funciones de C++11.
Los ejemplos de libNVVM se crean con CMake 3.10 o posterior.
Agradecemos sus comentarios sobre problemas y sugerencias de muestras. En este momento no aceptamos contribuciones del público; vuelva a consultar aquí a medida que evolucionamos nuestro modelo de contribución.
Usamos la Guía de estilo de Google C++ para todas las fuentes https://google.github.io/styleguide/cppguide.html
Las respuestas a las preguntas frecuentes sobre CUDA se pueden encontrar en http://developer.nvidia.com/cuda-faq y en las Notas de la versión del kit de herramientas CUDA.