Loading

Alison's New App is now available on iOS and Android! Download Now

Study Reminders
Support
Text Version

Set your study reminders

We will email you at these times to remind you to study.
  • Monday

    -

    7am

    +

    Tuesday

    -

    7am

    +

    Wednesday

    -

    7am

    +

    Thursday

    -

    7am

    +

    Friday

    -

    7am

    +

    Saturday

    -

    7am

    +

    Sunday

    -

    7am

    +

Na palestra anterior aprendemos sobre hardware gráfico básico. Também, aprendemos sobre os dispositivos de entrada e saída de gráficos e também arquitetura geral de um sistema gráfico. Agora, vamos continuar nossa discussão sobre esse hardware gráfico e hoje vamos cobrir fundamentos de programação GPU e GPU, que fazem parte do hardware gráfico.
Então, vamos começar pela GPU. O que é e como ele é usado para implementar o pipeline.
Uma coisa que devemos notar na graphics é que as operações gráficas são altamente paralelas na natureza. Essa é uma característica muito crucial das operações gráficas. Consequentemente, há necessidade de ir para o processamento paralelo dessas operações.
Por exemplo, considere o estágio de transformação de modelagem. Lembra-se que, nesta fase, o que fazemos? Nós convertemos ou transformamos objetos definidos em seu próprio sistema de coordenadas ou locais para uma cena de coordenadoria mundial. Agora, como fazemos isso, aplicamos transformações, por exemplo as rotações aos vértices que definem os objetos.
E qual é a transformação? Se você pode se lembrar de nossas discussões anteriores, definimos a transformação como uma multiplicação de duas coisas. Uma é uma matriz de transformação e a outra é um vetor de vértice. A coisa a notar aqui é que a mesma multiplicação de matriz vetorial é feita para todos os vértices que queremos transformar. Isso significa que estamos realizando, essencialmente, a mesma multiplicação de operação para todos os vértices.
Agora, nos é dado um conjunto de vértices que definem os objetos. Podemos ir para uma multiplicação em série onde executamos uma multiplicação de vetores matricial de cada vez. No entanto, isso de qualquer forma não vai ser muito eficiente. Porque, essencialmente, estamos realizando a mesma operação, então em vez de ir para multiplicação em série, se pudermos realizar a mesma operação em todos os vetores ao mesmo tempo que está em paralelo então vamos ter um ganho significativo de desempenho. E isso é muito importante em renderização em tempo real de cenas porque tipicamente precisamos processar milhões de vértices por vez ou milhões de vértices por segundo. Portanto, se pudermos processar todos esses milhões de vértices paralamente então vamos ter um ganho enorme de desempenho.
Se estamos realizando essas operações usando nossa CPU então não podemos tirar proveito dessas natureza paralelas inerentes das operações gráficas. Porque CPUs não são projetadas para isso. A fim de abordar esta questão em que queremos aproveitar esses paralelismos inerentes, há um hardware de propósito especial que vem com os nossos sistemas. Quase todos os sistemas gráficos vêm com uma placa gráfica separada, contendo a sua própria unidade de processamento e elementos de memória. Agora, esse sistema de hardware especializado separado é chamado de unidade de processamento gráfico ou GPU. Por isso, essencialmente GPU significa um hardware especializado que é usado para realizar operação gráfica explorando o paralelismo inerente que estão lá em operações gráficas.
Vamos entrar no funcionamento da GPU. Agora, temos que notar que a GPU é um sistema multicore que significa que ele contém um grande número de núcleos ou elementos de processamento da unidade. Agora, cada um desses núcleos ou esses elementos de processamento da unidade é chamado de processador de fluxo. Porque funciona em fluxos de dados, fluxos de dados de entrada.
Agora, esses núcleos não passam de um hardware simples capaz de realizar operações aritméticas simples de número inteiro e de ponto flutuante apenas. Então, cada núcleo pode realizar operações aritméticas apenas, aritmética de número inteiro ou aritmética de ponto flutuante. E vários núcleos são agrupados para formar outra unidade chamada de multiprocessadores de streaming ou SM. Assim, cada núcleo é chamado processador de fluxo e muitos tais núcleos são agrupados para formar multiprocessadores de streaming.
Agora, isso nos leva à ideia de SIMD, observe o termo. Para entender, consideremos um exemplo, a transformação geométrica de vértices que estávamos discutindo anteriormente. Então, aqui nossa instrução é a mesma que é a multiplicação. Agora, os dados sobre os quais essa instrução opera varia, porque os vetores de vértice variam. Embora a matriz de transformação permaneça a mesma. Por isso, então aqui o que estamos fazendo, estamos tendo instrução única trabalhando em múltiplos dados. Esta é a ideia de SIMD ou Instrução Única Múltiplos Dados, e os multiprocessadores de streaming GPU são essencialmente exemplos de SIMD. Então, como funciona, aqui como você pode ver, temos a mesma instrução dada a todos os núcleos e os núcleos levam dados que podem ser diferentes mas a instrução será mesma e a mesma instrução irá operar em fluxos de dados diferentes. Uma outra ilustração desta ideia é dada aqui, aqui se não considerarmos o SIMD então o que acontece. Por isso, temos duas operações de adição em dois fluxos de dados. A0 B0 e A1 B1, portanto, haverá duas instruções separadas para a realização dessas duas adições separadas dando a saída de C0 e C1, esta é operação normal. Em caso de SIMD o que acontece é que temos isso como fluxos de dados e a instrução é única. Aqui nota que temos duas instruções trabalhando em dois fluxos de dados separados. Aqui temos uma única instrução trabalhando em ambos os fluxos de dados para nos dar a saída desejada. Essa é a ideia do SIMD. Então, você agora sabe que as GPUs contêm SMs ou multiprocessadores de streaming que funcionam com base na ideia de SIMD.
Então, vamos ter uma olhada em como as GPUs estão organizadas. Como eu disse que cada multiprocessador de streaming é projetado para executar operações SIMD. Então e nós temos muitos tais multiprocessadores de streaming, como mostrado aqui. Em seguida, temos alguma memória especializada, cujo propósito será explicado a você em breve, e outros componentes para gerenciar esse processamento paralelo. Cada multiprocessador de streaming contém vários processadores de streaming ou curso como mostrado aqui. E cada núcleo é capaz de realizar operações aritméticas de número inteiro simples ou de ponto flutuante apenas. (Consulte O Slide Time: 11:33) Então, que é amplamente o que estão lá em GPU, multiprocessadores de streaming e unidades de memória dedicadas mais componentes adicionais para gerenciar esse processamento paralelo. Agora, vamos tentar entender como funcionam as operações gráficas nos GPUs. A primeira coisa que devemos notar é que a maioria dos sistemas gráficos em tempo real supõem que cena é feita de triângulos. Então, nós realmente convertemos qualquer superfície em triângulos ou malhas triangulares. Este ponto que já discutimos anteriormente quando falávamos de representação de objetos.
Agora, dado que informações triangulares mesh o que acontece é que, aquelas APIs dedicadas que são fornecidas na biblioteca gráfica como OpenGL ou Direct3D, esses triângulos são enviados para GPU, um vértice por vez seriado e GPU monta-os em triângulos.
Também, devemos observar aqui que os vértices são representados com sistema de coordenadas homogêneo. Assim, os vértices estão representados no sistema de coordenadas homogêneas.
E por isso estamos lidando aqui com o primeiro estágio que é definição de objeto, portanto, esses objetos são definidos em seus sistemas de coordenadas locais ou de modelagem. Em seguida, o GPU executa todos os estágios, então primeiro realiza transformação de modelagem em vértices que é a primeira etapa de processamento.
E como já explicamos anteriormente esta transformação é obtida com uma única matriz de transformação e operação de multiplicação de ponto vetorial.
Como já observamos anteriormente, o GPU multicore executa tais operações simultaneamente ou paralelas, portanto, essencialmente múltiplos vértices são transformados simultaneamente ao mesmo tempo. Não é que um atrás do outro estamos realizando as multiplicações. Então, o que obtemos após a multiplicação que é fluxo de triângulos mas, desta vez, eles são definidos em sistema de coordenadas mundiais, que é o propósito de modelar o estágio de transformação. Supõe-se também que o espectador esteja localizado na origem do sistema de coordenadas mundiais e a direção de visualização esteja alinhada com o eixo z. Esta é a suposição usando o qual o hardware é projetado.
Assim, após a transformação de modelagem, a GPU computa a cor vértice ou o estágio de iluminação é realizado. Agora, isso é feito com base na luz que é definida para a cena, por isso alguma fonte de luz é assumida e com base nessa fonte de luz esta coloração é feita. Agora, por que a GPU é adequada para as cores da computação porque se você pode se lembrar da nossa discussão sobre iluminação, notamos que a coloração pode ser computada por produtos de ponto vetor e uma série de operações de adição e multiplicação. E essas operações são realizadas simultaneamente para múltiplos vértices pela GPU porque ele é projetado dessa forma, portanto, novamente aqui estamos explorando a natureza inerente das operações gráficas que é o paralelismo.
Após a coloração, cada vértice de 3D colorido é projetado em para o plano azul. E que novamente é feito usando multiplicação de vetores matricial, já notamos isso antes durante nossa discussão sobre transformação de projeção e a saída que obtemos é fluxo de triângulos nas coordenadas de tela ou dispositivo prontos para serem convertidos em pixels. Agora, observe aqui que essa projeção realmente envolve a transformação de visão também. O que não mencionamos explicitamente aqui assim como a janela para visualizar transformação. Todas essas transformações nós podemos clube juntos multiplicando as matrizes de transformação correspondentes para obter uma matriz de transformação única.
Então, depois desse estágio obtemos os triângulos de espaço do dispositivo e agora vamos para a conversão de rasterização ou varredura. Por isso, aqui pode-se notar que cada triângulo do espaço do dispositivo sobrepõe alguns pixels na tela que significa que aqueles pixels fazem parte dos triângulos. No estágio de rasterização esses pixels são determinados.
Agora, os designers da GPU que desenvolveram GPUs ao longo dos anos incorporaram muitos algoritmos de tal rasterização, nós já discutimos poucos em nossas discussões sobre a rasterização. Agora, esses algoritmos exploram uma observação crucial que é cada pixel pode ser tratado independentemente de todos os outros pixels. Então, não é necessário tratar os pixels como dependentes um do outro eles podem ser tratados de forma independente.
Assim sendo, os pixels podem ser rasterizados de forma paralela, assim você pode usar este paralelismo inerente para rasterizar todos os pixels simultaneamente. E essa é uma grande vantagem de ter GPU, não temos que processar um pixel de cada vez em vez disso podemos processar todos os pixels juntos para obter resultado rápido, saída rápida.
Agora, se você pode se lembrar do pipeline de gráficos 3D, durante o estágio de processamento de pixels existem mais duas etapas que estão lá, mais duas atividades que estão lá, uma é textura de superfície ou atribuindo padrões às cores da superfície e segunda é remoção de superfície oculta ou HSR.
Agora, a ideia de textura de superfície é muito simples aqui a imagem de textura é ali que na verdade é imposta na superfície para nos dar a ilusão de detalhes. Observe que é apenas uma criação de ilusão em vez de realmente computar um padrão de textura, um simplesmente substituindo cores pixel por cor textura. Essa é a ideia mais simples que discutimos anteriormente. (Consulte O Slide Time: 20:40) Agora, a fim de que precisamos armazenar esta textura imagens ou mapas de textura. E já que precisamos acessá-lo, que texture imagens com frequência, idealmente eles devem ser armazenados em memória de alta velocidade, para que o tempo de acesso seja menor. Agora, isso ocorre porque como dissemos cálculos de pixels anteriores são muito frequentes e cada cálculo de pixel deve acessar essas imagens de textura. Em segundo lugar, o acesso costuma ser muito regular na natureza. Isso significa que pixels próximos tendem a acessar imagens de texturas próximas ou locais de imagem de textura. Por isso, para reduzir o tempo de acesso especializado cache de memória é usado para armazenar as imagens de textura como mostrado aqui nesta figura. São locais de memória especializados na GPU para armazenar imagens de textura.
Também, discutimos anteriormente durante nossa discussão sobre remoção de superfície oculta, a ideia de algoritmo de buffer de Z ou algoritmo de buffer de profundidade. Agora, isso é implementado em GPUs e para isso também tipicamente GPUs são equipados com elemento de memória especializado ou buffers de profundidade. E armazena distância de espectadores de cada pixel. Então, isso tipicamente faz parte da GPU.
Agora se você pode se lembrar de como funciona o buffer Z, então aqui também o GPU compara pixels distância com distância de pixel já presente que é ele simplesmente executa o algoritmo e a memória de exibição é atualizada apenas se o novo pixel estiver mais próximo. Então, ele implementa o algoritmo de buffer Z, para mais detalhes você pode consultar a palestra 23. Então, você tem os multiprocessadores de streaming, cada um contendo curso, então estes vários itens de dados para realizar essas operações simultâneas mais armazenamento de textura especializada que formam GPU.
Agora, há mais um conceito que é a ideia de shaders e programação de shader. Vamos tentar entender este conceito de programação em breve a um nível muito introdutório. Em nossa discussão anterior sobre a GPU o que discutimos é que, como os GPUs implementam estágios de pipeline. Agora, nessa discussão se você pode ter notado que há dois amplos grupos de atividades, um é processamento de vértices ou processamento de vértice também chamado de processamento de geometria. Outro é processamento de pixels. Então, esses dois amplos grupos de atividades foram discutidos para explicar o trabalho da GPU.
Agora, durante os primeiros anos de GPUs eles costumavam vir com pipeline de hardware de função fixa, isso significa que todos os estágios de pipeline ou todos os estágios que implementam o pipeline são pré-programados e embutidos no hardware. O conteúdo do GPU dedicou componentes para tarefas específicas e o usuário não tinha controle sobre como essa tarefa deve ser executada e qual unidade de processamento executa qual estágio do pipeline. Então, mais cedo GPU é usado para vir com esse hardware de função fixa que significa que tudo estava predeterminado, qual componente do GPU vai lidar com qual parte do pipeline e o usuário não tinha controle sobre ele. Então, o fluxo era tipicamente assim do programa de usuário os primitivos eram enviados, então componentes estavam lá para processamento de geometria, a saída é de tela 2D coordenadas a partir de lá o processamento de pixels inicia e os componentes foram novamente corrigidos.
Mas aí as pessoas percebem que, isso na verdade está reduzindo a flexibilidade e por causa desse poder de GPU não foi totalmente utilizado. Para alavancar melhor o poder GPU, as GPUs modernas são projetadas para serem programáveis que significa que podemos programá-las. As unidades de função fixa são substituídas por grade unificada de processadores conhecidos como shaders. Então, mais cedo havia unidades de função fixa, agora há uma grade unificada de processadores que são chamados de shaders.
E qualquer unidade de processamento pode ser usada para a realização de qualquer cálculo de estágio de pipeline. E os elementos GPU, ou seja, as unidades de processamento e a memória podem ser reaprovetados através de programas do usuário.
Então, mais cedo tínhamos unidades fixas para realizar estágios diferentes, agora temos instalações comuns que são reutilizadas para realizar estágios diferentes e que é determinado através da programação. Qual porção e como os elementos da GPU, a saber, as unidades de processamento e a memória são utilizadas para a execução de operações relacionadas a uma determinada etapa. A ideia é mostrada aqui como você pode ver uma vez que os primitivos são enviados para o GPU, GPU como um elemento comum, agora o subconjunto desses elementos comuns são usados para diferentes finalidades como você pode ver aqui também a memória também é compartilhada e reutilizada.
Agora, a ideia é que escrevamos programas para usar elementos do GPU, esses programas são chamados de programas shader e a abordagem correspondente é chamada de programação shader. Passemos brevemente pelo básico da programação do shader.
Agora, com o GPU programável que acabamos de introduzir é possível que programador modifique como o hardware GPU processa vértices e tons pixels, shades significa assinais cor aos pixels. Isso é possível ao escrever vertex shaders e shaders de fragmento, estes também são chamados de programas de vértice e programas de fragmento. Estes são termos que você provavelmente já se deparou com estes são usados para especificar para a GPU como usar seu hardware para fins específicos. E essa abordagem como eu disse é conhecida como programação do shader e tem outros nomes também como programação de GPU, programação de hardware gráfico e etc.
Em caso de shader de vértice, o que acontece é que, esses programas são usados para processar vértices ou a geometria. Essencialmente estes programas são utilizados para realizar transformações de modelagem, iluminação e projeção para coordenadas de tela que envolvem todas as transformações intermediárias da transformação de visualização. E conceitualmente a janela para visualizar transformação também.
Em caso de shader de fragmento ele faz um trabalho diferente, são programas que executam as computações necessárias para o processamento de pixels. Agora quais são os cálculos, aqueles estão relacionados a como cada pixel é renderizado, como a textura é aplicada ou mapeamento de texturas e se deve desenhar um pixel ou não que é ocultação de superfície oculta. Então, esses 3 são a tarefa feita por fragmentos de fragmento. Observe que todos estes 3 estão relacionados ao processamento de pixels. Assim, os shaders de vértice são processamento de vértices principalmente relacionados a transformações da coordenada de modelagem para a coordenada de dispositivos, e todas as transformações no entre. Considerando que os shaders de fragmento lidam com o processamento de pixels que é renderização de pixels aplicando texturas, bem como executar remoção de superfície oculta no nível do pixel.
Agora, por que é chamado de fragmento shader as unidades de processamento de pixels, ele implica que a GPU em qualquer instante pode processar um subconjunto ou fragmento de todos os pixels de tela que estão presentes. Então, em um momento um subconjunto dos pixels da tela são processados daí ele é chamado de shader de fragmento.
Agora, esses programas de shader são pequenos pedaços de códigos e eles são enviados para hardware gráfico de programas de usuários tão essencialmente chamando algumas APIs e executadas em hardware gráfico. Então, devemos ter isso em mente que eles são pequenos pedaços de códigos executados em hardware gráfico e que são incorporados em programas de usuários, enviados para o hardware pelos programas do usuário.
De fato, essa capacidade de programar GPUs deu origem a uma nova ideia que é a ideia de propósito geral GPU ou GPGPU. Novamente estes são termos comuns hoje em dia e você provavelmente já se deparou com este termo, isto significa que podemos usar GPU para qualquer propósito não necessariamente apenas para realizar operações relacionadas a gráficos. Assim, com a ideia de GPGPU podemos executar tarefas que não estão relacionadas a gráficos em tudo, entretanto estas são assuntos muito envolvidos e não iremos mais longe para explicar esses conceitos.
Por isso, em síntese o que aprendemos hoje, vamos tentar recapitear rapidamente.
Aprendemos sobre como as ferragens funcionam. Agora, isso significa a unidade de processamento gráfico que são, de qualquer forma, parte dos sistemas de informática que lidam com operações gráficas. Aprendemos também como os estágios de pipeline são implementados na GPU e se introduzimos à ideia de shaders e programas shader.
Agora, isso é sobre hardware. Por isso, na palestra anterior e na palestra de hoje aprendemos sobre hardware gráfico. Começamos com discussão sobre arquitetura geral de um sistema gráfico uma arquitetura muito genérica, depois explicamos termos diferentes e então em alguns detalhes aprenderam como funciona o GPU. Um componente permanece que é como como um programador podemos escrever um programa para realizar operações gráficas. Que vamos aprender esse aspecto do curso que está escrevendo programas para realizar a operação gráfica ou criar uma cena na tela que iremos aprender na próxima palestra, onde iremos aprender sobre programas de escrita utilizando o OpenGL que é uma biblioteca gráfica.
O que quer que tenhamos discutido hoje você pode encontrar neste livro, especificamente o capítulo 10, Seção 10 ponto 3. Isso tudo por hoje, veja você na próxima palestra. Obrigado e bom bye.