GDH Press: Blog » OpenCL, CUDA, Brook: processamento usando a GPU
 
RSS

OpenCL, CUDA, Brook: processamento usando a GPU

Publicado em 10/08/2009 – 15:37
por Carlos Morimoto

Tradicionalmente, a diferença fundamental entre os processadores (CPUs) e os chipsets de vídeo (GPUs) é o fato de que as CPUs são otimizadas para cálculos sequenciais (executando aplicativos diversos), enquanto as GPUs são otimizadas para cálculos massivamente paralelos, processando gráficos 3D.

Antigamente, essa divisão era bem mais nítida, já que as placas 3D processavam apenas triângulos, texturas e efeitos simples. Entretanto, com a introdução do uso de shaders (que nada mais são do que pequenos aplicativos, destinados a executarem tarefas específicas na composição das cenas) elas ganharam a capacidade de também executarem código sequencial, assim como os processadores.

Você pode pensar no GT200 ou qualquer outro chip atual como blocos de vários pequenos processadores trabalhando em paralelo. Embora sejam otimizados para o processamento de gráficos 3D e shaders, eles podem ser usados para basicamente qualquer outra tarefa computacional, indo desde a decodificação de vídeos 1080p até aplicações científicas.

Não demorou para que a nVidia e a ATI percebessem o novo filão e passassem a investir no desenvolvimento de ferramentas de desenvolvimento capazes de liberar o potencial oculto das placas. A nVidia começou o ataque com o CUDA (suportado por todos os chipsets a partir do G80), a ATI respondeu com o Brook+ (suportado pelos chipsets a partir do R520) e em seguida surgiu o OpenCL, um padrão aberto que é suportado por ambas.

O CUDA permite acessar as funções das placas usando funções em C (C for CUDA), o que o torna uma ferramenta relativamente simples para desenvolvedores familiarizados com a linguagem. Existem também wrappers que permitem desenvolver em Java (jCUDA), C# (CUDA.NET) ou até mesmo Python (PyCUDA).

O Brook+ por sua vez é baseado na linguagem Brook, que é também uma variação do C, otimizado para computação paralela. Tanto o CUDA quanto o Brook+ oferecem uma boa flexibilidade e permitem gerar aplicativos bastante otimizados. O grande problema é o fato de cada um dos dois ser compatível com apenas uma das arquiteturas.

O OpenCL é uma espécie de primo-irmão do OpenGL, que apesar de não ser mais tão usado em jogos (perdendo espaço para o DirectX) é o mais usado em aplicações profissionais. Ambos são desenvolvidos pelo Khronos Group, uma associação de fabricantes destinada a desenvolver padrões abertos. Ele permite não apenas o uso de GPUs, mas também de outros chips aceleradores (como processadores Cell) o que o torna uma opção mais ou menos universal.

cuda_html_m3f8d33ab

À primeira vista, a escolha do OpenCL parece óbvia, já que com ele seria possível desenvolver aplicativos que poderiam ser usados em qualquer GPU, em vez de desenvolver uma versão para placas da nVidia e outra para placas da ATI. Entretanto, na prática a escolha é um pouco mais complicada, já que o OpenCL oferece funções e extensões que são específicas para cada família.

Embora seja perfeitamente possível desenvolver aplicativos genéricos em OpenCL, isso implica em nivelar por baixo, utilizando apenas as funções mais comuns, o que resulta em um desempenho longe do ideal. Por outro lado, ao otimizar para uma família de placas, perde-se a compatibilidade com a outra, o que obriga os desenvolvedores a duplicarem grande parte do código dos aplicativos, um trabalho que acaba não sendo tão diferente assim de desenvolver duas versões separadas.

Para complicar, teremos também suporte a processamento paralelo no DirectX11 (que será mais uma solução aplicada às duas famílias, com suporte a várias famílias de placas, assim como no caso do Direct3D) e também o Larrabee da Intel, que se comportará como uma GPU, mas poderá ser programado diretamente em C ou C++. Como pode ver, este é ainda um ramo em franca expensão, onde muita coisa vai acontecer.

Além da questão da linguagem, existe também o desafio de otimizar o código para o uso de computação paralela, adaptando-o para as características de uma GPU.

Embora os potenciais benefícios sejam grandes, as dificuldades também são, já que o desenvolvimento de aplicativos massivamente paralelos exige não apenas um bom domínio da linguagem escolhida, mas toda uma nova metodologia de desenvolvimento, especialmente em situações onde o paralelismo não é óbvio, como no caso de filtros gráficos e algoritmos de encriptação. Basta ter em mente que apenas uma pequena porção dos aplicativos são capazes de extrair o máximo de desempenho de processadores com 4 núcleos, o que dizer então de uma GPU com 320 unidades de processamento.

Alguns exemplos de tarefas que podem ser beneficiadas pelo uso de uma GPU são aplicativos de edição e conversão de vídeo e áudio, aplicativos de edição de imagens em geral e aplicativos como o Seti@Home e Folding@Home que executam um grande volume de operações matemáticas.

Embora o ganho varie muito, em algumas situações as GPUs realmente se sobressaem. Uma GeForce 9600 GT é duas vezes mais rápida que um Core 2 Duo E6700 ao codificar vídeos em H.264 usando o PowerDirector 7 (otimizado para o CUDA) e quase 6 vezes mais rápida no SETI@Home, por exemplo. Você pode ver alguns números aqui.

Existem muitas diferenças na arquitetura de uma CPU e uma GPU. Algumas das diferenças mais notáveis são que as GPUs operam a frequências de clock muito mais baixas, mas em troca possuem um poder bruto de processamento muito maior, devido ao uso de múltiplas unidades de processamento. Enquanto um processador atual dedica a maior parte dos transistores aos caches, a arquitetura paralela das GPUs permite que elas dediquem a maior parte às unidades de processamento propriamente ditas, utilizando apenas pequenas quantidades de cache L1. Com isso, o percentual de transístores "úteis" em uma GPU é muito maior, o que explica o maior poder de processamento bruto por ciclo de clock.

card

Em tese, seria possível executar o sistema operacional e aplicativos de uso geral diretamente em uma GPU, mas isso exigiria que tudo (do chipset e o BIOS da placa mãe ao sistema operacional e os aplicativos) fossem adaptados e, mesmo assim, o desempenho no final seria muito baixo, pois eles são exatamente o tipo de tarefa onde as GPUs são mais fracas. Em resumo, não existe a possibilidade de as GPUs substituírem os processadores, pois as duas arquiteturas se complementam.

A tendência para o futuro é que os processadores passem a incorporar unidades de processamento paralelas, passando a executar as duas funções. Em outras palavras, os processadores do futuro terão GPUs integradas e serão capazes de desempenhar os dois tipos de tarefas. As placas 3D offboard não irão desaparecer, mas elas se tornarão periféricos mais especializados, reservados à aplicações de alto desempenho.

A AMD tem trabalhado no Fusion, enquanto a Intel vem silenciosamente desenvolvendo o Larrabee, sem falar nas iniciativas da nVidia e até mesmo da VIA. Não é difícil de imaginar que no futuro os softwares serão capazes de detectar se uma GPU está presente e usá-la para executar tarefas otimizadas, reduzindo o uso do processador principal. A GPU se tornará mais um processador auxiliar, assim como no caso dos processadores aritméticos, incorporados na época do 486.

» Mais posts

  1. 21 respostas para “OpenCL, CUDA, Brook: processamento usando a GPU”

  2. ddragoonss em 10 ago, 2009

    A capacidade de calcular rapidamente com números flutuantes e a capacidade de calcular com números inteiros não é o fator principal que diferencia as CPU das GPU?

  3. Carlos Morimoto em 10 ago, 2009

    As CPUs também são capazes de executar cálculos de ponto flutuante, usando o x87 ou o SSE (e variações), assim como as GPUs são também capazes de executar cálculos com inteiros (embora seja um desperdício). A diferença reside mais na forma como as unidades de processamento são distribuídas e em como você precisa estruturar o código para tirar proveito da arquitetura.

  4. kite0101 em 10 ago, 2009

    Na minha opinião, ATI ta muito atrasada no uso de gpgpu o brooks que vc falou ainda ta em beta e não chega ser um compilador e mais um parser que transformar oque vc escreveu nele em c++ e depois faz a compilação com c++ ja o cuda possui um compilador completo vc escreve em cuda e o codigo ja e compilado direto a principal vantagem disto e que na hora de usar o debug no cuda vc ve o codigo que vc escreveu e no brooks vc ve o codigo c++ gerado pelo parser oque faz com que seja mais dificil debugar codigos em brooks.
    O opencl e bom mais e mais dificil de usar que o cuda em uma boa analogia eu diria que o cuda e o DirectX e o opencl e o OpenGL, todo mundo que faz programação de jogos,é apenas jogos, em 3D sabe que e mais facil o directx pq no opengl pra fazer um cubo vc tem que dar uma meia volta e pra aplicar textura neste cubo então e uma dor de cabeça lascada ja no directx e mais facil.
    Eu realmente queria muito que o cuda virasse um padrão aberto

  5. dk em 10 ago, 2009

    Trabalho de severino da informatica na prefeitura da minha cidade e quanto mais conheço sobre informatica, principalmente hardware; mais vontade tenho de fazer eng. computação.
    Apesar de no momento não ter uma nVdia, eu curto muito essa empresa.
    Otimo post Morimoto.

  6. sboorbou em 11 ago, 2009

    Infelizmente não sou um programador tão bom quanto gostaria, e não tenho experiencia profissional em directX ou openGL, somente "brincadeiras" que testei…
    Sei que o DirectX é de longe mais facil de usar, sem sombra de duvidas, vivi isso na veia…
    Mas não podemos esquecer que o OpenGL esta Anos luz a frente do DirectX em termos de utilidade e usabilidade…. O que o DirectX 11 promete já passou pelo OpenGL a decadas…
    Pessoalmente gostaria de conseguir ser um Programador Pleno em OpenGL e c++…

  7. aLEX em 11 ago, 2009

    Adoro ver essa tecnologia mil e como vc assimila bem isso pra gente bom tenho uma opnião sobre. Circulão rumores orríveis a respeito dos jogos para pc vão se instingir ja li sobre isso então você se pergunta mas pra que tudo isso se for mesmo. O tempo dirá? Ou não é apenas para jogos? Afinal creio que a maioria dessa tecnologia está relacionada aos jogos de hoje.

  8. aLEX em 11 ago, 2009

    OBS: Sei que o assunto é processamento usando a GPU mas ja que tocou no assunto de placa de Vídeo.

  9. htupam em 11 ago, 2009

    Mesmo que os processadores evoluam a um grande ponto, as GPU's nunca serão substituidas, por causa expclusivavente dos processos graficos pesados e dos gamers Hardcore[como eu].

  10. FrancoNeto em 12 ago, 2009

    Essas GPUs realmente abrem uma nova fronteira na computação científica e de alto desempenho, penso seriamente em arrumar um projetinho e comprar umas duas dessas pra brincar, daqui mais um ano ou dois elas serão as vedetes da computação, pois já teremos memória RAM em boa quantidade nas GPUs, compiladores eficientes e padrões abertos bem estabelecidos.

    Quem sair na frente vai ter um bom retorno !!!

  11. Daniel em 13 ago, 2009

    Prezado Carlos Marimoto,

    Você aborda de uma maneira simples e clara esse assunto, parabéns! Eu trabalho no CPTEC/INPE (Centro de Previsão de Tempo e Estudos Climáticos) na área de Processamento de Alto Desempenho e estamos iniciando projetos para usar GPUs em códigos meteorológicos. Gostaria de ressaltar que até bem pouco tempo pensávamos em criar aplicações para serem executadas em clusters ou supercomputadores de dezenas de núcleos (cores) no máximo. Rapidamente os equipamentos evoluiram de uma forma muito rápida como pode ser constatado no site top500.org. O supercomputador em primeiro lugar possui uma arquitetura híbrida, para complicar, e nada menos que 129600 cores. Desenvolver aplicações eficientes para esse número de cores e em arquiteturas híbridas não é apenas uma extensão do que fazemos hoje, é um novo paradigma da computação. Ainda ninguém tem uma resposta ou um caminho para esse novo desafio que as GPUs estão também inseridas, pois clusters de GPUs com milhares de cores estão sendo criados. Só o trabalho árduo e a um longo prazo poderá nos esclarecer os rumos dessa nova era da supercomputação que está iniciando.

    Abraços,
    Daniel M. Lamosa

  12. kite0101 em 13 ago, 2009

    Repera que eu disse no post "apenas jogos" o OpenGL e melhor que o directx para programação mais generica e justamente por ser mais generico e mais dificil.
    Aqui no LCAD da USP a gente tem um projeto chamado de olho virtual cujo objetivo e scanear um olho de verdade pra dentro do computador e poder inferir analises neste olho(e parecido com aqueles exames eletronicos de vista so que muito mais sofisticado) e o que o pessoal usa neste projeto e OPENGL pq ele possui recursos inesxistentes no DirectX.
    Entretando no quesito jogo o OPENGL perde, não examente pq ele seja ruim mais pq e generico(tudo nele tem que ser feito da maneira certa, oque envolve um pouco de geometria).
    O mesmo com OPENCL ele generico demais feito pra se programar desdo cell do PS3 ate as placas de video,passando neste meio por processadores x86, então ta muito dificil fazer coisas nele eu queria que fosse criado um OPENCL mais like.

  13. ddragoonss em 13 ago, 2009

    Qual o motivo de uma GPU com um bom controlador de dados(para administrar os múltiplos "cores") ser inferior a uma CPU para atividades "comuns" como sustentar um SO?

    Cada vez mais, ter um processador top de linha com maior freqüência possível se torna desnecessário, até a própria intel já percebeu isso, criando processadores mais fracos(vide o fracasso do pentium 4) e mais econômicos, creio que o limite de evolução de processamento de "dados" já chegou.

  14. Carlos Morimoto em 13 ago, 2009

    O problema no caso das GPUs é a especialização. Elas são capazes de processar um grande volume de instruções, mas apenas em situações onde você consegue quebrar o trabalho em centenas de blocos simples, que podem ser processados simultaneamente. Se o seu aplicativo é um grande bloco de código monolítico, a GPU acaba sendo utilizada, já que apenas uma ou algumas poucas unidades de processamento poderão ser utilizadas. Em uma analogia simplista, seria como se você tivesse um cluster de 10.000 micros 486. Ele poderia ser muito rápido, ou absurdamente lento, de acordo com o tipo de código que fosse executar.

  15. Wilson em 15 ago, 2009

    Imaginem se uma placa mãe vir com um processador ATOM ou similar e uma GPU que esta neste artigo o computador seria mais barato e de serta forma mais potente que os atuais se todos os softwares estivessem compatibilidade com esse conjunto?

  16. Tiago Luiz Messias em 23 set, 2009

    Isso pode dar uma vida extra a algumas plataformas não tão recentes e processadores como Athlon 64 soquete 939 ou Pentium D…
    Vendo uma placa Tesla da NVIDIA, percebi que ela contém 4 GB de memória, contra 1 GB da GTX 285. Isso me leva a crer que a quantidade de memória RAM na computação paralela (dividindo grandes e pesadas tarefas em pequenos blocos e tudo mais…) faz diferença. Estou certo?

  17. Du em 2 mar, 2010

    Indiretamente quanto mais ram, melhor, mas no caso a Tesla foi pensada pra ser um "co-processador" pois nem saída de vídeo tem (além de custar mil reais a mais geralmente). A vantagem de ter mais ram é a quantidade de informações que você pode alocar na placa para ser processado. Se você tiver 4gb de dados pra mastigar, mas sua placa de vídeo só tiver 1gb, você vai ter que mandar em blocos e pensar muito cuidadosamente para não perder eficiêcia quando for transferir dados entre pc-placa de video (o que é o gargalo da tecnologia em questão).

  1. 7 Trackback(s)

  2. ago 24, 2009: 4°podcast do paineldohardware com o tema tecnologia | Paineldohardware
  3. set 6, 2009: GDH Press: Blog » Placas 3D: Physics e PhysX
  4. set 8, 2009: GDH Press: Blog » DirectX e OpenGL: a guerra das APIs 3D
  5. set 22, 2009: GDH Press: Blog » Placas 3D: Shaders, stream processors, TMUs e ROPs
  6. out 19, 2009: GDH Press: Blog » As diferentes versões do DVI, HDMI, VGA e adaptadores

Comente: