Amostras para desenvolvedores CUDA que demonstram recursos do CUDA Toolkit. Esta versão suporta CUDA Toolkit 12.5.
Esta seção descreve as notas de lançamento dos exemplos CUDA somente no GitHub.
Baixe e instale o CUDA Toolkit 12.5 para sua plataforma correspondente. Para obter os requisitos do sistema e as instruções de instalação do kit de ferramentas cuda, consulte o Guia de instalação do Linux e o Guia de instalação do Windows.
Usando git, clone o repositório de amostras CUDA usando o comando abaixo.
git clone https://github.com/NVIDIA/cuda-samples.git
Sem usar o git, a maneira mais fácil de usar esses exemplos é baixar o arquivo zip que contém a versão atual clicando no botão "Baixar ZIP" na página do repositório. Você pode então descompactar todo o arquivo e usar as amostras.
Os exemplos do Windows são criados usando o IDE do Visual Studio. Arquivos de solução (.sln) são fornecidos para cada versão compatível do Visual Studio, usando o formato:
*_vs<version>.sln - for Visual Studio <version>
Arquivos de solução de amostras completos existem no diretório pai do repositório:
Cada amostra individual possui seu próprio conjunto de arquivos de solução em: <CUDA_SAMPLES_REPO>Samples<sample_dir>
Para construir/examinar todas as amostras de uma vez, os arquivos completos da solução devem ser usados. Para construir/examinar uma única amostra, os arquivos de solução de amostra individuais devem ser usados.
As amostras do Linux são construídas usando makefiles. Para usar os makefiles, altere o diretório atual para o diretório de amostra que você deseja construir e execute make:
$ cd <sample_dir>
$ make
Os makefiles de amostras podem tirar vantagem de certas opções:
TARGET_ARCH= - compilação cruzada visando uma arquitetura específica. As arquiteturas permitidas são x86_64, ppc64le, armv7l, aarch64. Por padrão, TARGET_ARCH é configurado como HOST_ARCH. Em uma máquina x86_64, não configurar TARGET_ARCH é equivalente a configurar TARGET_ARCH=x86_64.
$ make TARGET_ARCH=x86_64
$ make TARGET_ARCH=ppc64le
$ make TARGET_ARCH=armv7l
$ make TARGET_ARCH=aarch64
Veja aqui mais detalhes sobre a compilação multiplataforma de amostras CUDA.
dbg=1 – construir com símbolos de depuração
$ make dbg=1
SMS="AB ..." - substitui as arquiteturas SM para as quais a amostra será construída, onde "AB ..."
é uma lista delimitada por espaço de arquiteturas SM. Por exemplo, para gerar SASS para SM 50 e SM 60, use SMS="50 60"
.
$ make SMS="50 60"
HOST_COMPILER=<host_compiler> - substitui o compilador host g++ padrão. Consulte o Guia de instalação do Linux para obter uma lista de compiladores host suportados.
$ make HOST_COMPILER=g++
Amostras básicas de CUDA para iniciantes que ilustram os principais conceitos do uso de CUDA e APIs de tempo de execução CUDA.
Amostras de utilitários que demonstram como consultar os recursos do dispositivo e medir a largura de banda da GPU/CPU.
Amostras que demonstram conceitos relacionados a CUDA e técnicas comuns de resolução de problemas.
Amostras que demonstram recursos CUDA (grupos cooperativos, paralelismo dinâmico CUDA, gráficos CUDA, etc.).
Amostras que demonstram como usar bibliotecas da plataforma CUDA (NPP, NVJPEG, NVGRAPH cuBLAS, cuFFT, cuSPARSE, cuSOLVER e cuRAND).
Amostras específicas do domínio (Gráficos, Finanças, Processamento de Imagens).
Amostras que demonstram otimização de desempenho.
Amostras que demonstram o uso de libNVVVM e NVVM IR.
Alguns exemplos de CUDA dependem de aplicativos e/ou bibliotecas de terceiros, ou de recursos fornecidos pelo kit de ferramentas e driver CUDA, para compilar ou executar. Essas dependências estão listadas abaixo.
Se uma amostra tiver uma dependência de terceiros que esteja disponível no sistema, mas não esteja instalada, a amostra será renunciada no momento da construção.
As dependências de cada amostra estão listadas na seção Dependências do README.
Essas dependências de terceiros são exigidas por alguns exemplos de CUDA. Se disponíveis, essas dependências são instaladas automaticamente em seu sistema ou podem ser instaladas por meio do gerenciador de pacotes do seu sistema (Linux) ou de um site de terceiros.
FreeImage é uma biblioteca de imagens de código aberto. O FreeImage geralmente pode ser instalado no Linux usando o sistema gerenciador de pacotes da sua distribuição. O FreeImage também pode ser baixado do site do FreeImage.
Para configurar o FreeImage em um sistema Windows, extraia a distribuição DLL do FreeImage na pasta ../../../Common/FreeImage/Dist/x64
de forma que contenha os arquivos .h e .lib. Copie o arquivo .dll para a pasta bin/win64/Debug
e bin/win64/Release
no nível raiz.
MPI (Message Passing Interface) é uma API para comunicação de dados entre processos distribuídos. Um compilador MPI pode ser instalado usando o sistema gerenciador de pacotes da sua distribuição Linux. Também está disponível em alguns recursos online, como Open MPI. No Windows, para construir e executar aplicativos MPI-CUDA pode-se instalar o MS-MPI SDK.
Algumas amostras só podem ser executadas em um sistema operacional de 64 bits.
DirectX é uma coleção de APIs projetadas para permitir o desenvolvimento de aplicações multimídia em plataformas Microsoft. Para plataformas Microsoft, o driver CUDA da NVIDIA oferece suporte a DirectX. Vários exemplos CUDA para Windows demonstram a interoperabilidade CUDA-DirectX. Para construir tais exemplos, é necessário instalar o Microsoft Visual Studio 2012 ou superior, que fornece o Microsoft Windows SDK para Windows 8.
DirectX 12 é uma coleção de APIs de programação avançadas de baixo nível que podem reduzir a sobrecarga do driver, projetada para permitir o desenvolvimento de aplicativos multimídia em plataformas Microsoft a partir do sistema operacional Windows 10. Para plataformas Microsoft, o driver CUDA da NVIDIA oferece suporte a DirectX. Poucas amostras CUDA para Windows demonstram interoperabilidade CUDA-DirectX12. Para construir tais amostras é necessário instalar o SDK do Windows 10 ou superior, com VS 2015 ou VS 2017.
OpenGL é uma biblioteca gráfica usada para renderização 2D e 3D. Em sistemas que suportam OpenGL, a implementação OpenGL da NVIDIA é fornecida com o driver CUDA.
OpenGL ES é uma biblioteca gráfica de sistemas embarcados usada para renderização 2D e 3D. Em sistemas que suportam OpenGL ES, a implementação OpenGL ES da NVIDIA é fornecida com o driver CUDA.
Vulkan é uma API de computação e gráficos 3D multiplataforma e de baixa sobrecarga. Vulkan tem como alvo aplicações gráficas 3D em tempo real de alto desempenho, como videogames e mídia interativa em todas as plataformas. Em sistemas que suportam Vulkan, a implementação Vulkan da NVIDIA é fornecida com o driver CUDA. Para construir e executar aplicativos Vulkan é necessário instalar o Vulkan SDK.
OpenMP é uma API para programação de multiprocessamento. OpenMP pode ser instalado usando o sistema gerenciador de pacotes da sua distribuição Linux. Geralmente vem pré-instalado com o GCC. Também pode ser encontrado no site do OpenMP.
Screen é um sistema de janelas encontrado no sistema operacional QNX. A tela geralmente é encontrada como parte do sistema de arquivos raiz.
X11 é um sistema de janelas comumente encontrado em sistemas operacionais estilo *-nix. O X11 pode ser instalado usando o gerenciador de pacotes da sua distribuição Linux e vem pré-instalado em sistemas Mac OS X.
EGL é uma interface entre APIs de renderização Khronos (como OpenGL, OpenGL ES ou OpenVG) e o sistema de janelas da plataforma nativa subjacente.
EGLOutput é um conjunto de extensões EGL que permitem que o EGL seja renderizado diretamente no display.
EGLSync é um conjunto de extensões EGL que fornece objetos de sincronização que são primitivos de sincronização, representando eventos cuja conclusão pode ser testada ou aguardada.
NvSci é um conjunto de bibliotecas de interface de comunicação a partir das quais CUDA interopera com NvSciBuf e NvSciSync. NvSciBuf permite que aplicativos aloquem e troquem buffers na memória. NvSciSync permite que aplicativos gerenciem objetos de sincronização que coordenam quando as sequências de operações começam e terminam.
NvMedia fornece processamento poderoso de dados multimídia para verdadeira aceleração de hardware em dispositivos NVIDIA Tegra. Os aplicativos aproveitam a Interface de Programação de Aplicativo (API) NvMedia para processar os dados de imagem e vídeo.
Esses recursos CUDA são necessários para alguns exemplos de CUDA. Eles são fornecidos pelo CUDA Toolkit ou pelo CUDA Driver. Alguns recursos podem não estar disponíveis no seu sistema.
As rotinas de retorno de chamada CUFFT são rotinas de kernel fornecidas pelo usuário que o CUFFT chamará ao carregar ou armazenar dados. Essas rotinas de retorno de chamada estão disponíveis apenas em sistemas Linux x86_64 e ppc64le.
CDP (CUDA Dynamic Parallelism) permite que kernels sejam iniciados a partir de threads em execução na GPU. O CDP está disponível apenas em GPUs com arquitetura SM 3.5 ou superior.
Multi Block Cooperative Groups (MBCG) estende os Grupos Cooperativos e o modelo de programação CUDA para expressar a sincronização entre threads e blocos. MBCG está disponível em GPUs com arquitetura Pascal e superior.
Os Grupos Cooperativos de Vários Dispositivos estendem os Grupos Cooperativos e o modelo de programação CUDA, permitindo que blocos de threads em execução em várias GPUs cooperem e sincronizem à medida que são executados. Este recurso está disponível em GPUs com arquitetura Pascal e superior.
CUBLAS (CUDA Basic Linear Algebra Subroutines) é uma versão acelerada por GPU da biblioteca BLAS.
IPC (Interprocess Communication) permite que processos compartilhem ponteiros de dispositivos.
CUFFT (CUDA Fast Fourier Transform) é uma biblioteca FFT acelerada por GPU.
CURAND (CUDA Random Number Generation) é uma biblioteca RNG acelerada por GPU.
CUSPARSE (CUDA Sparse Matrix) fornece sub-rotinas de álgebra linear usadas para cálculos de matrizes esparsas.
A biblioteca CUSOLVER é um pacote de alto nível baseado nas bibliotecas CUBLAS e CUSPARSE. Ele combina três bibliotecas separadas sob um único guarda-chuva, cada uma das quais pode ser usada independentemente ou em conjunto com outras bibliotecas de kits de ferramentas. A intenção do CUSOLVER é fornecer recursos úteis do tipo LAPACK, como fatoração de matriz comum e rotinas de resolução triangular para matrizes densas, um solucionador de mínimos quadrados esparsos e um solucionador de autovalores. Além disso, o cuSolver fornece uma nova biblioteca de refatoração útil para resolver sequências de matrizes com um padrão de dispersão compartilhado.
NPP (NVIDIA Performance Primitives) fornece funções de processamento de imagem, vídeo e sinal aceleradas por GPU.
NVGRAPH é uma biblioteca de análise gráfica acelerada por GPU.
A biblioteca NVJPEG fornece funcionalidade de decodificação JPEG acelerada por GPU de alto desempenho para formatos de imagem comumente usados em aplicativos de aprendizagem profunda e multimídia de hiperescala.
NVRTC (CUDA RunTime Compilation) é uma biblioteca de compilação de tempo de execução para CUDA C++.
Stream Priorities permite a criação de streams com prioridades especificadas. Stream Priorities está disponível apenas em GPUs com arquitetura SM 3.5 ou superior.
UVM (Memória Virtual Unificada) permite memória que pode ser acessada pela CPU e GPU sem cópia explícita entre as duas. UVM está disponível apenas em sistemas Linux e Windows.
FP16 é um formato de ponto flutuante de 16 bits. Um bit é usado para o sinal, cinco bits para o expoente e dez bits para a mantissa.
Suporte NVCC de recursos do C++ 11.
As amostras libNVVM são criadas usando CMake 3.10 ou posterior.
Agradecemos sua opinião sobre questões e sugestões de amostras. No momento não estamos aceitando contribuições do público, volte aqui à medida que evoluímos nosso modelo de contribuição.
Usamos o Guia de estilo C++ do Google para todas as fontes https://google.github.io/styleguide/cppguide.html
As respostas às perguntas mais frequentes sobre CUDA podem ser encontradas em http://developer.nvidia.com/cuda-faq e nas Notas de versão do CUDA Toolkit.