Aumentar a Memória de Vídeo

Um recurso pouco conhecido que existe nativamente no SteamOS e pode ser usado no seu sistema Linux: Veja como expandir a memória de vídeo!


| Se você apoia nosso site, desative o AdBlock quando visitá-lo, inclusive em Mobile!
Os anúncios são poucos e não invasivos. Se quiser contribuir com nosso trabalho, clique em qualquer banner de sua preferência, exceto dos Parceiros. 
Mais detalhes clicando aqui.


Edit: A publicação foi revisada e no final do artigo, no tópico 7. há o parâmetro que deve ser usado para placas AMD Radeon HD 3xxx até 8xxx!

1. Introdução

Memória de vídeo – também conhecida como VRAM – é uma porção de memória que há nas placas de vídeo quando são dedicadas; ou uma parte da memória RAM, quando são Onboard – integradas no processador. Essa memória é importante para execução de games, sendo essencialmente para armazenar texturas em alta definição e alguns modelos de objetos de cena.

Em sistemas Android e no Windows há a Memória Compartilhada: Apesar de ter sua memória já reservada para vídeo, em caso de necessidade, parte da RAM pode ser alocada pra vídeo, tecnicamente aumentando sua capacidade.

Neste exemplo a placa de vídeo possui 6 Gb dedicados; porém o Windows ainda permite usar 2 Gb de RAM como memória de vídeo, possuindo no final virtualmente teoricamente 8 Gb de memória de vídeo.

E como isso acontece?

2. GTT

A maioria dos sistemas operacionais possui suas próprias maneiras de alocar memória RAM como memória de vídeo. No Linux, o módulo mais conhecido é o graphics translation table, também conhecido como GTT.

O GTT é uma unidade de gerenciamento de memória de entrada e saída, também conhecida como IOMMU. O GTT permite o acesso direto da memória da placa gráfica para a memória do sistema, através do qual são carregados buffers de texturas, malhas poligonais e outros dados de games e/ou aplicações. Também pode ser usado para expandir a quantidade de memória de vídeo disponível para sistemas com gráficos integrados ou compartilhados, ou seja, sem processador gráfico discreto ou embutido, como os processadores Intel HD Graphics e AMD VBGA.

No entanto, esse tipo de remapeamento de memória (expansão) tem uma ressalva que afeta todo o sistema: especificamente, qualquer GTT, memória pré-alocada, não pode ser utilizada para nenhuma outra finalidade, exceto memória gráfica e renderização de exibição.

E como isso acontece em Linux?

3. Linux

No linux a situação é um pouco complicada: Por padrão a maioria das distribuições Linux, seja o Ubuntu, Manjaro ou Fedora, dentre outras – pra não dizer todas – não possuem esse acesso à memória de vídeo compartilhada com a memória RAM. Costumam pegar apenas o que foi pré definido pela Firmware UEFI ou pela BIOS, causando uma limitação que não existe no Windows nem em Android.

O maior motivo, de acordo com desenvolvedores, é simplesmente que “a RAM é mais lenta que a memória de vídeo”, ou seja, é preferível ficar com pouca memória de vídeo mas que funcione bem, do que usar a memória RAM junto e ter um desempenho mais ou menos.

Eu particularmente discordo disso, uma vez que o Windows usa e abusa de tal recurso e muitas vezes um game ganha desempenho apenas por ter mais espaço de memória para armazenar seus dados!

Mas e aí, como expandir a memória de vídeo no Linux?

Até o presente momento é mais complicado se você possui placas de vídeo NVIDIA e Intel HD Graphics, por essas possuírem um controle GTT restritivo por uma série de fatores. Portanto esse tutorial é voltado às placas de vídeo AMD.

A quem interessar, deixo o contexto de como surgiu tal dúvida e sua resolução: mexendo no SteamDeck!

4. SteamDeck

Ao fazer a análise do aparelho recentemente, me ocorreu que nos testes, em todos os testes feitos em outros sistemas operacionais, apenas 4 Gb de memória de vídeo estavam alocadas e disponibilizadas às aplicações.

Porém no SteamOS havia mais memória disponível: 12 Gb no meu aparelho! Então qual o segredo?

4.1 Firmware UEFI

A primeira parte de tal ajuste se encontra na Firmware UEFI, aonde pode ser alterado quanto de RAM fixamente será cedida à placa de vídeo. Por padrão o aparelho reserva 1 Gb, porém pode ser alterado para 4 Gb.

Até aí, tudo certo, ficam 4 Gb de vídeo e 12 Gb de RAM.

Porém há um outro segredinho: Um parâmetro de GRUB que força o uso de um valor diferente para o GTT mencionado acima!

4.2 GRUB

No GRUB do SteamDeck temos estas entradas:

# SteamOS:
# plymouth tweaks
# – add explicit splash
# – plymouth.ignore-serial-consoles otherwise plymouth will never trigger
GRUB_CMDLINE_LINUX_DEFAULT=”loglevel=3 quiet splash plymouth.ignore-serial-consoles tsc=directsync module_blacklist=tpm log_buf_len=4M amd_iommu=off amdgpu.gttsize=8128 spi_amd.speed_dev=1 audit=0 fbcon=vc:4-6 fbcon=rotate:1″
GRUB_RECORDFAIL_TIMEOUT=0GRUB_CMDLINE_LINUX=”console=tty1 rd.luks=0 rd.lvm=0 rd.md=0 rd.dm=0 rd.systemd.gpt_auto=no”

A entrada que nos interessa é a amdgpu.gttsize=8128. – E é aqui o problema com a NVIDIA e a Intel, não temos um parâmetro equivalente que faça tal configuração, ao menos, não dessa forma.

Ou seja, o aparelho, independente do valor definido na Firmware UEFI, sempre separa 8 Gb de memória RAM para vídeo de forma compartilhada. Dessa forma, o sistema continua com 1 Gb de vídeo e 15 Gb de RAM, porém se um game exigir, dinamicamente até 9 Gb de RAM será alocada para gráficos, restando 7 Gb de RAM!

E aí que se você fizer igual eu e alocar no SteamDeck 4 Gb para vídeo e mantiver o valor de 8 Gb padrão do GRUB, o aparelho poderá utilizar até 12 Gb de RAM como memória de vídeo se apenas até 4 Gb de RAM foram utilizados.

5. Configurando

Se você possui uma placa de vídeo AMD e deseja fazer o teste de alteração de memória, abra o arquivo /etc/default/grub com seu editor de textos favorito como SUDO. Vá até a linha que começa com GRUB_CMDLINE_LINUX_DEFAULT. Por exemplo:

GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash”

Edite o final da linha adicionando o parâmetro amdgpu.gttsize= e definindo no final o valor, em Mb’s, de quantos Gb’s de RAM você deseja compartilhar com a placa de vídeo. Aqui por exemplo para 2 Gb:

GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash amdgpu.gttsize=2048″

O valor pode ser tanto quanto de memória você tiver. Mas cuidado para não colocar valores tão altos e deixar seu sistema instável! Salve o arquivo, feche. Revalide o GRUB:

$ sudo update-grub2

Reinicie o sistema.

6. Validando

Para verificar se funcionou, execute este comando:

$ glxinfo -B

E olhe a linha:

Total available memory: X MB

O valor de X será o valor definido no GRUB + valor padrão pré-definido pela Firmware UEFI/BIOS!

O game para reconhecer a memória total deverá ser compatível e/ou com a versão apropriada do Proton/Steam se for em modo compatibilidade. Porque houve aplicações que só usaram a memória pré-definida da placa e outras que reconheceram o valor total.

Esta publicação será atualizada se houver um modo de fazer o mesmo com as placas de vídeo da NVIDIA e da Intel!

7. Placas Antigas

Para placas AMD mais antigas das linhas Radeon HD 3850 até HD 8180, o parâmetro para o GRUB é diferente:

radeon.gartsize=1024

Novamente, com 1024 em Megabytes.

Siga conforme explicado anteriormente, trocando no GRUB aonde usaria amdgpu.gttsize para radeon.gartsize.

8. Conclusão

A esse ponto você deve ter algumas dúvidas:

  • Isso permite rodar mais games com mais desempenho?
    Sim e não. Depende também de como está a organização das suas memórias na máquina! 1 pente de 8 Gb terá um desempenho inferior a 2 pentes de 4 Gb – dual channel – e se houver 4 slots com 1 Gb cada, será ainda melhor – quad-channel.
  • Isso prejudica o desempenho das aplicações comuns?
    Não prejudica, uma vez que essa memória compartilhada só será usada caso a placa de vídeo necessite.
  • Memória de Vídeo usa SWAP?
    Normalmente não, o que pode acontecer, caso a RAM fique 100% cheia, é a RAM ser despejada na SWAP e liberar espaço para a memória de vídeo, que é de maior prioridade aqui.
  • Em vez de aumentar o valor, posso abaixa-lo?
    Claro, pode abaixar pela BIOS e deixar o mínimo possível alocado; e depois deixar um valor alto no GRUB. Assim você terá mais memória RAM útil e se a placa de vídeo precisar, poderá usar mais depois!
  • Isso pode causar um desempenho inferior nos games?
    Dificilmente. Uma vez que a memória de vídeo das placas AMD, linha VEGA por exemplo, já é compartilhada com a própria RAM, você está apenas gerenciando o quanto será disponibilizado, uma vez que a memória será a mesma.

A meu ver esse procedimento é muito útil em computadores da linha VEGA onde se deseja ter mais performance com os games! Seus processadores costumam ter bom poder de fogo nas aplicações, ter mais memória dedicada ajuda a otimizar a usabilidade geral do equipamento.

E você, fez os testes? Ganhou desempenho nos games?
Deixe nos comentários sua experiência!

Se alguém souber de técnicas para NVIDIA e Intel pode mandar também que eu testo e se for pertinente eu adiciono à publicação com os devidos créditos.

Fontes:
cyberciti.biz
steamcommunity
reddit
GART
Código fonte do Kernel Linux
Phoronix

5 comentários em “Aumentar a Memória de Vídeo”

    • Eu vou lançar uma publicação sobre um sistema Arch-based, e futuramente quero abordar ajustes em cima de uma opção alternativa ao grub, que é o systemd-boot. Não sei se é o seu caso, mas se for, logo mais teremos novidades!

      Responder
  1. Li o seu artigo e através dele descobri uma coisa. Minha placa é da Intel e quando dei o comando glxinfo -B no terminal, apareceu o seguinte:

    name of display: :0
    display: :0 screen: 0
    direct rendering: Yes
    Extended renderer info (GLX_MESA_query_renderer):
    Vendor: Intel (0x8086)
    Device: Mesa Intel(R) UHD Graphics 620 (WHL GT2) (0x3ea0)
    Version: 23.1.0
    Accelerated: yes
    Video memory: 7823MB
    Unified memory: yes
    Preferred profile: core (0x1)
    Max core profile version: 4.6
    Max compat profile version: 4.6
    Max GLES1 profile version: 1.1
    Max GLES[23] profile version: 3.2
    OpenGL vendor string: Intel
    OpenGL renderer string: Mesa Intel(R) UHD Graphics 620 (WHL GT2)
    OpenGL core profile version string: 4.6 (Core Profile) Mesa 23.1.0-devel (git-722bcd7973)
    OpenGL core profile shading language version string: 4.60
    OpenGL core profile context flags: (none)
    OpenGL core profile profile mask: core profile

    OpenGL version string: 4.6 (Compatibility Profile) Mesa 23.1.0-devel (git-722bcd7973)
    OpenGL shading language version string: 4.60
    OpenGL context flags: (none)
    OpenGL profile mask: compatibility profile

    OpenGL ES profile version string: OpenGL ES 3.2 Mesa 23.1.0-devel (git-722bcd7973)
    OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.20

    Observe as linhas que dizem:

    Video memory: 7823MB
    Unified memory: yes

    Pesquisei e descobri que unified memory é a tecnologia que a Intel utiliza para que as placas integradas disponham de qualquer quantidade de memoria ram que estiver disponível, se necessário. O Video memory ali é na verdade a quantidade de memoria ram do meu notebook. Meu sistema é o Linux Mint 21.1. Posso estar enganado, mas a memória já está compartilhada, senão o sistema nem reconheceria tal coisa.

    Responder
    • Interessante sua observação, rodei o comando no meu thinkpad e ele exibiu 1.5 Gb de RAM para vídeo, coisa que pela BIOS é limitada a 512mb… Mas não encontrei um comando que force ou mesmo aumente ou diminua essa memória. Parece ser mesclada com prioridade, por exemplo, se não uso toda essa memória de vídeo, então ela fica para a RAM, não há uma pré-alocação como ocorre nos sistemas AMD.

      Responder

Deixe um comentário