Unidade de procesamento gráfico

[miniatura|250px|GPU [GeForce|Ge Force 6600GT (NV43)  de Nvidia.]]
A **unidade de procesamento gráfico** (*Graphics Processing Unit*) ou **GPU**, tamén coñecida como **unidade de procesamento visual** (*Visual Processing Unit*) é un microprocesador (ou acelerador gráfico) para computadores persoais, videoconsolas e outros dispositivos que requiran de gran cantidade de imaxes xeradas por computador.

As GPUs modernas son moi eficientes manipulando e mostrando gráficos por computador, e a súa estrutura de alto paralelismo fainas moito máis efectivas que as típicas CPUs para un amplo rango de algoritmos complexos.

Unha GPU pon en funcionamento un número de operacións gráficas primitivas cunha rapidez maior que unha CPU. As operacións máis comúns para os primeiros gráficos 2D inclúen o copiado rectangular de zonas de memoria (como as xanelas ou os videoxogos), coñecido polo termo inglés de *blitter*, e tamén operacións de recheo de rectángulos, triángulos, círculos, e demais formas xeométricas.

As GPUs modernas soportan gráficos 3D, coma ordenacións dos obxectos, iluminación ou transformacións xeométricas, e tamén capacidades de vídeo dixital.

## Historia
As modernas GPU son descendentes dos chips gráficos monolíticos de finais da década de 1970 e 1980. Estes chips tiñan soporte BitBLT limitado na forma de sprites, e usualmente non soportaban o debuxo de figuras. Algúns GPU podían executar varias operacións nunha lista de "display" e podían usar DMA para reducir a carga no procesador anfitrión. Un exemplo das primeiras GPUs é o coprocesador ANTIC empregado nos ATARI 800 e o ATARI 5200.

Cara a finais dos 80 e comezos dos 90, os microprocesadores de propósito xeral de alta velocidade foron moi populares para pór en funcionamento os GPUs máis avanzados. Moitas tarxetas gráficas para PCs e estacións de traballo empregaban Procesadores Dixitais de Sinais (*DSP* polas súas siglas en inglés), coma por exemplo a serie TMS340 de Texas Instruments, para pór en funcionamento funcións de debuxo rápidas. Tamén moitas impresoras láser contiñan un procesador de varrido de imaxes *PostScript* correndo nun procesador RISC coma o AMD 29000.

Segundo a tecnoloxía de proceso de semicondutores foi mellorando, eventualmente foi posible mover as funcións de debuxo e as BitBLT á mesma placa e posteriormente ao mesmo chip a xeito dun controlador de buffer de marcos (*frames*), coma o VGA. Estes aceleradores gráficos de 2D non eran tan flexibles como os baseados en microprocesadores, pero eran moito máis fáciles de fabricar e vender. A Commodore AMIGA foi a primeira computadora de produción en masa que incluía unha unidade *blitter* e o sistema gráfico IBM 8514 foi unha das primeiras tarxetas de vídeo para PC en pór en funcionamento primitivas 2D en hardware.

## Diferenzas coa CPU 
As GPUs actuais son moi potentes e poden chegar a superar a frecuencia de reloxo dunha CPU antiga (máis de 500MHz). A potencia das GPU e o seu dramático ritmo de desenvolvemento recente débense a dous factores diferentes. O primeiro factor é a alta especialización das GPU, xa que ao estar pensadas para desenvolver unha soa tarefa, é posible dedicar máis silicio no seu deseño para levar a cabo esa tarefa máis eficientemente. Por exemplo, as GPU actuais están optimizadas para cálculo con valores en coma flotante, predominantes nos gráficos 3D.

Doutra banda, moitas aplicacións gráficas requiren un alto grao de paralelismo inherente, ao ser as súas unidades fundamentais de cálculo (vértices e píxeles) completamente independentes. Os modelos actuais de GPU adoitan ter unha media ducia de procesadores de vértices (que executan vertex shaders), e ata dous ou tres veces máis procesadores de fragmentos ou píxeles (que executan fragment shaders). Deste xeito, unha frecuencia de reloxo duns 500-600MHz en comparación co ofrecido por unha CPU de 4&nbsp;GHz tradúcese nunha potencia de cálculo moito maior grazas á súa arquitectura en paralelo.

## Arquitectura
A arquitectura das GPUs atópase moi segmentada, o que indica que posúe gran cantidade de unidades funcionais. Estas unidades funcionais pódense dividir principalmente en dúas: aquelas que procesan vértices e aquelas que procesan píxeles.

Inicialmente á GPU chégalle a información da CPU en forma de vértices. O primeiro tratamento que reciben estes vértices realízase no *vertex shader*. Este realiza transformacións coma a rotación das figuras. Tras isto, defínese a parte destes vértices que se vai a ver (*clipping*), e os vértices transfórmanse en píxeles mediante o proceso de rasterización. Estas etapas non posúen unha carga relevante para a GPU.

No *pixel shader* fanse as transformacións referentes aos píxeles, coma a aplicación de texturas. Ademais antes de almacenar os píxeles na caché, aplícanse algúns efectos coma o *antialiasing*, *blending* e o efecto néboa.

Outras unidades funcionais chamadas ROP toman a información gardada na caché e preparan os píxeles para o seu visualización. Tamén poden encargarse de aplicar algúns efectos. Tras isto, almacénase a saída no *frame buffer*. Dependendo do tipo de representación, pódense tomar directamente estes píxeles para a súa representación nun monitor dixital, ou xerar unha sinal analóxica a partir deles, para monitores analóxicos. Se é este último caso, teñen que pasar por un DAC (*Dixital-Analog Converter*) para ser finalmente amosados na pantalla.

## Programación
Nos comezos a programación da GPU facíase con chamadas a servizos de interrupción da BIOS. Tras isto, a programación da GPU comezou a facerse en linguaxe ensambladora específica a cada modelo. Posteriormente situouse un nivel máis entre o hardware e o software, deseñando as APIs (*Application Program Interfaces*), que proporcionaban unha linguaxe máis homoxénea para os modelos existentes no mercado. A primeira API de uso xeral foi estándar aberto OpenGL (*Open Graphics Language*), tralo que Microsoft desenvolveu o sistema DirectX.

Tralo desenvolvemento de APIs, decidiuse crear unha linguaxe de alto nivel para gráficos. A linguaxe estándar de alto nivel asociada á biblioteca OpenGL é o *OpenGL Shading Language*, GLSL, posta en funcionamento en principio por tódolos fabricantes. A empresa californiana Nvidia creou unha linguaxe propietaria chamada Cg (do inglés, *C for graphics*), con mellores resultados que que GLSL nas probas de eficiencia. En colaboración con Nvidia, Microsoft desenvolveu a súa *High Level Shading Language*, HLSL, practicamente idéntico a Cg, pero con certas incompatibilidades menores.

## Fabricantes de GPUs 
* NVIDIA Corporation
* ATI Technologies
* 3Dlabs
* Matrox
* XGI Technology Inc.
* Intel
* 3dfx (agora parte de NVIDIA)

## Véxase tamén 
### Outros artigos
* Gráficos por computador
* Hardware
* Minería de GPU
* Videoconsola

### Ligazóns externas 
* Tutoriais de programación en Cg