한국   대만   중국   일본 
GPGPU ? Wikipedia, a enciclopedia livre Saltar para o conteudo

GPGPU

Origem: Wikipedia, a enciclopedia livre.

A Unidade de Processamento Grafico de Proposito Geral ou GPGPU ( General Purpose Graphics Processing Unit ) utiliza a GPU ( graphics processing unit ) para alem de renderizacao grafica tais como: processamento de imagem , visao computacional , inteligencia artificial , calculo numerico dentre outras aplicacoes. Ou seja, e a utilizacao da GPU para realizar a computacao em aplicacoes que antes eram tratada pela CPU ( Unidade Central de Processamento ).

Visao Geral e Historico [ editar | editar codigo-fonte ]

A Unidade de Processamento Grafico de Proposito Geral se tornou pratico e popular depois dos anos de 2001, por causa do advento de duas programaveis shaders e ponto flutuante. A partir dali a comunidade de computacao cientifica comecou a fazer testes com o hardware, seu primeiro teste foi com uma multiplicacao de matrizes de rotina, um dos primeiros codigos cientificos simples a correr mais rapido em GPUs era a implementacao da fatoracao LU. [ 1 ]

Para os primeiros esforcos de se utilizar GPUs com processadores de uso geral, foi necessario reformular problemas computacionais em termos graficos, foram apoiados por dois APIs (Interfaces de Programacao de Aplicativos) principais OpenGL e DirectX . Os mais atuais fornecedores independentes de hardware incluem Microsoft DirectCompute e Apple/Grupo Khronos OpenCL.

DirectX [ editar | editar codigo-fonte ]

DirectX e um conjunto de APIs responsavel pela comunicacao entre hardware e software durante a execucao de videos e principalmente games.Algumas das suas versoes sao: DirectX 8 introducao Shader Model 1.1, DirectX 8.1 Pixel Shader Models 1.2, 1.3 e 1.4 e DirectX 9 definindo Shader Model 2.x e 3.0. Cada modelo de shader aumentou as flexibilidades e capacidades do modelo de programacao, garantindo o hardware conforme segue o exemplo. A especificacao DirectX 10 Shader Model 4.0 introduz que unifica a especificacao de programacao para vertice, geometria (Geometry "Shaders" e novo para DirectX 10) e processamento fragmento permitindo um melhor ajuste para hardware de shader unificada, proporcionando assim uma piscina computacional de recurso programavel.

OpenGl [ editar | editar codigo-fonte ]

Ver artigo principal: OpenGL

O OpenGL (Open Graphics Library) e uma API livre utilizada na computacao grafica, para desenvolvimento de aplicativos graficos, ambientes 3D, jogos, entre outros.

O OpenGL e um conjunto de algumas centenas de funcoes, que fornecem acesso a praticamente todos os recursos do hardware de video. Internamente, ele age como uma maquina de estados, que de maneira bem especifica dizem ao OpenGL o que fazer. Usando as funcoes da API, voce pode ligar ou desligar varios aspectos dessa maquina, tais como a cor atual, se transparencia sera usada, se calculos de iluminacao devem ser feitos, se havera ou nao o efeito de neblina, e assim por diante.

O nucleo do OpenGL e conhecido como “rendering pipeline” ou dutos de renderizacao. E importante notar que o OpenGL lida tanto com o desenhos na forma vetorial, definidos por vertices, como com mapas de bits, definidos pixel-a-pixel.

Conceitos de Programacao GPGPU [ editar | editar codigo-fonte ]

As GPU sao processadores com multiplos nucleos, que tem uma capacidade muito maior de processamentos de dados do que a CPU. [ 2 ]

Ela e encarregada do processamentos de multiplos dados, para que isso aconteca, a GPU utiliza-se de um conjunto de stream(grande conjunto ordenado de dados) de maneira paralela. Para que isso seja eficiente o hardware dela e implementado seguindo um pipeline grafico, ou seja, o pipeline foi implementado em varias unidades fazendo que a computacao paralela seja a nivel de dado. Outro aspecto importante e a sua velocidade de acesso a memoria que e muito mais rapidas que a CPU, pois a GPU se importa com o principio da localidade da memoria ao inves da computacao generica. [ 3 ]

Processamento de Fluxo [ editar | editar codigo-fonte ]

GPUs so pode processar vertices e fragmentos independentes, mas pode processar muitos deles em paralelo. Isto e especialmente eficaz quando o programador quer processar muitas vertices ou fragmentos da mesma maneira. Neste sentido, as GPUs sao processadores stream - processadores que podem operar em paralelo, executando um kernel em muitos registros em um fluxo de uma so vez.

A stream e simplesmente um conjunto de registros que requerem computacao similar. Streams fornecer paralelismo de dados. Kernels sao as funcoes que sao aplicadas a cada elemento no corrego. Nos GPUs, vertices e fragmentos sao os elementos em corregos e shaders de vertice e fragmento sao os graos a serem executados neles. Desde os elementos do processo GPUs independentemente nao ha nenhuma maneira de ter shaders ou dados estaticos. Para cada elemento so pode ler a partir da entrada, realizar operacoes sobre ele, e escrever para a saida. E possivel ter varias entradas e varias saidas, mas nunca um pedaco de memoria que e ser lidos e escritos.

Intensidade Aritmetica e definida com o numero de operacoes realizadas por palavra de memoria transferida. E importante para aplicacoes GPGPU ter alta intensidade aritmetica mais a latencia de acesso a memoria limitara aceleracao computacional. [ 4 ]

Aplicacoes GPGPU ideais tem grandes conjuntos de dados, alto paralelismo e dependencia minima entre elementos de dados.

Conceitos de Programacao GPU [ editar | editar codigo-fonte ]

Recursos Computacionais [ editar | editar codigo-fonte ]

Ha uma variedade de recursos computacionais disponiveis na GPU:

  • Processadores programaveis - vertice, primitivos, e dutos de fragmentos permitem programador para realizar kernel em fluxos de dados
  • Rasterizer - cria fragmentos e interpola constantes por vertice, como coordenadas de textura e cor, ou seja, junta o conjunto de vertices para que sejam processadas e recebam o contexto geometrico para que possam se tornar em cores e no que mais for necessario, e para que no final torne-se elementos de um pixel. [ 5 ]
  • Unidade de textura ? os fragmentos sao processados pelo mesmo programa, sao escritos na memoria de acordo com a localizacao do fragmento no framebuffer.
  • Framebuffer ? e quando as informacoes ja prontas sao enviadas para memoria de video e depois quando o conteudo ja estiver concluido e enviada para a tela do computador.

Texturas como fluxo [ editar | editar codigo-fonte ]

A forma mais comum para um fluxo de tomar em GPGPU e uma grade 2D porque este se encaixa naturalmente com o modelo de prestacao construido em GPUs. Muitos calculos mapear naturalmente em grades: algebra matricial, processamento de imagem, a simulacao de base fisica, e assim por diante.

Desde texturas sao usados ??como memoria, pesquisas de textura sao utilizados como memoria le. Algumas operacoes podem ser feitas automaticamente pelo GPU por causa disso.

Kernels [ editar | editar codigo-fonte ]

Kernels pode ser pensado como o corpo de loops. Por exemplo, um programador de operar em um grid sobre a CPU e pode ter um codigo que se parece com isso:

// Entrada e saida de grids tem  10000 x 10000 ou 100 milhoes de elementos.


void
 transform_10k_by_10k_grid
(
float
 in
[
10000
][
10000
],
 float
 out
[
10000
][
10000
])

{

    for
 (
int
 x
 =
 0
;
 x
 <
 10000
;
 x
++
)
 {

        for
 (
int
 y
 =
 0
;
 y
 <
 10000
;
 y
++
)
 {

            // A proxima linha vai executar 100 milhoes de vezes

            out
[
x
][
y
]
 =
 do_some_hard_work
(
in
[
x
][
y
]);

        }

    }

}

Controle de Fluxo [ editar | editar codigo-fonte ]

Nas linguagens atuais o controle de fluxo e feito por if-then-else, for e while. Tais estruturas de controle de fluxo foram recentemente adicionadas ao GPUs. Como as CPU tem comando muito longos e necessario que elas sejam bem estruturadas e controladas, ja que a cada falha na previsao de uma ocorrencia, ira ocorrer uma penalidade. De maneira parecida a GPU da NVIDIA GeForce 6 funciona. [ 6 ]

Atualmente as arquiteturas paralelas possuem alguns tipos de controle de fluxo, como instrucoes unicas ,dados multiplos (SIMD) e instrucoes multiplas e dados multiplos(MIMD). Para que uma GPU possa implementar uma ramificacao e necessario tres SIMD ramificacao, MIMD ramificacao e codigos de condicao.

Mas as ramificacoes tem um custo, ou seja, elas diminuem a performance das GPUs. Para que elas possam fazer as ramificacoes internas sem o suporte do hardware e necessario se utilizar de tecnicas como Static Branch Resolution, Pre-computation, Z-Cull, Data-Dependent Looping With Occlusion Queries. [ 7 ]

Metodos GPU [ editar | editar codigo-fonte ]

Mapa [ editar | editar codigo-fonte ]

A operacao mapa simplesmente aplica a funcao dada (o kernel) para cada elemento na stream. Um exemplo simples e multiplicar cada valor na stream por uma constante (aumentando o brilho de uma imagem). A operacao de mapa e simples de implementar na GPU. O programador gera um fragmento para cada pixel na tela e aplica-se um fragmento de programa para cada um. O resultado da stream que e do mesmo tamanho e armazenado no buffer de saida.

Reduzir [ editar | editar codigo-fonte ]

Alguns calculos requerem o calculo de uma stream menor (possivelmente uma stream de apenas um elemento) a partir de uma stream maior. Isto e chamado uma reducao do fluxo. Geralmente uma reducao pode ser realizada em varios passos. Os resultados da etapa anterior sao usados ??como a entrada para a etapa atual e o intervalo no qual a operacao e aplicada e reduzida ate que apenas um elemento da stream continua.

Filtragem de Fluxo [ editar | editar codigo-fonte ]

Filtragem de fluxo e essencialmente uma reducao nao uniforme. Filtragem envolve a remocao de itens do fluxo com base em alguns criterios.

Varredura [ editar | editar codigo-fonte ]

Consiste basicamente em um algoritmo que irra fazer uma varredura para detectar colisoes, ou em outros casos na retirada de dados que nao sao importantes. [ 7 ]

Scatter and Gather [ editar | editar codigo-fonte ]

No acesso a memoria de GPU existe duas operacoes de grande importancia elas sao a operacao de escrita e leitura quando acessao de forma indireta a memoria, elas sao denominadas como scatter e gather respectivamente.

A operacao gather ira ler valores contidos em um lugar qualquer na memoria, para isso ela ira fazer acesso as texturas contidas na GPU. [ 3 ]

Ja a operacao de scatter ira escrever um valor em qualquer posicao da memoria. Sendo assim ela e mais complicada, ou seja, ela nao pode ser utilizada em um programa de fragmentos, porque em cada fragmento tem implicito o endereco de onde ele veio, e para onde ele deve retornar atraves do mapeamento em framebuffer. Para que isso nao ocorra e utilizado o programa de vertices, em que uma operacao de scatter e feita por vertice.

Classificacao [ editar | editar codigo-fonte ]

A operacao de classificacao transforma um conjunto nao ordenado de elementos em um conjunto ordenado de elementos. A aplicacao mais comum em GPUs esta sendo usado redes de classificacao. [ 7 ]

A classificacao de rede vai ter um numero fixo de etapas nas quais os dados nao vao ter relacao, elas tambem terao um padrao de comunicacao que sera o de gather ao em vez scatter.

Pesquisa [ editar | editar codigo-fonte ]

A operacao de busca permite que o programador para encontrar um determinado elemento dentro do fluxo, ou, eventualmente, encontrar vizinhos de um elemento especificado, nesse caso e utilizado bastante em pesquisa a banco de dados. A GPU nao e usada para acelerar a busca por um elemento individual, mas em vez disso e usada para executar varias pesquisas em paralelo. Dois exemplos de pesquisa sao:

  • Pesquisa Binaria:E a forma de pesquisa mais simples, consiste em pegar o elemento que se deseja encontrar e comparar com o elemento central que contem na lista, conforme for o resultado ele ira para direita ou esquerda ate encontrar o elemento ou determinar que o elemento nao existe.
  • Vizinho mais proximo:Nesta pesquisa sera procurado os vizinhos mais proximos de um elemento, para isso usa-se o metodo de pesquisa em arvore, onde os vizinhos serao armazenados em uma fila de acordo com a sua distancia.

As Estruturas de Dados [ editar | editar codigo-fonte ]

Uma variedade de estruturas de dados podem ser representados na GPU:

  • Densas matrizes
  • Matrizes esparsas - estaticos ou dinamicos
  • Estruturas adaptativas ( tipo de uniao )

Linguagens que se beneficiam de GPGPU [ editar | editar codigo-fonte ]

  • CUDA ( Compute Unified Device Architecture ) criada pela NVIDIA para programacao GPGPU.
  • FireStream Linguagem da AMD para GPGPU.
  • OpenCL ( Open Compute Language ) Linguagem de programacao livre que tambem utiliza GPGPU.
  • DirectCompute API criada pela Microsoft para GPGPU.
  • C++ AMP API da Microsoft para facilitar a programacao GPGPU em C++ . Necessita de placa de video que suporte directcompute . [ 8 ]

Principais Linguagens de Programacao GPU [ editar | editar codigo-fonte ]

Na programacao GPU existem diversas linguagens, mas somente duas tem maior enfase, sao elas CUDA e OpenCL. Ambas fornecem paralelismo de dados, e tambem uma linguagem de baixo nivel para fazer a comunicacao com o hardware. Apesar da CUDA ter maior desempenho, a OpenCL vem sendo olhada com maior interesse por se tratar de uma linguagem de programacao aberta. [ 9 ]

OpenCl [ editar | editar codigo-fonte ]

Ver artigo principal: OpenCL

OpenCL ( Open Computing Language ) e uma plataforma para escrever programas que funcionam em plataformas heterogeneas, consistindo em CPUs, GPUs, processadores de sinal digital ( DSPs ), field-programmable gate arrays (FPGAs) e outros processadores. OpenCL inclui uma linguagem (baseada em C99) para escrever kernels (funcoes executadas em dispositivos OpenCL), alem de APIs que sao usadas para definir e depois controlar as plataformas heterogenea. OpenCL permite programacao paralela usando, tanto o paralelismo de tarefas, como de dados. Ela e um padrao aberto mantido pela organizacao sem fins lucrativos tecnologia consorcio Khronos Group.

A proposta OpenCL e similar as propostas OpenGL e OpenAL, que sao padroes abertos da industria para graficos 3D e audio, respectivamente. Ela possui alguns versoes a mais recente e OpenCl 2.0.

Algumas empresas que implementam sao IBM Corporation, NVIDIA, Intel, Aplle Inc dentre outras.

CUDA [ editar | editar codigo-fonte ]

CUDA ( Compute Unified Device Architecture ) e uma plataforma de computacao paralela de proposito geral que tira proveito das unidades de processamento grafico (GPUs) NVIDIA para resolver muitos problemas computacionais complexos em uma fracao do tempo necessario em uma CPU. Ela inclui a arquitetura de conjunto de instrucoes CUDA ISA (Instruction Set Architecture) e o mecanismo de computacao paralela na GPU.

Para programar segundo a arquitetura CUDA™, os desenvolvedores hoje em dia podem usar C - uma das mais amplamente utilizadas linguagens de programacao capaz de operacoes de baixo nivel, que pode ser entao executada com alta performance em um processador compativel com CUDA™.

Atualmente cientistas e desenvolvedores estao aplicando a GPU CUDA em controle de trafego aereo e em simulacoes da corrente sanguinea, para encontrar placas ocultas em arterias. [ 10 ]

Areas que utilizam GPGPU [ editar | editar codigo-fonte ]

  • Clusters de computadores ou uma variacao de uma computacao paralela (utilizando tecnologia cluster GPU ) para tarefas de grande intensidade de calculo:
    • Clusters de computacao de alto desempenho (clusters HPC) (muitas vezes chamados supercomputadores )
      • Incluindo tecnologias de cluster, como Message Passing Interface , e imagem de sistema unico (SSI), computacao distribuida , e Beowulf
    • Computacao em grid (uma forma de computacao distribuida) ( networking muitos computadores heterogeneos para criar uma arquitetura de computador virtual)
    • Clusters de balanceamento de carga (as vezes chamado de farm de servidores )
  • Segmentacao - 2D e 3D
  • Processamento de imagem digital
  • A iluminacao global - o tracado de raios , mapeamento de fotons , radiosity entre outros, espalhamento de subsuperficie
  • Computacao geometrica - geometria solida construtiva , campos de distancia, deteccao de colisao , a transparencia computacao, geracao de sombra
  • Computacao cientifica
    • Simulacao de Monte Carlo de propagacao da luz
    • A previsao do tempo
    • Pesquisa de clima
    • A modelagem molecular na GPU
    • Mecanica quantica fisica
    • Astrofisica [ 11 ]
  • As redes neurais

Referencias

  1. Peng Du, Rick Weber,Piotr Luszczek, Stanimire Tomov, Gregory Peterson, Jack Dongarra (2012) From CUDA to OpenCL: Towards a performance-portable solution for multi-platform GPU programming - Parallel Computing Volume 38, Issue 8, August 2012, Pages 391?407 - http://www.sciencedirect.com/science/article/pii/S0167819111001335
  2. [1]
  3. a b GPU ? Graphics Processor Units David Reis, Ivan Conti, Jeronimo Venetillo- http://www.verlab.dcc.ufmg.br/_media/cursos/arquitetura/2007-1/grupo3/seminario_grupo3.pdf
  4. Asanovic, K., Bodik, R., Demmel, J. , Keaveny, T., Keutzer, K., Kubiatowicz, J., Morgan, N., Patterson, D., Sen, K., Wawrzynek, J., Wessel, D., Yelick, K .: A visao da paisagem de computacao paralela. Commun. ACM 52 (10) (2009) 56-67
  5. Emerson Alecrim - Placa de video e GPU: principais caracteristicas -. http://www.infowester.com/placavideo.php
  6. ≪Copia arquivada≫ . Consultado em 9 de novembro de 2014 . Arquivado do original em 26 de abril de 2009  
  7. a b c GPGPU survey paper : John D. Owens, David Luebke, Naga Govindaraju, Mark Harris, Jens Kruger, Aaron E. Lefohn, and Tim Purcell. "A Survey of General-Purpose Computation on Graphics Hardware". Computer Graphics Forum, volume 26, number 1, 2007, pp. 80?113.
  8. ≪GPGPU desenvolvimento de jogos≫ . 29 de julho de 2012  
  9. Michael Feldman - OpenCL Gains Ground On CUDA - February 28, 2012 - http://www.hpcwire.com/2012/02/28/opencl_gains_ground_on_cuda/
  10. [2]
  11. [3]

Ligacoes externas [ editar | editar codigo-fonte ]