Iniciando a programação de GPU com CUDA


 

Por conta do doutorado eu tenho um interesse especial por arquiteturas paralelas como é o caso do processador Cell Broadband Engine que equipa o Playstation3 e também das placas de vídeo da nVidia que têm diversos núcleos e nos últimos anos têm chamado a atenção dos pesquisadores por serem muito mais baratas do que máquinas paralelas grandes.
Sempre adiei o início dos meus estudos desse tipo de desenvolvimento mas nesse verão surgiu a oportunidade de fazer um mini-curso de programação CUDA no LNCC em Petrópolis, tem sido uma experiência interessante (que terminou sexta-feira dia 05/02/2010) e que me incentivou a finalmente fazer a instalação do meu ambiente.
Tal como no caso do Cell Broadband Engine, existem meios de programar usando um ambiente emulado, mas nada como poder executar seu programa na arquitetura final :) por sorte minha máquina é equipada com uma placa GeForce 8200M G. No site da nVidia consta que esta placa não tem capacidade de rodar programas CUDA, mas depois de rodar pelos fóruns descobri que algumas pessoas conseguiram executar com sucesso, e também na wikipedia consta esta placa como capaz de rodar programas CUDA.
Bom, a tarefa parecia simples, é necessário usar o driver fornecido pela nVidia, existem versões para linux, windos e mac. A versão mais recente (e estável) do CUDA é a 2.3, porém esta precisava da versão 190 do driver, começou aí o meu primeiro problema. Meu OpenSuSE 11.1 é uma versão de 32 bits, para que reconhecesse toda a memória instalada (4GB) foi necessário usar o módulo de expansão PAE, com isso o driver de vídeo mais atualizado é o 185.18.14 voltei então para a versão 2.2 do CUDA que é compátivel com meu driver.
A instalação é bem tranquila, sendo realizada a partir de dois arquivos binários baixados da nVidia, porém precisamos ficar atentos, os exemplos não compilavam de jeito algum, pois a biblioteca libcuda.so não estava visível, mais uma busca nos fóruns e achei uma dica de criar um link simbólico do arquivo .so fornecido para o nome esperado pelo SDK, funcionou corretamente, mas agora o problema estava com a compilação de certos exemplos, que realizei como root.

Hora de fazer um resumo ! Comece assim:

    baixe os arquivos da nVidia
    atualize o driver de vídeo
    instale o SDK
    vá até o diretório /usr/lib e faça um link simbólico para o arquivo do libcuda.so.xxx como libcuda.so
    no diretório NVIDIA_CUDA_SDK execute o make como root (ou com sudo)

Pronto! Agora já tem um ambiente funcionando, no meu caso o openGL não está funcionando, mas não é bem o meu objetivo então isso não foi um grande problema. Minha placa tem apenas um multiprocessador com 8 núcleos e 512MB acredito que seja possível realizar os testes necessários, mas se tudo funcionar vou precisar providenciar um ambiente mais forte com mais núcleos.

Em breve vou postar aqui alguns exemplos de codificação e como configurar o Netbeans para trabalhar com o CUDA.

One comments

  1. Obvio que se fosse sempre mais rapido usar a GPU do que a CPU teriamos sistemas operacionais baseados apenas na GPU, as acoes da Intel estariam despencando etc. Mas para alguns tipos de tarefas o uso da placa de video no lugar de CPUs x86 de uso geral (Intel, AMD etc) pode resultar em ganhos de performance impressionantes sim!

    Eu deixei executando por uns 2 meses o cliente basico do Folding@Home (http://folding.stanford.edu/). Essa versao basica usa qualquer CPU x86 para calcular o comportamento de proteinas para entender e ajudar a descobrir a cura de certas doencas. Depois, dando uma olhada no site deles eu achei um outro cliente, experimental, que usa GPUs da nVidia ou da ATI. Instalei esse tambem, e agora meu computador usa parte da CPU e GPU (nVidia 9800GT) para calcular protein folding. Eu ainda nao tenho numeros para comparar os dois, mas baseado na minha pagina de estatisticas do F@H (http://fah-web.stanford.edu/cgi-bin/main.py?qtype=userpage&username=pburglin) eu diria com seguranca que a performance mais que dobrou!

    Como eu uso o computador pra gravar TV ele fica ligado a maior parte do tempo, executando tarefas como conversao de MPEG2 pra H.264, detecao de comerciais etc. Dai eu deixo o F@H executando em background. Posso navegar na internet assim sem problemas, mas quando eu quero jogar (e.g. DragonAge) eu desligo os clientes do F@H.

Leave a Reply