Zrýchlenie grafiky na počítačoch s Pentium Pro / Pentium II
Technický popis
Technické riešenie procesorov radu Pentium Pro a Pentium II obsahuje vyrovnávaciu pamäť (cache) pre zrýchlenie prístupu k často používaným údajom. Vyrovnávacia pamäť prvej úrovne je na čipe procesora, druhá úroveň je na čipe (Pentium Pro), na spoločnej doske procesora (Pentium II), alebo (Celeron) chýba úplne.
Keďže tu dochádza k duplikácii údajov v pamäti mimo procesora a vo vyrovnávacích pamätiach, je potrebné riešiť ich vzájomnú synchronizáciu. Inak by sa mohlo stať, že napr. periféria pristupujúca priamo do hlavnej pamäti dostane starú kópiu dát, pretože nová je zatiaľ iba vo vyrovnávajúcej pamäti procesora.
Túto synchronizáciu je možné realizovať viacerými spôsobmi. Buď sa zápisy vykonávajú paralelne do vyrovnávacích pamätí aj do hlavnej pamäti (write-through), alebo sa so zápisom chvíľu počká (write-back).
Existujú však prípady, keď je pamäť umiestnená na zariadení, ku ktorému sa pristupuje cez zbernicu. Typickým prípadom je videokarta na PCI alebo AGP zbernici. Tieto zbernice sú schopné dosiahnuť vyššej priepustnosti, pokiaľ sa zápisy skombinujú do dlhších blokov (write-combining), ktoré sa potom prenášajú naraz. Z toho môžu profitovať operácie, ktoré potrebujú prenášať väčšie množstvo súvislých údajov (a ktoré nie sú vykonávané akcelerátorom priamo na periférii).
Procesory Pentium Pro a Pentium II obsahujú registre, pomocou ktorých je možné stratégiu komunikácie s vonkajšou pamäťou selektívne zvoliť pre rozličné oblasti pamäti (MTRR - Memory Type Range Register). Operačný systém Linux tieto registre sprístupňuje aj používateľom.
Konfigurácia
Pre využitie tejto možnosti potrebujete:
- Linux s verziou jadra aspoň 2.2.0 (prípadne niektoré jadro vývojovej série, MTRR pribudli niekedy okolo 2.1.75)
- Grafickú kartu na PCI alebo AGP zbernici so známou
adresou lineárneho buffera a veľkosťou pamäti.
Adresa sa dá zistiť z výpisu X servera po štarte
(pri štarte cez startx sa objaví na obrazovke,
pri automatickom štarte sa zvykne zapisovať
napr. do /var/log/xdm-error.log). Napr.:
(--) S3: videoram: 2048k (--) S3: Local bus LAW is 0xE0000000
- V konfigurácii jadra zapnúť v sekcii "Processor type and
features" voľbu "MTRR control and configuration"
(CONFIG_MTRR). Po rekompilácii a reboote vznikne špeciálny
súbor /proc/mtrr, ktorý sprístupňuje MTRR registre. Aktuálne
nastavenie zistíme príkazom cat /proc/mtrr - napr. pre počítač
s 96 MB pamäti dostaneme:
reg00: base=0x00000000 ( 0MB), size= 64MB: write-back, count=1 reg01: base=0x04000000 ( 64MB), size= 32MB: write-back, count=1
Režim kombinácie zápisov zapneme pre vyššie uvedený príklad karty na 0xE0000000 s veľkosťou pamäti 2MB (0x200000 hexa) nasledovne:
echo "base=0xe0000000 size=0x200000 type=write-combining" > /proc/mtrr
(zápis pochopiteľne môže vykonať iba root) a skontrolujeme znovu cat /proc/mtrr:
reg00: base=0x00000000 ( 0MB), size= 64MB: write-back, count=1 reg01: base=0x04000000 ( 64MB), size= 32MB: write-back, count=1 reg02: base=0xe0000000 (3584MB), size= 2MB: write-combining, count=1
V prípade, že všetko funguje ako má, môžeme tento príkaz zapísať do niektorého skriptu, ktorý sa automaticky vykoná pri štarte systému.
Výsledky
Popisované nastavenie používam približne rok na počítači s procesorom Pentium Pro / 166 MHz a grafickou kartou S3 Trio64V+ na PCI zbernici. Použitý X server je momentálne XF86_S3 verzie 3.3.3, grafický mód 1440x1080 pri 256 farbách. Porovnanie výkonnosti pomocou programu x11perf ukázalo viac ako 50% zrýchlenie nasledujúcich operácií:
Pomer Operácia 3.09 500x500 tiled rectangle (161x145 tile) 3.00 500x500 tiled rectangle (216x208 tile) 2.86 100x100 tiled rectangle (216x208 tile) 2.78 100x100 tiled rectangle (161x145 tile) 2.74 Copy 500x500 from pixmap to window 2.68 ShmPutImage 500x500 square 2.56 Copy 100x100 from pixmap to window 2.44 ShmPutImage 100x100 square 2.17 Fill 300x300 tiled trapezoid (4x4 tile) 2.09 Fill 300x300 tiled trapezoid (161x145 tile) 2.06 Fill 300x300 tiled trapezoid (216x208 tile) 1.82 Fill 100x100 tiled trapezoid (4x4 tile) 1.76 Fill 300x300 tiled trapezoid (17x15 tile) 1.66 Destroy window via parent (200 kids) 1.51 Unmap window via parent (16 kids) 1.51 PutImage 100x100 square
Naopak spomalenie o viac ako 10% vykázali operácie:
Pomer Operácia 0.89 Create and map subwindows (4 kids) 0.88 Fill 10x10 tiled trapezoid (161x145 tile) 0.87 Fill 10x10 tiled trapezoid (216x208 tile) 0.84 Create unmapped window (200 kids) 0.82 Destroy window via parent (16 kids) 0.80 1x1 tiled rectangle (216x208 tile) 0.80 1x1 tiled rectangle (161x145 tile) 0.78 Unmap window via parent (4 kids)
Ostatné operácie (x11perf ich testuje vyše 300) nevykázali znateľnú zmenu. Štatistickú chybu je ťažko odhadnúť, najväčšie zrýchlenie sa ale skutočne týka operácií, ktoré sa týkajú prenosu súvislých blokov z pamäti do grafickej karty.
Bratislava, 13. 3. 1999
Stanislav Medunastano (AT) meduna.org