• Drano Rauteon

GPU: Como funciona? - parte 3

Para entendermos melhor o funcionamento das GPU's, precisamos voltar lá no começo, quando as principais fabricantes de chip's gráficos, ATi (atual AMD) e nVidia, estavam engatinhando. Desta forma, farei um resumo de tudo o que aconteceu até aqui, além de dar início a explicação do funcionamento dos chip's gráficos.

Como explicamos no Capítulo 2, as CPU's praticam o processamento de dados em série, dividindo o processamento de informações em estágios. As GPU's começaram desta mesma forma. O melhor exemplo que podemos dar é a arquitetura ATi Wonder (1986 ~ 1992), onde havia apenas um núcleo de processamento (semelhante ao que era o Pixel Shader) e uma unidade de operações raster (ROP).

Depois, com a criação do Vertex Shader, vieram blocos de hardware aprimorados, que serão explicados mais adiante.

As unidades de mapeamento de texturas (TMU) também chegaram, fazendo um grande par com as unidades ROP. Com a evolução, os blocos de memória cache foram aumentando, assim como nas CPU's, a quantidade de pixel pipelines também se multiplicaram.

Na segunda metade da década de 2000, os Vertex Shaders e Pixel Shaders passaram a ser unificados, podendo processar também o Geometry Shader. Com centenas e centenas de núcleos de processamento operando em paralelo e podendo processar variados tipos de dados, viu-se a possibilidade de utilizar a GPU para os mesmos fins da CPU. E aí surgem as GPGPU (Unidade de Processamento Gráfico de Propósito Geral).

Agora vamos descobrir quais foram os primeiros chip's a portar as tecnologias que mencionamos até aqui.

Funcionalidades gráficas


Os primeiros chip's gráficos da ATi a suportar DirectX foram:

-> Chip Mash64 GT (lançado em 01/04/1996);

-> Chip Mash64 GT-B (01/09/1996);

-> Chip Mash64 LT (01/11/1997).


Todos os modelos listados acima são da arquitetura Mash (1992 ~ 1997) e suportaram o DirectX 5.0, lançado em 1997. Ambos os modelos tinham apenas uma unidade de processamento de Pixels, uma unidade ROP e uma TMU.


Por parte da nVidia, os primeiros a suportarem DirectX foram:

-> Chip NV4 (23/03/1998) - DirectX 5.0;

-> Chip NV5 B5 (15/03/1999) - DirectX 6.0;

-> Chip NV5 B6 (22/03/1999) - DirectX 6.0.


Todos os modelos listados são da arquitetura Fahrenheit (1998 ~ 2000). A Riva TNT (chip NV4) suporta o DirectX 5.0 e os demais chips desta arquitetura suportam o DirectX 6.0, lançado em Agosto de 1998. Veja abaixo, uma imagem da placa de vídeo Riva TNT:

Imagem 1 - nVidia Riva TNT, com o chip NV4, 16 MB de memória RAM SDR em um barramento de 128 bits. Já vinha com suporte ao barramento AGP 2x.


Quanto ao OpenGL, os primeiros chip's da nVidia a suportarem esta API foram aqueles com a arquitetura Fahrenheit. A versão 1.2 do OpenGL foi a utilizada pelos chips NV4, NV5 B5 e B6.

No lado da ATi, os primeiros chip's a suportarem OpenGL foram os da arquitetura Rage 3 (1997 ~ 1999):

-> Chip Rage 3 (01/03/1997): OpenGL 1.1;

-> Chip Rage 3 Turbo (01/03/1997): OpenGL 1.1.


Quanto á computação paralela, o OpenCL, CUDA Cores e DirectCompute tiveram início na arquitetura Tesla (2006 ~ 2010), da nVidia, com o lançamento do chip G80 em 8 de Novembro de 2006.

No lado da Ati / AMD, tivemos o início no chip R520, lançado em primeiro de Outubro de 2005, pertencente a arquitetura R500 (2005 ~ 2007), apesar dele ainda não ter Shaders unificados, apenas unidades ROP desenvolvidas para propósito geral.

Com a chegada do ATi R520, foi implementado o Brook+, uma linguagem de programação baseada em C, feito pra tornar o processamento de software uma tarefa executada não só prela CPU, tornando a GPU multi-uso, não servindo apenas para processamento 3D. Apesar de estar na frente da nVidia, a tecnologia não vingou tão bem e quem se destacou com o inicio das GPGPU's foi a arquitetura Tesla, cerca de um ano depois.

A Ati / AMD passou a dar suporte ao OpenCL versão 1.1 e a computação paralela a partir do chip RV730, lançado em 17 de Julho de 2007, sendo parte da arquitetura TeraScale.

Para saber mais sobre as funcionalidades gráficas das placas de vídeo, leia o Capítulo 2 desta série.


Pixel Shader

Outra coisa que precisamos saber é que, no principio as GPU's não tinham nem Shaders separados, quem dirá unificados. Eram núcleos de processamento de Pixels com uma ou algumas unidades ROP. Se analisarmos todos estes chips da nVidia e Ati, veremos que eles possuíam apenas uma ou algumas unidades de processamento primitivas ao estilo "Pixel Shader". Não era exatamente uma Pixel Shader, mas era o inicio dos sombreadores.

De maneira sucinta, a imagem final era gerada por um ou alguns núcleos que faziam o quadro e a aplicação de algoritmos de filtros de luz, cor, textura, cálculo de perspectiva (que utilizavam as ROP's, por exemplo) ou, em placas de vídeo muito antigas, outros chip's auxiliares (ao estilo de co-processadores), auxiliavam na geração da imagem. Veja abaixo, a imagem de uma ATi Graphics Solution Card (Microarquitetura Wonder - 1986 ~ 1992), com o chip CW16800-A:

Imagem 2 - O layout da placa "Graphics Solution Rev 3" foi feito em 1985, porém o chip foi fabricado na trigésima nona semana de 1986 (vide inscrição 8639 do chip). Esta placa tinha 64 kB de memória DRAM em um barramento de 32 bits, permitindo uma taxa de transferência de 20 MB/s.


Não havia de fato núcleos de executavam conjunto de instruções sombreadoras nem unidades dedicadas a texturas, portanto, as GPU's vinham com uma quantidade limitada de efeitos pré-programados que poderiam ser utilizadas por todos os jogos e softwares, o que deixava a desejar no realismo e qualidade das cenas. Tudo isso mudou com a chegada do DirectX e dos Shaders.


O conjunto de instruções denominado "Pixel Shader 1.1" só passou a ser suportado no chip nVidia NV17 A3, da arquitetura Celsius (1999 ~ 2005), lançado em Fevereiro de 2002. Este chip não possuía nenhuma unidade Vertex Shader.

No lado da ATi, temos o chip R100, lançado em primeiro de Abril de 2000, pertencente a arquitetura Rage 6 (2000 ~ 2007). Este chip suportava o Vertex Shader 1.0 e o Pixel Shader 1.4.

O R100 possuía 1 unidade Vertex Shader e 2 unidades Pixel Shader.


Vertex Shader

A nVidia implementou uma unidade Vertex Shader a partir do chip NV20 A5, lançado em 27 de Fevereiro de 2001, pertencente a arquitetura Kelvin (2001 ~ 2003). A ATi implementou uma unidade Vertex Shader a partir do chip RC1000, lançado em primeiro de Junho de 2000, pertencente a arquitetura IBM (1999 ~ 2001).


ROP's e TMU's

No princípio, as GPU's tinham apenas uma unidade Raster (ROP) e não existia a unidade TMU (pra processamento de texturas).

Na Ati, os chip's passaram a ter uma unidade TMU a partir da arquitetura Mash (1992 ~ 1997), especificamente a partir do chip Mash64 GT.

Já a nVidia lançou a Riva TNT, arquitetura Fahrenheit (1998 ~ 2000), com o chip NV4 tendo duas unidades ROP e duas unidades TMU.

Depois deste passo por parte da Ati e nVidia, todos os chip's passaram a ter uma ou mais unidades TMU.


Enfim, no último tópico deste artigo veremos mais alguns detalhes deste processo de transição que ocorreu na segunda metade dos anos 1990, juntamente dos chip's fabricados até a segunda metade dos anos 2000, quando os Shaders Unificados entraram no mercado.


Na sequência, veremos um pouco sobre os estágios de criação de imagem em 3D, que servirá de base para entender o funcionamento dos chip's gráficos.

Primeiramente, precisamos entender um termo conhecido como "pipeline de gráficos", para saber os vários estágios de geração de um cenário de jogo, por exemplo.

Diagrama 1


-> Em primeiro lugar, temos o estágio denominada "Aplicação". Esta etapa consiste na execução do software, feito pela CPU. Este software é programado em linguagem de alto nível, tipo C e Python, em aplicativos do tipo Unity ou Blender. Esta etapa também envolve a recepção de sinais de periféricos (mouse e teclado, por exemplo)

É na fase de Aplicação que são executadas tarefas de detecção de colisão e animação, Morphing e técnicas de aceleração utilizando regimes de subdivisão espaciais, tais como Quadtrees ou Octrees. Otimizações de software devem ser utilizadas nessa etapa, pois o "mundo virtual" de um jogo de computador moderno não cabe completamente na memória RAM.


O novo quadro, um conjunto com milhares de bits representando 'primitivas', podendo ser triângulos, círculos, linhas e pontos, vai para o segundo estágio.


CURIOSIDADE: Primitivas gráficas são elementos básicos dos gráficos / desenhos a partir dos quais são construídos outros objetos mais complexos. Também são os comandos e funções que manipulam e alteram os elementos gráficos de uma imagem.

A modelagem de objetos por meio de primitivas se dá por instanciação. Por exemplo: uma linha é uma sequência de pontos e uma polilinha é uma sequência de linhas. Uma circunferência pode ser vista como um conjunto de polilinhas fechada, formando um circulo, em que sua "resolução" se dá pela quantidade de linhas.

Para entender melhor, abra o PDF abaixo e estude sobre o Sistema de Coordenadas Gráficas, com um exemplo prático incluindo primitivas gráficas e um conceito de Domínio (Window) e ViewPort.

Sistemas_de_Coordenadas_Gráficas_e_View
.
Download • 1.15MB

CURIOSIDADE: Um vértice é um ponto em que duas ou mais curvas, retas ou arestas se encontram, formando um ângulo. Todas as formas geométricas fechadas (triângulo, quadrado, retângulo, decágono, pentágono, heptágono e etc.) são considerados polígonos, e os polígonos formam todos os objetos do cenário 3D. Os cantos dos polígonos são as vértices.


-> Em segundo lugar, temos o estágio denominado "Geometria". Esta parte consiste em pegar as primitivas gráficas geradas no primeiro estágio e fazer operações matemáticas complexas com os polígonos e seus vértices, afim de montar a imagem "crua" (todos os polígonos que formam o quadro), fazer o cálculo de iluminação e aplicar recortes (tipo Clipping, Backface Cull, Perspective Divide e ViewPort Transformation) para que então ela seja processada na etapa de rasterização. Neste momento, já temos todos os objetos do cenário criados a partir de polígonos. Dentro deste estágio, temos 5 etapas a serem seguidas, que podem ser vistos no diagrama de blocos abaixo:

Diagrama 2


Para saber mais sobre as 5 etapas dentro do estágio de Geometria, abra o PDF abaixo, pois vai ser de extrema importância para entender mais sobre os diagramas de blocos de alguns chip's gráficos detalhados na sequência desta explicação.

Pipeline_de_Gráficos_-_Etapa_de_Geometr
.
Download • 812KB

No estágio de Geometria, é onde os conjuntos de instruções de Vertex e Geometry Shader são utilizados.

É válido lembrar que, os dados, daqui pra frente são denominados 'fragmentos', isto é, são Pixels, porém não estão prontos para serem exibidos, pois precisam passar pelo estágio de rasterização.


-> Por último, temos estágio de "Rasterização". Este passo consiste em pegar a imagem vetorial (os objetos do cenário feitos de polígonos) e fragmentá-los, para que seja aplicado filtros de luz, cores e texturas, além de aplicar a ilusão de profundidade através do Z-Buffer. Também é nesta etapa em que são aplicadas as técnicas de Anti-Aliasing.

A cor de um fragmento depende da iluminação, textura e outras propriedades do material do 'primitivo' visível e é frequentemente interpolada usando as propriedades do vértice do triângulo. Na etapa de rasterização é que as instruções Pixel Shader são utilizadas.


OBSERVAÇÃO: Um triângulo é o primitivo geométrico mais comum da computação gráfica. É definido por seus três vértices (pontos) e um vetor normal (o vetor normal serve para indicar a face frontal do triângulo e é um vetor perpendicular à superfície). O triângulo pode ser fornecido com uma cor ou com uma textura. Os triângulos sempre existem em um único plano, portanto, eles são preferidos aos retângulos.

Até a arquitetura nVidia Curie e a arquitetura ATi R500 (arquitetura TeraScale e superiores já tinham Shaders unificados) utilizava-se de um esquema de processamento de imagem dividido por estágios, denominado Pixel Pipeline.

De início, temos o bloco de hardware com o controlador PCI, AGP ou PCI Express. Os controladores de memória RAM e um barramento de conexão deles com um bloco de memória cache de Texturas e cache de Geometria.

As primitivas gráficas são transferidas da CPU para a GPU para então serem processados. É aí que todo o processo de Geometria e Rasterização, descritos no tópico "Pipeline de Gráficos", começa.


-> O inicio do processo se dá pelo bloco de processadores de Vertex Shader, que pegam as primitivas gráficas criadas na CPU e montam um cenário com todos os objetos formados a partir destes primitivos, fazem os cálculos referentes a iluminação e as etapas de Clip, ViewPort e afins (estudadas no tópico "Pipeline Gráfica" deste artigo);


-> Após o processo de sombreamento de vértices, temos o início da rasterização (onde o cenário "cru", a imagem vetorial, montada pelos Vertex Shaders é transformado em fragmentos), sendo ela ligada à um bloco de hardware denominado "interpolador" (ou Z-cull, nos chips nVidia) e este bloco com conexão direta ao Z-Buffer, que estava junto das unidades ROP (saída de rasterização).

O bloco de hardware de rasterização também é ligado ao sombreador de fragmentos, isto é, as unidades de processamento de Pixel Shaders, que também estão acopladas nas unidades TMU;

As unidades de Pixel Shader eram o 'coração' da placa de vídeo. Elas também tinham um bloco de memória cache ligado aos controladores de memória RAM.


É Neste ponto que temos o Pixel Pipeline. Mas o que significa isso?

Pipeline, em tradução literal seria um "caminho", uma "canalização". Como foi dito anteriormente, o bloco de rasterização fragmenta a imagem vetorial para que ela seja direcionada aos Pixel Shaders. Cada fragmento é "canalizado" para um Pixel Shader. Dentro de cada Pixel Shader o fragmento passa por várias etapas de processamento (que você verá melhor nos diagramas, no Capítulo 4).


-> Por último, as unidades de saída de rasterização (ROP's), responsáveis por aplicar os filtros AA e aplicar profundidade na imagem. As unidades ROP possuem o Z-Buffer e em alguns projetos o RGB-Buffer, para armazenar informações de cores, trabalhando em conjunto com o Buffer de coordenadas "Z".


Ao final, as interfaces de vídeo, que podem ser analógicas, implementadas por um RAMDAC (VGA, S-Vídeo e etc.), ou digitais, do tipo HDMI, DVI-D, FPD-Link e DisplayPort.


Você verá muito mais detalhes sobre o assunto no Capítulo 4, dedicado a explicar o diagrama de blocos de alguns chips nVidia e ATi / AMD que trabalham com as diretrizes do Pixel pipeline.


OBSERVAÇÃO: Alguns autores de sites conhecidos chamam os processadores Pixel Shader de "Pixel Pipeline". Não está tão errado, porém é bom distinguir um termo do outro: A imagem vetorial é fragmentada no início da rasterização e os fragmentos são canalizados para cada processador Pixel Shader.

Neste tópico vamos mostrar um pouco do hardware que havia no mercado antes da criação do conjunto de instruções Pixel Shader e Vertex Shader (incluída no DirectX 8.0 em Novembro de 2000). Na época existiam apenas processadores que faziam a etapa de rasterização da imagem, isto é, a colorização dos pixels. Nesta etapa também era aplicados efeitos pré-programados na imagem, mas que foram substituídos pelas rotinas da API OpenGL, que foi suportada a partir das arquiteturas ATi Rage 3 (1997 até 1999) e nVidia Fahrenheit (1998 até 2000).


CURIOSIDADE: É interessante que, desde o princípio existiam chip's com unidades de saída de rasterização (as unidades ROP). Obviamente elas evoluíram muito com o passar das décadas, e vários efeitos e técnicas de melhoramento de imagem passaram a ser executadas por este bloco de hardware.


Daí pra diante tivemos um período de transição, em que alguns chip's suportavam instruções Pixel / Vertex Shader, porém tinham apenas processador de sombreamento de Pixel, sendo que a parte de Geometria tinha que ser toda calculada pela CPU.

Até que chegamos nas placas que tinham unidades de sombreamento de Pixel e Vértice.


Arquiteturas nVidia


Antes da chegada das instruções Pixel Shader e Vertex Shader, as placas de vídeo da nVidia possuíam apenas um primitivo processador ao estilo do Pixel Shader, então as etapas da Pipeline de Gráficos (estudada no Capítulo 3) eram executadas da seguinte maneira:

-> Aplicação: Feita pela CPU;

-> Geometria: Feita pela CPU;

-> Rasterização: Feita pela GPU.


Como você pode ver, a GPU ficava apenas com a última etapa da geração de imagem, o que deixava a CPU sobrecarregada.

A lista de chip's nVidia que trabalhavam desta maneira é descrita abaixo:

1. Arquitetura Fahrenheit (1998 ~ 2000):

-> Chip NV4, NV5 B5 e NV5 B6.


2. Arquitetura Celsius (1999 ~ 2005):

-> Chip Crush 11 e Crush 17;

-> Chip NV10 A3, NV11 A2, NV11 B2, NV11 B3, NV15 A4, NV15 A5.

Os chip's seguintes já suportam as instruções Pixel Shader e Vertex Shader (lançados no DirectX 8.0), porém ainda não possuem unidades de processamento Vertex Shader, fazendo com que a etapa de Geometria ainda tenha que ser feita pela CPU. Os chip's nVidia abaixo ainda funcionam assim.

1. Arquitetura Celsius (1999 ~ 2005):

-> Chip NV17 A3, NV17 A4, NV17 A5, NV18 A2, NV18 A4, NV18 C1 e NV19.


A partir da arquitetura Kelvin, a GPU passou a ter unidades de processamento Vertex Shaders, fazendo com que apenas a etapa de Aplicação fosse feita pela CPU, deixando-a menos sobrecarregada.

No lado da nVidia, as arquiteturas que possuem unidades Pixel Shader e unidades Vertex Shader são:

-> Kelvin (2001 ~ 2003): Chip's NV20, NV25, NV28 e NV2A;

-> Rankine (2003 ~ 2005): Chip's NV30, NV31, NV34, NV35, NV36, NV37, NV38, NV39;

--> Curie (2003 ~ 2013): Chip's NV40, NV41, NV42, NV43, NV44, NV45, NV48, G70, G71, G72, G73, C51, C61, C67, C68 e C73.


Arquiteturas ATi / AMD


Antes da chegada das instruções Pixel Shader e Vertex Shader, as placas de vídeo da ATi possuíam apenas um primitivo processador ao estilo do Pixel Shader, então as etapas da Pipeline de Gráficos (estudadas neste Capítulo) eram executadas da seguinte maneira:

-> Aplicação: Feita pela CPU;

-> Geometria: Feita pela CPU;

-> Rasterização: Feita pela GPU.


Como você pode ver, a GPU ficava apenas com a última etapa da geração de imagem, o que deixava a CPU sobrecarregada.

A lista de chip's ATi que trabalhavam desta maneira é descrita abaixo:

1. Arquitetura Wonder (1986 ~ 1992):

-> Chip's 16899-0, 18800-1, 28800-5, 28800-6;

-> Chip's ATI CHIPS P82C435, ATI CHIPS P82C441;

-> Chip's ATI CW16800-A, ATI CW16800-B.


2. Arquitetura Mash (1992 ~ 1997):

-> Chip's Mash 8, Mach32 e Mach64;

-> Chip's Mach64 GT, Mach64 GT-B e Mach64 LT.


3. Arquitetura Rage 2 (1996 ~ 1996):

-> Chip Rage 2.


4. Arquitetura Rage 3 (1997 ~ 1999):

-> Chip's Rage 3 e Rage 3 Turbo.


5. Arquitetura Rage 4 (1998 ~ 1999):

-> Chip's M1, M3 e M4;

-> Chip's Rage 4, Rage 4 PRO e Rage Mobility.


6. Arquitetura IBM (1999 ~ 2001):

-> Chip IBM.


7. Arquitetura Rage 6 (2000 ~ 2007):

-> Chip M6.


Os chip's seguintes já suportam as instruções Pixel Shader e Vertex Shader (lançados no DirectX 8.0), porém ainda não possuem unidades de processamento Vertex Shader, fazendo com que a etapa de Geometria ainda tenha que ser feita pela CPU. Os chip's ATi mostrados abaixo funcionam assim.

1. Arquitetura Rage 6 (2000 ~ 2007):

-> Chip RV100.


A partir da arquitetura Rage 6, a GPU passou a ter unidades de processamento Vertex Shaders, fazendo com que apenas a etapa de Aplicação fosse feita pela CPU, deixando-a menos sobrecarregada.

No lado da ATi, as arquiteturas que possuem unidades Pixel Shader e unidades Vertex Shader são:

1. Arquitetura Rage 6 (2000 ~ 2007):

-> Chip's R100, Rage 6, RS200 e RS250.


2. Arquitetura Rage 7 (2001 ~ 2006):

-> Chip's M7, M9 e M9+;

-> Chip's R200, R250, RC300, RS100, RS300 e RS350;

-> Chip's ATI RV200, RV250 e RV280.


3. Arquitetura Rage 8 (2202 ~ 2007):

-> Chip M10;

-> Chip's R300, R350, RC410, RS400 e RV350;


4. Arquitetura Rage 9 (2003 ~ 2008):

-> Chip's M11, M12, ATI M22 e M24;

-> Chip's R360, RS480, RS482 e RS485;

-> Chip's RV360, RV370 e RV380.


5. Arquitetura R400 (2004 ~ 2008):

-> Chip's M18, M26 e M28;

-> Chip's R420, R423, R430, R480 e R481;

-> Chip's RS600, RS690, RS740 e RV410.


6. Arquitetura R500 (2005 ~2007):

-> Chip's M52, M54, M56, M58, M62, M64, M66, M68 e M71;

-> Chip's RV505, RV515, RV516, RV530, RV535, RV560 e RV570.


Para concluir o raciocínio, dentro da arquitetura R500 temos os Chip's R520, R580 e R580+, que possuem Unidades ROP de propósito geral, onde era aplicado a API de computação paralela Brook+ que já citei anteriormente.

Neste artigo, fizemos uma introdução sobre o funcionamento dos chip gráficos com base nas etapas computação gráfica, porém ainda estamos no início. No próximo artigo, veremos alguns diagramas de blocos de circuitos de chip's gráficos para entender esta era "Pré-Shaders Unificados", para só depois entendermos a tecnologia atual.

Se encontrou alguma inconsistência, quer mandar alguma sugestão, elogio ou algum complemento a este texto, não deixe de entrar em contato conosco pelo e-mail hardwarecentrallr@gmail.com

Texto: Leonardo Ritter

Imagens e diagramas: TechPower Up; Leonardo Ritter

Fontes: TechPower Up, Wikipedia (somente artigos com fontes verificadas!), UNIP (Universidade de São Paulo).

20 visualizações

© 2020 Hardware Central Tecnologia Entretenimento e Comunicação do Brasil Ltda. Todos os direitos reservados.

Wix Editor / Revisão da web page: 3.1/2020 (16/07/20)