Výpočty pomocí grafických procesorů GPU – GPGPU
Současné grafické karty disponují až pětadvaceti násobně větším výkonem než obyčejné procesory. V souvislosti s tímto je snaha přenášet složité výpočty z procesoru na grafickou kartu. Co všechno můžou grafické procesory nabídnou, v čem spočívá obrovský výkonnostní rozdíl, kdy je vhodné pro výpočet použít grafickou kartu a kdy ne? Co znamenají zkratky GPU a GPGPU? Přesně na tyto otázky se pokusím podat jednoduchou a jasnou odpověď.
Co mě přivedlo k sepsání článku o GPU?
V pátek 6. 11. jsem se zúčastnil přednášky „Masivně paralelní architektury (GPGPU a další)“, pořádané u nás na fakultě Ústavem počítačových systémů. Přednášejícím byl Jan Prach ze Sun Microsystems. Zapsal jsem si pár poznámek a protože mě využití GPU pro jiné než grafické výpočty zaujalo, chtěl jsem se o této problematice dozvědět více a začal jsem hledat informace na internetu. K mému překvapení jsem moc českých článků na toto téma nenašel, a proto jsem zamířil na zahraniční weby. Z toho co jsem se dozvěděl, jsem se rozhodl sepsat krátký článek, který by poskytl základní informace o této problematice.
Co je to GPU a GPGPU
GPU je anglická zkratka znamenající Graphic Processing Unit, česky bychom to přeložily jako grafický procesor. Ten se většinou nachází na grafické kartě, ale může být také integrovaný na základní desce, a slouží především k výpočtům spojených s vykreslováním obrazu. Tento grafický procesor (dále jen GPU) disponuje vysokým výpočetním výkonem při počítání s čísly v plovoucí desetinné čárce. Tento výpočetní výkon je v dnešní době již tak obrovský a má takový náskok oproti standardnímu procesoru (dále jen CPU), že je snaha a potřeba využívat GPU i pro jiné než grafické výpočty. Právě používání GPU pro jiné než grafické výpočty se označuje zkratkou GPGPU, která znamená General-purpose computing on graphics processing units, což by se dalo přeložit jako “víceúčelové počítání na grafických procesorech”.
V čem je ten rozdíl mezi GPU a CPU
GPU je optimalizováno převážně pro jednodušší aritmetické operace v plovoucí desetinné čárce nad vektory a maticemi. Na rozdíl od CPU má méně vnitřní logiky. Nedisponuje například logikou pro obsluhu přerušení či pro ochranu paměti, stejně tak logikou pro různé dynamické předvídání instrukcí (různé prefetch techniky). Hlavní rozdíl je však v počtu výpočetních jednotek. Zatím co současná moderní CPU mají 2 až 8 jader, na GPU jich najdete kolem 800. Nejde však o plnohodnotná jádra jako naleznete na CPU, ale o proudové procesory (sream processors), jejichž význam bude vysvětlen dále.
Zjednodušeně řečeno, GPU neposkytuje tolik funkčnosti jako CPU, zato je velice rychlý.
Výkonnostní rozdíly – obecně
Současné nejvýkonnější procesory od Intelu mají teoretický výkon plus mínus 75 až 100 Gflops (FLOPS je zkratka pro počet operací v plovoucí řádové čárce za sekundu). Současná nejvýkonnější grafická karta od ATI má výpočetní výkon kolem 2700 Gflops. Přitom spotřeba takto extrémně rozdílná není, přibližně 120W CPU a 180W GPU. Aby toho nebylo málo, má grafická karta asi 10x větší paměťovou propustnost, což zrychluje práci s velkými objemy dat.
Ve finále je GPU teoreticky až 50x rychlejší, skutečné hodnoty jsou kolem pětadvaceti násobného zrychlení.
Pro jaké typy úloh je GPU vhodné
GPU umožňuje takzvaný datový paralelizmus. To znamená, že určitá operace je prováděná zároveň nad všemi daty (proudem dat => odtud název proudové procesory) paralelně.
Představte si, že máte pole o 10 000 000 prvcích a je třeba hodnotu každého prvku zdvojnásobit. V případě zpracování na CPU by byl nejspíš použitý nějaký cyklus, pravděpodobně for, který by prošel celé pole a každý prvek vynásobil dvěma. CPU by zadaný úkol provádělo ve více jak 10 000 000 taktech. Zatím co GPU by vzalo celé pole a během jednoho taktu všechny prvky zároveň vynásobilo dvěma.
Jak je vidět, GPU je vhodné použít pro úkoly, které je možné dobře paralelizovat, jako jsou operace nad poli a maticemi prvků. Podmínkou ovšem je, že se nad všemi prvky bude provádět stejná operace a, že jednotlivé položky jsou na sobě nezávislé! I na GPU je sice možné provádět nad každým prvkem jinou operaci, ale v takovém případě bude výkonnostní přínos malý, nebo žádný.
Dále je vhodné, aby úloha zpracovávaná na GPU využívala tisíce, v lepším případě desetitisíce a více, vláken (threadů). Pokud úloha využívá jen 2 nebo 3 vlákna, je zbytečné přepisovat ji pro GPU. Jenom pro ilustraci uvedu ze GPU na GTX 285 od nVidie má omezení na maximálně 2 198 956 147 200 vláken.
Příkladem vhodných úloh pro paralelní zpracování jsou cykly, ve kterých probíhají operace nad polem prvků, přičemž prvky na sobě nejsou vzájemně závislé.
Řečeno ve zkratce, GPU je vhodné pro zpracování paralelních úloh, kde je možno provádět stejnou operaci nad mnoha nezávislými položkami.
Současná omezení GPU
Ačkoli jsem to již výše zmínil, zopakuji to pro přehlednost ještě jednou. Na GPU neexistuje přerušení jako u klasických procesorů. Stejně tak na GPU nenajdete ochranu paměti, která by hlídala, kterému procesu daná část paměti patří. Další věc která je na GPU problematická je rekurze. Teoreticky je dnes už možné ji provádět, avšak z výkonových důvodů je to nevhodné. Úzkým hrdlem je taktéž propustnost a zpoždění na sběrnici mezi GPU a CPU.
Omezení GPU, která se pomalu stávají minulostí
V začátcích, kdy se GPU začaly využívat pro jiné než grafické výpočty, na nich neexistoval datový typ integer (celočíselné číslo => číslo bez desetinných míst). Další zajímavostí je, že ačkoli byly GPU vždy optimalizovány pro operace s čísly v plovoucí desetinné čárce, byly ještě relativně nedávno v těchto výpočtech méně přesné než soudobé CPU. Důvodem byl fakt, že GPU bylo optimalizováno pro rychlost a vysoká přesnost nebyla třeba, takže GPU na rozdíl od CPU nepočítaly s dvojitou přesností. Stejně tak dříve na GPU čipech neexistovala dedikovaná paměť, která by umožňovala výpočetním jednotkám vzájemnou komunikaci. Všechna omezení uvedená v tomto odstavci se však již pomalu stávají minulostí a na nejnovějších GPU už se s nimi pravděpodobně nesetkáte.
Psaní aplikací pro GPU
Dříve se na programování aplikací využívajících GPU používaly knihovny poskytující API (Application Programming Interface) pro práci s počítačovou grafikou jako jsou Open GL, či DirectX. Tento přístup nebyl zrovna nejvhodnější, protože programátoři museli svůj program přetransformovat tak, aby jeho výpočty odpovídali grafickým výpočtům poskytovaných těmito knihovnami. Potřebu vhodnějšího prostředku pro práci s GPU, který by umožnil využívat jeho vysoký výkon, si uvědomily i firmy vytvářející grafické čipy a knihovny pro práci s nimi.
Výsledkem jsou tři balíky knihoven, pomocí kterých můžete programovat aplikace využívající GPU:
Za prvním jmenovaným stojí firma Microsoft a za druhým firmu nVidia. Zatímco první dvě knihovny jsou, jak je vidět „one man show“. Za poslední jmenovanou OpenCL stojí konsorcium Khronos Group, které sdružuje desítky firem a jeho účelem je tvorba otevřených standardů.
Závěrem
V tomto článku jsem se pokusil shrnout základní informace o GPU. Vysvětlit rozdíly mezi procesory GPU a CPU, ukázat proč je mezi nimi takový propastný výkonnostní rozdíl, popsat typ úloh pro které je použití GPU vhodné a naopak upozornit na omezení, které z použití GPU vyplývají, na konec jsem ještě zmínil tři balíky knihoven potřebných pro vývoj aplikací využívajících GPU.