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!