• Drano Rauteon

GPU: Como funciona? - Parte 2

Atualizado: Abr 26

O assunto de hoje são algumas funcionalidades gráficas das placas de vídeo. Vamos abordar algumas tecnologias das mais comuns que são executadas pela GPU. Vamos começar pelo básico, que é a arquitetura CUDA (nVidia) e os Stream Processors / Computer Units (AMD / ATi), até chegarmos nas tecnologias mais recentes, como por exemplo o Ray Casting e Ray Tracing, que não são tão novas, porém foram aprimoradas nos últimos anos.

Imagem 1 - 1050Ti em detalhes na tela do App GPU-Z


Vamos continuar estudando alguns itens presentes na tela do App GPU-Z, pois é neste software que encontramos as principais tecnologias suportadas pelas GPU's.

API, sigla para "Application Programming Interface", que em português significaInterface de Programação de Aplicações” ou “Interface de Programação de Aplicação”, é um conjunto de rotinas e padrões estabelecidos por um software para a utilização das suas funcionalidades por aplicativos que vão apenas utilizar de seus serviços e que não pretendem envolver-se em detalhes da implementação do software. Resumindo, API é a interface de programação de aplicativos. Ela possibilita que você tenha uma base para programar algo, um conjunto de códigos preparados para realizar tal função.

De modo sucinto, uma API é construída por uma série de funções acessíveis somente por programação, e que permitem utilizar características do software “menos visíveis” ao utilizador comum.

Por exemplo, um sistema operacional (SO) possui uma grande quantidade de funções em sua API, funções estas que permitem ao programador criar janelas, programar jogos e aplicativos, cifrar dados e etc. Mas as API's dos sistemas operacionais costumam ser dissociadas de tarefas mais essenciais, como a manipulação de blocos de memória e acesso a dispositivos. Essas tarefas são atributos do núcleo do sistema (kernel) e raramente são programáveis.

Outro exemplo são programas de desenho geométrico que possuem uma API específica para criar automaticamente entidades de acordo com padrões definidos pelo utilizador.

Você não precisa criar do zero um serviço de mapas para mostrar em seu site a localização da sua empresa, pois o Google permite que você puxe uma API do Maps para a finalidade que você necessita.

Os GIF's que você troca pelo WhatsApp são enviados graças a uma API do Giphy. O WhatsApp não precisou criar um banco próprio, pois o Giphy disponibilizou a API para quem quer usar.


Numa explicação metafórica, é como se a API fosse um conjunto de pincéis, tintas e telas que um pintor pode usar para pintar um quadro, sem ter que fabricar ele mesmo cada pincel, cada tela, e cada tinta.

Nessa mesma metáfora, a API também seria uma espécie de manual de como pintar paisagens, fazer a iluminação e coisas do gênero, uma vez que também orienta a forma com a qual o pintor pode usar os recursos disponíveis.

Cada versão seria como um upgrade nos pincéis e possibilidades dadas ao pintor.


Mas vamos nos focar aqui nas API's utilizadas para tarefas multimídia, principalmente jogos. É aí que temos o famoso DirectX, Open GL, Open CL, Vulkan e algumas outras.

O DirectX é uma API para tarefas multimídia criada pela Microsoft especialmente para o SO Windows.

Veja abaixo um PDF com algumas informações sobre o DirectX e suas versões:

API's - DirectX
.pdf
Download PDF • 112KB

Agora, vamos para a próxima:



Qualquer GPU Radeon ou APU AMD baseada na arquitetura GCN (Graphics Core Next) já é compatível com a Vulkan.

Veja abaixo um PDF com algumas informações sobre o DirectX e suas versões:

API's - Vulkan
.pdf
Download PDF • 65KB

Na sequencia temos:


Veja abaixo um PDF com algumas informações sobre o DirectX e suas versões:

API's - OpenGL
.pdf
Download PDF • 110KB

E estas foram as 3 principais API's focado em desenvolvimento de gráficos 3D.

Finalizando o assunto APIs, cada uma delas consegue se sair melhor em tal jogo, pois ele pode ter sido projetado para rodar nela, ou ela tem um recurso específico mais aprimorado que outra.

Se as API's descritas nos tópicos anteriores são pra uso em jogos e conteúdo multimídia em geral, temos outro conjunto de sistemas para tornar a computação paralela acessível a outros softwares, aplicativos, programas em geral.

Mas o que é computação paralela?

De uma forma sucinta, antigamente tínhamos apenas o processamento de dados em série, do mesmo jeito que ainda ocorre hoje nas CPU's. Temos um núcleo de processamento com capacidade de executar uma thread (tarefa) por vez, e uma fila de instruções a serem processadas. O máximo que dá pra ser feito é dividir o núcleo em "estágios de pipeline", isto é, separar o processamento de uma instrução em várias etapas. A cada ciclo de clock uma etapa da instrução é processada e outras instruções já podem ser carregadas na sequência.

Nas GPU's, a partir do Chip ATi R520 e do Chip nVidia G80, começou a se utilizar computação paralela, que consiste em 'quebrar' um código em muitos fragmentos e processa-los em vários pequenos e simples núcleos que operam de forma sincronizada. Quando eu digo "pequenos e simples núclos", quero dizer que eles possuem uma arquitetura bem mais simples e reduzida do que um núcleo de uma CPU.

Com a implementação desta tecnologia, viu-se a oportunidade de utilizar a GPU pra processar não só jogos e conteúdo multimídia, mas também softwares feitos pras mais diversas aplicações. E nisso, a GPU passou a trabalhar em conjunto CPU, e não ser mais simplesmente um sistema 'dependente' feito exclusivamente pra gerar imagens. Em muitos casos a GPU é até mais eficiente que a CPU, justamente por ela possuir centenas e centenas de pequeninos núcleos de processamento trabalhando de forma conjunta.


CURIOSIDADE: Foi nesse memento, em que GPU passou a ser "multi-uso", que surgiu o termo GPGPU (General Purpose Graphics Processing Unit - Unidade de Processamento Gráfico de Propósito Geral). Um GPGPU possui muitas funções, dentre elas Visão Computacional, Inteligência Artificial, Calculo Numérico e Processamento de Imagem.


Pra isso, foram criadas extensões da linguagem de programação C, que permitem que os códigos criados sejam fragmentados e processados pelas centenas de núcleos da GPU. Essas extensões são:


CUDA

Imagem 2 - nVidia G80 (8 de Novembro de 2006, pertence a arquitetura Tesla) Primeiro chip nVidia a suportar a tecnologia CUDA.


Significa “Compute Unified Device Architecture” e foi implementada na GPU's a partir da arquitetura G80 (arquitetura Tesla 2006 ~ 2010). É uma plataforma de computação paralela criada pela nVidia, construída a partir de uma extensão da linguagem C (essa extensão é um superconjunto do C99), que permite que o programa seja compilado em centenas e centenas de fragmentos de código. Cada fragmento do código será direcionado a uma unidade shader do chip gráfico. Isso faz com que a GPU possa processar códigos como a CPU e auxilia-la nos processos.


CURIOSIDADE: Apesar da arquitetura Tesla significar também o ponto de partida da tecnologia CUDA, alguns chips com essa arquitetura não a suportavam. É o caso do chip C77, C78, C79, C7A e C7A-ION. Eles eram chip's de baixo custo, servindo apenas como vídeo on-board (Integrated Graphics Processor).


CURIOSIDADE: Existem também wrappers que permitem desenvolver em Java (jCUDA), C# (CUDA.NET) ou até mesmo Python (PyCUDA). Isso torna a plataforma mais flexível, pois permite que várias linguagens de programação sejam compiladas pra serem processadas em computação paralala.


Como você pode ver, lá na Imagem 1 temos o termo "Shaders", que estudamos no primeiro capítulo desta série. De forma sucinta, os CUDA Cores são as unidades Shader unificadas, que processam os Geometry, os Vertex e os Pixel Shaders.

Devido a CPU ter apenas alguns núcleos e fazer processamento de instruções em série, a GPU pode executar um código mais rapidamente, já que há centenas e centenas de Shader Units e o código é dividido entre todos eles (por isso foi dado o nome de computação paralela), entretanto, texturas, por exemplo, não são suportadas pelos shaders, e como a CUDA não é um projeto aberto, todos os aplicativos, jogos e demais softwares que foram feitos com esta tecnologia só funcionam em GPU's da marca nVidia.

Em GPU's da AMD, o código que utilizar a tecnologia CUDA tem que ser processado exclusivamente na CPU, a deixando sobrecarregada.

Com o incremento desta tecnologia nas GPU's nVidia, as Shader Units dos chips da marca passaram a receber o nome de CUDA Cores. Vele lembrar que, os CUDA Cores processam Vertex Shaders, Pixel Shaders e Geometry Shaders, assim como os Stream Processors da AMD, que foram implementados a partir da arquitetura TeraScale (2005 ~ 2013).

O fluxo dos dados funciona da seguinte maneira: os dados são copiados da memória principal (HDD ou SSD, por exemplo) para a memória da placa de vídeo e a CPU aloca um processo para a GPU. A GPU processa o código em suas unidades shader e depois os dados fazem o processo inverso, ou seja, são gravados na memória principal.


Brook+


O Brook+, outra extensão da linguagem C, concorrente da tecnologia CUDA, permite que programas compilados sejam fragmentados para o processamento paralelo. A arquitetura R500 era otimizada para operar com o Brook+ mesmo não tendo Shaders unificados, pois na verdade ela utilizava unidades ROP operando como processadores de propósito geral. Você entenderá melhor no capítulo 4.

Nesse sistema ainda não há a implementação de Shaders unificados, pois a arquitetura ATi R500 (a qual este sistema foi implementado) ainda utiliza Shaders separados.


Placas da nVidia não suportam o Brook+. A partir da arquitetura TeraScale (2005 ~ 2013), a ATi / AMD unificou os Shaders, abandonando o Brook+ e optando por utilizar o OpenCL (explicado mais abaixo) e o DirectCompute, da Microsoft. Os Shaders passaram a se chamar "Stream Processors", que não suportam um código com a tecnologia CUDA, da nVidia, apenas executam as instruções de Vertex Shader, Pixel Shader e Geometry Shader utilizando o OpenGL e DirectCompute.


Se quiser saber mais sobre o Brook+, veja o PDF abaixo:

Computação Paralela - Brook+
.pdf
Download PDF • 51KB

CURIOSIDADE: Normalmente, um chip gráfico da AMD possui mais Shader Units operando a cloks mais baixos, enquanto as Shader Units da nVidia estão presentes em menor quantidade e operando com um clock mais elevado.


OpenCL

O OpenCL, sigla para Open Computing Language (Linguagem Aberta de Computação), veio para unir a computação paralela da nVidia e da ATi / AMD.

Esta tecnologia une as duas plataformas, permitindo que uma aplicação possa ser processada numa variedade enorme de chips gráficos.

O OpenCL também foi desenvolvido pelo consórcio Khronos Group e é um primo-irmão da API OpenGL. O OpenCL não deixa de ser também uma API, pois integra um banco de códigos para definir e controlar plataformas heterogêneas.

Para saber mais sobre OpenCL, abra o PDF do link abaixo:

Computação_Paralela_-_Open_CL
.pdf
Download PDF • 105KB

CURIOSIDADE: O termo “computação heterogênea” é utilizado para designar o uso de diferentes arquiteturas em um mesmo sistema computacional a fim de se obter melhores desempenhos das aplicações serão executadas neste nó. Entre as alternativas destacam-se arquiteturas como GPU's (Graphics Processing Units) e FPGA's (Field-programmable Gate Arrays), ambos também conhecidos como aceleradores. A computação heterogênea também é utilizada para designar um sistema com CPU's e GPU's trabalhando em conjunto. Se quiser saber mais sobre computação heterogênea e seus usos:

Introducao a Computacao Heterogenea
.pdf
Download PDF • 3.08MB

DirectCompute


O DirectCompute também é uma plataforma de computação paralela suportada tanto pela AMD quanto pela nVidia. Este sistema é uma API pertencente ao DirectX, já abordado no início do texto. Ele foi inicialmente lançado com a API DirectX 11, mas é executado em GPU's que usam DirectX 10 também. É suportado pelo Windows Vista e Sistemas Operacionais posteriores da Microsoft.

O DirectCompute compartilha uma variedade de interfaces computacionais com seus concorrentes, como por exemplo os sombreadores de computação do OpenGL (Khronos Group) e do CUDA (nVidia) e algumas coisas do OpenCL.

O PhysX é um poderoso sistema de processamento de física e seu software está presente em amis de 150 jogos e está presente na linha de GPU's nVidia, Sony Playstation 3, Microsoft Xbox 360 e Nintendo Wii. Placas da ATi / AMD não possuem tal tecnologia por não ter participação e propriedade para utiliza-la.

Este sistema tem a função de manipular cálculos de física em jogos eletrônicos, aumentando seu realismo.

O PhysX foi projetado para fins de aceleração de hardware, sendo executado em placas com alto poder de processamento e centenas de núcleos, tornando a tecnologia perfeita para ser integrada na computação paralela.


O PhysX foi criado pela AGEIA. Em 20 de Julho de 2005, a Sony fechou um contrato com a AGEIA para utilizar esta plataforma em seu console, o Playstation 3.Em 4 de Fevereiro de 2008, a nVidia comprou a operação da AGEIA Technologies Incorporated, tornando-se proprietária da tecnologia PhysX.

o Kit de Desenvolvimento de Software (Software Development Kit - SDK) juntamente do motor PhysX está presente também nos Sistemas Operacionais Windows 10, 7, Vista, XP, no Linux e no Mac OS X.


Para entendermos o funcionamento do PhysX na GPGPU, precisamos voltar no passado e estudar a origem da PPU (Phisics Processing Unit - Unidade de Processamento de Física) e sua evolução até ser incorporada a computação paralela. Então, para saber mais sobre o assunto, acesse o PDF abaixo.

PPU_-_Unidade_de_Processamento_de_Físic
.
Download • 71KB

Com isso, podemos concluir que, com a evolução das placas de vídeo, o PhysX deixou de ser um chip dedicado ao processamento de física e passou a ser integrado na GPU, tendo apenas um motor PhysX (software) implementado em muitos jogos, que permite fazer do chip gráfico uma PPU.

O que é Ray Tracing?

Na vida real, uma fonte de luz emite raios luminosos que se chocam com os objetos e refletem, refratam ou absorvem a luz de acordo com suas características físicas.


PARA VER OS ARTIGOS SOBRE ÓTICA E ENTENDER MELHOR O ASSUNTO, CLIQUE AQUI!

No cenário de um jogo ou em efeitos especiais de filmes e programas de TV, a fonte de luz (raios primários) é o observador. A emitir raios de luz, eles se chocam com os objetos do cenário que refletem, absorvem ou refratam a luz recebida. Desta forma também consegue se ter noção de profundidade e notar os objetos que estão mais perto e os que estão mais longe da visão, o que é considerada a primeiro estágio do Ray Tracing, também chamada de Ray Casting.

Com a técnica do Ray Casting, é possível também remover as superfícies que não estão visíveis a um observador do cenário através da verificação dos primeiros pontos onde os raios de luz primários incidiram. Ao contrário do algoritmo de Ray Tracing, o Ray Casting não possui criação de raios secundários, e portanto, se torna menos complexo e mais fácil de ser processado que o Ray Tracing.

Para que o algoritmo do Ray Tracing funcione, foram criados três tipos de raios de luz, chamados de secundários: raios de sombra, raios de reflexão e raios de refração.

Para o cálculo de iluminação, quando um raio de luz se chocar com um objeto e também a reflexão e refração da luz feita por outros objetos dentro do cenário, será verificado a distância deste do objeto em relação ao observador e assim será determinada a cor dos pixels. Se o raio de luz não incidir em nenhum objeto, isto é, seguir em linha reta até o fundo do cenário, é dado a ele a cor de fundo do frame nos pixels que o compõem.

CURIOSIDADE: Antes da arquitetura Turing, o Ray Tracing era aplicado via software e utilizando o hardware disponível no chip gráfico. Com a chegada das nVidia Turing, o chips gráficos ganharam vários 'RT Cores'. Um RT Core é uma unidade de processamento exclusiva para a aplicação destes efeitos de luz.


CURIOSIDADE: O DirectX 11.0 passou a ter suporte nativo ao Ray Tracing, com conjuntos de instruções para que a GPU aplique os efeitos de iluminação.

A Arquitetura Tesla (2006 ~ 2010), da nVidia, apesar de não ser preparada para Ray Tracing já suporta o DirectX 11.1 (muito limitada, predominando os recursos da versão 10_0). O primeiro chip Tesla foi o C77, lançado em 3 de Junho de 2008. A arquitetura Fermi (2010 ~ 2016) da nVidia já suportava o DirectX 12 (limitada, predominando os recursos da versão 11.0), tendo seu primeiro chip, o GF100, lançado em 26 de Março de 2010.

Por parte da ATi / AMD, temos a arquitetura TeraScale 2 (2009 ~ 2015) com suporte ao DirectX 11.1 (11_0), com o primeiro chip, denominado Bart, lançado em 2 de Julho de 2011.

O Anti-Aliasing é uma série de soluções criadas para reduzir o serrilhado nas linhas de um cenário 3D. O Anti-Aliasing é aplicado pelas Unidades ROP (Raster Operation Units) e este tópico é um complemento da explicação sobre Unidades ROP do Capítulo 1 desta série.

Acessando o PDF abaixo, você encontra a explicação sobre vários tipos da Anti-Aliasing, seus detalhes e especificações.

Anti-Aliasing - Detalhamento
.pdf
Download PDF • 1.49MB

Uma imagem 3D possui três dimensões. Isso não é novidade. Porém, diferente de uma gráfico 2D, em que há apenas informações sobre largura (vetor "X") e altura (vetor "Y"), a imagem 3D possui uma terceira dimensão, um terceiro vetor, denominado "Z". Se você não está entendo do assunto, relembre suas aulas do ensino médio sobre o plano cartesiano.

o Z-Buffer é um bloco de memória física com informações sobre o vetor "Z", que dita a profundidade da imagem, isto é, a sobreposição de vértices, arestas e polígonos que formam o quadro que será exibido na tela.

Imagem 2 - Um display exibindo três polígonos sobrepostos.


O Buffer de vetores "Z" está junto das unidades ROP, a saída de renderização, isto é, a finalização do processamento da imagem. Observe que, a unidade ROP não cria vetores, mas sim utiliza as coordenadas do plano cartesiano pra fazer a sobreposição deles e criar a ilusão de profundidade na imagem exibida na tela.

Para entender de forma mais aprofundada, acesse o PDF abaixo, com mais informações sobre o Z-Buffer

Z-Buffer - Como funciona
.pdf
Download PDF • 66KB

O Anisotropic Filtering é uma filtro de texturas que evoluiu a partir do Bilinear e do Trilinear Filtering.

O Anisotropic Filtering é aplicado pelas Unidades TMU (Texture Mapping units) e este tópico é um complemento da explicação sobre Unidades TMU do Capítulo 1 desta série.

Para saber mais sobre esta tecnologia, clique no documento PDF abaixo:

Anisotropic Filtering pdf
.pdf
Download PDF • 161KB

E este foi o segundo capítulo da série sobre placas de vídeo. No próximo artigo, veremos os blocos de hardware presente nestes chips e estudar seu funcionamento.

Caso tenha encontrado algum erro ao longo do texto, peço encarecidamente que envie uma e-mail para hardwarecentrallr@gmail.com


ATENÇÃO: Este texto contém PDF's retirados de sites de terceiros, que foram traduzidos, concatenados e ou resumidos para formar uma explicação mais completa. A intenção do blog é apenas criar / repassar informações, sendo uma entidade sem fins lucrativos e sem a intenção de prejudicar terceiros.

TEXTO: Leonardo Ritter;

Imagens: Leonardo Ritter;

Fontes: Guia Do Hardware; Wikipedia (somente artigos com fontes verificadas); AMD; Fórum Adrenaline; Pontifícia Universidade Católica do Rio Grande do Sul; GameVicio; Showmetech.