Need for speed: parallelle GPU-berekeningen

Een beeld op je computerscherm bestaat tegenwoordig uit miljoenen pixels in wel een miljard kleurencombinaties. Iedere pixel die je ziet, is berekend door de GPU: de Graphic Processing Unit, een processor gespecialiseerd in het maken van beeldberekeningen. We maken dagelijks gebruik van een GPU, bijvoorbeeld tijdens het gamen of kijken van video’s, maar hoe werkt het precies? Wat is ervoor nodig om 3D-beelden te maken en waar koop je het beste een GPU?

Zoveel content, zoveel berekeningen

Verschillende content vraagt om verschillende soorten berekeningen. Laten we eens wat beter kijken naar wat ervoor nodig is om een beeld op je scherm te toveren. Stel dat je in de mailapplicatie op je computer een mailtje opent. In dit geval moet er een ‘platte’ beeldberekening worden gemaakt. We noemen dit ook wel een ‘2D-beeld’. Dit beeld is opgemaakt uit vlakken en lijnen gevuld met letters of zogeheten ‘bitmaps’ – allemaal werk dat een CPU kan uitvoeren.

Maar stel je voor dat er een video met bewegende 2D-beelden is ingesloten in de mail. Zodra er bewegend beeld moet worden weergegeven, moet er meer gebeuren. Het digitale bestand, de bron van het beeld, wordt door de CPU aan de GPU aangeboden. Vervolgens moet de GPU dit redelijk snel, beeld voor beeld, weer naar het scherm sturen, willen we vloeiend beeld zien op ons computerscherm. Klinkt misschien wat ingewikkeld, maar al met al wordt een moderne GPU hier niet erg warm van. Het enige wat hij ‘eigenlijk’ hoeft te doen, is enkel met de juiste snelheid voor de juiste kleuren pixels te zorgen.

Zodra er bewegende, computer gegenereerde 3D-beelden in het spel komen, kan de GPU écht aan het werk. Bij computer gegenereerde 3D-beelden is er namelijk nog geen sprake van een bestaand beeld: er is nog geen compleet plaatje zoals bij een foto, video of een letter. Dit beeld moet eerst worden opgebouwd uit andere ‘informatie’. Die ‘informatie’ is afhankelijk van wat voor beeld gemaakt moet worden.

Driehoeken

Laten we dit uitleggen aan de hand van een voorbeeld. We nemen een 3D-landschap: het eerste computer gegenereerde 3D-beeld dat ooit gemaakt is. Om voor te stellen hoe dit landschap wordt berekend, nemen we een eenvoudig Nederlands polderlandschap. Abstract zou dit kunnen bestaan uit één rechthoekig vlak met een horizontaal kleurverloop van groen naar lichtgroen en daarboven één rechthoekig lichtblauw vlak. Om dit te kunnen berekenen, moet de GPU een aantal dingen weten: twee coördinaten voor de onderste rechthoek, twee coördinaten voor de bovenste rechthoek en twee kleuren (waarvan één met gradatie en richting voor het verloop van groen).

Een rechthoek wordt door een GPU berekend aan de hand van twee gelijke driehoeken waarvan de schuine zijden tegen elkaar geplaatst zijn. Deze driehoeken worden ‘ingekleurd’ met de gevraagde kleuren. Er worden driehoeken gebruikt, omdat daarmee ieder oppervlak bij benadering gemaakt kan worden.

Nu hebben we een polderlandschap met perspectief. Misschien een leuk idee om er een dijk in te plaatsen? Ook deze dijk wordt weer opgebouwd uit driehoeken, of beter gezegd, piramiden.

parallelle GPU-berekeningen

We plaatsen drie driehoeken met de lange zijden tegen elkaar aan zodat ze een piramide vormen; de vierde driehoek vormt de ‘bodem’. Als we in 3D naar een piramide kijken, zien we nooit vier vlakken tegelijk. We moeten de GPU nu dus nog vertellen vanuit wel oogpunt we naar dit beeld willen kijken. Als het goed is, zien we uiteindelijk twee vlakken van de piramide in ons landschap. Wanneer we heel veel van deze piramides samenvoegen, kunnen we bergen, dalen, of zelfs dijken beschrijven.

Floating point berekeningen

Goed, we hebben een 3D-beeld van een polderlandschap met een dijk. Daar mag nog wel een beetje beweging inkomen! Hiervoor hoeven we aan het beschreven beeld niets anders te wijzigen dan de kijkhoek. Het klinkt simpel, maar toch heb je hier de kracht van een GPU voor nodig, in tegenstelling tot een CPU. De GPU rekent beeld voor beeld de pixels voor de driehoeken uit: de resultaten van deze berekeningen zijn geen simpele hele getallen. Het zijn delingen en daarom getallen met cijfers achter de komma. Cijfers achter de komma uitrekenen kan de CPU wel, maar hij is er niet heel snel mee. Hij kan ook niet zoveel van deze berekeningen tegelijkertijd uitvoeren. Een GPU is juist ontworpen om delingen uit te rekenen met een vastgestelde precisie. Dat doet hij snel en parallel (veel berekeningen tegelijkertijd).

Dit soort complexere, parallelle berekeningen noemen we floating point-berekeningen. GPU's zijn ontworpen om snel 32-bit floating point-berekeningen uit te voeren. Afgekort noemen we dit ook wel ‘FP32’-berekeningen. Bij FP32-berekeningen zijn de afrondingen van de delingen nauwkeurig genoeg om de objecten, opgebouwd uit driehoeken, uit te rekenen. Hiervoor gebruikt een GPU kernen, ‘cores’, die allemaal tegelijk kunnen rekenen. Dus het aantal cores en de klokfrequentie van de cores (het aantal berekeningen per seconde) bepaalt hoeveel van deze berekeningen in totaal tegelijkertijd gedaan kunnen worden. Indien een FP32-berekning te nauwkeurig is, kan een core ook twee FP16- of vier FP8-berekeningen maken in dezelfde tijd.

Rekenvoorbeeld

Stel we willen een GPU FP8-berekeningen laten maken. De GPU heeft tweehonderd FP32-cores die op iedere 1GHz klokpuls een berekening kunnen maken. Dit betekent dat hij 200x4x1000000000 = 800 Giga berekeningen per seconde kan maken. Dit is heel veel malen meer dan dat bijvoorbeeld een Intel CPU op dit moment kan doen. Een moderne commercieel verkrijgbare GPU heeft op dit moment 8704 cores van 1,7GHz!


Wat is de beste GPU?

Nvidia, momenteel de succesvolste GPU-fabrikant, heeft enige jaren geleden CUDA-cores en Tensor-cores ontworpen. Waarom deze zo goed zijn? De CUDA-cores zijn goed in het maken van nauwkeurig FP32-berekeningen. De Tensor-cores zijn specifiek gemaakt om minder nauwkeurige, maar wel snellere en zuinigere berekeningen uit te voeren zoals FP8- of zelfs integere getaldelingen zoals INT8- en INT4-berekeningen. Een INT4-berekening geeft een supersnel resultaat ten koste van een behoorlijke afrondingsfout. Dit heeft als voordeel dat bijvoorbeeld de kleur van vlakken in een landschap grof, maar snel kunnen worden berekend. De combinatie van heel veel CUDA-cores en Tensor-cores die parallel werken zorgt er dus voor dat er supersnel gedetailleerd beeld kan worden berekend. En dit allemaal parallel over veel cores! De applicatie bepaald wat de beste GPU is.

Ga voor producten met de juiste cores naar onze webshop of laat u adviseren en neem contact op-met mij of een van mijn collega’s.

John van Zandvoort Senior Support Engineer
E-mail: john.van.zandvoort"@"arcobel.com
Linked-In:johnvanzandvoort