|
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:
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:
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 >
|
| |||||||||||||||||||||||||||||||||||||||||||||
|
|
||