Há poucos meses, a Nvidia lançou uma nova série de placas baseadas na arquitetura Maxwell. As GTX 970 e GTX 980 chegaram para substituir a série anterior trazendo mudanças importantes no interior.
Logo que chegou ao mercado, a GeForce GTX 970 apresentou um desempenho muito bom, assim como um valor mais acessível que a GTX 980. Porém, há pouco tempo, testes demonstraram alguns problemas com a arquitetura de memória da GTX 970.
Foi constatado que, apesar de a placa vir com 4 GB de RAM, ela não era capaz de oferecer toda a memória para o sistema. Pelo menos não com o mesmo desempenho. Para tentar esclarecer um pouco essa situação, nós conversamos com dois especialistas no assunto: direto do Teclab, Ronaldo "rbuass" Buassali e Jacson "bros" Schenckel mostram o que levou a placa a apresentar esses resultados conflitantes.
Porém, na verdade isso não é um problema na arquitetura, pois a placa foi projetada desde o início para funcionar assim. O único "erro" da NVIDIA, se é que podemos falar assim, foi não ter passado todas as informações para o público no momento do lançamento da GPU.
Como é a arquitetura de memória da GeForce GTX 970
A GeForce GTX 970 apresenta um novo subsistema de memória. A nova metodologia de funcionamento trabalha com uma memória particionada em dois, sendo que a primeira partição tem 3,5 GB e a segunda, 0,5 GB.
A ideia desse texto é mostrar o que acontece dentro desta faixa de utilização (uso de 3,5 GB a 4,0 GB) e determinar se existe perda significativa de desempenho por causa da diferença de arquitetura.
O teste que levantou as polêmicas foi o Nai's Benchmark. Mas esses resultados são reais? Sim, mas com ressalvas. Esse é um benchmark feito para Teslas, que não são exatamente placas de vídeo como as GeForce.
Teslas são feitas para trabalhar em headless mode (sem monitor). Assim, ela não tem saída de vídeo. Portanto, se for utilizado com uma GTX 970, a placa terá que reservar uma parte da memória, o que faz com que o programa não consiga acessar toda a RAM disponível na placa.
Quem quiser utilizar esse programa, deverá utilizar outra placa de vídeo (que não seja NVIDIA) ou mesmo uma "onboard" para o monitor. Isso garante que a memória de vídeo da placa que será testada não seja reservada.
Não sendo assim, ela não vai detectar toda a memória e ainda terá o desempenho afetado por ter a placa "brigando" com o desktop para "dividir" a memória, o que tira de certa forma o sentido do teste.
Por que a segunda partição (0,5 GB) é mais lenta?
Isso tem a ver com a seleção dos chips depois que eles são fabricados. Imagine uma "fornada" de chips saindo (waffle). Suas partes individuais são testadas. Não somente o funcionamento perfeito, mas ações como a verificação de frequência e o consumo, entre outras, serão avaliadas e, assim, os chips GM204 (chip da GTX 980 e GTX 970) são classificados ou descartados.
Cada um desses chips produzidos demonstra resultados ligeiramente diferentes uns dos outros, e alguns apresentam pequenas imperfeições. Essas imperfeições não são falhas físicas como “buracos”, por exemplo. Na maioria das vezes, elas significam que o chip não poderá suportar a mesma frequência que um chip perfeito. Porém, com um Clock menor, ele funcionará perfeitamente.
No caso dos chips da NVIDIA, em vez de lançar uma GTX 980 com clocks menores, a empresa utiliza esses produtos para fabricar a GTX 970, fazendo com que aquele SM que não alcança a frequência projetada fique desabilitado, e o resto da GPU possa trabalhar normalmente.
Imagem do GM204, presente na GTX 980.
Esse recurso é normal e utilizado por outras empresas, como a Intel e AMD, nas quais é comum verificar modelos similares, porém com detalhes subtraídos (como cache, frequência etc.).
A ideia é aproveitar a produção, já que a confecção desses produtos é um processo caro e demorado. Dessa maneira, a empresa pode ter linhas diferentes de produtos e garantir que todos funcionam de forma adequada e sempre com sua capacidade total.
Quer saber mais sobre o assunto? Clique aqui para ver como são fabricados os processadores.
Mas o que mudou da GTX 980 para a GTX 970?
Na hora de desabilitar alguns recursos do GM204, foram desabilitados alguns CUDA cores. Vamos supor que cada CUDA core seja um "processadorzinho", e que cada um desses tenha uma série de unidades (inteiro, ponto flutuante etc.).
Um CUDA core dentro de uma GPU (Graphic Processing Unit) trabalha de uma maneira bastante simples, pois só tem uma unidade de inteiro e uma de ponto flutuante, e o "resto” da GPU se encarregará das instruções.
A ideia é ter milhares desses pequenos núcleos e conseguir distribuir uma grande quantidade de trabalho entre eles. O chip GM204 que roda na GTX 980 possui 16 SM (são 4 GPCs – Graphic Processing Cluster –, e dentro de cada um existem 4 SMs, sendo que cada SM tem 128 CUDA cores).
No caso da GTX 970, desabilitaram-se 384 CUDA cores (3 SMs). Verifica-se também que dos 4 controladores de memória (imaginemos que temos uma controladora de memória para cada chip de memória), só que cada 2 dessas ficam dentro de um bloco de ROPs (Render Output Unit), então temos 4 controladores de framebuffer e, dentro de cada controladora dessa, 2 controladores de memória de 32 bits.
Vamos esclarecer melhor
Até a arquitetura Kepler (geração anterior), qualquer imperfeição ocasionava a desativação de um bloco todo e, neste caso, a placa cairia de 256 bits para 192. Agora, com o processo mais refinado, faz mais sentido desabilitar alguns ROPs, pois eles ficariam de qualquer maneira sem utilidade. Isso pois quem iria acessá-los seriam os CUDA cores desabilitados.
Mas e o cache menor?
A memória cache possui densidade muito alta, portanto é muito provável que se achem imperfeições em alguma região quando os novos chips são testados.
Podemos ver isso, por exemplo, em um processador Core i7 para Notebook que vem com parte do cache desabilitada, até em um mesmo processador. Existem muitos exemplos assim.
Então já há um bom tempo que empresas como Intel, NVIDIA e AMD buscam o melhor aproveitamento do chip, e agora, no caso da NVIDIA, a empresa busca implementar essa análise de granularidade também para outros componentes da GPU (cache, controladora de memória etc.).
Isso explica o fato de a GTX 970 ter 1,75 MB de Cache L2, e a GTX 980, 2,0 MB de L2. Isso também explica por que a placa teve a memória dividida em duas partes, sendo uma principal e mais rápida, de 3,5 GB, e outra mais lenta, de 500 MB, que é utilizada apenas quando é necessário.
Como isso funciona nos games?
Para os testes apresentados, foram adotados benchmarks que utilizariam entre 3,5 e 4 GB de memória. Dessa forma, a placa trabalha em sua faixa crítica e é obrigada a usar a parte "mais lenta" da memória.
É sabido que se a requisição de memória ultrapassar a memória disponível (4 GB), a queda de desempenho vai ser brutal, pois o aplicativo vai buscar a próxima memória disponível. Isso acontece porque o jogo não sabe quanta memória de vídeo ele tem, então ele "pede" para o sistema operacional, e este vai alocar onde for possível.
Se essa memória está disponível na placa de vídeo, ótimo, se não, ela vai alocar de outro lugar e fazer o que chamamos de "swap", que é um processo bastante lento. Por isso, se "estourar" a memória, o framerate cai demais.
Atualmente, existem jogos que demandam quantidades muito altas de memória de vídeo.
Watch Dogs, Assasin´s Creed Unity, Shadow of Mordor, entre outros, são games que podem usar muita memória gráfica, sendo que alguns deles já contam com opções que solicitam 6 GB (ex. Shadow of Mordor no Ultra).
Atualmente, somente a GTX Titan tem essa capacidade entre as placas "gamer". Podemos monitorar isso com softwares (ex. GPUz, Afterburner) e comprovar na vida real.
Um game como Assassin´s Creed Unity, por exemplo, que tem 3 alternativas de jogo (baixo, médio e alto), pede como demanda respectivamente 2 GB, 3 GB e 4 GB, mas se desejar jogar ele em 4K, com todos os recursos no máximo, certamente ele pode ultrapassar essa quantidade e, conforme dissemos, promover a queda brusca de FPS do seu jogo, caso sua GPU não possua a quantidade de memória exigida.
Assim sendo, é muito importante dimensionar a quantidade de recursos e efeitos para que isso "caiba" na sua placa de vídeo.
O que são os detalhes, texturas, filtros?
Podemos dizer, de forma simples, que dentro do jogo temos três tipos de opções gráficas.
Nível de detalhes
Isso vai definir a complexidade da geometria dos modelos. De acordo com o nível de detalhes de um cenário, teremos a fidelidade com que a imagem é representada. Então precisamos imaginar que algo como "polígonos por objeto" e, normalmente, mais texturas vão exigir mais componentes.
Imagine uma cena de um jogo FPS, na qual a definição “baixo detalhe" signifique 1 mil polígonos, a média seriam 3 mil e a alta, 10 mil polígonos.
Então, isso afeta diretamente o desempenho, pois estamos gerando mais objetos por quadro e, consequentemente, imagens mais definidas, o que aumenta a carga de trabalho da GPU.
Logicamente existe carga para a memória, mas, neste caso, o aumento do trabalho para o processador gráfico é muito mais incisivo.
Qualidade de texturas
Esse item pode ser dividido em duas partes: qualidade de ambiente e qualidade de texturas.
Normalmente são definidas no game, sendo exemplos de qualidade de texturas (ex. de alta resolução, baixa resolução) e qualidade do ambiente (low, medium, high, ultra), e isso afeta a fidelidade com que os modelos são criados.
A qualidade das texturas tem impacto direto sobre a quantidade de memória utilizada, ou seja, quanto maior a qualidade, mais memória de vídeo será necessária. Esse impacto não será tão grande na GPU, já que as texturas geralmente são imagens estáticas sobre os polígonos já processados.
Para resumir:
— Geometria determina mais trabalho para a GPU;
— Resolução das texturas, mais volume de memória. Aumenta pouco a carga da GPU, desde que tenha memória suficiente.
Anti aliasing – Filtro antisserrilhamento
Se nós renderizarmos uma imagem sem este filtro, vamos perceber a presença de uma "escada", principalmente em linhas que não estejam em ângulo reto. Isso acontece porque todas as imagens são construídas com polígonos, que são pequenos triângulos “empilhados” uns nos outros para a composição dos objetos.
O que o filtro anti aliasing faz?
Ele acrescenta pixels com cores intermediárias nas bordas que existem entre as linhas retas e, dessa forma, suaviza as bordas das imagens para garantir uma qualidade visual melhor.
Este trabalho pesa tanto para a GPU quanto para a memória, pois, para realizar esse trabalho, o filtro (Multi Sample Anti Aliasing – MSAA, por exemplo) vai pegar 2, 4 ou 8 amostras. Dessa forma, ampliamos o tamanho do framebuffer.
Podemos imaginar que temos quatro pixels dentro de cada um, e isso determina que quatro vezes mais espaço na memória será necessário para o framebuffer. Isso pesa bastante para a GPU e bastante para a memória.
Pode-se também comprovar facilmente por meio de software (Afterburner, GPUz) quando, por exemplo, ativamos ou desativamos ele e verificamos a grande diferença entre o trabalho da memória e do uso de GPU pela placa.
Mas aumentar a resolução também requer mais carga da GPU e da memória.
O que acontece quando aumentamos a resolução?
Se aumentarmos a resolução, teremos mais pixels, então o framebuffer dentro da memória de vídeo vai ocupar mais espaço. Se a mudança de resolução é pequena (ex. 1080P para 1440P), embora seja aproximadamente 33% a mais de resolução, o Framebuffer não ocupará tanto espaço dentro da memória da GPU.
Uma unidade de framebuffer de 1080P ocupa só 8 MB, mas serão necessárias duas unidades (double buffering). Então, enquanto a imagem tem um buffer na memória (imagem que está na tela), tem outro buffer que é o que a GPU está usando para gerar a próxima imagem para ele trocar quando esta ficar pronta.
O que os testes mostraram?
A equipe da NV procurou cenários em que a memória trabalhasse entre 3,5 e 4 GB de memórias, sem ultrapassar esse limite.
Configuraram o game Battlefield 4 para utilizar mais do que 3,5 GB, e então, mesmo com tudo no limite, o game não alcançou o valor mínimo de 3,5 GB, e os FPS verificados (médio) foram respectivamente 36 e 30 (GTX 980 e GTX 970). Após isso, aumentaram a resolução do game para 135% (opção do jogo BF4), consequentemente aumentando as cargas de memória e também de GPU, afinal são 35% a mais de pixels para renderizar.
Independente da memória utilizada, por si só, isso já causaria a queda de desempenho, e as conclusões foram essas:
Nessas condições (resolução 4K, AA em 2X e requisições máximas), no Battlefield 4 houve uma perda de 47% para a GTX 980, quando se trabalhou nessa "faixa crítica". Considerando-se a GTX 980, que acessa toda a memória a 100% (sem imperfeições), existiu a perda natural de performance pelas condições de trabalho.
Nesta mesma condição, a GTX 970 teve uma queda de desempenho de 50%, ou seja, perdeu só um pouco em relação à sua irmã maior.
Para elucidar melhor, as requisições de GPU e memória foram aumentadas, e nessas condições ela perdeu uma porcentagem pequena nesta faixa de memória, sendo que os outros 3,5 GB utilizaram as memórias no máximo.
Para resumir:
— GTX 980 a 36 FPS perdeu 47% de desempenho
— GTX 970 a 30 FPS perdeu 50% (sendo que se ela tivesse a memória completa, perderia "teoricamente" os mesmos 47%, ou até mais, pois ela tem menos CUDA cores).
Então, deve-se considerar, levando em conta as variáveis envolvidas, uma perda entre 3% e 4% relacionada à questão da memória.
Micro stuttering, tearing, que bicho é esse?
Quando estamos renderizando uma imagem (ex. Vsync ligado, 60 Hz), precisamos ficar nos 60 quadros por segundo para que a cena seja fluida, além de garantir que o espaçamento entre um quadro e outro seja constante.
Cada frame dura 16.6 ms (16.67 x 60 = 1 segundo). Sendo assim, a placa deve processar o frame em menos de 16.6 ms para que esteja pronto na atualização do monitor. Cada frame é uma corrida contra o tempo, pois ele lê a entrada, processa a geometria, filtra etc., e tudo isso em menos de 16 ms.
Quando desativamos o VSYNC, a placa fica livre e não precisa respeitar a hora da atualização do monitor. Se não houver essa capacidade de processar perfeitamente todos os quadros, estaremos provocando o tearing (corte na imagem que aparece quando vemos um pedaço da imagem atual e outro do quadro seguinte), percebido como uma quebra de imagem conhecida pelos gamers.
Já o stuttering acontece quando os quadros são processados em tempos muito diferentes. Imaginemos que temos quadros fluindo a 16ms, 15ms, 17ms, 16ms, e valores próximos em milissegundos, permitindo a boa fluência da imagem. Se tivermos grande diferença de tempo entre cada quadro, teremos essa imperfeição na imagem (ex. 16ms, 8ms, 25ms, 27ms, 7ms).
Dizemos que tem um jitter (tamanho das fatias de tempo) muito alto, então, por não conseguir terminar a tela naqueles 16 ms, o monitor repete a imagem que está na tela e terá que esperar mais 16 ms para terminar a imagem (que só aparecerá na atualização seguinte). É como uma "engasgada".
Próximo desafio a ser vencido: micro stuttering
Para avaliar o micro stuttering, é preciso rodar um teste que se chama Fcat.
O Fcat consiste em várias etapas. Primeiro é preciso capturar a imagem do jogo em vídeo, diretamente na saída da placa. Depois, é preciso passar esse vídeo dentro de um programa, que vai analisar quanto tempo demora o processamento de cada frame.
Para isso, precisamos de uma placa de captura DVI, capaz de capturar vídeo sem compressão e resolução máxima (em 60 Hz), além de uma máquina forte, pois são pelo menos 400 MB por segundo de escrita.
Através da análise desses quadros é que será possível perceber quanto tempo aquele frame específico precisou para chegar na tela.
Considerações finais
A GTX 970 foi lançada como uma placa fantástica, pois conseguia, por um custo relativamente baixo, oferecer uma performance de "gente grande".
Nada disso mudou. O fato de a placa ter parte de sua memória "mais lenta" não é suficiente para comprometer seu desempenho, pois a arquitetura utilizada permite que se trabalhe muito bem desta forma.
Obviamente, acreditamos que o modo de funcionamento do subsistema de memória visa a diminuição dos custos para que seja possível manter a placa no patamar de preço atual. Se não fosse assim, ela teria um preço muito mais próximo da GeForce GTX 980.
Isso significa que, apesar de o sistema de memória da GTX 970 realmente apresentar diferenças em relação ao que foi apresentado inicialmente pela NVIDIA, na prática, ela continua sendo uma ótima placa de vídeo e apresenta um desempenho excelente para a sua faixa de preço.
Texto por Ronaldo Buassali