Pesquisa

só um divisor

NVIDIA Optimus em Linux + CUDA

Este tutorial é uma cópia do tutorial encontrado no blog de Andnovar destinado à instalação de bumblebee, primus e CUDA para notebooks. Estou reproduzindo (na verdade é uma versão) o site porque eu esqueço onde encontrei a informação.

Os passos são os seguintes:

        sudo add-apt-repository ppa:bumblebee/stable
        sudo add-apt-repository ppa:ubuntu-x-swat/x-updates
        sudo apt-get update
        sudo apt-get install bumblebee bumblebee-nvidia
        sudo shutdown -r now
        
Para testar deve rodar
        optirun glxspheres
        optirun glxgears
        
optirum habilita a placa interna, pode rodar o programa sim essa opção e dessa forma utilizara a placa não Nvidia. Se quer mais performance deve instalar Primus:
        sudo add-apt-repository ppa:zhurikhin/primus
        sudo apt-get update
        sudo apt-get install primus
        
Para testar o primus devemos usar
        vblank_mode=0 optirun -b primus glxspheres
        

Instalando o driver experimental da Nvidia

Em teoria o driver 310 tem mais performance que os anteriores, o problema é que a configuração deve ser feita a mão. Primeiro devemos instalar o driver:

        sudo apt-get install nvidia-310-updates nvidia-experimental-310 nvidia-settings-310-updates
        
agora deve modificar a configuração do bumblebee
        sudo vim /etc/bumblebee/bumblebee.conf
        

e modificar a linha $22$ para:

Driver=nvidia

a linha 55 mude para:

KernelDriver=nvidia-experimental-310

na linha 58 mude para:

LibraryPath=/usr/lib/nvidia-experimental-310:/usr/lib32/nvidia-experimental-310

mude a linha 61 para:

XorgModulePath=/usr/lib/nvidia-experimental-310/xorg,/usr/lib/xorg/modules

reinicie o Bumblebee

        sudo service bumblebeed restart
        
e teste-o:
        optirun glxspheres
        

Modifica a linha 16 do arquivo /usr/bin/primusrun mudando "nvidia-current" para "nvidia-driver"

Instalando CUDA toolkit

Baixe o toolkit do site da Nvidia mas não instale ele, antes vamos modificar os seguintes arquivos:

        sudo vim /etc/environment
        
e adicione o seguinte caminho de busca ':/usr/local/cuda-5.0/bin'. Edite depois o seguinte arquivo
        sudo vim /etc/ld.so.conf
        
e adicione '/usr/local/cuda-5.0/lib' e '/lib'. Finalmente edite o arquivo que o instalador indica:
        sudo vim /etc/bash.bashrc
        
e adicione
        export PATH=/usr/local/cuda-5.0/bin:$PATH
        export LD_LIBRARY_PATH=/usr/local/cuda-5.0/lib:$LD_LIBRARY_PATH
        export LD_LIBRARY_PATH=/usr/lib/:$LD_LIBRARY_PATH
        
e rode no terminal
        sudo ldconfig
        sudo apt-get install freeglut3-dev python-opengl python-pytools python-setuptools python-numpy libboost1.48-all-dev
        sudo apt-get install build-essential libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libglu1-mesa-dev
        sudo ln -s /usr/lib/x86_64-linux-gnu/libglut.so /usr/lib/libglut.so
        sudo sh cuda_5.0.35_linux_64_ubuntu11.10-1.run
        
No momento da instalação não deixamos instalar o driver, só o toolkit e os Samples. Como o driver original não é instalado obteremos alguns erros :

ERROR: The kernel header file '/lib/modules/3.8.0-22-generic/build/include/linux/version.h' does not exist. The most likely reason for this is that the kernel source files in ‘/lib/modules/3.8.0-22-generic/build’ have not been configured.

o seguinte erro com o toolkit é o seguente

Unsupported compiler: 4.7.3

Solução: O que faremos para arrumar isto é colocar uma versão mais antiga do compilador:

      sudo apt-get install gcc-4.6 g++-4.6
      sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.6 200
      sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.6 200
      sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.7 300
      sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.7 300
      sudo update-alternatives --config gcc
      sudo update-alternatives --config g++
      
agora escolha a versão g++ e gcc 4.6 (não funciona direito com a 4.4). O próximo erro:

Error:
Missing required library libglut.so

Solução:

      sudo ln -s /usr/lib/x86_64-linux-gnu/libglut.so.3 /usr/lib/libglut.so
      
Outro possível erro é

clGetPlatformIDs failed: platform not found khr

Solução:

        cd /usr/lib/nvidia-310-updates/
        ln -s libnvidia-opencl.so.310.44 libnvidia-opencl.so.1
        echo libnvidia-opencl.so.1 | sudo tee /etc/OpenCL/vendors/nvidia.icd
        

Compilando com cutil

      nvcc mycudacode.cu -lcutil -o mycudaproject 
      -I ~/NVIDIA_GPU_Computing_SDK/C/common/inc 
      -L ~/NVIDIA_GPU_Computing_SDK/C/lib 
        ~/NVIDIA_GPU_Computing_SDK/C/lib/libcutil_x86_64.a
      -L /usr/lib/nvidia-310-updates 
      -I /usr/include/nvidia-310-updates/cuda/ -lcuda 
      -L /usr/local/cuda/lib64
      -I/usr/local/cuda/include -lcudart
      

Problemas com os exemplos do NVIDIA_GPU_Computing_SDK

Problema com OpenGL: Open C/common/common.mk and CUDALibraries/common/common_cudalib.mk and put \$(RENDERCHECKGLLIB) befor \${OPENGLLIB} in all the relevant places.



In the boxFilterNPP, imageSegmentationNPP, freeImageInteropNPP, histEqualizationNPP and Makefiles and put \$(LIB) after the source files:

\$(CXX) \$(INC) -o boxFilterNPP boxFilterNPP.cpp \$(LIB) -lUtilNPP_\$(LIB_ARCH) -lfreeimage\$(FREEIMAGELIBARCH)

\$(CXX) \$(INC) -o imageSegmentationNPP imageSegmentationNPP.cpp \$(LIB) -lUtilNPP_\$(LIB_ARCH) -lfreeimage\$(FREEIMAGELIBARCH)

\$(CXX) \$(INC) -o freeImageInteropNPP freeImageInteropNPP.cpp \$(LIB) -lUtilNPP_\$(LIB_ARCH) -lfreeimage\$(FREEIMAGELIBARCH)

\$(CXX) \$(INC) -o histEqualizationNPP histEqualizationNPP.cpp \$(LIB) -lUtilNPP_\$(LIB_ARCH) -lfreeimage\$(FREEIMAGELIBARCH)



In randomFog include

USERENDERCHECKGL := 1

in the Makefile and change:

RENDERCHECKGLLIB := -lrendercheckgl_\$(LIB_ARCH)\$(LIBSUFFIX)

RENDERCHECKGLLIB := -L../../../C/lib -lrendercheckgl_\$(LIB_ARCH)\$(LIBSUFFIX)


in common_cudalib.mk