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.
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.
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.).
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 1280×800 (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á.
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.
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.