Quando você tem um cálculo que possa ser grande demais para você realizar a mão, a primeira solução que lhe vem a cabeça é pegar uma calculadora, não é mesmo? No entanto, quando você tem uma série de cálculos extremamente complexos que poderiam te tomar horas em uma calculadora enquanto você tem poucos segundos para resolvê-los, é preciso algo muito maior.

Os computadores são as máquinas pensantes que realizam boa parte de nossas tarefas com rapidez e, como você deve saber, em sua essência eles são movidos por cálculos matemáticos, que vão desde os mais simples até os mais extensos e complexos. Com a evolução de hardware e software, esses cálculos tendem a ficar mais complexos, muitas vezes necessitando de um "empurrãozinho" para serem ainda mais rápidos, assim, surgiu a computação paralela.

Paralelamente falando de problemas

Dividindo grandes problemas matemáticos em vários problemas pequenos, a computação paralela agiliza o processamento de dados, assim como nós, que costumamos dividir uma grande tarefa em pequenos afazeres para que possamos completá-la mais rapidamente. Por exemplo: Se sua mãe mandar você e o seu irmão arrumarem o seu quarto, é muito mais fácil e rápido um guardar as roupas do chão enquanto o outro faz a cama do que ambos tentarem fazer a mesma tarefa juntos, não é mesmo?

A tecnologia CUDA da Nvidia funciona basicamente com este conceito, dividindo tarefas complexas em núcleos de uma GPU enquanto que uma CPU por si só levaria muito mais tempo para fazer o mesmo. A plataforma de computação paralela desenvolvida pela empresa que já é conhecida por suas GPU's ganha diariamente mais popularidade e também usabilidade em diversas áreas de conhecimento, indo desde computadores gamers até grandes máquinas de reconhecimento espacial.

Mas então, o que é CUDA?

A Compute Unified Device Architecture (CUDA), é uma extensão para as linguagens de programação C, C++, Java, Fortran e Python, que possibilitam o uso de programação paralela sem que seja necessário o programador aprender uma nova linguagem para programar, pois, em sua própria plataforma já existe um sistema de "tradução" das suportadas. Dessa maneira, operações complexas podem ser transferidas dos núcleos da CPU para a unidade de processamento gráfico (GPU, mais conhecida como placa de vídeo), onde serão processadas mais rapidamente.

Mas aí você se pergunta, se os hardwares dos dias de hoje são tão poderosos, por que precisaria existir essa transferência de problemas de uma unidade para outra? A resposta é simples: processamento de vídeo, análises sísmicas, simulações de dinâmica de fluidos e previsão do tempo têm uma carga tão absurda de dados para serem processados que nem mesmo a CPU mais avançada é capaz de processá-la em poucos segundos.

A maioria das expressões dos tipos de problemas que citamos acima são repetitivas, portanto,placas de vídeo são ideiais para as mesmas, afinal, todos os cálculos podem ser divididos entre os 1536 núcleos de uma GPU Nvidia GTX 680 enquanto seriam divididos em apenas 8 núcleos de um processador AMD Bulldozer FX-8150. GPU's estas que, além da quantidade de núcleos, possuem memórias muito mais rápidas, chegando até as poderosas DDR5.

O que a CUDA faz?

Basicamente, o que a tecnologia faz é transformar as GPU's da Nvidia em CPU's, utilizando as suas centenas de núcleos no processamento de dados e, assim, otimizando o sistema.

Como podemos ver em jogos principalmente da nova geração, componentes físicos ficam cada vez mais realistas como, por exemplo, chuva, vento, gravidade e etc. Com a CUDA essas propriedades gráficas ficam muito mais leves, pois seus cálculos matemáticos complexos podem ser executados diretamente na GPU.

No vídeo abaixo você confere uma simulação utilizando a CUDA para reproduzir 12 milhões partículas em tempo real, algo que uma CPU teria dificuldades para realizar.

Como as placas de vídeo são desenvolvidas para processar paralelamente elementos em 3D em alta resolução e em tempo real, a sua evolução acompanha a demanda de hardware de processamento de dados complexos consumindo uma quantidade muito menor de energia que precisaria um processador com a mesma quantidade de núcleos.

O fluxo de dados da CUDA é muito mais simples do que parece. Depois que os dados da tarefa complexa são copiados da memória principal, eles são levados até a GPU, que aloca o processo e então o executa paralelamente entre seus núcleos, realizando vários cálculos de uma só vez, depois que a tarefa estiver concluída, é só mandar o resultado de volta para a memória principal. Tudo isso é feito automaticamente.

As desvantagens da CUDA

Embora seja a solução de grande parte dos problemas, a CUDA não pode fazer tudo sozinha. A renderização de texturas, por exemplo, não é suportada pelos núcleos da placa de vídeo, que tem a única função de realizar cálculos que deixem as informações necessárias para a renderização prontas. Outro problema que pode acontecer é as cópias realizadas entre uma memória e outra causarem algum tipo de conflito e piorar ainda mais o desempenho da máquina que, felizmente, depende apenas do barramento do sistema para correr este risco.


A Geforce GTX Titan é uma das melhores GPUs do mercado e tem 3072 Núcleos Cuda

É importante também levar em conta que a a tecnologia foi desenvolvida para ser compatível com um hardware da Nvidia, ou seja, se você tem uma GPU que usa outra tecnologia, a extensão poderá até funcionar, mas ficará limitada ao processador da máquina apenas, tornando o desempenho geral bem menos satisfatório.

Como já dito pelos próprios desenvolvedores da CUDA, se você não tiver um processo realmente complexo para ser realizado que possa ser realizado de maneira linear pela CPU, talvez não valha a pena utilizá-la na programação do seu software. Agora se você está desenvolvendo algo realmente grande, podendo dividir o seu problema em pelo menos mil probleminhas,  ela pode melhorar muito a sua vida e a vida de seus consumidores.