Poslední dobou se ve velké míře mluví o hardwarové akceleraci a to především ve spojení s internetovými prohlížeči. Díky tomuto způsobu vykreslování totiž může dojít ke značnému zrychlení zobrazování grafického obsahu, jakým je například i webová stránka. Avšak takového zrychlení nemusíme dosáhnout pouze u webových prohlížečů, ale dnes a denně ji používáme i u některých video přehrávačů nebo multimediálních editorů.

Kde to všechno začalo?

První grafické karty se objevili v počítačích již v sedmdesátých letech dvacátého stolení. Tehdy ještě rozhodně nevypadaly a neměly takový výkon jako dnešní grafické karty. Ale postupem času se zlepšovaly a vývojáři jim přidávali nové funkce. Již od té doby se čipy CPU a GPU vyvíjely zcela jiným směrem.

<p> </p>

Jedna z prvních grafických karet - nVidia NV1. V pozadí spuštěná aplikace běžící na této kartě. Zdroj obrázku.

Rozdíl mezi CPU a GPU

CPU (procesor) byl zaměřen na složité operace nebo skoky v instrukcích a proto velkou část čipu zabírá kontrolní logika, která se stará o běh aplikace, a také vyrovnávací paměť (cache), do které se ukládají důležitá data pro rychlý přístup. Nezbývá tedy již tolik místa pro samotné výpočetní jednotky (aritmetické a logické, tzv. ALU). S tímto přístupem však procesory dosahují svého maxima, a jak jste si možná všimli, v poslední době již nedochází ke zvyšování taktů procesorů, ale výrobci se spíše zaměřují na paralelismus a přidávají jádra.

Naopak GPU (grafický čip) se na paralelismus zaměřuje od počátku. Proto u něj najdete menší řídící logiku, ale zato daleko více výpočetních jednotek. Tyto jednotky jsou seskupeny a vždy jednu skupinu ovládá menší řídící logika. Také vyrovnávací paměti nejsou tak velké. Na druhou stranu GPU nedokáže zpracovat tak složité aplikace jako CPU.

<p> </p>

Rozdíl mezi CPU a GPU. CPU má velkou kontrolní logiku (Control), GPU má více ALU jednotek. Zdroj obrázku.

Jádra a vlákna

Pokud nyní porovnáme novější procesory a novější grafické karty, pak procesory mají například 6 jader, kde každé jádro dokáže pracovat samostatně a jedno se tak v jednom okamžiku stará například o vašeho komunikačního klienta, druhé o souborového manažera, další indexuje obsah disku, apod. Každé jádro se může v jednom okamžiku starat o jeden proces nezávisle na ostatních jádrech. Podobně je to s vlákny. I když v jednom procesu spustíme více výpočetních vláken, jedno jádro může zpracovávat pouze jedno vlákno v jednom okamžiku. Jádro pak často přepíná, aby se dostalo na všechna vlákna (či procesy).

Grafická karta může obsahovat desítky streamovacích multiprocesorů (SM). Tyto multiprocesory dokážou zpracovávat v jednom okamžiku něco přes tisíc vláken a dohromady tak může běžet na jednom grafickém čipu desetitisíce vláken. Většinou jsou bloky vláken omezeny na vykonávání jedné instrukce nad různými daty (stejná instrukce, ale jiná data pro každé vlákno - tzv. SIMD). Další omezení je u přenosu dat z paměti. Přece jen takový počet vláken něco spotřebuje (textury, datová pole, atd.).

<p> </p>

Ukázka karty nVidia Fermi. Obsahuje spoustu SM, kde každý z nich má mnoho jader. Zdroj obrázku.

K čemu je tedy GPU?

Máme tedy čip, který dokáže zpracovávat velké množství paralelních operací najednou po blocích se stejnou instrukcí, ale jinými daty. K čemu nám takový čip je? Podívejte se kupříkladu před sebe na obrazovku. Pokud máte nastaveno na svém monitoru rozlišení například jen 1280x800 (což je v dnešní době poměrně málo), pak se vám několikrát (u LCD většinou 60krát) za vteřinu počítá milion pixelů. Z toho velká spousta pixelů má podobný postup výpočtu.

Dobře to lze ukázat na počítačové hře. Představte si, že se svou postavou ve hře běžíte po rovné ulici a podíváte se do země přímo pod sebe. Takovýto kousek prostředí může být klidně tvořen pouze jedním velkým trojúhelníkem s jednou texturou na něm. Pak výpočet všech pixelů pochází pouze z jednoho trojúhelníku a jedné textury, liší se pouze v souřadnicích mapujících se do textury. Toto je zjednodušený model, protože bychom neměli zapomenout na světla a stíny, nejrůznější post-processing efekty, na to, že držíte v ruce zbraň, která se musí také zobrazit apod. Ale základní myšlenka je nyní snad všem jasná. Spousta pixelů prochází stejnými instrukcemi, pouze některá data jsou různá.

<p> </p>

Mapování textury na kouli. Všechny pixely prochází stejnými instrukcemi s jinými daty. Zdroj obrázku.

Webové prohlížeče

Nyní se vraťme k problému, který jsme nakousli na začátku. Máme tedy prohlížeč, který zobrazuje webovou stránku. Pokud přeneseme veškerý výpočet z CPU na GPU, můžeme dosáhnout opravdového zrychlení. Představte si jenom pozadí, které je na mnohých stránkách. Může se jednat o malý obrázek, který se však vykresluje na mnoho pixelů.

Pro takové zrychlení se například v testovací verzi IE9 (viz. tento článek) využívá komponent rozhraní DirectX, které mnozí znáte z počítačových her. Podrobněji si o něm můžete přečíst v našem starším článku. Konkrétně z něj využívá Direct2D pro vykreslování 2D grafiky (obrázků apod.) a DirectWrite pro text. Direct3D je využíván pro sestavení stránky a můžete to poznat především u stránek s velkým obsahem obrázků (demonstrační stránka společnosti Microsoft). Hardwarová akcelerace se objevuje i ve zkušebních verzích prohlížečů Google Chrome a Mozilla Firefox.

<p> </p>

Ukázka dema pro zkoušku hardwarové akcelerace.

Závěr

Hardwarová akcelerace je v poslední době spojována s webovými prohlížeči, ale nesmíme zapomenout například i na všechny multimediální aplikace, které ji využívají. Pomocí této metody lze zrychlit vykreslování obsahu a také ulehčit procesoru, který má určitě plno dalších důležitých věcí na práci.