Introdução NVIDIA CUDA é uma arquitetura de computação paralela de propósito geral que tira proveito do mecanismo de computação paralela das unidades de processamento gráfico (GPUs) NVIDIA para resolver muitos problemas computacionais complexos em uma fração do tempo necessário em uma CPU. Ela inclui a arquitetura de conjunto de instruções CUDA ISA (Instruction Set Architecture) e o mecanismo de computação paralela na GPU. Para programar segundo a arquitetura CUDA, os desenvolvedores hoje em dia podem usar C - uma das mais amplamente utilizadas linguagens de programação de alto nível, que pode ser então executada com alta performance em um processador compatível com CUDA. Outras linguagens serão admitidas no futuro, incluindo FORTRAN e C++. Com 100 milhões de GPUs compatíveis com CUDA vendidas até o momento, milhares de desenvolvedores de software já estão utilizando as ferramentas gratuitas de desenvolvimento de software da CUDA para resolver problemas em uma variedade de aplicativos profissionais ou domésticos, incluindo desde processamento de vídeos e áudio e simulação de efeitos físicos, até exploração de gás e petróleo, design de produtos, processamento de imagens na área médica e pesquisa científica. Com mais de 100 milhões de GPUs compatíveis com CUDA já implementadas, milhares de desenvolvedores de software já estão utilizando as ferramentas gratuitas de desenvolvimento de software da CUDA para acelerar aplicativos, incluindo desde codificação de vídeo e áudio, até a exploração de gás e petróleo, design de produtos, processamento de imagens na área médica e pesquisa científica. Objetivo Com o poder de processamento dos chips gráficos aumentando a cada dia – ao ponto de serem mais rápidos do que processadores convencionais em operações matemáticas – tem-se discutido já há algum tempo se os chips gráficos não poderiam ser usados como processadores para a execução de programas. A idéia, conhecida como GPGPU (General-Purpose Graphics Processing Unit ou Unidade de Processamento Gráfico de Uso Geral), é direcionar para o chip gráfico cálculos que de outra maneira seriam feitos pelo processador, aumentando assim o desempenho. Características Para direcionar para o chip gráfico os cálculos, o programador teria que saber como programar um chip gráfico específico para que um programa pudesse ser executado nele, e este programa não funcionaria em um chip gráfico diferente. Para resolver este problema a NVIDIA lançou um compilador C para sua série GeForce 8800, chamado CUDA. Com o CUDA qualquer programador pode facilmente compilar seus programas escritos em C para usarem o poder de processamento do chip gráfico do micro. Dando um passo adiante, a NVIDIA lançou uma série de “placas de vídeo” chamada Tesla. Essas “placas de vídeo” são equipadas com chips gráficos GeForce 8800, mas elas não produzem vídeo: elas foram desenvolvidas para serem usadas como processadores, ou seja, para executarem programas. Esses programas precisam ser compilados com o CUDA, obviamente. Dessa forma usuários comuns não se beneficiarão desta tecnologia, ou seja, não ache que instalando uma dessas placas no micro o desempenho de processamento aumentará automaticamente. Qualquer tipo de programa de cálculo pesado que faz muitas coisas em paralelo podem se beneficiar de usar o GPGPU – se eles foram compilados para usar o chip gráfico, obviamente. Isto inclui principalmente simulações (física, financeira, médica, biológica e química, por exemplo). Uma coisa muito interessante a respeito do CUDA é que você não precisa ter uma placa Tesla instalada para usá-lo. Dessa forma um programador pode comprar qualquer placa de vídeo da série GeForce 8800 e tentar ver se usando o chip gráfico em vez do processador aumenta o desempenho da aplicação que ele está escrevendo. Se funcionar bem, o programador pode pensar em comprar um sistema mais potente, ou seja, uma solução Tesla. Vantagens CUDA tem várias vantagens sobre as tecnologias anteriores em suas GPUs (GPGPU); leitura dispersa - o código pode ler de endereços arbitrários na memória; Memória compartilhada - CUDA expõe uma região de memória compartilhada rápida (16KB em tamanho) que podem ser compartilhados entre threads. Isso pode ser usado como um cache de usuário, permitindo maior largura de banda do que é possível utilizando textura lookups; Downloads mais rápidos e readbacks de e para a GPU; Suporte completo para operações de números inteiros e operações de bitwise; Limitações Sem suporte a recursão; Processamento de textura não é suportado; As GPUs da NVIDIA rodam a apenas 32 bits, permitindo apenas dados com single precision ao invés de Double precision (64 bits), existentes nos super computadores; A largura de banda e latência entre o CPU e a GPU pode ser um gargalo; Threads devem ser executadas em grupos de no mínimo 32 para o melhor desempenho, com o número total de segmentos que chegam aos milhares. Filiais no código do programa não afetam o desempenho significativamente, desde que cada um dos 32 segmentos toma o mesmo caminho de execução, o modelo de execução SIMD torna-se uma limitação importante para qualquer tarefa inerentemente divergente (por exemplo, percorrer um espaço de particionamento de dados estruturados durante raytracing); Ao contrário OpenCL, GPUs CUDA habilitadas só estão disponíveis a partir da NVIDIA (GeForce série 8 e superiores, Quadro e Tesla). Deve-se dizer que a AMD / ATI só suporta GPGPU em seus chips high-end; Conclusões Utilizando GPUs CUDA podemos obter speedups surpreendentes, em aplicações que utilizam a mesma função para tratar múltiplos dados. Para compararmos o poder de processamento de uma GPU CUDA foi realizado o seguinte teste, multiplicação de duas matrizes com 1000 linhas e 1000 colunas, o resultado desse calculo na GPU CUDA Geforce GTX 275 foi obtido em um intervalo de tempo de 15ms e em uma CPU Intel Celeron de 2,8 GHZ o mesmo teste levou aproximadamente 35s. O desempenho em cálculo da GPU, se mostrou superior ao da CPU, sendo então uma excelente fonte de processamento devido ao seu baixo custo beneficio. Referências [1] CARAPETO R. Programação em GPU. Disponível em: http://algos.inescid.pt/~jcm/cpd/papers/4a4/programacao_gpu.pdf . Acesso em Dezembro de 2009. [2] NVIDIA CORPORATION, CUDA ZONE, Disponível em: http://www.NVIDIA.com/object/cuda_home.html. Acesso em Dezembro de 2009. [3] WIKIPÉDIA CORPORATION, CUDA, Disponível em: http://en.wikipedia.org/wiki/CUDA. Acesso em Dezembro de 2009.