Aumentar a velocidade da placa gráfica em Linux
Contribuído por su- em 15-05-00 16:00
do departamento fast-penguin-dptm.
Linux Com o passar dos tempos, o sistema de janelas X deixou de ser usado apenas para aplicações profissionais e começaram a surgir cada vez mais aplicações didácticas, multimedia , tais como jogos e vídeo. Por essa razão, a performance do sistema de janelas X começou a ser cada vez mais importante e todos os truques que possam aumentar a velocidade devem ser aproveitados. Aqui vai uma técnica simples que permite aumentar a performance da placa gráfica em cerca de 250% ou mais...
Uma das formas mais simples e mais eficaz de melhorar a performance do subsistema de vídeo de um PC consiste em configurar a cache do sistema, para maximizar a performance da placa gráfica:

Acontece que os processadores Intel a partir do Pentium Pro (P Pro, PII, Celeron e P3) passaram a possuir um controlador de cache integrado no CPU e a cache secundária passou a estar incluída no mesmo package que o CPU.

Por essa razão, estes CPUs possuem um conjunto de registos especiais, chamados MTRR (Memory Transfer Region Registers) que permitem configurar o controlador de cache e a cache secundária.

Os CPUs mais recentes da AMD e de outros fabricantes também possuem registos deste género, mas funcionam de forma ligeiramente diferente.

O kernel de Linux, a partir da versão 2.1 começou a possuir um ficheiro virtual «/proc/mtrr» que permite configurar e programar os registos MTRR.

Para além dos CPUs Intel, este ficheiro também permite controlar, de forma uniforme, os registos equivalentes dos CPUs produzidos pelos outros fabricantes, mas o suporte para cada CPU depende da versão de kernel usado em cada caso.

Os MTRRs permitem definir regiões de memória e escolher políticas de gestão diferentes para cada região.

As políticas que existem são as seguintes:

No-cache

A cache não é usada para aceder a essa região.

Write-through

A cache só é usada para optimizar as leituras

Write-back

A cache é usada para optimizar leituras e escritas.

Write-combining

A cache é usada para optimizar as escritas, agrupando escritas em regiões consecutivas, numa única operação.


Em geral, a memória RAM do sistema deve estar configurada em modo Write back, para maximizar a performance do sistema.

As regiões especiais, usadas para comunicar com periféricos como, por exemplo, alguns controladores SCSI, placas de rede e outros dispositivos, devem usar o modo no-cache, para que a cache não retarde a propagação da informação vinda do CPU para esses periféricos e vice-versa.

As placas gráficas são um caso especial, porque costumam utilizar duas regiões de memória distintas: o frame-buffer (a chamada memória de vídeo) e os registos de controlo.

Os registos de controlo são usadas para programar a própria placa como, por exemplo, para seleccionar resoluções e, no caso das placas aceleradoras, servem para enviar comandos à placa. Por esse motivo, esta região deve estar configurada em modo no-cache.

O frame-buffer deve ser configurado em modo write-combining, o que permite aumentar a velocidade da placa gráfica entre 250% a 300%.

A razão por que este aumento de performance é tão grande, deve-se ao facto de as placas PCI e AGP possuírem um modo de transferencia chamado burst-mode.

Numa situação normal, os acessos à memória são feitos em 2 passos: sempre que o CPU pretende escrever uma palavra de dados na memória, tem de enviar um endereço pelo BUS, que pode ter de ser subdividido em duas partes (coluna e linha) e só depois pode enviar os dados.

Contudo, no caso do BUS PCI /AGP é possível agrupar os acessos em blocos. Nesse caso, o CPU só tem de enviar o endereço do início do bloco e depois pode enviar todos os dados sequencialmente, sem ter de voltar a enviar mais endereço nenhum. Dessa forma, consegue-se aumentar a performance em quase 300%.

A escolha do modo de cache write-combining permite utilizar este modo, porque as escritas na memória são agrupadas em blocos pela cache, que depois são enviados pelo BUS PCI/AGP usando o modo burst.

Para verificar a configuração actual dos registos MTRR, basta listar o conteúdo do ficheiro «/proc/mtrr»:

$ cat /proc/mtrr:

reg00: base=0x00000000 ( 0MB), size= 64MB: write-back, count=1


Por omissão, só costuma existir uma única região definida, que abrange toda a memória RAM do sistema e usa o modo write-back. Neste exemplo, o sistema tinha apenas 64Mb de RAM.

Para optimizar a velocidade da placa gráfica, é necessário descobrir os endereços das zonas de memória usadas por ela.

Felizmente, essa informação pode ser obtida a partir do ficheiro «/proc/pci»:


$ cat /proc/pci


No caso do meu sistema, obtenho a seguinte lista:

PCI devices found:

Bus 0, device 0, function 0:

Host bridge: Intel 440BX - 82443BX Host (rev 3).

Medium devsel. Master Capable. Latency=64.

Prefetchable 32 bit memory at 0xf8000000 [0xf8000008].

Bus 0, device 1, function 0:

PCI bridge: Intel 440BX - 82443BX AGP (rev 3).

Medium devsel. Master Capable. Latency=128. Min Gnt=140.

Bus 0, device 7, function 0:

ISA bridge: Intel 82371AB PIIX4 ISA (rev 2).

Medium devsel. Fast back-to-back capable. Master Capable. No bursts.

Bus 0, device 7, function 1:

IDE interface: Intel 82371AB PIIX4 IDE (rev 1).

Medium devsel. Fast back-to-back capable. Master Capable. Latency=64.

I/O at 0x1000 [0x1001].

Bus 0, device 7, function 2:

USB Controller: Intel 82371AB PIIX4 USB (rev 1).

Medium devsel. Fast back-to-back capable. IRQ 9. Master Capable. Latency=64.

I/O at 0x1020 [0x1021].

Bus 0, device 7, function 3:

Bridge: Intel 82371AB PIIX4 ACPI (rev 2).

Medium devsel. Fast back-to-back capable.

Bus 0, device 12, function 0:

Multimedia audio controller: Unknown vendor Unknown device (rev 3).

Vendor id=1073. Device id=c.

Medium devsel. IRQ 10. Master Capable. Latency=64. Min Gnt=5.Max Lat=25.

Non-prefetchable 32 bit memory at 0xf4000000 [0xf4000000].

Bus 0, device 13, function 0:

Ethernet controller: Silicon Integrated Systems Unknown device (rev 2).

Vendor id=1039. Device id=900.

Medium devsel. Fast back-to-back capable. IRQ 11. Master Capable. Latency=173. Min Gnt=52.Max Lat=11.

I/O at 0x1400 [0x1401].

Non-prefetchable 32 bit memory at 0xf4008000 [0xf4008000].

Bus 1, device 0, function 0:

VGA compatible controller: ATI Unknown device (rev 122).

Vendor id=1002. Device id=475a.

Medium devsel. Fast back-to-back capable. IRQ 11. Master Capable. Latency=66. Min Gnt=8.

Prefetchable 32 bit memory at 0xf5000000 [0xf5000008].

I/O at 0x9000 [0x9001].

Non-prefetchable 32 bit memory at 0xf4100000 [0xf4100000].

Neste exemplo, só nos interessa a última secção, «VGA compatible controller» que corresponde a uma placa gráfica ATI.

Nesta secção, estão definidas duas regiões de memória: uma non-prefetchable que corresponde aos registos da placa e outra, prefetchable, que corresponde à memória de vídeo (frame-buffer).

É exactamente esta segunda região (prefetchable) que convém configurar, para passar a usar o modo write-combining.

Para isso, basta executar o seguinte comando:

echo "base=0xf5000000 size=0x800000 type=write-combining" > /proc/mtrr

Em que «base» representa o início da memória de vídeo que havia sido obtido no ficheiro «/proc/pci» e «size» corresponde à quantidade de memória da placa, expressa em numeração hexadecimal.

Neste exemplo, o valor 0x800000 corresponde a 8Mb, mas se a placa tivesse 16Mb teria sido usado 0x1000000 e 32Mb corresponderia a 0x2000000.

Para que que esta configuração passe a ficar activa por omissão, este comando deve ser adicionado ao fim do ficheiro «/etc/rc.d/rc.local». Desta forma, passa a ser executado sempre que o sistema arranca.

Os resultados obtidos dependem bastante das aplicações usadas. Por exemplo, se o X só é usado para fazer processamento de texto, é natural que não se note qualquer diferença. No entanto, quando se usam gráficos 3D e vídeo, já se nota uma grande diferença.

Por exemplo, no Quake 2 e Quake 3, é natural que se ganhem mais 4 ou 5 frames por segundo, mesmo quando se utiliza hardware acelerador.

No meu caso, estou a desenvolver um sistema de CAD 3D para a indústria do calçado e estou a utilizar a implementação de Mesa3D em software puro. Apesar de o programa fazer muitos cálculos no CPU, consigo obter um ganho de performance de 3 a 4 frames por segundo.

Finalmente, resta lembrar que alguns dos drivers mais recentes para Linux, como os drivers das placas 3dfx, já fazem a programação dos registos MTRR de forma automática. Contudo, a melhor forma de verificar se os registos estão a ser devidamente programados, consiste em consultar o «/proc/mtrr».

Por outro lado, é natural que o XFree4 também venha a fazer esta programação de forma automática, mas ainda não tive oportunidade de experimentar.


su-

Motif disponível para Open Source | Artigo no Computadores/Público é simples tradução  >

 
gildot Login
Login:

Password:

Referências
  • Linux
  • Intel
  • Mais acerca Linux
  • Também por su-
  • "Aumentar a velocidade da placa gráfica em Linux" | Login/Criar uma conta | 1 comentários | Procurar na discussão
    Filtro:
    ATENÇÃO: Os comentários são da exclusiva responsabilidade dos seus autores.
    Resultados (Pontos:0)
    por Anonimo Cobarde em 15-05-00 23:43 GMT (#1)
    Apesar usar com um driver próprio (bastante mais rápido do que o "normal") eu notei logo uma diferença no refresh dos meus ETerms transparentes sombreados (durante resizes e moves). No geral (video, operacoes 3D, etc...) ficou ligeiramente (200% :) ) mais rápido (P3 512Kb com uma antiga ATI 3D Pro Turbo) :).

    cool :)
    [ Responder | Pai ]