RTX Ampere mudou tudo

PC Facts
5 min readSep 9, 2020

Hoje, especificamente, falaremos o que mudou nos CUDA Cores, nos Tensor Cores e nos RayTracing Cores a ponto de permitir um salto tão grande de performance conforme se alega.

Enquanto aguardamos os testes da nova família NVIDIA RTX, resolvemos fazer algo inédito no Brasil. Oferecer um mergulho profundo nos detalhes técnicos da arquitetura Ampere.

Começando pelas unidades básicas da NVIDIA, os Streaming Multiprocessors, mais conhecidos como SMs: Em Ampere, eles ganham mais um datapath ou caminho de dados para Floating Point 32. Isso permite o dobro de operações de ponto flutuantes por ciclo — o que embasa a alegação de dobro de performance.

Maaaaaaaaaaaas, isso nem sempre acontecerá, pois, um dos caminhos de dados permite que a unidade de FP32 faça INT32, então quando o jogo usar INT32, algumas unidades que eram para fazer FP32 naquele caminho de dados estarão fazendo INT 32. Em Turing, dava para fazer INT 32 junto com FP32, mas em ampere não.

Lembrando que cada um dos warp schedulers de Ampere permite warps de até 32 threads, podendo, portanto, particionar um SM de 128 Cuda Cores FP32 em 3 partições de 32 CUDA Cores fazendo FP 32 e 1 partição com 32 CUDA Cores fazendo INT 32. Isso tudo em um ciclo.

Facilitando para entendimento. É possível que tenhamos 100% dos CUDA fazendo FP32 em jogos que não usam INT32, bem como ter 75% dos CUDA Cores fazendo FP32 e 25% fazendo INT 32 em jogos que usam INT32. Como normalmente a proporção é no máximo 70% — 30% FP 32 — INT 32, esse particionamento fica quase que sob medida.

Streaming Multiprocessor Ampere

Adiciono ainda que a banda de cache L1 foi dobrada, justamente para acompanhar esse volume de dados a mais por conta do FP32 dobrado.

Seguindo agora para a evolução nos RayTracing Cores. É fundamental para o RayTracing funcionar, que as unidades de cálculos façam o que a gente chama de travessia da BVH.

BVH de Bounding Volume Hierarchy, ou hierarquia de volumes limitados.

Raio tracejado em um triângulo

O raio é tracejado junto à uma caixa, um volume; depois dentro dessa caixa, é encontrado outro volume e assim sucessivamente, até que a gente encontre o triângulo propriamente dito que vai dar a informação final em retorno.

Raio tracejado com intersecção na primeira caixa da travessia da BVH

A travessia da BVH é importante para economizar raios e não traçar luz em pontos que não vão encontrar geometria. Por isso que é necessária uma árvore para achar o limite de cada volume dentro da cena 3D. Sem isso, você teria que traçar raios sem limites para tudo que é lado.

Travessia da BVH executada até chegar no primitivo (o triângulo)

Se todo esse processo fosse feito em CUDA Cores ou Stream Processors, a execução seria extremamente lenta porque são unidades SIMD (Single Instruction, Multiple Data — em português Instrução única, dados múltiplos). Nesse tipo de carga de trabalho, faz-se necessário MIMD (Múltiplas Instruções, Múltiplos Dados) que é o caso dos RT Cores. Além disso, os RT Cores oferecem hardware específico para execução de BVH.

Comparação de execução de travessia de BVH SIMD contra execução em MIMD (RT Cores)

Mas isso tudo que eu falei da BVH vale para Turing. O que vem de diferença em Ampere é a adição de Interpolação de posição de triângulos no tempo para auxiliar a interseção dos triângulos por raios tracejados.

Diferença entre o RT Core de Turing e o de Ampere

Em outras palavras, para eu tracejar um raio num triângulo, eu já preciso ter passado por todas caixas da hierarquia de volumes — o que toma tempo. Ao poder prever a direção que aquele triângulo vai tomar no frame seguinte com a ajuda dos Motion Vectors, eu não preciso recomeçar o processo todo no frame a seguir — economizando tempo. Economizar tempo representa ganho de performance.

Coordenadas dos Motion Vectors indicando onde estarão os pixels do frame futuro

E é essa a diferença entre o RT Core Turing para o RT Core Ampere. Ele é mais rápido porque ele tem acesso às coordenadas do triângulo do frame futuro. Isso inclusive permite a introdução do Motion Blur com Ray Tracing, já que você consegue prever o movimento do triângulo que está desfocado na cena e expressar corretamente ele no frame final, além de ganhar mais performance por executar essa função com menos raios.

No que se refere às mudanças dos Tensor Cores, que agora estão em sua terceira geração, a palavra que define a diferença entre os usados em Turing e os usados em Ampere é Sparsity, em português: Esparsidade. Acho até que nem existe isso no dicionário.

Sparsity demonstrando maior eficiência na produtividade final

Uma matriz esparsa é a que contém alguns valores zerados ou próximos de zero. E a esparsidade é a propriedade que a inteligência artificial passa a ter para desconsiderar valores zerados e evitar inferências desnecessárias. Há quem diga que, inclusive, dá para desconsiderar valores próximos a zero, também. O objetivo é evitar redundância de resultados inúteis, eliminá-los e ganhar tempo. Economizar tempo representa ganho de performance.

Mas o recurso finalístico, que contempla todos os três ganhos juntos e nos brinda com algo que beneficia a todos juntos é a concorrência e simultaneidade possível entre RayTracing, Deep Learning Super Sample e Graphics — exclusivo de Ampere. Como se pode perceber, ainda há mais ganho na performance quando o DLSS é feito sem esperar pela Rasterização ou pelo RT.

Concorrência de Gráficos, RT e DLSS rendendo 0,8ms a mais (16 FPS de ganhos)

Com essas três mudanças (nos SMs, nos RT Cores e no Tensor Cores), Jen Hsun Huang defende que a NVIDIA conseguiu o Triplo Dobro. Dobrou performance em Raster, em Ray Tracing e DLSS. Realmente, no papel, isso parece promissor, mas sempre recai a responsabilidade à nós de averiguarmos o cenário real para poder afirmar que isso vai acontecer.

Resta-nos aguardar.

--

--