quarta-feira, 21 de abril de 2010

Instalação de CUDA no Ubuntu 9.10 e o GCC 4.4 (com e sem a placa de vídeo NVIDIA compatível)

Adaptação do tutorial NVIDIA CUDA on Ubuntu Karmic Koala and GCC 4.4 do site: http://moelhave.dk/2009/12/nvidia-cuda-on-ubuntu-karmic-koala/


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
  1. Instalação do driver NVIDIA;
  2. Instalação do Toolkit CUDA;
  3. 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 -m
Se 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 -y
sudo 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 stop
1.3. Execute:
sudo chmod +x NVIDIA-Linux-x86-190.53-pkg1.run
sudo ./NVIDIA-Linux-x86-190.53-pkg1.run 
1.4. Siga o prompt do instalador. Diga sim para instalar as bibliotecas de compatilidade.

1.5. Reinicie o computador.

1.6. Para ver as configurações :
nvidia-settings
1.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.run
2.2. Execute o toolkit para instalação:
sudo sh cudatoolkit_2.3_linux_32_ubuntu9.04.run
2.3. Será solicitado o local da instalação. Digite:
/usr/local/cuda
2.4. Registre a nova biblioteca de arquivos executando:
sudo gedit /etc/ld.so.conf.d/cuda.conf
2.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/lib64
2.6. Salve o arquivo e feche-o.

2.7. Execute no terminal para registrar as novas bibliotecas:
sudo ldconfig
2.8. Nenhuma mensagem será mostrada no terminal.

2.9. Agora abra o arquivo .bashrc com o seguinte comando:
gedit ~/.bashrc

2.10. E adicione no final deste arquivo:
  • para SO 32bits :
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib:$LD_LIBRARY_PATH 

  • para SO 64bits:
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

2.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.run
3.2. Execute o toolkit para instalação:
sudo sh cudasdk_2.3_linux.run
3.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.3
3.5. Agora vamos para o local onde está instalado o SDK:
cd ~/NVIDIA_GPU_Computing_SDK/C
3.6. Crie um diretório e crie atalhos para o gcc-4.3:
mkdir mygcc
cd mygcc
ln -s $(which g++-4.3) g++
ln -s $(which gcc-4.3) gcc
cd ..
3.7. Edite o arquivo makefile comum:
gedit common/common.mk
3.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 -fPIC
3.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/mygcc

3.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.
make
3.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=1
3.14. Os códigos são compilados a partir da pasta src e os executáveis ficam na pasta:
cd bin/linux/release/
./deviceQuery

3.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)


  • 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)

3.17. Abaixo vemos a captura de tela do exemplo Ocean:
./oceanFFT




3.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 make

3.19. Ao utilizar o comando "nvcc" para compilar lembrar de utilizar g++-4.3 e gcc-4.3.

6 comentários:

  1. Bom tutorial Douttorx!

    ResponderExcluir
  2. Excelente tutorial...

    Ajudou bastante na instalação aqui.

    ResponderExcluir
  3. Muito bom, parabéns!

    ResponderExcluir
  4. Oi. 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:
    /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.

    ResponderExcluir
  5. Existe algum tutorial para instalação do OpenCL em placas ATI?
    Abraço!

    ResponderExcluir
  6. Olá Josecley e Anônimo,
    infelizmente 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

    ResponderExcluir