# Kepler (microarquitetura)

Kepler é o codinome de uma microarquitetura de GPUs desenvolvida pela Nvidia, apresentada pela primeira vez no varejo em abril de 2012, como sucessora da microarquitetura Fermi. Kepler foi a primeira microarquitetura da Nvidia com foco na eficiência energética. A maioria das GPUs da série GeForce 600, a maioria das séries GeForce 700 e algumas GPUs da série GeForce 800M eram baseadas em Kepler, todas fabricadas em 28 nm. Kepler também encontrou uso no GK20A, o componente GPU do SoC Tegra K1, bem como na série Quadro Kxxx, no Quadro NVS 510 e nos módulos de computação Nvidia Tesla. Kepler foi seguido pela microarquitetura Maxwell e usado junto com Maxwell nas séries GeForce 700 e GeForce 800M.
A arquitetura leva o nome de Johannes Kepler, um matemático alemão e figura-chave na revolução científica do século XVII.

## Visão geral

Enquanto o objetivo da arquitetura anterior da Nvidia era o design focado em aumentar o desempenho em computação e tesselação, com a arquitetura Kepler a Nvidia focou em eficiência, programabilidade e desempenho. O objetivo de eficiência foi alcançado através do uso de um relógio GPU unificado, agendamento estático simplificado de instruções e maior ênfase no desempenho por watt. Ao abandonar o shader clock encontrado em seus designs de GPU anteriores, a eficiência é aumentada, mesmo que sejam necessários núcleos adicionais para atingir níveis mais elevados de desempenho. Isso não ocorre apenas porque os núcleos são mais econômicos (dois núcleos Kepler usando 90% da energia de um núcleo Fermi, de acordo com os números da Nvidia), mas também porque a mudança para um esquema de clock de GPU unificado oferece uma redução de 50% no consumo de energia em aquela área.
O objetivo de programabilidade foi alcançado com o Hyper-Q do Kepler, o paralelismo dinâmico e várias novas funcionalidades Compute Capabilities 3.x. Com ele, foi possível obter maior utilização de GPU e gerenciamento de código simplificado com GPUs GK, permitindo assim mais flexibilidade na programação para GPUs Kepler.
Finalmente, com o objetivo de desempenho, recursos de execução adicionais (mais núcleos CUDA, registros e cache) e com a capacidade do Kepler de atingir uma velocidade de clock de memória de 7 GHz, aumentam o desempenho do Kepler quando comparado às GPUs Nvidia anteriores.

## Recursos

A GPU da série GK contém recursos das gerações mais antigas do Fermi e do Kepler mais recente. Os membros baseados no Kepler adicionam os seguintes recursos padrão:
* Interface PCI Express 3.0
* DisplayPort 1.2
* Saída de vídeo HDMI 1.4a 4K x 2K
* Aceleração de vídeo por Purevideo VP5 (decodificação H.264 de até 4K x 2K)
* Bloco de aceleração de codificação H.264 de hardware (NVENC)
* Suporte para até 4 monitores 2D independentes ou 3 monitores estereoscópicos/3D (NV Surround)
* Next Generation Streaming Multiprocessor (SMX)
* Polymorph-Engine 2.0
* Agendador de instruções simplificado
* Texturas sem encadernação
* Capacidade de computação CUDA 3.0 a 3.5
* GPU Boost (atualizado para 2.0 no GK110)
* Suporte TXAA
* Fabricado pela TSMC em um processo de 28 nm
* Novas instruções de embaralhamento
* Paralelismo Dinâmico
* Hyper-Q (reserva de funcionalidade MPI do Hyper-Q apenas para Tesla)
* Unidade de gerenciamento de rede
* NVIDIA GPUDirect (reserva de funcionalidade RDMA do GPU Direct apenas para Tesla)

### Next Generation Streaming Multiprocessor (SMX)

A arquitetura Kepler emprega uma nova arquitetura de multiprocessador de streaming chamada "SMX". Os SMXs são a razão da eficiência energética do Kepler, já que toda a GPU usa uma única velocidade de clock unificada. Embora o uso de um único relógio unificado pelo SMX aumente a eficiência de energia devido ao fato de que vários núcleos Kepler CUDA de clock mais baixo consomem 90% menos energia do que vários núcleos Fermi CUDA de clock mais alto, unidades de processamento adicionais são necessárias para executar um warp inteiro por ciclo. Dobrar de 16 para 32 por array CUDA resolve o problema de execução de warp, o front-end SMX também é duplo com agendadores de warp, unidade de despacho e o arquivo de registro duplicado para entradas de 64K para alimentar as unidades de execução adicionais. Com o risco de inflar a área da matriz, os motores SMX PolyMorph são aprimorados para 2.0 em vez de dobrar ao lado das unidades de execução, permitindo estimular o polígono em ciclos mais curtos. Existem 192 shaders por SMX. Núcleos FP64 CUDA dedicados também são usados, pois todos os núcleos Kepler CUDA não são capazes de FP64 para economizar espaço na matriz. Com a melhoria que a Nvidia fez no SMX, os resultados incluem um aumento no desempenho e eficiência da GPU. Com o GK110, o cache de textura de 48 KB é desbloqueado para cargas de trabalho de computação. Na carga de trabalho de computação, o cache de textura torna-se um cache de dados somente leitura, especializado em cargas de trabalho de acesso à memória desalinhadas. Além disso, foram adicionados recursos de detecção de erros para torná-lo mais seguro para cargas de trabalho que dependem de ECC. A contagem de registros por thread também é duplicada no GK110 com 255 registros por thread.

### Agedador de instruções simplificado

A redução adicional do espaço da matriz e a economia de energia foram obtidas com a remoção de um bloco de hardware complexo que cuidava da prevenção de riscos aos dados.

### GPU Boost

GPU Boost é um novo recurso que é aproximadamente análogo ao turbo boost de uma CPU. É sempre garantido que a GPU funcione em uma velocidade de clock mínima, conhecida como “clock base”. Esta velocidade de clock é definida em um nível que garantirá que a GPU permaneça dentro das especificações TDP, mesmo com cargas máximas. Quando as cargas são mais baixas, entretanto, há espaço para que a velocidade do clock seja aumentada sem exceder o TDP. Nesses cenários, o GPU Boost aumentará gradualmente a velocidade do clock em etapas, até que a GPU atinja uma meta de potência predefinida (que é 170 W por padrão). Ao adotar essa abordagem, a GPU aumentará ou diminuirá seu clock dinamicamente, de modo que forneça a máxima velocidade possível, permanecendo dentro das especificações TDP.
A meta de energia, bem como o tamanho das etapas de aumento do clock que a GPU executará, são ajustáveis ​​por meio de utilitários de terceiros e fornecem um meio de overclock de placas baseadas em Kepler.

### Suporte Microsoft Direct3D

As GPUs Nvidia Fermi e Kepler da série GeForce 600 suportam a especificação Direct3D 11.0. A Nvidia afirmou originalmente que a arquitetura Kepler tem suporte completo para DirectX 11.1, que inclui o caminho Direct3D 11.1. Os seguintes recursos Direct3D 11.1 de "UI moderna", no entanto, não são suportados:
* Rasterização independente de alvo (somente renderização 2D).
* Rasterização 16xMSAA (somente renderização 2D).
* Modo de renderização de linha ortogonal.
* UAV (Unordered Access View) em estágios sem pixel shader.
De acordo com a definição da Microsoft, o nível de recurso 11_1 do Direct3D deve estar completo, caso contrário, o caminho do Direct3D 11.1 não poderá ser executado. Os recursos Direct3D integrados da arquitetura Kepler são os mesmos da arquitetura Fermi da série GeForce 400.

### Suporte Next Microsoft Direct3D

As GPUs NVIDIA Kepler da série GeForce 600/700 suportam nível de recurso Direct3D 12 11_0.

### Suporte TXAA

Exclusivo para GPUs Kepler, TXAA é um novo método de anti-aliasing da Nvidia projetado para implementação direta em mecanismos de jogos. TXAA é baseado na técnica MSAA e em filtros de resolução personalizados. Ele foi projetado para resolver um problema importante em jogos conhecido como shimmering ou temporal aliasing. O TXAA resolve isso suavizando a cena em movimento, certificando-se de que qualquer cena do jogo esteja livre de qualquer serrilhado e brilho.

### Shuffle Instructions

Em um nível baixo, o GK110 vê instruções e operações adicionais para melhorar ainda mais o desempenho. Novas instruções de embaralhamento permitem que threads dentro de um warp compartilhem dados sem voltar para a memória, tornando o processo muito mais rápido do que o método anterior de carregar/compartilhar/armazenar. As operações atômicas também foram revisadas, acelerando a velocidade de execução das operações atômicas e adicionando algumas operações FP64 que anteriormente estavam disponíveis apenas para dados FP32.

### Hyper-Q

O Hyper-Q expande as filas de trabalho de hardware do GK110 de 1 para 32. A importância disso é que ter uma única fila de trabalho significava que Fermi poderia ficar subocupado às vezes, pois não havia trabalho suficiente naquela fila para preencher todos os SM. Por ter 32 filas de trabalho, o GK110 pode, em muitos cenários, alcançar maior utilização ao ser capaz de colocar diferentes fluxos de tarefas no que de outra forma seria um SMX ocioso. A natureza simples do Hyper-Q é ainda reforçada pelo fato de que ele é facilmente mapeado para MPI, uma interface comum de passagem de mensagens frequentemente usada em HPC. Como algoritmos herdados baseados em MPI que foram originalmente projetados para sistemas multi-CPU que ficaram obstruídos por falsas dependências agora têm uma solução. Ao aumentar o número de trabalhos MPI, é possível utilizar o Hyper-Q nesses algoritmos para melhorar a eficiência, tudo sem alterar o código em si.

### Paralelismo Dinâmico

A capacidade de paralelismo dinâmico permite que os kernels possam despachar outros kernels. Com o Fermi, apenas a CPU poderia despachar um kernel, o que incorre em uma certa sobrecarga ao ter que se comunicar de volta com a CPU. Ao dar aos kernels a capacidade de despachar seus próprios kernels filhos, o GK110 pode economizar tempo por não ter que voltar para a CPU e, no processo, liberar a CPU para trabalhar em outras tarefas.

### Unidade de gerenciamento de rede

Habilitar o paralelismo dinâmico requer um novo sistema de gerenciamento de rede e controle de despacho. A nova Unidade de Gestão de Rede (GMU) gerencia e prioriza as redes a serem executadas. O GMU pode pausar o envio de novas grades e enfileirar grades pendentes e suspensas até que estejam prontas para execução, proporcionando flexibilidade para permitir tempos de execução poderosos, como o paralelismo dinâmico. O Distribuidor de Trabalho CUDA no Kepler mantém redes prontas para despacho e é capaz de despachar 32 redes ativas, o que é o dobro da capacidade do Fermi CWD. O Kepler CWD se comunica com a GMU através de um link bidirecional que permite à GMU pausar o envio de novas redes e manter redes pendentes e suspensas até que sejam necessárias. A GMU também tem uma conexão direta com as unidades Kepler SMX para permitir grades que lançam trabalho adicional na GPU via Paralelismo Dinâmico para enviar o novo trabalho de volta à GMU para ser priorizado e despachado. Se o kernel que despachou a carga de trabalho adicional for pausado, o GMU o manterá inativo até que o trabalho dependente seja concluído.

### NVIDIA GPUDirect

NVIDIA GPUDirect é um recurso que permite que GPUs em um único computador, ou GPUs em diferentes servidores localizados em uma rede, troquem dados diretamente sem a necessidade de ir para a CPU/memória do sistema. O recurso RDMA no GPUDirect permite que dispositivos de terceiros, como SSDs, NICs e adaptadores IB, acessem diretamente a memória em várias GPUs no mesmo sistema, diminuindo significativamente a latência de envio e recebimento de mensagens MPI de/para a memória da GPU. Ele também reduz a demanda pela largura de banda da memória do sistema e libera os mecanismos GPU DMA para uso em outras tarefas CUDA. Kepler GK110 também oferece suporte a outros recursos GPUDirect, incluindo Peer-to-Peer e GPUDirect for Video.

### Descompressão/compressão de vídeo
#### NVENC

NVENC é a codificação de função fixa com baixo consumo de energia da Nvidia, capaz de receber codecs, decodificar, pré-processar e codificar conteúdo baseado em H.264. Os formatos de entrada da especificação NVENC são limitados à saída H.264. Mesmo assim, o NVENC, através de seu formato limitado, pode suportar codificação de até 4096x4096.
Assim como o Quick Sync da Intel, o NVENC é atualmente exposto por meio de uma API proprietária, embora a Nvidia tenha planos de fornecer uso do NVENC por meio de CUDA.

## Desempenho

O poder teórico de processamento de precisão única de uma GPU Kepler em GFLOPS é calculado como 2 (operações por instrução FMA por núcleo CUDA por ciclo) × número de núcleos CUDA × velocidade de clock do núcleo (em GHz). Observe que, como a geração anterior do Fermi, o Kepler não é capaz de se beneficiar do aumento do poder de processamento com a emissão dupla de MAD + MUL como o Tesla era capaz.
O poder teórico de processamento de precisão dupla de uma GPU Kepler GK110/210 é 1/3 de seu desempenho de precisão única. No entanto, esse poder de processamento de precisão dupla está disponível apenas em placas profissionais Quadro, Tesla e placas GeForce de ponta da marca TITAN, enquanto os drivers para placas GeForce de consumo limitam o desempenho a 1/24 do desempenho de precisão única. Os chips GK10x de desempenho inferior são similarmente limitados a 1/24 do desempenho de precisão única.

## Chips Kepler

* GK104
* GK106
* GK107
* GK110
* GK208
* GK210
* GK20A (Tegra K1)