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:

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 Meduna
stano (AT) meduna.org