# Unidade de processamento gráfico

GPU (Graphics Processing Unit, ou Unidade de Processamento Gráfico), conhecido também como VPU ou unidade de processamento visual, é um tipo de microprocessador especializado em processar gráficos em computadores pessoais, estações de trabalho ou videogames. GPUs modernas manipulam gráficos computadorizados com eficiência e sua estrutura de processamento paralelo os tornam mais capazes neste tipo de trabalho que CPUs normais. Uma GPU normalmente é utilizada em placas de vídeo (este é chamado de Vídeo Offboard ou Placa de Vídeo Dedicada), mas versões simplificadas são integradas diretamente na placas-mãe o que é chamado de Acelerador Gráfico Integrado ou Placa de Vídeo Onboard.

## Diferença para os aceleradores 3D anteriores

Diferente dos aceleradores gráficos 3D anteriores, uma GPU incorpora as funções de iluminação e transformação de vértices (transform and lighting também conhecido como T&L), que antes eram efetuadas no processador central do computador, mais exatamente em seu co-processador aritmético (FPU, unidade de ponto flutuante). Seus antecessores efetuavam basicamente a aplicação de texturas em superfícies, e ao incorporar outra etapa do processamento de imagens, libera o processador central para outras funções.
O primeiro GPU voltado para o uso doméstico foi o modelo GeForce 256. No entanto, alguns processadores especializados voltados para uso profissional em simuladores e computação gráfica já atendiam aos critérios. As duas maiores empresas que fabricam GPU's são AMD e nVidia, além da estadunidense Intel por meio de suas GPUs integradas em chipsets (com apenas aceleradores de mídia) e GPUs em placas de vídeo dedicadas.

## História
### Anos 80

Em 1983, a Intel disponibilizou o iSBX 275 Video Graphics Controller Multimodule Board para sistemas industriais baseados no padrão Multibus. Foi baseado no 82720 Graphics Display Controller e acelerou o desenho de linhas, arcos, retângulos e caracteres em bitmap. O carregamento de framebuffer via DMA também foi acelerado.
Disponibilizado em 1985, o Commodore Amiga foi o primeiro computador pessoal a usar uma GPU. A GPU tinha suporte a desenho de linhas, preenchimento de áreas, e incluía um tipo de circuito chamado blitter, que acelerava o movimento, manipulação e combinação de múltiplos bitmaps. Também incluso existia um coprocessador de gráficos com seu próprio (e primitivo) set de instruções. Por causa disso e um tempo depois, muitos outros PCs requeriam que uma GPU lidasse com todos os aspectos de desenho.
Em 1987, o sistema de gráficos 8514 da IBM foi disponibilizado como uma das primeiras placas de vídeo para PC, para implementações primitivas em 2D no hardware.

### Anos 90

Em 1991, a S3 Graphics introduziram o S3 86C911, que foi nomeado em homenagem ao Porsche 911, como uma indicação do aumento de desempenho prometido. O 86C911 trouxe também uma leva de limitações. Até 1995, todos os produtores de chips gráficos adicionaram suporte em aceleração 2D aos seus chips. Ao chegar essa época, esses chips de aceleração provaram ser melhores do que os caros coprocessadores de múltiplo-uso, e esses coprocessadores desapareceram do mercado.
Durante os anos 90, a aceleração 2D continuou a evoluir. Conforme capacidades de manufatura aumentava, também aumentava o nível de integração dos chips gráficos. Interfaces de Programação de Aplicativos (APIs) adicionais começaram a chegar para uma variedade de tarefas, como a biblioteca de gráficos do WinG, da Microsoft, para Windows 3.x, e futuramente, sua interface para aceleração de jogos 2D no Windows 95 ou depois, DirectDraw.
Ainda durante os anos 90, gráficos 3D auxiliados pela CPU estavam tornando-se comuns em jogos de computador e videogames, que levaram a uma demanda pública por gráficos 3D acelerados por hardware. Exemplos de gráficos em 3D vendidos em grandes quantidades temos os consoles de quinta geração, tais como Playstation e Nintendo 64. Já no PC, as primeiras tentativas por gráficos 3D com baixo custo foram falhas, sendo elas o S3 ViRGE, ATI Rage, e Matrox Mystique. Esses chips foram basicamente aceleradores 2D da geração passada com algumas características 3D embutidas. Alguns desses eram até compatíveis com as entradas dos velhos, para fácil implantação e custo mínimo. Inicialmente, gráficos 3D somente foram possíveis com placas discretas dedicadas ao aceleramento de funções 3D (e total falta de aceleração 2D), tais como o 3dfx Voodoo. No entanto, conforme a tecnologia de manufatura foi progredindo, vídeo, aceleração 2D e funcionalidade 3D foram todas integradas em apenas um chip. Os chips Verite, da Rendition, foram os primeiros a fazer isso direito.
OpenGL apareceu no começo dos anos 90 como uma profissional em gráficos API, mas sofria de problemas de desempenho, que permitiram que a Glide API se tornasse a força dominante no PC, ao fim dos anos 90. No entanto, esses problemas foram facilmente descartados e a Glide API caiu para segundo lugar. Implementações em software da OpenGL foram comuns durante esse tempo, por mais que a influência da OpenGL eventualmente levou ao suporte de hardware. Com tempo, uma paridade emergiu entre características oferecidas em hardware, e aquelas oferecidas pela OpenGL. DirectX se tornou popular entre os desenvolvedores de games do Windows durante o fim dos anos 90. Ao contrário da OpenGL, a Microsoft insistiu em dar suporte pessoal do hardware. Esse modo tornou o DirectX menos popular, já que muitas GPUs tinham suas próprias características, cujas aplicações já existentes da OpenGL já poderiam se beneficiar, deixando o DirectX uma geração atrás.
Com o passar do tempo, a Microsoft começou a trabalhar mais próxima de desenvolvedores de hardware, e começou a dar mais atenção aos novos DirectX. O Direct3D 5.0 foi a primeira versão a ganhar grande espaço no mercado de jogos, e competiu diretamente com muitos outras bibliotecas gráficas, específicas para certos hardwares, enquanto o OpenGL manteve uma forte sequência. Direct3D 7.0 introduziu suporte para Iluminação e Transformação (Transform & Lighting, T&L) para Direct3D, enquanto a OpenGL já tinha essa capacidade exposta desde sua origem. Aceleradores 3D foram além de serem apenas simples aceleradores. A NVIDIA GeForce 256 (também conhecida como NV10) foi a primeira placa a nível de consumidor com T&L acelerada por hardware, enquanto placas profissionais 3D já tinham essa capacidade. Transformação e iluminação por hardware, ambos características já existentes, vieram ao nível do consumidor no anos 90, e mantiveram o precedente para o pixel e vertex shader, futuramente, cujas unidades eram mais flexíveis e programáveis.

### Anos 2000

Com a OpenGL API e funcionalidade similar no DirectX, GPUs adicionaram sombreamento programável à suas capacidades. Cada pixel poderia ser processado por um programa que poderia incluir texturas de imagem adicionais como entradas, e cada vértice geométrico poderia ser processado por um programa curto antes de ser projetado na tela. NVIDIA foi a primeira a produzir um chip capaz de sombreamento programável, a GeForce 3 (nomeada NV20). Até Outubro de 2002, com a introdução da ATI Radeon 9700 (também conhecida como R300), o primeiro acelerador Direct3D 9.0, shaders de pixels e vertices podem implementar looping, e em geral foram rapidamente virando flexíveis como CPUs, e ordens de magnitude mais rápidas para operações com vetores de imagens.
Conforme o poder de processamento das GPUs vem aumentando, também vem aumentando sua demanda por energia elétrica. GPUs de alto desempenho comumente consomem mais energia que CPUs atuais.
Hoje em dia, GPUs paralelas começaram a fazer progresso com relação a CPU. A plataforma CUDA, da NVIDIA, é o modelo de programação mais adotado para computação em GPU, com OpenCL sendo oferecida como um padrão aberto.

## Funções Computacionais

GPUs modernas usam maior parte dos seus transístores para fazer cálculos relacionados com gráficos 3D. Eles foram inicialmente usados para acelerar o intenso trabalho de mapeamento de texturas e renderização de polígonos, mais tarde adicionando unidades para acelerar cálculos geométricos tais como a rotação e translação de vértices em diferentes sistemas de coordenadas. Recentes desenvolvimentos em GPUs incluem suporte para shaders programáveis, que podem manipular vértices e texturas com muitas das mesmas operações suportadas por CPUs, usando técnicas de interpolação e oversampling para reduzir aliasing. E já que maior parte dessas computações envolvem operações com matrizes e vetores, engenheiros e cientistas têm estudado o uso de GPUs para calculações não-gráficas.
Junto com o hardware 3D, as GPUs de hoje incluem capacidades de aceleração 2D e capacidades de framebuffer (geralmente com um modo de compatibilidade VGA).

### Decodificação de vídeo acelerado por GPU

A maioria das GPUs feitas desde 1995 têm suporte ao espaço de cor YUV e overlays de hardware, importantes para playback digital de vídeos, e várias GPUs feitas desde 2000 também suportam comandos primitivos do MPEG, tais como compensação de moção e iDCT. Esse processo de decodificação acelerada de vídeo, onde porções do processo de decodificação de vídeo e pós-processamento de vídeo são deixadas para o hardware da GPU, é comumente referido como "Decodificação de vídeo acelerado por GPU", "Decodificação de vídeo auxiliada por GPU", entre demais termos.
Placas de vídeo mais recentes podem decodificar vídeos de alta definição na própria placa, tirando a pressão da CPU. Os APIs mais comuns para decodificação de vídeo acelerada por GPU são DxVA para Windows, e VDPAU, VAAPI, XvMC, e XvBA para Linux e sistemas operacionais UNIX. Todos, exceto XvMC são capazes de decodificar vídeos codificados com codecs MPEG-1, MPEG-2, MPEG-4 ASP (MPEG-4 Parte 2), MPEG-4 AVC (H.264 / DivX 6), VC-1, WMV3/WMV9, Xvid / OpenDivX (DivX 4), e DivX 5, enquanto XvMC é apenas capaz de decodificar MPEG-1 e MPEG-2.

## Computação de propósito geral

Recentemente placas de vídeo incorporaram tecnologias para programação de propósito geral, como OpenCL e CUDA, servindo como um co-processador massivamente paralelo para cálculos intensivos, sendo essa técnica conhecida como GPGPU (general propose graphic processing unit). Placas de vídeo modernas incluem um grande número de núcleos de processamento, adequadas para além do processamento gráfico, a computação científica. Um exemplo é o projeto Folding@home, que implementa a capacidade de processamento de dinâmica molecular em GPU conseguindo um aumento de várias vezes no desempenho.

### Capacidade de processamento

GPUs pela sua arquitetura massivamente paralela, possuem uma capacidade de cálculo muito superior a de um processador central, embora tal poder só seja aproveitado em problemas paralelizáveis a nível de dados, como multiplicação de matrizes, por exemplo. Tais processadores se chamam Stream Processors, ou processadores de fluxo numa tradução livre, e GPUs modernas contém até milhares deles. Uma placa de vídeo Radeon HD 8970, por exemplo, possui 2048 processadores de fluxo rodando a 1 GHz, tendo assim uma capacidade máxima teórica de aproximadamente 4 TeraFlops de precisão simples e 1 TeraFlop em precisão dupla.

## Terminologia

Devido a sua natureza técnica e complexidade, diversos termos em inglês são utilizados para descrever as GPUs, entre as principais se encontram:
* Pixel pipeline — Parte de um processador gráfico que transfere informações referentes aos pixels. Quanto maior a sua quantidade, maior a velocidade da placa em processar pixels para exibição na tela.
** Fillrate — Quantidade de pixels texturizados que podem ser gerados e exibidos pelo processador gráfico em um segundo.
* Render output unit (ROP, unidade de saída de renderização) — uma das etapas finais de renderização na qual os pixels e texels na placa são processados no pixel final a ser exibido na tela.
* Shader — Instruções de software usados nos processadores gráficos para renderizar efeitos. Dividem-se em três tipos principais:
** Geometry shader — Combina uma série de vértices em objetos que serão processados pelos pixel shaders.
** Pixel shader — O pixel shader executa rotinas programáveis atuando no nível de pixel assim sendo, depois que a imagem foi completamente modelada pelo sistema (CPU e GPU) e teve seus polígonos “ajustados” pelo vertex shader, o pixel shader entra em ação analisando os materiais dos objetos modelados e as condições de iluminação, e dando um toque final realçando cores onde for necessário, adicionando reflexos onde eles existirem e criando qualquer efeito que o programador quiser com muito mais realismo do que as técnicas mais simples de texturização e iluminação tradicionais.
** Vertex shader — Manipula vértices e consequentemente o formato de objetos. Esses vértices são então enviados para os geometry shaders.
*** Unified shader — Se refere à capacidade de processar os três diferentes tipos de shaders em uma única seção do processador (originalmente cada um dos shaders era processado em uma área especializada).
* Texture mapping unit (TMU, unidade de mapeamento de textura) — Unidade que rotaciona e redimensiona uma imagem bitmap e a aplica em uma superfície ou objeto 3D.
* Transform and lighting (T&L, transformação e iluminação) — Processos nos quais objetos tridimensionais em um espaço virtual são convertidos em coordenadas bidimensionais para exibição em monitores (transformação) e o cálculo de cores resultantes em objetos iluminados na tela (iluminação). Nome dado geralmente à unidade que acelera estes processos em uma unidade de processamento.