Vale a pena se preocupar com a localidade de referência da GPU?

9

A localidade de referência faz tanto diferença no desempenho da GPU quanto no desempenho da CPU?

Por exemplo, se eu enviar 200 comandos de desenho para a GPU, verei uma diferença (potencialmente) perceptível se os dados de cada comando estiverem contíguos na memória em vez de pular os mapas de buffers / texturas?

Pergunta secundária: estou assumindo que a GPU garante contra falsos problemas de compartilhamento por ter a maioria dos recursos imutáveis. Mas, no caso em que não estão, é por isso que os threads sempre fazem o trabalho de quatro fragmentos?

Xenoprima
fonte

Respostas:

10

A localidade de referência importa, mas você não precisa se preocupar tanto ... porque você não tem controle absoluto.

Ao usar o OpenGL / DirectX, normalmente você tem controle limitado sobre o layout da memória, o driver fará o resto. Por exemplo, você pode tentar vários layouts de buffers de vértices, como o uso de dados de vértices intercalados ou não intercalados e, dependendo dos dados / driver / GPU, o desempenho variará. Crie um perfil e escolha o que melhor se adequa à sua aplicação.

Por exemplo, na otimização de GPU Gems Pipeline, a localidade de referência é mencionada duas vezes , a primeira:

Acesse dados de vértice de maneira relativamente seqüencial. As GPUs modernas armazenam em cache os acessos à memória ao buscar vértices. Como em qualquer hierarquia de memória, a localidade espacial de referência ajuda a maximizar as ocorrências no cache, reduzindo assim os requisitos de largura de banda.

E o segundo

Otimize para o cache de vértices pós-T&L. As GPUs modernas têm um pequeno cache primeiro a entrar, primeiro a sair (FIFO) que armazena o resultado dos vértices transformados mais recentemente; uma ocorrência nesse cache salva todo o trabalho de transformação e iluminação, além de todo o trabalho realizado anteriormente no pipeline. Para tirar proveito desse cache, você deve usar primitivas indexadas e ordenar seus vértices para maximizar a localidade de referência sobre a malha. Existem ferramentas disponíveis - incluindo D3DX e NVTriStrip (NVIDIA 2003) - que podem ajudá-lo nessa tarefa.

Na minha opinião, essas recomendações seguem o que eu estou falando e implicam que você não tem controle absoluto sobre o layout da memória, mas o que você tem controle, por exemplo, como os vértices de cada VBO são dispostos, pode afetar o desempenho.

Se o seu aplicativo estiver com um desempenho atingido, você deve primeiro detectar o gargalo, pode não ser um local de referência de dados com problema, mas talvez porque haja uma quantidade enorme de dados sem seleção, por exemplo, você não está executando a seleção de frustum. etc Você pode conferir minha resposta aqui no tópico.

Eu acho que você deveria se preocupar mais com a localidade de referência ao usar o OpenCL / CUDA, caso tenha controle absoluto sobre o layout da memória.

concept3d
fonte
3

Originalmente, as GPUs eram usadas apenas para aplicativos multimídia que mostram pouca reutilização de dados. À medida que as GPUs se tornam cada vez mais usadas para aplicativos de uso geral (daí o termo GPGPU), agora eles apresentam caches gerenciados por hardware de tamanho grande, por exemplo, a GPU Fermi possui 768 KB de cache de último nível, a Kepler GPU possui 1536 KB de cache de último nível e a GPU Maxwell possui 2048 KB de cache de último nível. Isso, juntamente com um amplo corpo de pesquisa sobre caches de GPU, mostra que a localização dos dados é definitivamente importante para as GPUs. Veja meu documento de pesquisa para obter detalhes e referência para os itens acima.

user984260
fonte