quarta-feira, 27 de abril de 2011

Surgimento e Panorama da Supercomputação em GPU

Olá leitores!
Para inaugurar o blog, vamos conversar um pouco sobre essa nova tendência, a da Computação de Alto Desempenho utilizando GPU. Ou, GPU Computing, para simplificar.
GPU Computing começou com uma turma meio perturbada, que teve a ideia de usar o paralelismo dos fragment processors das placas de vídeo para cálculos gerais. Daí a sigla da época era GPGPU, inglês para Computação de Propósito Geral utilizando Unidades de Processamento Gráfico (General Purpose computation on Graphics Processing Units). Isso foi por volta de 2002, quando os processadores gráficos tinham evoluído de simples processadores de vídeo com algumas funções matemáticas especiais para computação gráfica, para poderosos processadores vetoriais, capazes de processar milhões de pixels, texels, voxels e mais um punhado de coisinhas terminadas em xel. A turminha da computação gráfica já tinha desenvolvido efeitos bem bonitos usando linguagens bem específicas, com Cg (C for graphics), GLSL (OpenGL Shader Language).
Os shader programs são pequenos trechos de código que são replicados e executados simultaneamente em vários elementos de uma textura ou vértices de um polígono. Através dos shaders, os programadores gráficos conseguem fazer aqueles brilhos, explosões, sombras e outras coisinhas legais que gostamos de ver nos nossos jogos! Então, alguém um dia pensou "Ei, se é possíver fazer uma operação numa textura inteira, por que não fazer umas continhas?". Se pensarmos em uma imagem como uma matriz de pixels, onde cada pixel é um valor de cor, é possível imaginar que daria para usar esta estrutura para armazenar outro tipo de dados. As placas de vídeo da época já eram capazes de trabalhar com texturas com números de ponto flutuante de 32 bits (o nosso velho float). Então, foi exatamente isso que essa turminha fez! Em vez de cores, eles armazenaram números. E em vez de aplicarem efeitos gráficos, eles trabalharam com várias texturas, fazendo multiplicações, somas, transposições e voilá! Conseguiram fazer essas operações 20 vezes mais rápidos que nos métodos tradicionais. Resumindo, o GPGPU consistia em "enganar" a placa de vídeo e fazê-la mastigar números, em vez de compor texturas. Um verdadeiro trabalho de um ninja dos códigos!
Mas isso dava muito... trabalho! As texturas de ponto flutuante são normalizadas entre 0 e 1, ou -1 e 1. Ou seja, você tem que transformar seus dados para esta faixa, calculá-los e depois transformá-los de volta. E nesse processo, um pouco da precisão numérica era sacrificada. Mas rodar um processo 20 vezes mais rápido é bem incentivador. Rodar aquela simulação de duas semanas em algumas horas? Tô dentro! Começaram a surgir várias pesquisas implementando métodos matemáticos nas placas de vídeo.
Isso chamou a atenção da indústria. Ora, se eu já ganho um punhado de dinheiro vendendo placas para jogadores, se eu vender mais um punhado de placas para pesquisadores, vou ganhar outro punhado de dinheiro! Ei! Esse povo tem mais dinheiro, então eu posso cobrar mais caro! XD
Bem... mais ou menos. Os pesquisadores querem precisão e facilidade de uso. A maioria dos interessados são físicos, químicos, matemáticos que estão interessados em fazer simulações e não em ficar escrevendo código difícil! Então, as fabricantes se movimentaram e lançaram ferramentas para facilitar o uso de suas placas de vídeo para computação geral.
Hoje, programar a sua placa de vídeo está muito mais fácil as duas maiores fabricantes já oferecem um amplo conjunto de ferramentas para fazê-lo. Destacam-se a tecnologia CUDA, da Nvidia e a OpenCL, um padrão aberto mantido por um consórcio. A gigante Microsoft também quer entrar na brincadeira e lançou o DirectCompute, que permite usar a biblioteca gráfica deles, o famoso DirectX, para computação geral. Também já foram publicados milhares de artigos e muitos softwares famosos, como Matlab, estão usando esta tecnologia para melhorar sua performance. As indústrias de jogos também estão usando esse negocinho para fazer efeitos de física melhores.
Para quem quiser saber mais, dá uma passadinha no site da Nvidia e procure por CUDA, ou no site do grupo Khronos, que mantém o OpenCL. Ou aqui, no GPUBrasil, que é um grupo de estudos com essa tecnologia.
Acho que tá bom por agora, não é? No próximo post, falarei mais sobre a linguagem CUDA, que é a que eu tenho estudado mais e falarei como instalar os kits de desenvolvimento e configurar o Eclipse para programar. Vejo vocês lá!

Nenhum comentário:

Postar um comentário