Como Projetar Chips de GPU
Chapter 1 Introduction to Gpu Chip Design

Capítulo 1: Introdução ao Projeto de Chip de GPU

O que são GPUs e como elas diferem das CPUs

As Unidades de Processamento Gráfico (GPUs) são circuitos eletrônicos especializados projetados para manipular e alterar rapidamente a memória, a fim de acelerar a criação de imagens em um buffer de quadros destinado à saída para um dispositivo de exibição. As GPUs foram originalmente desenvolvidas para descarregar o processamento de gráficos 2D e 3D da CPU, permitindo um desempenho muito maior para aplicações intensivas em gráficos, como jogos de vídeo.

Enquanto as CPUs são projetadas para computação de uso geral e apresentam lógica de controle complexa para suportar uma ampla variedade de programas, as GPUs têm uma arquitetura altamente paralela, consistindo em milhares de núcleos menores e mais eficientes, projetados para lidar com várias tarefas simultaneamente. Isso as torna ideais para renderização de gráficos, onde grandes blocos de dados podem ser processados em paralelo.

As principais diferenças arquiteturais entre CPUs e GPUs incluem:

  • Contagem de núcleos: as GPUs têm um grande número de núcleos pequenos (centenas a milhares), enquanto as CPUs têm alguns núcleos grandes e poderosos (2-64).
  • Hierarquia de cache: as CPUs têm grandes caches para reduzir a latência, enquanto as GPUs têm caches menores e dependem mais da alta largura de banda para compensar a latência.
  • Lógica de controle: as CPUs têm previsão de ramificação complexa e capacidades de execução fora de ordem. As GPUs têm lógica de controle muito mais simples.
  • Conjunto de instruções: as CPUs suportam uma ampla variedade de instruções para computação de uso geral. Os conjuntos de instruções das GPUs são mais limitados e otimizados para gráficos.
  • Largura de banda de memória: as GPUs têm uma largura de banda de memória muito alta (até 1 TB/s) para alimentar seus muitos núcleos. As CPUs têm uma largura de banda menor (50-100 GB/s).
  • Desempenho de ponto flutuante: as GPUs são capazes de um desempenho de ponto flutuante muito maior, tornando-as adequadas para cargas de trabalho de HPC e IA.

Em resumo, a arquitetura altamente paralela das GPUs permite que elas se destaquem em tarefas que envolvem o processamento de grandes blocos de dados em paralelo, enquanto a lógica de controle mais sofisticada das CPUs as torna mais adequadas para computação de uso geral.Aqui está a tradução em português deste arquivo Markdown. Para o código, não traduzi o código, apenas os comentários.

Principais aplicações e importância das GPUs

Nas últimas duas décadas, as GPUs se tornaram um dos tipos mais importantes de tecnologia de computação, pois sua estrutura altamente paralela as torna mais eficientes do que CPUs de uso geral para algoritmos que processam grandes blocos de dados em paralelo. Algumas das principais áreas de aplicação que impulsionaram o rápido avanço da tecnologia de GPU incluem:

Gráficos de computador e jogos

O uso mais comum das GPUs é acelerar a criação de imagens em um buffer de quadros destinado à saída para um dispositivo de exibição. As GPUs se destacam na manipulação de gráficos de computador e processamento de imagens, e sua estrutura altamente paralela as torna mais eficazes do que CPUs de uso geral para algoritmos em que grandes blocos de dados são processados em paralelo. Elas são um componente padrão em consoles de jogos modernos e PCs de jogos.

Computação de alto desempenho (HPC)

As capacidades de processamento paralelo das GPUs as tornam adequadas para aplicações de computação científica que envolvem o processamento de conjuntos de dados muito grandes com algoritmos paralelos. As GPUs foram amplamente adotadas em supercomputadores e clusters de HPC, onde trabalham ao lado de CPUs para acelerar cargas de trabalho altamente paralelas, como previsão do tempo, simulações de dinâmica molecular e análise sísmica.

Inteligência artificial e aprendizado de máquina

O poder de processamento paralelo das GPUs foi fundamental para o rápido avanço do aprendizado profundo e da IA nos últimos anos. O treinamento de redes neurais profundas complexas requer uma enorme quantidade de poder de computação, e as GPUs se tornaram a plataforma de escolha para treinar modelos de IA em larga escala devido à sua capacidade de executar eficientemente as operações de multiplicação de matrizes no coração dos algoritmos de aprendizado profundo. Todas as principais plataformas de IA em nuvem e supercomputadores usados para IAAqui está a tradução em português deste arquivo markdown. Para o código, não traduzi o código, apenas os comentários.

Mineração de criptomoedas

As GPUs também têm sido amplamente utilizadas para a mineração de criptomoedas, pois suas capacidades de processamento paralelo as tornam bem adequadas para os algoritmos de hashing criptográfico usados em criptomoedas baseadas em prova de trabalho, como o Bitcoin. As GPUs de alta gama da AMD e Nvidia estavam em altíssima demanda durante o boom das criptomoedas em 2017.

Computação acelerada e IA de borda

Com o lento progresso da Lei de Moore, houve uma tendência significativa em direção à computação acelerada e heterogênea, com chips aceleradores especializados, como GPUs, trabalhando ao lado de CPUs para acelerar cargas de trabalho exigentes. As GPUs também estão sendo usadas para trazer capacidades de IA para dispositivos de borda, como smartphones, alto-falantes inteligentes e sistemas automotivos. Os SoCs móveis agora comumente apresentam GPUs integradas que são usadas tanto para gráficos quanto para acelerar cargas de trabalho de IA.

O paralelismo massivo e a alta largura de banda de memória das GPUs as tornaram uma das plataformas de computação mais importantes hoje, com aplicações que se estendem muito além da computação gráfica. À medida que atingimos os limites dos processadores de uso geral, chips especializados como GPUs, FPGAs e aceleradores de IA estão se tornando motores de computação cada vez mais importantes do futuro.

O cenário dos aceleradores de computação

Como os ganhos de desempenho dos CPUs de uso geral desaceleraram nos últimos anos, tem havido uma tendência crescente em direção a chips aceleradores especializados que podem acelerar cargas de trabalho específicas. As GPUs são um dos exemplos mais proeminentes de aceleradores, mas existem várias outras categorias importantes:

Field Programmable Gate Arrays (FPGAs)

Os FPGAs são dispositivos semicondutores baseados em uma matriz de blocos lógicos configuráveis (CLBs) conectados por meio de interconexões programáveis. Os FPGAs podem ser reprogramados para atender aos requisitos de aplicação ou funcionalidade desejados após a fabricação, oferecendo uma alternativa mais flexível aos ASICs. Eles são comumente usados em aeroespacial e defesa, prototipagem de ASIC, imagem médica### Circuitos Integrados Específicos de Aplicação (ASICs) Os ASICs são circuitos integrados personalizados para um uso particular, em vez de serem destinados a uso geral como os CPUs. Os ASICs modernos geralmente incluem processadores de 32 bits ou 64 bits inteiros, blocos de memória incluindo ROM, RAM, EEPROM, memória flash e outros grandes blocos de construção. Os ASICs são comumente usados na mineração de bitcoins, aceleradores de IA, comunicação sem fio 5G e dispositivos IoT.

Aceleradores de IA

Os aceleradores de IA são chips especializados projetados para acelerar as cargas de trabalho de IA, particularmente o treinamento e a inferência de redes neurais. Exemplos incluem os Tensor Processing Units (TPUs) da Google, os Nervana Neural Network Processors (NNPs) da Intel e uma série de startups construindo chips de IA do zero. Esses chips aproveitam a matemática de precisão reduzida, circuitos eficientes de multiplicação de matrizes e a integração estreita de computação e memória para alcançar um desempenho muito maior por watt do que GPUs ou CPUs em cargas de trabalho de IA.

Unidades de Processamento de Visão (VPUs)

As VPUs são chips especializados projetados para acelerar as cargas de trabalho de visão computacional e processamento de imagem. Eles geralmente incluem hardware dedicado para tarefas como processamento de sinal de imagem, visão estéreo e detecção de objetos baseada em CNN. As VPUs são comumente usadas em aplicações como ADAS automotivo, drones, fones de ouvido AR/VR, câmeras inteligentes e outros dispositivos de borda que exigem processamento visual de baixa latência.

Chips Neuromorfo e Quântico

Olhando mais adiante, os chips neuromorfo tentam imitar a arquitetura do cérebro para fornecer um desempenho de rede neural rápido e eficiente em energia, enquanto os chips quânticos aproveitam os efeitos mecânicos quânticos para resolver certos problemas mais rápido do que os computadores clássicos. Essas ainda são áreas de pesquisa emergentes, mas poderiam se tornar aceleradores importantes no futuro.

A tendência geral na computação é em direção a arquiteturas específicas de domínio e a uma diversidade de aceleradores sendo integrados junto com CPUs de uso geral para acelerar oCargas de trabalho importantes. Os GPUs pioneiraram este modelo de computação acelerada e permanecem um dos tipos mais importantes de aceleradores, mas uma ampla variedade de outros aceleradores também estão se tornando cada vez mais cruciais em muitos domínios de aplicação.

Noções básicas de hardware de GPU

Uma GPU moderna é composta por vários componentes de hardware-chave:

Streaming Multiprocessors (SMs)

O SM é o bloco de construção básico da arquitetura da GPU da NVIDIA. Cada SM contém um conjunto de núcleos CUDA (tipicamente de 64 a 128) que compartilham lógica de controle e cache de instruções. Cada núcleo CUDA tem uma unidade lógica aritmética (ALU) e uma unidade de ponto flutuante (FPU) totalmente encanadas. Tipicamente, um chip de GPU tem de 16 a 128 SMs, resultando em milhares de núcleos CUDA.

Texture/L1 Cache

Cada SM tem um cache de textura dedicado e um cache L1 para melhorar o desempenho e reduzir o tráfego de memória. O cache de textura é projetado para otimizar a localidade espacial e é particularmente eficaz para cargas de trabalho gráficas. O cache L1 lida com operações de memória (carregar, armazenar) e fornece acesso rápido a dados com baixa latência.

Memória Compartilhada

A memória compartilhada é uma memória rápida e on-chip que é compartilhada entre os núcleos CUDA dentro de um SM. Pode ser usada como um cache programável, permitindo um acesso de maior largura de banda e menor latência a dados reutilizados com frequência. A memória compartilhada é dividida em módulos de memória (bancos) de tamanho igual que podem ser acessados simultaneamente pelos núcleos.

Registro de Arquivo

Cada SM tem um grande registro de arquivo que fornece armazenamento de baixa latência para operandos. O registro de arquivo é dividido entre os threads residentes em um SM, fornecendo a cada thread seu próprio conjunto dedicado de registros. Acessar um registro geralmente leva zero ciclos de relógio extras por instrução, mas podem ocorrer atrasos devido a dependências de leitura após gravação e conflitos de banco de memória de registro.

Escalonador de Warps

O escalonador de warps é responsável por gerenciar e agendar warps em um SM. Um warp é um grupo de 32 threads que são executados concorrentemente nos núcleos CUDA.Aqui está a tradução em português deste arquivo Markdown. Para o código, não traduzi o código, apenas os comentários.

Escalonador Warp

O escalonador warp seleciona os warps prontos para execução e os despacha para os núcleos, permitindo alta utilização e ocultação de latência.

Rede de Interconexão

A rede de interconexão conecta os SMs ao cache L2 compartilhado da GPU e aos controladores de memória. Geralmente é implementada como uma chave de cruzamento que permite que vários SMs acessem o cache L2 e a DRAM simultaneamente.

Controladores de Memória

Os controladores de memória lidam com todas as solicitações de leitura e gravação para a DRAM da GPU. Eles são responsáveis por otimizar os padrões de acesso à DRAM para maximizar a utilização da largura de banda. As GPUs modernas têm interfaces DRAM muito largas (256 bits a 4096 bits) e suportam tecnologias de memória de alta largura de banda, como GDDR6 e HBM2.

Núcleos RT e Núcleos Tensor

As GPUs NVIDIA modernas também incluem unidades de hardware especializadas para acelerar o rastreamento de raios (Núcleos RT) e IA/aprendizado profundo (Núcleos Tensor). Os Núcleos RT aceleram a travessia da hierarquia de volumes delimitadores (BVH) e os testes de interseção de raio-triângulo, enquanto os Núcleos Tensor fornecem operações de multiplicação de matriz e convolução de alto desempenho.

Esses componentes de hardware trabalham juntos para permitir que as GPUs alcancem um desempenho computacional e largura de banda de memória muito altos, tornando-as adequadas para cargas de trabalho paralelas em gráficos, HPC e IA. A arquitetura altamente paralela e as unidades de hardware especializadas das GPUs modernas permitem que elas entreguem um desempenho ordens de magnitude maior do que os CPUs de uso geral em determinadas cargas de trabalho.

Uma breve história das GPUs

A história das GPUs pode ser rastreada até os primeiros dias da aceleração de gráficos 3D na década de 1990:

  • Década de 1990: Os primeiros aceleradores 3D, como o 3dfx Voodoo e o NVIDIA RIVA TNT, começaram a aparecer na metade da década de 1990 para descarregar o processamento de renderização gráfica 3D do CPU. Esses eram dispositivos de função fixa otimizados para um conjunto específico de APIs gráficas e careciam de programabilidade.

  • 1999: A NVIDIA introduziu o GeForCAqui está a tradução em português do arquivo markdown, com os comentários traduzidos, mas o código não traduzido:

peline. Ele poderia processar 10 milhões de polígonos por segundo, um marco importante no desempenho gráfico do consumidor.

  • 2001: A NVIDIA lançou o GeForce 3, que introduziu o sombreamento de vértices e pixels programáveis, abrindo caminho para efeitos visuais mais realistas e dinâmicos. Isso marcou o início da transição de pipelines gráficos de função fixa para programáveis.

  • 2006: O lançamento do NVIDIA GeForce 8800 GTX marcou um ponto de virada importante, pois foi o primeiro GPU a suportar o modelo de programação CUDA, permitindo que os desenvolvedores usassem o GPU para computação de propósito geral (GPGPU) além apenas de gráficos. Ele apresentava 128 núcleos CUDA e poderia atingir mais de 500 GFLOPS de desempenho.

  • 2008: Apple, AMD, Intel e NVIDIA formaram o grupo de trabalho OpenCL para desenvolver um padrão aberto para programação paralela em sistemas heterogêneos. O OpenCL forneceu uma alternativa independente de fornecedor ao CUDA, embora o CUDA tenha permanecido a plataforma GPGPU mais amplamente utilizada.

  • 2010: A NVIDIA lançou a arquitetura Fermi, que apresentava até 512 núcleos CUDA, uma hierarquia de cache L1/L2 unificada, suporte a memória ECC e melhor desempenho em precisão dupla. Isso tornou os GPUs viáveis para uma gama mais ampla de aplicações de HPC e computação científica.

  • 2016: A NVIDIA introduziu a arquitetura Pascal com o Tesla P100, que apresentava memória HBM2 de alta largura de banda, até 3584 núcleos CUDA e núcleos FP16 especializados para aprendizado profundo. O P100 poderia entregar mais de 10 TFLOPS de desempenho, consolidando os GPUs como a plataforma de escolha para o treinamento de IA.

  • 2018: A NVIDIA lançou a arquitetura Turing, que introduziu os Núcleos RT para ray tracing em tempo real e os Núcleos Tensor para aceleração de inferência de IA. O Turing marcou um marco significativo na arquitetura de GPU, pois expandiu as capacidades do GPU além apenas da rasterização e GPGPU, incluindo técnicas de renderização avançadas e aceleração de IA.

Conclusão

Nas últimas duas décadas, os GPUs evoluíram de aceleradores gráficos de função fixa para aceleradores altamente programáveis, capazes de executar uma ampla gama de cargas de trabalho, desde gráficos até aprendizado de máquina e computação científica.Aqui está a tradução em português do arquivo markdown, com os comentários de código traduzidos:

Motores de computação eficientes em energia e programáveis que desempenham um papel crítico em uma ampla gama de aplicações, desde jogos e visualização até computação de alto desempenho e inteligência artificial. Inovações arquitetônicas-chave que permitiram essa transformação incluem:

  • A introdução de sombreamento programável com suporte para ramificação e loop
  • Arquiteturas de sombreador unificadas que permitem que as mesmas unidades de processamento sejam usadas para diferentes tarefas de sombreamento
  • A adição de suporte para modelos de programação de uso geral, como CUDA e OpenCL
  • Aumento da eficiência energética por meio do uso extensivo de multithreading para ocultar a latência da memória e manter as unidades aritméticas utilizadas
  • Melhorias contínuas na largura de banda de memória e a introdução de tecnologias de memória de alta largura de banda, como GDDR6 e HBM2
  • A incorporação de unidades de função fixa para rastreamento de raios e processamento de tensor para acelerar a renderização e as cargas de trabalho de IA

Olhando para o futuro, é claro que a especialização e a computação heterogênea continuarão a ser os principais impulsionadores para melhorar o desempenho e a eficiência. As GPUs estão bem posicionadas para permanecer na vanguarda dessas tendências, dada sua herança de processamento paralelo eficiente em energia e sua capacidade de incorporar funcionalidade específica de domínio, mantendo a programabilidade de uso geral. Técnicas como designs baseados em chiplets e tecnologias de empacotamento avançadas permitirão que as GPUs escalem para níveis ainda mais altos de desempenho e integrem ainda mais funcionalidade ao longo do tempo.

Ao mesmo tempo, a aplicabilidade da aceleração por GPU continua a crescer, à medida que cada vez mais cargas de trabalho em computação científica, análise de dados e aprendizado de máquina exibem o tipo de paralelismo de grão fino em que as GPUs se destacam. Com sua capacidade de acelerar essas e outras aplicações emergentes, as GPUs estão prontas para desempenhar um papel cada vez mais importante no impulsionamento de futuros avanços na computação. Entender sua arquitetura é fundamental para desbloquear todo o seu potencial.