O advento das CPUs multicore e das GPUs manycores significa que o caminho para desenvolvimento de novos processadores são sistemas paralelos. Além disso o paralelismo obtido com estes chips continuam com a evolução prevista pela lei de Moore [6]. O desafio agora é desenvolver softwares que consigam utilizar de forma eficiente o número de cores disponíveis no sistema e que a performance destes acompanhe de forma transparente o aumento do número de nucleos disponíveis. Aplicações com estas caracteristicas já existem na área de jogos, as quais utilizam os recursos disponíveis para manipular imagens de alta resolução e produzir cenas o mais realistas possíveis em frações de segundos.
CUDA é um modelo de programação paralela e um ambiente de software projetado para superar estes desafio enquanto requer uma baixa curva de aprendizado para programadores familiares com linguagens tradicionais como a linguagem C.
CUDA é composta de três abstrações principais, a saber: uma hierarquia de grupo de threads, memorias compartilhadas, sincronização via barreiras – que são expostos para o programador atraves de um conjunto minimo de extenções para a linguagem C.
Estas abstrações possibilitam o paralelismo de dados e threads. Elas levam o programador a particionar o problema em subproblemas que podem ser solucionados independentemente em paralelo e então combinar estas partes para que possam ser trabalhadas cooperativamente. Tão decomposição preserva a expressividade da linguagem e permite que as threads cooperem quando estiverem trabalhando nos subproblemas, e ao mesmo tempo permite uma evolução de performance de forma transparente já que cada subproblema pode ser agendado para ser executado em qualquer um dos núcleos disponíveis: Um programa em CUDA pode portanto executar em qualquer número de núcleos, apenas o sistema de runtime precisa saber quantos núcleos estão disponívei.
GPU: Processador manycore altamente paralelo
Movido pelo insaciavel demanda de mercado por aplicações de tempo real, graficos 3D de alta definição a GPU evoluiu para um processador manycore altamente paralelo com um gigantesco poder de computação e uma grande largura de barramento de memória, como ilustrado pela figura 1.

Figura 1
A razão por trás da grande diferença de poder de computaçaõ entre a CPU e a GPU é que a GPU é especializada para tarefas de computação intensiva e altamente paralela – exatamente o que renderização gráfica trabalha – e portanto foi projetada de forma que mais transistores são dedicados para processamento ao inves utiliza-los para cache e/ou controle de fluxo, veja a figura 2 para uma representação gráfica.

Figura 2
Mais especificamente, a GPU foi especialmente projetada para resolver problemas que podem ser expressos em termos de computações com diversos dados em paralelo – o mesmo programa é executado para cada elemento de dado em paralelo – e com alta necessidade de aritimetica. Devido ao mesmo programa ser executado para cada porção de dados, existe pouca necessidade de uma unidade de controle de fluxo sofisticada; e porquê ele é exeuctada em diversos dados em paralelos e tem alta requisição para calculos, a latencia de acesso a memória pode ser ocultada com calculos ao inves de caches gigantes.
Processamento de dados em paralelo mapeia a mesma porção de dados para diversas threads ao mesmo tempo. Muitas aplicações que processam grandes quantidades de dados podem utilizar um modelo de programação paralelo para acelerar suas as computações realizadas. Na renderização 3D grandes conjuntos de pixels e vertices são mapeados para threads executando em paralelos. Aplicações de processamento de imagem e video tais como codificação e decoficação de video, redimencionamento de imagem, visão computacional e reconhecimento de padrões, podem mapear blocos de imagens e pixels para threads executando em paralelo. De fato muitos algoritmos fora do campo de processamento de imagem e video estão sendo acelerados pelo processamento de dados em paralelo, desde simulação física e computação finânceira até biologia computacional. Você pode encontrar diversos exemplos de aplicações e o ganho de performance que obtiveram aqui [3].
O modelo de programação CUDA foi projetado para expor todo o potencial de processamento paralelo as GPUs. Existem milhões de GPUs espalhadas por todo o mundo e você mesmo pode estar utilizando uma agora e nem sabe, confira em [4] a lista das placas gráficas que suportam CUDA.
Referências:
1. http://www.nvidia.com.br/object/cuda_home_br.html#
2. http://www-csl.csres.utexas.edu/~billmark/teach/cs395t-06-spring/
3. http://www.nvidia.com.br/object/cuda_develop_br.html
4. http://www.nvidia.com.br/object/cuda_learn_products_br.html
5. http://www.techradar.com/blogs/article/parallel-computing-and-you-496480
6. http://pt.wikipedia.org/wiki/Lei_de_moore
7. http://courses.ece.uiuc.edu/ece498/al1/Syllabus.html
8. http://courses.ece.uiuc.edu/ece498/al1/Archive/Spring2007/Syllabus.html