9
Fotogalerie

Výpočty na grafické kartě: odlehčete procesoru

Zpracování videa, komprimace nebo prolamování hesel, to vše dnes dokážou grafické karty. I levnější modely jsou v tom často výkonnější než ty nejdražší současné procesory.

Kapitoly článku:


Procesor je považován za mozek počítače, přesto však často jde o jednodušší zařízení, než jakým je běžná grafická karta. Ta je totiž s trochou nadsázky samostatným počítačem, který se už dávno nevyužívá jen k výpočtu herních scén. Množství procesorů a gigabajty rychlé vyhrazené paměti najdou uplatnění také při méně obvyklých činnostech.

Karta nejen na grafiku

Grafickou kartu má v počítači úplně každý, většina uživatelů se spokojí s některým modelem Intelu či Radeonem integrovaným v procesoru. Především dedikované grafiky jsou ale tahounem odvětví GPGPU (General-Purpose Graphics Processing Unit) a u nich to celé začalo. Běžný počítačový procesor je univerzálním řešením pro všechny výpočetní úlohy, grafické čipy se orientují především na paralelní zpracování a jednodušší operace, které pak díky optimalizaci zvládnou mnohonásobně rychleji.

Tesla
Grafická karta bez grafických výstupů, to je Nvidia Tesla K20, ve skutečnosti „pouze“ koprocesor pro GPGPU s 2 496 jádry, 5 GB paměti a cenou přesahující 70 000 Kč

Ideálním příkladem výhodného nasazení GPGPU je zpracování jednoho úkolu nad větším množstvím dat. Představíte-li si rozměrné pole, běžný procesor by jej musel v cyklu projít a pro každý z jeho prvků provést požadovanou operaci. GPU rozdělí úlohu mezi své výpočetní jednotky a provede celou operaci najednou nebo v několika málo cyklech. Obdobně rychlá je práce s vektory, maticemi či jinými vstupy, kde hrají roli poměrně jednoduché operace s rozsáhlými daty.

 
Grafická karta nemusí sloužit jen na hry, GPGPU z ní dělá mocný víceúčelový nástroj
 

Díky této specializaci nehrozí postupné nahrazení běžných procesorů grafickými kartami, ale je zcela přirozený probíhající trend začlenění grafického jádra jako součásti procesoru, tak jako se to stalo v minulosti třeba s matematickým koprocesorem zaměřeným na výpočty s plovoucí desetinnou čárkou. Díky tomu se s GPGPU dnes setkáte i u vestavěných jader řady Intel HD Graphics nebo Radeonů v APU od AMD.

Shader jako alfa i omega

Zásadním rozdílem mezi grafickou kartou a procesorem je konstrukce a množství vnitřní logiky, ať už jde o zachování zpětné kompatibility platformy x86, nebo fakt, že procesor plánuje (predikční algoritmy), obsluhuje události (požadavky přerušení) apod. Zatímco v dnešních desktopových CPU najdete maximálně osm více či méně robustních jader, množství výpočetních jednotek v GPU jde do tisíců.

Nasa
Výpočetní karty nacházejí své uplatnění především v oblasti superpočítačů a výpočetních středisek, v domácích podmínkách pro GPGPU poslouží i běžná herní grafika

Výkonné součásti jsou nazývány shadery, ale dnes se používá spíš označení stream procesory. Shader je programovatelná součást grafického čipu, která slouží k manipulaci s pixelem či vrcholem, ať už jde o jeho barvu nebo geometrické vlastnosti. Stream procesor je obecnějším pojetím shaderu. Jeho primární úlohou je shadery unifikovat a umožnit každému z nich všechny operace, tedy zamezit rozdělení na pixel shadery, vertex shadery aj., které si mezi sebou přelévaly data, zatímco velká část čipu byla v každou chvíli nevyužitá. Přechod k unifikovaným shaderům – stream procesorům – tento problém vyřešil a současně otevřel dveře do té doby okrajové technologii GPGPU.

Co je stream processing?

Pojem stream processing označuje základní kámen, na kterém staví technologie GPGPU. Odkazuje na instrukce SIMD (Single Instruction, Multiple Data) umožňující vykonání jednoho postupu nad větším množstvím dat. Využití nachází v paralelním programování, což je také případ GPGPU. Umožňuje programátorovi využívat pole výpočetních jednotek, bez přesného určení co má který výpočetní blok v danou chvíli provádět, a současně odpadá problém synchronizace. Vstupem jsou data (stream) a sada instrukcí, které mají být provedeny.

Největší přínos v oblasti výpočtů stále mají samostatné grafické karty, protože jsou svébytným celkem, u kterého pracují rychle všechny jeho součástí. Jde především o paměť, protože té má běžný procesor nedostatek. Cache je relativně malá a operační paměť RAM zase pomalá. Úzkým hrdlem s dedikovanou kartou se tak stává jen systémová sběrnice. Celý postup pak funguje tak, že jsou z hlavní paměti RAM nakopírována data do paměti grafické karty, tam dojde k automatickému rozdělení mezi výpočetní jádra (stream processing), samotný výpočet je instruován hlavním procesorem a po jeho skončení jsou zase data zkopírována do RAM počítače. Grafická karta tak slouží jen na jednotlivé úlohy a vzhledem k netriviálnímu vývoji programů využívajících GPGPU jde výhradně o ty, kde má její zapojení významný přínos.

Každý svou cestou

První neherní programy využívající grafické karty pracovaly s shadery, jejichž funkci ohýbaly tak, aby byly použitelné i mimo svět grafických výpočtů. Programování probíhalo skrze multimediální rozhraní API (DirectX) nebo stavělo na Assembleru, ale v obou případech šlo o krkolomné řešení. Výrobci grafických čipů si uvědomovali výkon i šíři využití svých procesorů, což vedlo ke vzniku platforem Nvidia Cuda a ATI Stream.

CUDA_processing_flow_(En).PNG
Výpočet probíhá na grafické kartě, ale stále je řízen hlavním procesorem, úzkým hrdlem zůstává systémová sběrnice (zdroj: Wikipedia)

Cuda umožňuje vývojářům programovat v jazycích Fortran, C a C++, nechybí ale ani nástroje třetích stran pro vývoj v mnoha dalších jazycích, mezi kterými najdete třeba Javu nebo Python. Při práci se s akcelerací na kartách Nvidie setkáte často, AMD je v tomto ohledu mírně pozadu a konkurenta pozvolna dohání.

 
Pravděpodobným vítězem v oblasti vývoje pro grafiky se stane OpenCL, možností je ale víc
 

Technologie závislé na hardwaru jednoho výrobce jsou vždy přítěží pro vývojáře, a proto se nyní oba producenti grafických čipů soustředí na plnou podporu aplikačního rozhraní OpenCL založeném na jazyku C. Tato sada funkcí si klade za cíl sjednotit vývoj napříč hardwarem a umožnit vývojářům implementaci akcelerace pomocí grafiky bez nutnosti přepisování kódu pro více platforem.

OpenCL Paměť
OpenCL pod sebou zahrnuje i práci s pamětí, zavádí její logické rozvrstvení a přidělování zpracovávaným úlohám

Další výhodou OpenCL je podpora většího množství hardwaru, než jsou pouze grafické karty. To umožňuje využít výpočetní výkon počítače jako celku nebo přenášet zátěž mezi procesorem a grafikou, což může být užitečné zejména u mobilních zařízení s ohledem na co největší úspornost. Aktuální stabilní verze 1.2 dále umožňuje např. rozdělit výpočetní sílu do několika samostatných bloků a těm pak zadat práci odděleně. Díky tomu lze pro kritickou část kódu pevně vymezit díl hardwaru, který nebude vytěžovat nic jiného. Připravovaná verze 2.0 přinese kromě jiného sdílenou virtuální paměť, generický adresní prostor nebo rozšířenou podporu ovladačů pro Android.

Určitě si přečtěte

Články odjinud