CPU VS GPU – Encontrando o Gargalo — Pt 2


Neste post irei discutir um pouco sobre algumas maneiras que temos para perceber se um jogo esta limitado pela CPU ou pela GPU . Irei também falar brevemente sobre como remover gargalos no caso da aplicacão esta limitada pela GPU. (Link para parte 1)

Inicialmente recomendo que o pessoal tenha lido o primeiro tutorial da série.

Em jogos, normalmente encontramos os seguintes tipos de gargalos  :

  1. CPU bound (o processador é o fator limitante no seu jogo)
  2. GPU bound (a placa de vídeo é o fator limitante no seu jogo)
  3. Equilíbrio (CPU e GPU estão sob a mesma carga,praticamente impossível de alcançar em uma execução completa de um jogo)

Nao existe uma maneira simples de detectar se estamos CPU e GPU bounded.

O blog do Shawn Hargreaves contem uma serie de passos que podemos seguir para tentar descobrir em qual caso acima estamos. Irei me basear um pouco no post dele neste artigo, porem sem focar exclusivamente no XNA.

O primeiro e básico passo nesta procura é:

  • Desabilitar qualquer espécie de sistema que controle o frame rate da aplicação. Alguns jogos/engines usam um sistema interno de clock que forcam o FPS a um determinado numero fixo.
  • Desabilitar o V-Sync (vertical synchronization)

Em seguida começamos os testes:

O primeiro é feito para detectar se voce esta CPU Bounding usando um profiler de CPU.

A idéia é ver se o tempo gasto em seu aplicativo percentualmente esta mais concentrado nos métodos que realizam tarefas exclusivamente de CPU (como a maioria dos sistemas de inteligência artificial por exemplo). Se voce encontrar numeros alarmantes nos métodos CPU, voce provavelmente estara CPU BOUNDED. Se voce perceber que uma grande parcela do tempo esta sendo gasta em metodos que realizam operacoes graficas, voce nao poderá concluir que sua aplicacão está GPU BOUNDED (lembre do ultimo post, a tarefa de desenhar uma primitiva é um conjunto de operacões executadas tanto pela CPU quanto pela GPU).

Caso o seu aplicativo esteja gastando muito tempo na funcao chamada Present do DirectX (responsavel por traduzir as chamadas gráficas para o driver de vídeo executa-las (o opengl deve ter uma semelhante), conforme discutido no post anterior), isto pode significar que voce esta GPU Bound (o Present pode estar esperando a GPU terminar de desenhar o frame anterior e por isto estar demorando mais que o normal), porém em alguns casos pode significar que a CPU esta gastando muito tempo para converter as chamadas gráficas em instrucoes para a GPU. Para descobrir em qual caso voce está, a melhor maneira é (infelizmente) alterar o codigo que roda exclusivamente na CPU e verificar o que acontece com o frame rate. Tomar cuidado para não alterar algo que tenha a ver com desenho de primitivas (desenhar depende da GPU e CPU, se voce fizer isto,  nao podera concluir nada com a resposta obtida, deve-se alterar apenas trechos que dependam exclusivamente da CPU ou da GPU)

Um exemplo de alteração possivel é desabilitar uma parte do calculo da IA, se o frame rate nao mudar, voce esta GPU BOUND, se ele mudar sensivelmente voce esta CPU BOUND.

Uma vez que descobrimos que estamos GPU bound, precisamo saber em que estagio da pipeline da GPU esta o nosso gargalo. É interessante utilizar um profiler de GPU como o PerfHud neste caso. Devemos olhar para os graficos que mostram a carga de operacão nas unidades Vertex e Pixel shader (DirectX 9c), além de verificar acesso a texturas e memória utilizada. Esta tarefa é bastante: “experiência, conhecimento da técnica usada e tentativa e erro”, não existe uma receita pronta.

Situação comuns de GPU Bound (e solucões possíveis )são:

  • Ter um Pixel Shader muito complexo. (Não há solucão simples, tente simplificar o algoritmo, usar texturas com valores pré-calculados, prefira se possível passar os cálculas para o Vertex Shader e utilizar os valores interpolados pelo rasterizador)
  • Ter um Vertex Shader muito complexo. (Não há solucão simples, tente simplificar o algoritmo, usar texturas com valores pré-calculados)
  • Efetuar muitas leituras de texturas no Pixel Shader (Não há solucão simples, tente simplificar o algoritmo, usar filtros mais simples como Point ou Linear)
  • Desenhar muitas primitivas diferentes usando shaders diferentes (Efetue na CPU uma ordenação dos objetos a serem desenhados a fim de minimizar a troca de estados da GPU)
  • Desenhar muitas primitivas (considere o uso de instancing para o caso de objetos iguais, tente usar estruturas cache friendly ao armazenar os vértices, considere o uso de estruturas de particão espacial (como uma Octree) para ajudar fazendo Culling na CPU)

A seguir listei os parametros que mais afetam cada um dos estágios da pipeline da GPU, :

Input Assembler

  • Número de vértices enviados
  • Tamanho de cada vértices (quantidade de dados enviado por vértices)
  • O quão ordenado estão os vértices (coerência de cache).

Vertex shader

  • Número de vértices enviados
  • Complexidade do código rodado nesta unidade
  • Quanto ordenados estão os vértices do triângulos para coerência de cache.

Rasterizer

  • Número de pixel renderizado (Resolução da tela)
  • Número de valores a serem interpolados passados do Vertex para o Pixel Shader

Pixel shader

  • Número de pixels renderizados
  • Complexidade do Pixel Shader (funções utilizadas, tamanho, fluxo de dados, complexidade dos algoritmos utilizados)

Texture fetch (leitura de texels)

  • Número de Pixels renderizados
  • Quantidade de leituras de textura por pixel
  • Quantidade de dados de textura lidos da memória
  • Texturas com Mipmap normalmente tem maior coerência de cache
  • Compressão de textura utilizada
  • Tipo de filtros aplicados
  • Anisotrópico é o mais caro
  • Trilinear é a segunda mais lenta
  • Bilinear e Point são as que possuem os menores custos

Depth/stencil testes

  • Número de pixels renderizados
  • Uso de MultiSampling (Antialiasing)
  • Configuração do Depth/Stencil (modo read/write vs. read-only )

FrameBuffer

  • Número de pixel renderizado
  • Uso de MultiSampling
  • Tamanho de cada pixel em termo de bytes (including MRT)
  • Modo read/write (alpha blending) vs. write-only (opaco)

As informacoes acimas foram retiradas de blogs especializados, livros e da minha experiência no assunto.

Uma última dica importante que ouvimos todos os dias, mas ninguém segue. Otimizacão  é feita depois que as coisas já estão funcionando. Otimizacão deve ser feita de maneira inteligente, não adianta absolutamente nada criar o método de busca mais rápido do universo se ele é usado uma única vez pelo seu jogo ( e ainda durante o loading =P). Encontre os gargalos antes !!!!

Até a próxima pessoal =P

 

, , , , ,

  1. #1 by Travel and Leisure on 22 de junho de 2017 - 4:38 pm

    Excellent beat ! I wish to apprentice while you amend your website, how could i subscribe for a blog web site? The account helped me a acceptable deal. I had been tiny bit acquainted of this your broadcast provided bright clear idea

  2. #2 by Best Finance News on 22 de junho de 2017 - 4:41 pm

    Lovely site! I am loving it!! Will come back again. I am taking your feeds also

  3. #3 by Home Product and Service on 22 de junho de 2017 - 4:56 pm

    I like the helpful info you provide in your articles. I will bookmark your weblog and check again here frequently. I’m quite sure I will learn many new stuff right here! Good luck for the next!

  4. #4 by sword of samurai on 22 de junho de 2017 - 6:06 pm

    It was everything I expected

  5. #5 by Nodachi sword on 22 de junho de 2017 - 6:28 pm

    One of the strongest blades I won that isn’t truly Damascus steel, but is very close to the strength of such. This blade has a good weight to it, which makes it very easy to cut through many things given it has a sharp edge, which mine does. The design and construction are marvelous and I would definitely give this blade some consideration if you are looking for a good sword.

  6. #6 by hydraulic cylinder repair on 22 de junho de 2017 - 6:34 pm

    one of our visitors recently suggested the following website

  7. #7 by katana blade on 22 de junho de 2017 - 7:11 pm

    I’ve placed 5 orders so far with these guys. YOU WILL BE IMPRESSED ! Inexpensive knives and swords do not always have to be cheap. I was thrilled when I opened the heavy tubes containing my purcheses. The quality and price tend to lean more to quality. That is something you never seem to get anymore. Their customer service is as good as their products.

  8. #8 by he has a good point on 22 de junho de 2017 - 7:13 pm

    I simply want to say I am just new to blogging and actually liked your web-site. Probably I’m want to bookmark your blog . You amazingly come with really good stories. Thanks a bunch for revealing your blog site.

1 648 649 650
(não será publicado)