January 11, 2011

GPU dos games à computação científica

Olá leitor! Meu nome é Fábio Santos, sou aluno de doutorado do Laboratório de Termofluidodinâmica (LTFD) do Programa de Engenharia da COPPE/UFRJ.

Bem, muitos de vocês leitores durante a adolescência (ou até hoje como eu) passaram horas jogando aquele game com gráficos sensacionais, que geralmente tinha como requisito mínimo aquela bendita placa de vídeo poderosa. Então, sabe essas placas, foram se desenvolvendo ao ponto de ganhar um espaço na computação científica. Mas como toda essa mudança de paradigma ocorreu??

A princípio os microprocessadores baseados em CPU, tais como da família Intel e AMD Opteton, aumentaram a sua performance e reduziram seu custo vertiginosamente nas últimas duas décadas. Mas como sabemos, para algumas aplicações esses avanços não foram suficientes, assim surgindo a necessidade de códigos paralelos para o uso de clusters de computadores afim de nos propiciar centenas de GFLOPs ( bilhões de operações de ponto flutuante por segundo). Contudo, essas CPUs foram desenvolvidas para o processamento serial, e portanto, não foram otimizadas para realizar a tarefa de paralelizar códigos.

Então onde entram as placas de vídeo nessa história???

As GPU (Graphics Processing Unit) são placas aceleradores de imagem otimizadas para paralelismo e renderização de imagens. Devido a essa otimização, as GPU atingem picos de velocidade que superam qualquer CPU existente. Por exemplo, uma GPU Nvidia Fermi pode ser cerca 250 vezes mais veloz que um Intel Core i7 quad (uma das CPU mais rápidas hoje no mercado) utilizada de forma sequencial.

Agora você deve estar se questionando: "o que faz esses dispositivos serem tão rápidos?" A resposta é simples. A filosofia do design das GPUs são significativamente diferentes, já que as placas de vídeo devem ser capazes de executar um número massivo de operações de ponto flutuante por frames de vídeo. Para isto, esses hardwares executam um número muito grande de threads simultanemante, enquanto um outro grande número de threads aguarda a latência de memória, minimizando assim o controle lógico de execução de tarefas. Ainda nessa arquitetura, pequenos cache de memória são utilizados para auxiliar o controle de memória, evitando que diferentes threads acessem várias vezes a memória DRAM. Consequentemente, mais áreas de chips são utilizadas para operações de ponto flutuante.

Eu tenho uma GPU. Como rodar meus códigos??

Existe uma linguagem de programação própria. Na verdade, não é uma linguagem, mas sim uma API, um conjunto de padrões de linguagem de programação, denominada de CUDA. Primeiramente essa API foi baseada na linguagem C. Entretanto, hoje a mesma tem suas variações em Fortran e Python.

E onde CFD e FEA entram nessa história???

A Ansys_inc inicia seu interesse fazendo acordos de colaboração com a Nvidia para o desenvolvimento de aceleradores em CUDA, começando pelo Mechanical ( ANSYS Unveils GPU Computing for Accelerated Engineering Simulations ). Atualmente, em CFD já existe um pluggin OpenFOAM-CUDA que acopla o OpenFOAM com um solver de sistemas lineares desenvolvido em CUDA, denominado SpeedIT. Mas isso ficará para o próximo post! Enfim, se você joga ou jogava games para workstation (rs) é bem provável que vá gostar de programar na sua placa de vídeo usando algumas dessas APIs ( PyCuda, Cuda ou Fortran Cuda)...