CUDA (Compute Unified Device Architecture) é uma arquitetura de programação paralela desenvolvida pela NVIDIA que utiliza o poder computacional das placas de vídeo para processamento de problemas de propósito geral. Para gozar do paralelismo oferecido por CUDA é necessário ter uma placa de vídeo NVIDIA compatível. Veja mais detalhes em CUDA Zone.
É possível também programar em CUDA sem ter a placa de vídeo, apenas emulando uma placa de vídeo utilizando a CPU. Neste caso não tem-se o ganho de desempenho, porém é útil quando quer aprender a linguagem e não dispoe-se de uma placa de vídeo compatível. Este tutorial é útil tanto para quem tem uma placa de vídeo NVIDIA compatível quanto para quem não tem. No meu caso, instalei em um desktop que possui a placa NVIDIA compatível e em um notebook que não possui a placa compatível. Segue as configurações dos computadores utilizados:
- Desktop: processador: Core2Duo E6550, vídeo: nVidia GeForce 8500GT 512mb, memória RAM: 4gb, hd: 500gb, sistema operacional: Ubuntu 9.10 32bits;
- Notebook: marca/modelo: STI IS 1462, processador: DualCore T3400, vídeo: VIA Chrome 9 HC, memória RAM: 2gb, hd 160gb, sistema operacional: Ubuntu 9.10 32bits;
Este tutorial de instalação é composto de três partes principais
- Instalação do driver NVIDIA;
- Instalação do Toolkit CUDA;
- Instalação do SDK CUDA.
Para uma instalação semelhante à do desktop é necessário seguir os três passos citados acima. Para uma instalação semelhante à do notebook não é necessário seguir o primeiro passo. Como não tem a placa de vídeo compatível CUDA então não é necessário instalar o driver.
Abaixo lista dos arquivos para baixar (clique no arquivo para baixar):
Driver 32bit: NVIDIA-Linux-x86-190.53-pkg1.run
Driver 64bits: NVIDIA-Linux-x86_64-190.53-pkg2.run
Toolkit 32bits: cudatoolkit_2.3_linux_32_ubuntu9.04.run
Toolkit 64bits: cudatoolkit_2.3_linux_64_ubuntu9.04.run
SDK: cudasdk_2.3_linux.run
Faça o download de acordo com a plataforma do seu SO. Para saber a plataforma digite no terminal:
uname -mSe aparecer algo como i386, i686 então seu sistema é de 32bits. Se aparecer x86_64 ou ia64 então é de 64bits.
O arquivo cudasdk_2.3_linux.run é comum às duas plataformas 32bit e 64bits.
Antes de começar à instalação dos pacotes NVIDIA vamos instalar algumas dependências:
0. Instalação de depêndencias:
sudo apt-get install build-essential libglut3-dev mesa-common-dev -ysudo apt-get install freeglut-dev libXi-dev libXmu-dev -y 1. Instalação do driver NVIDIA:
1.1. Desinstale qualquer driver NVIDIA instalado do seu computador. Utilize gui ou aptitude.
1.2. Instalação do driver. Feche a interface gráfica com o comando (talvez seja necessário imprimir este tutorial já que saída do modo gráfico):
sudo service gdm stop1.3. Execute:
1.4. Siga o prompt do instalador. Diga sim para instalar as bibliotecas de compatilidade.sudo chmod +x NVIDIA-Linux-x86-190.53-pkg1.runsudo ./NVIDIA-Linux-x86-190.53-pkg1.run 1.5. Reinicie o computador.
1.6. Para ver as configurações :
nvidia-settings1.7. No meu desktop gerou a seguinte imagem onde posso ver a versão do driver instalado:2. Instalação do Toolkit CUDA:
2.1. Permita execução do toolkit:
sudo chmod +x cudatoolkit_2.3_linux_32_ubuntu9.04.run2.2. Execute o toolkit para instalação:sudo sh cudatoolkit_2.3_linux_32_ubuntu9.04.run2.3. Será solicitado o local da instalação. Digite:/usr/local/cuda2.4. Registre a nova biblioteca de arquivos executando:sudo gedit /etc/ld.so.conf.d/cuda.conf2.5. E adicione neste arquivo uma das seguintes linhas de acordo com a arquitetura do seu SO (lib para 32bits e lib64 para 64bits):/usr/local/cuda/lib /usr/local/cuda/lib642.6. Salve o arquivo e feche-o.2.7. Execute no terminal para registrar as novas bibliotecas:
sudo ldconfig2.8. Nenhuma mensagem será mostrada no terminal.2.9. Agora abra o arquivo .bashrc com o seguinte comando:
gedit ~/.bashrc2.10. E adicione no final deste arquivo:
- para SO 32bits :
export PATH=/usr/local/cuda/bin:$PATHexport LD_LIBRARY_PATH=/usr/local/cuda/lib:$LD_LIBRARY_PATH - para SO 64bits:
export PATH=/usr/local/cuda/bin:$PATHexport LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH2.11. Salve e feche o arquivo .bashrc.
2.12. Atualize o ambiente do terminal com o comando:
bash --3. Instalação do SDK CUDA:
3.1. Permita execução do SDK:sudo chmod +x cudasdk_2.3_linux.run3.2. Execute o toolkit para instalação:sudo sh cudasdk_2.3_linux.run3.3. Escolha o local padrão de instalação.3.4. Como CUDA 2.3 não é compatível com o GCC 4.4 então é necessário instalar o gcc-4.3:
sudo aptitude install gcc-4.3 g++-4.33.5. Agora vamos para o local onde está instalado o SDK:cd ~/NVIDIA_GPU_Computing_SDK/C3.6. Crie um diretório e crie atalhos para o gcc-4.3:mkdir mygcccd mygccln -s $(which g++-4.3) g++ln -s $(which gcc-4.3) gcccd ..3.7. Edite o arquivo makefile comum:gedit common/common.mk3.8. Encontre as linhas que especificam CC, CXX e LINK e mude-as para:CXX := g++-4.3 CC := gcc-4.3 LINK := g++-4.3 -fPIC3.9. Ainda no arquivo common.mk insira antes de "ifeq($(nvcc_warn_verbose),1)"#use gcc-4.3 NVCCFLAGS+=--compiler-bindir=${HOME}/NVIDIA_GPU_Computing_SDK/C/mygcc3.10. A linha acima serve para indicar para o nvcc (compilador CUDA) utilizar o gcc-4.3 cujo atalho está na pasta mygcc.
3.11. Salve e feche o arquivo common.mk
3.12. Pronto. Agora pode utilizar o comando make para compilar os códigos que estão na pasta src.
make3.13. Caso não tenha a placa de vídeo compatível irá gerar os códigos para CPU. Neste caso o comando make terá um parâmetro que indica emulação.make emu=13.14. Os códigos são compilados a partir da pasta src e os executáveis ficam na pasta:
cd bin/linux/release/./deviceQuery3.15. Caso seja utilizado "make emu=1" os códigos ficarão na pasta
bin/linux/release/3.16. Este código mostra as informações da GPU.
- Resultado no meu desktop (comando "make" e utilizando GPU):
CUDA Device Query (Runtime API) version (CUDART static linking)
There is 1 device supporting CUDA
Device 0: "GeForce 8500 GT"
CUDA Driver Version: 2.30
CUDA Runtime Version: 2.30
CUDA Capability Major revision number: 1
CUDA Capability Minor revision number: 1
Total amount of global memory: 536150016 bytes
Number of multiprocessors: 2
Number of cores: 16
Total amount of constant memory: 65536 bytes
Total amount of shared memory per block: 16384 bytes
Total number of registers available per block: 8192
Warp size: 32
Maximum number of threads per block: 512
Maximum sizes of each dimension of a block: 512 x 512 x 64
Maximum sizes of each dimension of a grid: 65535 x 65535 x 1
Maximum memory pitch: 262144 bytes
Texture alignment: 256 bytes
Clock rate: 1.03 GHz
Concurrent copy and execution: Yes
Run time limit on kernels: Yes
Integrated: No
Support host page-locked memory mapping: No
Compute mode: Default (multiple host threads can use this device simultaneously)
There is 1 device supporting CUDA
Device 0: "GeForce 8500 GT"
CUDA Driver Version: 2.30
CUDA Runtime Version: 2.30
CUDA Capability Major revision number: 1
CUDA Capability Minor revision number: 1
Total amount of global memory: 536150016 bytes
Number of multiprocessors: 2
Number of cores: 16
Total amount of constant memory: 65536 bytes
Total amount of shared memory per block: 16384 bytes
Total number of registers available per block: 8192
Warp size: 32
Maximum number of threads per block: 512
Maximum sizes of each dimension of a block: 512 x 512 x 64
Maximum sizes of each dimension of a grid: 65535 x 65535 x 1
Maximum memory pitch: 262144 bytes
Texture alignment: 256 bytes
Clock rate: 1.03 GHz
Concurrent copy and execution: Yes
Run time limit on kernels: Yes
Integrated: No
Support host page-locked memory mapping: No
Compute mode: Default (multiple host threads can use this device simultaneously)
- Resultado no meu notebook (comando "make emu=1" e utilizando CPU):
CUDA Device Query (Runtime API) version (CUDART static linking)
There is no device supporting CUDA.
Device 0: "Device Emulation (CPU)"
CUDA Driver Version: 0.0
CUDA Runtime Version: 2.30
CUDA Capability Major revision number: 9999
CUDA Capability Minor revision number: 9999
Total amount of global memory: 4294967295 bytes
Number of multiprocessors: 16
Number of cores: 128
Total amount of constant memory: 65536 bytes
Total amount of shared memory per block: 16384 bytes
Total number of registers available per block: 8192
Warp size: 1
Maximum number of threads per block: 512
Maximum sizes of each dimension of a block: 512 x 512 x 64
Maximum sizes of each dimension of a grid: 65535 x 65535 x 1
Maximum memory pitch: 262144 bytes
Texture alignment: 256 bytes
Clock rate: 1.35 GHz
Concurrent copy and execution: No
Run time limit on kernels: No
Integrated: Yes
Support host page-locked memory mapping: Yes
Compute mode: Default (multiple host threads can use this device simultaneously)
There is no device supporting CUDA.
Device 0: "Device Emulation (CPU)"
CUDA Driver Version: 0.0
CUDA Runtime Version: 2.30
CUDA Capability Major revision number: 9999
CUDA Capability Minor revision number: 9999
Total amount of global memory: 4294967295 bytes
Number of multiprocessors: 16
Number of cores: 128
Total amount of constant memory: 65536 bytes
Total amount of shared memory per block: 16384 bytes
Total number of registers available per block: 8192
Warp size: 1
Maximum number of threads per block: 512
Maximum sizes of each dimension of a block: 512 x 512 x 64
Maximum sizes of each dimension of a grid: 65535 x 65535 x 1
Maximum memory pitch: 262144 bytes
Texture alignment: 256 bytes
Clock rate: 1.35 GHz
Concurrent copy and execution: No
Run time limit on kernels: No
Integrated: Yes
Support host page-locked memory mapping: Yes
Compute mode: Default (multiple host threads can use this device simultaneously)
3.17. Abaixo vemos a captura de tela do exemplo Ocean:
./oceanFFT3.18. Considerações finais: em alguns comandos pode ser necessário digitar "sudo" antes. Como saber? Se ao digitar o comando aparecer "Permissão negada".
Por exemplo, o comando make em alguns casos é necessário fazer
sudo make3.19. Ao utilizar o comando "nvcc" para compilar lembrar de utilizar g++-4.3 e gcc-4.3.



Bom tutorial Douttorx!
ResponderExcluirExcelente tutorial...
ResponderExcluirAjudou bastante na instalação aqui.
Muito bom, parabéns!
ResponderExcluirOi. Eu baixei o exemplo para OpenCL oclVectorAdd.tar.gz_FILES do site da NVIDIA e estou tentando executá-lo, mas está dando o seguinte erro:
ResponderExcluir/usr/bin/ld: cannot find -lshrutil_x86_64
collect2: ld returned 1 exit status
make: ** [../../..//OpenCL//bin//linux/release/oclVectorAdd] Erro 1
Eu rodo os exemplos da pasta NVIDIA_GPU_Computing_SDK em CUDA e funciona, tais como os que vc mostrou acima.
Podes dar-me alguma dica de como fazer executá-los.
obrigado e execelente tutorial.
Existe algum tutorial para instalação do OpenCL em placas ATI?
ResponderExcluirAbraço!
Olá Josecley e Anônimo,
ResponderExcluirinfelizmente não tenho experiência com OpenCL,
talvez estes links possam ajudar:
Página suporte da ATI Stream SDK
http://developer.amd.com/gpu/ATIStreamSDK/Pages/default.aspx
tópico sobre instalação:
http://forums.amd.com/forum/messageview.cfm?catid=390&threadid=133235