Pular para o conteúdo principal

GPGPU - Parte I

Utilizando a placa de vídeo para realizar operações matriciais.


Essa é uma idéia que ouço desde quando entrei na USP em 1998. Basicamente, as placas de vídeo são capazes de realizar operações matriciais de "uma só vez". Peço aos mais entendidos que me corrijam quando eu estiver (muito) errado.

Isso pode parecer meio estranho mas muitas das transformações de imagens apresentadas por sua placa de vídeo são série de transformações lineares. Dito isso, é um desperdício de tempo e processamento multiplicar uma matriz por outra com três laços aninhados! Aliás, é um desperdício deixar sua planilha eletrônica resolver equações lineares e outros problemas lineares computando um elemento da planilha por vez.

Chegou a hora de dar um basta nisso. Já não era sem tempo. Com avanço das placas de vídeo e das linguagens de renderização (pasmem! eu pensei que isso já seria possível a 10 anos atrás) é possível, por exemplo, multiplicar um vetor por um escalar em tempo constante.

Vamos por colocar as mãos na massa... O que é necessário ? Pelo que eu investiguei, é preciso do OpenGL 2.0 (mais especificamente o GLSL que a linguagem de programação de shaders) ou uma das edições recentes do DirectX (9 em diante).

Peraí... alguém me explica: isso é complicado mesmo ou por que ninguém fez nada até agora? E pra que essa linguagem GLSL. Porque, conforme veremos, enviar blocos de código para a Placa de Vídeo executar requer uma certa sofisticação tecnológica que tanto a Kronos como os fabricantes de placas de vídeo não nos deram.

Um passo por vez... o que é OpenGL? Isso pode parecer uma pergunta besta mas na verdade entender o significado do OpenGL ajuda a compreender a sofisticação do processo. O OpenGL não é uma API para interagir com a placa de vídeo! Nada disso... o OpenGL é na verdade uma API para a renderização de gráficos. O programador dispõe de uma linguagem para descrever o modelo gráfico que desejar e os drivers das placas de vídeo (que implementam o OpenGL) transformam esse modelo em chamadas de baixo nível para a placa. Essa últimas realizam as computações necessárias e emitem seus resultados para o monitor.

Veja que o programador não programa diretamente a placa para realizar as operações lineares. Também, observe quanto o OpenGL é diferente do DirectX que fornece através do seu componente Direct3D chamadas de baixo nível a placa de vídeo (o que favorece o desenvolvimento de jogos _ Por outro lado, a linguagem de renderização do OpenGL favorece o desenvolvimento de programas gráficos profissionais). Perceba que no OpenGL o desenvolvedor descreve os vários conceitos presentes no o 3D Studio : cenário, fontes de iluminação, textura dos objetos, a câmera etc. Bom é através de um mapeamento desses conceitos para a computação tradicional é que é possível implementar o GPGPU.

Comentários

Postagens mais visitadas deste blog

Expressões, preconceito e racismo

Expressões preconceituosas e racistas Antes de alguma outra frase, primeiro peço licença para falar de mais um assunto do qual não domino. Falo por acreditar que um leigo presta serviço maior ao debater assunto com base em fontes (ainda que seja uma Wikipedia) e no pensamento lógico do que simplesmente se manter mudo a questões do cotidiano. Em voga agora está em falar quais são ou eram as expressões preconceituosas e racistas que até a pouco eram toleradas em muitos meios. Como é covarde dizer que em boca fechada não entra racismo. O racismo não é perpetrado apenas por quem profere mas por quem se cala à agressão perpetrada a outrem. Mas veremos que a questão é muito mais complexa que os cães raivosos do politicamente correto querem dizer. Tomo aqui a palavra racista, como sendo algo usado para impor a dominação de uma “raça” sobre outra. Portanto, a acusação de racismo vai muito além da mera acusação de preconceito. Não tenho o menor apreso por vitimismo barato, onde expressões q...

A hard logic problem - The escape of blue eyed vampires

Once upon a time, a vampire clan lived peacefully on an island (as long as vampire clans can live peacefully). Then, a demon lord came, overwhelmed the vampires and became the ruler of the island. The demon didn't want any vampire to escape so he created a gargoyle to guard the only way out. This gargoyle was a fantastic creature, so powerful that he was kept petrified for the whole time until a vampire appears. Then he awakened and started to fight until seeing no more vampire "alive" (as far a vampire can be alive). All vampires crazy enough to try were killed only left a hundred of vampires. There was a catch, of course. The gargoyle was not perfectly designed. It did not awaken when blue eyes vampires appeared. And all remaining vampire were blue eyes but as you know vampires cannot see him/her selves on reflections. For any reason, they were not aware of their eye colors. Besides all that, blue eyed vampires didn't like each other (so they would never say ...

Curry with JS

Partial application and currying with Javascript In the strict way, currying is the technique of transforming a function that takes multiple arguments (a tuple of arguments) to one function that receive only one. In such way, currying techniques allow transform one multi-parameter function in a chain of functions, each one with a single argument. Looks complicated? Blah.. it is not true. In this little article, we are actually more interesting in partial applications. Let’s take the Mozilla Example for replace function in String. As we know, we can use a “replacer” function as paramenter for replace method in String object. Let’s say that we want to split a String defined by a non-numerical part, a numerical part and finally a non-alphanumeric part. Here is how: function replacer(match, p1, p2, p3, offset, string){ // p1 is nondigits, p2 digits, and p3 non-alphanumerics return [p1, p2, p3].join(' - '); }; We can try it as usual… var newString = "abc12345#$*%...