terça-feira, 10 de maio de 2011

CUDA - A aposta da Nvidia para Computação de Alto Desempenho

Olá, leitores!
Seguindo a série sobre Supercomputação, vou falar um pouco sobre a tecnologia que tenho estudado nesse tema, a Computing Unified Device Architecture - CUDA.
A arquitetura CUDA permite usar as placas de vídeo da Nvidia como processadores paralelos de uso geral.  É uma tecnologia proprietária, mas em constante desenvolvimento e com uma já grande comunidade de usuários e muitos trabalhos publicados. A primeira versão foi lançada ao público em 2006, simultaneamente ao lançamento dos novos chips da família G80. A primeira placa a suportar a CUDA foi a GeForce 8800 GT.
O objetivo desta tecnologia é permitir o uso do poder de processamento de sua placa de vídeo para cálculos de computação geral. Esta técnica nasceu com o nome de GPGPU. Mais informações sobre o GPGPU no post anterior. Ela também visa a facilitar a programação, dispensando um conhecimento profundo da arquitetura de hardware da placa, permitindo ao programador concentrar-se apenas na programação.
Hoje, já está em sua versão 4.0, com suporte para as placas mais novas e também às mais antigas. O desenvolvimento do framework acompanha o desenvolvimento das novas arquiteturas de hardware; novas funções são adicionadas sempre que a arquitetura do hardware evolui.
Então você quer programar em CUDA? Vamos ver o que você vai precisar:

Com os drivers e ferramentas instalados, você já tem tudo o que precisa para começar a se divertir com sua placa! ;-)
Agora, fica muito mais fácil programar quando você usa um Ambiente de Desenvolvimento Integrado (IDE). Para programar em CUDA, utilizando C/C++ você pode usar facilmente qualquer uma das IDE's conhecidas. Neste post, vou mostrar como configurar o Eclipse no Ubuntu. Por quê? Porque é o que eu uso! ;-) Nada contra o Windows, é que ainda não programei para ele. Mas para usar o Eclipse para Windows, deve ser bem parecido.
O Eclipse tem me ajudado bastante e já estou bem acostumado com ele. Tem bons recursos como refactoring, completa o código, busca de headers, gerenciamento de versões e outras funcionalidades por meio de sua vasta biblioteca de plugins. Eu recomendo! Para configurá-lo siga estes passos:
  • Faça o download do Eclipse Classic, de acordo com o seu SO: http://www.eclipse.org/downloads/
  • Após instalá-lo, você terá o ambiente de desenvolvimento padrão para Java. Para programar em C/C++ precisamos instalar o plugin CDT (C/C++ Development Tools). Para isso, faça o seguinte:
    •  Abra o Eclipse e clique em Help > Install new software...
    • No diálogo que se abre, escolha "All available sites" na primeira caixa de texto.
    • Embaixo, vai aparecer uma árvore com várias opções. Procure por "Programming Languages" e clique no sinal de + para estender as opções.
    • Marque a caixa com a opção "Eclipse C/C++ Development Tools".
    • Clique em Next
    • Se aparecer um termo de serviço, aceite (depois de ler, né? XD) e continue. O Eclipse fará o download dos componentes e irá instalar o ambiente para C/C++.
    • Quando ele terminar a instalação, irá pedir para reiniciar. Após o reinício, você já pode começar a programar em C/C++!
Muito bom. Agora que já temos o ambiente pronto, vamos começar um novo projeto e configurá-lo para usar o template do CUDA como base:
  • Abra o Eclipse e clique em File > New > Project... (Se você ver a opção C++ Project, pode clicar nela e pular a próxima etapa)
  • Na caixa do wizard, procure a opção C/C++ e expanda clicando no sinal de +. Escolha C ou C++ Project. Clique em Next.
  • Na próxima etapa, coloque o nome do projeto, e desmarque a caixa "Use default location". Clique no botão "Browse..." e navegue até a pasta onde você instalou o SDK do CUDA (você se lembra onde, né?). Na pasta raiz do SDK, navegue até a pasta C/src. Nesta pasta, ficam os códigos fonte dos exemplos e o template. Crie uma pasta para o seu projeto. Na seção "Project Type" escolha Executable > Empty Project. Na seção "Toolchains" escolha Linux GCC.


  • Na próxima caixa, clique no botão "Advanced Settings" para abrir as propriedades do projeto. No lado esquerdo, clique em "C/C++ Build". No lado direito, mude a opção "Cofiguration" para [All Configurations]. Desmarque a opção "Generate Makefiles automatically". Clique na aba "Behaviour" e apague a palavra "all" que está na caixa de texto ao lado da opção "Build(incremental build)".

  •  Volte no lado esquerdo e expanda a opção "C/C++ General" clicando no nosso velho conhecido sinal de +. Clique na opção "Paths and Symbols". Na aba "Includes", escolha "C sources" e clique no botão "Add..." e depois em "File System...". Navegue até a pasta C/common/inc que fica dentro da pasta do SDK. Faça o mesmo para a opção "C++ sources", caso você queira programar em C++. Em seguida, clique na aba "Library Paths". Clique no botão "Add..." e adicione a pasta /usr/local/cuda/lib ou /usr/local/cuda/lib64 de acordo com a arquitetura de seu SO (considerando que você instalou a toolkit no diretório padrão. Caso tenha instalado em outro diretório, basta informá-lo de acordo com sua escolha). Clique em "OK", depois em "Finish".
  • O Eclipse irá perguntar se você quer mudar para a perspectiva de C/C++, caso seja a primeira vez que você começou um projeto C/C++. Responda "Yes". Do lado esquerdo, você verá o "Project Explorer", com os nomes dos seus projetos. Clique com o botão direito do mouse no projeto que acabamos de começar (filosófico isso...) e clique em "Import...". Na caixa que aparece, expanda o item "General" e clique em "File System". Clique em "Next". Na próxima caixa, clique no botão "Browse" e navegue para a pasta do SDK/C/src/template. Marque a caixa de seleção que aparece no lado esquerdo, junto ao nome da pasta template. Isso irá marcar todos os arquivos da pasta. Nós vamos precisar deles. Clique em "Finish".
  • No "Project Explorer", clique no sinal de + ao lado do nome do seu projeto. Isso irá expandir e mostrar os arquivos que o compõem. Dê um duplo-clique no arquivo chamado "Makefile" para abri-lo. Procure a variável EXECUTABLE e mude o seu valor para um nome qualquer. Este será o nome do executável que será compilado.

  • Clique no menu Project > Build project. Repare no console se não ocorrerão erros. Caso a compilação seja bem sucedida, temos que informar ao Eclipse onde está o nosso executável. Clique agora no menu Run > Run Configurations... Nessa caixa, no lado esquerdo, clique em "C/C++ Application" e em seguida, no ícone "New launch configuration", acima da seção. Ele se parece com uma folha em branco com um sinalzinho de +. Deverá aparecer um item com o nome do seu projeto. Agora clique no botão "Browse". Navegue até a pasta do SDK/C/bin/linux/release e procure o executável com o nome que você escolheu. Clique em "Apply" e depois em "Run". Se tudo correr bem, o programa teste será executado no console do Eclipse, mostrando o tempo de execução.
Com isso, estamos prontos para começar a programar. Let's code!

No próximo post, vou falar mais das características e de como a CUDA funciona, para termos uma base de conhecimentos. Lembrando que computação paralela requer alguns cuidados, então é fundamental termos alguns conceitos bem definidos para que o nosso código funcione corretamente. Caso surja alguma dúvida, não se acanhe e use os comentários. Se você já usa o CUDA em outros ambientes de desenvolvimento e outros SO's e quiser compartilhar seu conhecimento, seu comentário (e links!) será bem-vindo. Até o próximo post!

2 comentários:

  1. Great post! It's good to see there is a reasonable option to just using emacs/vi and writing your own code and makefiles.

    ResponderExcluir
  2. Thanks, Stu! Although I'm not so old school to be an Emacs user, I'd have used Eclipse to program CUDA and it's very good! I'm thinking on trying Emacs one of these days...

    ResponderExcluir