Unidade De Processamento Gráfico
Total Page:16
File Type:pdf, Size:1020Kb
Unidade de Processamento Gráfico ● Definição ● Funcionamento ● Arquitetura ● GPU vs CPU ● GPGPUs ● Aplicações Definição GPUs são processadores dedicados para processamento gráfico da classe SIMD (Single Instruction Multiple Data). GPUs são desenvolvidas especificamente para cálculos de ponto flutuante, essenciais para renderização de imagens. Suas principais características são sua alta capacidade de processamento massivo paralelo e sua total programabilidade e desempenho em cálculos que exigem um volume grande de dados, resultando em um grande throughput (quantidade de instruções executadas por segundo). Funcionamento Para que as imagens possam ser geradas, a GPU trabalha executando uma sequência de etapas, que envolvem elaboração de elementos geométricos, aplicação de cores, inserção de efeitos e assim por diante. Essas etapas recebem o nome de pipeline gráfico. O pipeline gráfico possui 5 estágios: vector processing, primitive processing, rasterization, fragment processing, pixel operations. Iremos examinar esses estágios enquanto a GPU os executam para processar uma objeto gráfico. ● Vector processing: A GPU recebe um conjunto de vértices do objeto do qual se quer processar. Para o nosso exemplo, a GPU recebe um conjunto de vértices que descreve dois triângulos sobrepostos. ● Primitive processing: Um polígono complexo é decomposto em polígonos mais simples chamadas de primitivas. Nesse estágio ocorre o processo de triangulação, isto é, os vértices são ligados formando triângulos e esses triângulos são criados de tal forma que tome a forma do objeto da imagem que se quer processar. ● Rasterization: Ocorre o processo de rasterização, ou seja, todo o objeto da imagem é preenchido com pixel. Cada primitiva é processa independentemente. ● Fragments processing: nesse estágio, os pixels ganham cores baseados na cor do objeto, iluminação, sombreamento. ● Pixel Operations: Se um objeto é sobreposto por outro objeto, esse objeto não deve aparecer na imagem final. Agora imagine um ponto de observação, onde aparece o objeto 1 mas o objeto 2 está sendo obscurecido pelo objeto 1 da visão do observador. Cada objeto foi processado independentemente, então realiza-se cálculos baseados na distância do observador de tal forma, que os pixels do objeto 2 não apareçam na imagem, descartando-os. Depois disso, a imagem processada é levada para a memória de vídeo. As GPUs podem contar com vários recursos para a execução dessas etapas, entre eles: ● Pixel Shader: é um programa que trabalha com a geração de efeitos com base em pixels. Esse recurso é amplamente utilizado em imagens 3D (de jogos, por exemplo) para gerar efeitos de iluminação, reflexo, sombreamento, etc; ● Vertex Shader: consiste em um programa que trabalha com estruturas formadas por vértices, lidando, portanto, como figuras geométricas. Esse recurso é utilizado para a modelagem dos objetos a serem exibidos; ● Render Output Unit (ROP): basicamente, manipula os dados armazenados na memória de vídeo para que eles se "transformem" no conjunto de pixels que formará as imagens a serem exibidas na tela. Cabe a essas unidades a aplicação de filtros, efeitos de profundidade, entre outros; ● Texture Mapping Unit (TMU): trata-se de um tipo de componente capaz de rotacionar e redimensionar bitmaps (basicamente, imagens formadas por conjuntos de pixels) para aplicação de uma textura sob uma superfície. Arquitetura Fermi A GPU foca mais em ULA’s, o que as torna bem mais eficientes em termos de custo quando executam um software paralelo. Consequentemente, a GPU é construída para aplicações com demandas como cálculos paralelos grandes com mais ênfase no throughput que na latência. As GPUs da NVIDIA são divididas em: ● Streaming processing (SM): responsável por executar os blocos de threads entregues a GPU. ● GigaThreadEngine: responsável por enviar os blocos de threads às dezenas de SMs. Uma SM possui: ● Dois Warps Schedules: a dual Warp Scheduler recebe um conjunto de 32 threads chamadas de warps, seleciona uma instrução de cada Warp. ● Duas unidades Dispatch Unit: responsável por enviar as intrunções para as dezenas de unidades de execução da SM. ● Load/Store: carrega ou armazena o endereço das threads e carrega ou armazena o dado entre a cache e a shared memory. ● Special Function Unit (SFU): responsável por realizar cálculos transcendentais, como seno, cosseno, tangente. ● Duas colunas com 16 núcleos CUDA. ● Cada Núcleo possui uma ALU e uma FPU. ● Possui uma cache L1 por SM. ● Registradores: cada thread tem acesso somente ao seu registrador; ● L1 + Shared Memory: utiliza caches para threads individuais; ● Local Memory: utilizada para armazenar “spilled registers”. Um “spill register” ocorre quando um bloco de thread requer mais espaço nos registradores do que o disponível na SM. CPU vs GPU Uma CPU possui geralmente uma quantidade baixa de núcleos quando comparada a uma GPU. Uma GPU pode ter centenas de núcleos com cada um possuindo uma ALU para inteiros e para números em ponto flutuante com operações em pipeline. Uma CPU genérica moderna é construída utilizando camadas de cache para reduzir a latência do acesso à memória. Cada núcleo possui uma cache L1 para dados e uma cache L1 para instruções, auxiliadas por uma outra cache L2. Há ainda um terceiro nível de cache, a cache L3 que é compartilhada por todos os núcleos da CPU. Quando os dados não estão nas caches este é trazido da memória. Uma GPU é constituída de vários Processors Cluster (PC) cada um possuindo várias unidades chamada de Streaming Muitiprocessors (SM). Cada (SM) é composto de vários blocos onde cada um acomoda uma Cache de instruções L1, que por sua vez é compartilhada pelas dezenas de núcleos (também chamadas de Cuda) que compõe um bloco. Todos os SM compartilham a mesma cache L2. Uma GPU possui bem menos caches se comparado com uma CPU. Uma GPU não se preocupa com latência de acesso à memória, ou seja, o tempo gasto para recuperar um dado da memória e sim com a quantidade de trabalho que é realizada paralelamente. Uma GPU é projetada para computação paralela de dados. GPGPUs A Unidade de Processamento Gráfico de Propósito Geral ou GPGPU (General Purpose Graphics Processing Unit) utiliza a GPU (graphics processing unit) para além de renderização gráfica tais como: processamento de imagem, visão computacional, inteligência artificial, cálculo numérico dentre outras aplicações. Ou seja, é a utilização da GPU para realizar a computação em aplicações que antes eram tratada pela CPU(Unidade Central de Processamento). A NVIDIA apresentou a Compute Unified Device Architecture (CUDA) em 2006, trata-se de uma plataforma de computação paralela e modelo de programação que disponibiliza um aumento significativo de desempenho ao aproveitar o poder da GPU. Ao fornecer abstrações simples com respeito à organização hierárquica de threads, memória e sincronização, o modelo de programação CUDA permite aos programadores escreverem programas escaláveis sem a necessidade de aprender a multiplicidade de novos componentes de programação. Alguns modelos de GPUs da NVidia: ● G80: Introduzida em novembro de 2006. A GeForce 8800 foi a primeira GPU com suporte a linguagem C, introduzindo a tecnologia CUDA. A placa gráfica possui unificada com 128 CUDA cores, distribuídos entre 8 SMs. ● Fermi: Lançada em abril de 2010, esta arquitetura trouxe suporte para novas instruções para programas em C++, como alocação dinâmica de objeto e tratamento de exceções em operações de try e catch. Cada SM de um processador Fermi possui 32 CUDA cores. Até 16 operações de precisão dupla por SM podem ser executadas em cada ciclo de clock. ● Kepler: Lançada em 2012, a mais nova arquitetura da NVIDIA introduziu um novo modelo de SM, chamado de SMX, que possui 192 CUDA cores, totalizando 1536 cores no chip. A alteração da arquitetura foi a principal responsável pela maior redução no consumo de energia. Aplicações ● Computação Acelerada por GPU: Computação com aceleração de GPU é a utilização de uma GPU em conjunto com uma CPU para acelerar aplicativos científicos, de análise, de consumidor, de engenharia e corporativos. Basicamente o que faz a GPU, é receber da aplicação o processamento que requer maior uso intensivo de computação. A GPU recebe uma parte da aplicação, enquanto a CPU recebe o restante. ● Deep Learning: Arquiteturas de Deep Learning geralmente são complexas e necessitam de muitos dados para seu treinamento. Dessa forma, é inevitável a dependência de muito poder computacional para aplicar essas técnicas. As GPUs se destacam em cargas de trabalho paralelas e aceleram as redes neurais em até 10 a 20 vezes. ● Carros Autônomos: Praticamente todo carro autônomo ou semi autônomo em desenvolvimento hoje precisa de alguma plataforma computacional criada em torno de GPUs, como a NVIDIA que lançou a sua linha de placas Drive PX, que permitem a condução automatizada em vias expressas e mapeamento em HD, permite que os veículos usem redes neurais para processar dados de várias câmeras e sensores, pode compreender em tempo real o que está ocorrendo em volta do veículo e traçar uma rota segura e pode realizar 24 trilhões de operações de aprendizagem profunda por segundo. ● Medicina: Para processar gigabytes de dados gerados dinamicamente a cada segundo para uso por profissionais da área médica na prestação de serviços de saúde aos pacientes, por exemplo detectar câncer de mama, sequenciamento e análise genômica com computação acelerada e inteligente, a modelagem molecular permite usar uma unidade de processamento gráfico para simulações