GPGPU: Zo helpen grafische kaarten de wetenschap vooruit

Grafische kaarten zijn niet alleen interessant voor gamers, maar ook voor de wetenschap. De vele rekenkernen die nodig zijn om de mooiste spelwerelden tevoorschijn te toveren, zijn bijvoorbeeld ook uitermate geschikt voor DNA-onderzoek. PCM zoekt het uit.

Door de hoge snelheid waarmee de grafisch processor (gpu) kan rekenen kunnen er 3D-werelden worden gecreëerd met gedetailleerde en grote weidse vlaktes om in te verdwalen. Om deze werelden te kunnen zien, bestaat elke 3D-wereld uit punten die gecombineerd vlakken vormen en daardoor als herkenbare objecten op het scherm komen. Lees ook: Linux 4.10 ondersteunt virtuele gpu's.

GPU in games

Als je in een spel met een slagschip over een virtuele zee vaart, bestaat alles geheel uit een verzameling van deze punten en vlakken. Het aantal punten dat tijdens het modelleren van het schip wordt gebruikt, heeft invloed op de hoeveelheid details die je van het schip ziet. Om dan een brandslang er rood en beschadigd uit te laten zien en op het dek van het schip een houten vloer te kunnen zien liggen, worden over alle vlakken afbeeldingen gelegd. Vergelijkbaar met een autodeur die je met een heel grote sticker beplakt.

Bij het bewegen van het schip worden alle punten opnieuw berekend, wat in de huidige spellen al snel kan oplopen tot zestig keer per seconde. Om al deze berekeningen zo snel uit te kunnen voeren, wordt er van zoveel mogelijk cores van een gpu gebruikgemaakt. Bij de meest recente grafische kaarten worden al processoren gebruikt met ruim 3800 cores (rekenkernen) aan boord, wat veel berekeningen tegelijkertijd mogelijk maakt om zo ontzettend veel detail in de 3D-werelden aan te brengen.

© PXimport

GPGPU

Doordat de gpu steeds krachtiger wordt, is het interessant geworden om ook ándere rekenintensieve applicaties gebruik te laten maken van de gpu. Door middel van ‘General-Purpose computing on Graphics Processing Units’ (GPGPU) is het mogelijk om software te schrijven die op de gpu wordt uitgevoerd. Taken die van origine op de cpu uitgerekend werden, zijn nu met aanzienlijke tijdswinst door de gpu uit te voeren. Je zou in eerste instantie denken dat de hoeveelheid cores hiervoor verantwoordelijk is. Het verschil in snelheid wordt echter voornamelijk veroorzaakt door de sterk afwijkende architectuur tussen beide processoren.

Van oorsprong heeft de cpu de taak om berekeningen uit te voeren evenals om alle componenten binnen de computer en de aangesloten randapparatuur aan te sturen. Om de verschillende taken in goede banen te leiden, heeft de cpu onder andere de mogelijkheid om bepaalde taken tijdelijk in de wacht te zetten en andere taken voorrang te geven. Denk hierbij aan het registreren van een toetsaanslag of het uitvoeren van een berekening met prioriteit. 

Ieder programma krijgt in de vorm van een thread om de beurt rekentijd

Deze eigenschap zorgt ervoor dat meerdere programma’s naast elkaar op de computer kunnen draaien. Ieder programma, in de vorm van een thread, krijgt om de beurt wat rekentijd en kan zo de benodigde berekeningen uitvoeren. Threads zorgen voor een afgebakende omgeving waarbinnen de programmacode wordt uitgevoerd.

Door voor rekenintensieve programma’s meerdere threads te starten, kunnen de threads op een cpu met meerdere cores verdeeld worden over de beschikbare cores. Hiermee voorkomt de applicatie dat het zelf bevroren op het scherm staat en verhoogt het de snelheid waarmee gerekend wordt.

Het cachegeheugen

De gegevens waarmee gerekend wordt, staan opgeslagen in het interne geheugen van de computer. Dit is relatief traag geheugen, doordat het buiten de cpu geplaatst is. Daarnaast is er tijdens het productieproces gebruikgemaakt van zeer verfijnde technieken, die het mogelijk maken om op een klein oppervlak zeer veel geheugen te creëren, wat wel ten koste gaat van de snelheid. De wachttijd voor het benaderen van dit geheugen kan daardoor oplopen tot honderden processor-kloktikken. 

Processorfabrikanten lossen dit op door in de cpu zelf snel cachegeheugen aan te bieden, waardoor er nog maar vier processorkloktikken nodig zijn om een berekening te voorzien van gegevens. Omdat dat cachegeheugen kostbaar is en er niet oneindig ruimte beschikbaar is binnen de chip, maken weinig geraadpleegde gegevens ruimte voor gegevens die vaker nodig zijn. Deze weinig geraadpleegde gegevens moeten dan wel, wanneer ze opnieuw geraadpleegd worden, weer uit het tragere intern geheugen worden gehaald. 

De groeiende hoeveelheid cachegeheugen van moderne processors verkleint de kans dat een waarde niet meer in de cache past: een belangrijke reden waarom computers sneller worden. Programma’s hebben daardoor vaker direct toegang tot gegevens uit het cachegeheugen wat de algehele prestatie van de computer vergroot.

Verschil CPU en GPU

Een gpu heeft, net als de cpu, de beschikking over cachegeheugen en kan ook berekeningen op meerdere cores uitvoeren. Toch kan de gpu niet zomaar de cpu vervangen en kan bestaande software niet zomaar op de gpu uitgevoerd worden. Om niet afhankelijk te zijn van het interne geheugen van de computer heeft de grafische kaart beschikking over eigen geheugen.

Er zijn vier verschillende soorten geheugen op een GPU aanwezig

Er zijn vier verschillende soorten geheugen op de grafische kaart aanwezig. De bekendste wordt altijd gebruikt om mee te adverteren en is het grootste maar tevens traagste geheugen. Op de gpu zelf zijn de drie overige typen geheugen geplaatst. Er is lokaal en gedeeld geheugen waar de cores toegang tot hebben. Per core is er een zeer kleine hoeveelheid cache aanwezig, ongeveer 10 KB, een stuk kleiner dan de ruim 2 MB waarmee de meest recente cpu’s uitgerust worden.

Wanneer waardes uit het geheugen nodig zijn, worden deze uit het algemene geheugen gehaald en in het snel toegankelijke cachegeheugen geplaatst. De gpu is zo slim om bij elke opvraging eerst te kijken of de waarde nog in de cache aanwezig is. Doordat de cache per core klein is, zullen weinig gebruikte waardes snel uit de cache komen te vervallen. Bij een volgend gebruik zal dan eerst de waarde opnieuw uit het lokale of algemene geheugen gehaald moeten worden. Een techniek die ook in de cpu toegepast wordt, maar bij de gpu veel sneller voorkomt door de veel kleinere cache. 

Threads en cores

Om hiervoor een oplossing te kunnen bieden, is de architectuur van de grafische processor zo ingericht dat wanneer er te lang op geheugen moet worden gewacht, de thread tijdelijk uit de core gehaald kan worden. Zo kan een andere thread in de core worden gezet, waarmee het verlies van snelheid bij het wachten op geheugen verlaagd wordt. Om dit in goede banen te kunnen leiden, worden alle threads gesynchroniseerd. Ze voeren daardoor altijd exact dezelfde regel programmacode uit. Het is dus niet mogelijk dat een thread alvast de volgende som berekent en daarmee vooruit loopt op andere threads.

Voor het schrijven van GPGPU-code wordt gebruik gemaakt van CUDA of OpenCL. NVIDIA is de ontwikkelaar van CUDA en werkt alleen op NVIDIA-kaarten. Het opensource-project OpenCL is platform-onafhankelijk en werkt op zowel NVIDIA-, AMD- als Intel-processoren. Beide implementaties zijn een dialect van de programmeertaal C, maar wijken onderling sterk af als het gaat om het aansturen van de gpu. Het is dan ook niet mogelijk om zomaar een stukje bestaande C-code met GPGPU uit te voeren.

Voor het schrijven van GPGPU-code wordt gebruikgemaakt van CUDA of OpenCL

Niet alleen dient de programmeur een nieuw dialect aan te leren, het gebruik van geheugen met een gpu verschilt ook flink met die van de cpu. Op het moment dat code op een cpu uitgevoerd wordt, kan het eenvoudig nieuwe delen geheugen reserveren en deze ook direct gebruiken. Een algoritme kan daardoor actief inspelen op het soort data dat het te verwerken krijgt. 

Bij een gpu heeft de code alleen beschikking over vooraf gereserveerd geheugen. Voordat een berekening start, moet het dus al bekend zijn hoeveel geheugen er precies nodig is. Dit vergt van de programmeur wederom meer kennis over de data en het probleem wat opgelost moet worden om zo alsnog een goed werkend algoritme te bouwen.

Videokaart niet alleen voor games

Een grafische kaart wordt dus niet alleen maar gebruikt voor games. Veel programma’s voeren weinig en sterk van elkaar verschillende soorten berekeningen uit. Ze maken daarvoor gebruik van de cpu en benutten het cachegeheugen van de processor optimaal. Er zijn ook momenten waarop bekende programma’s als Excel, Spotify of Photoshop veel wiskundige berekeningen moeten uitvoeren in een zo kort mogelijke tijd. Daarvoor wordt bij deze acties gebruik gemaakt van GPGPU, zoals Photoshop doet bij het toepassen van een blur-filter. 

© PXimport

Ook wordt GPGPU steeds meer toegepast in de wetenschappelijke wereld, zoals bij het uitvoeren van analyses op grote verzamelingen data. Zo worden er met software bloedbaansimulaties berekend, zoekt men naar buitenaardse radiosignalen met het SETI-project en vindt er onderzoek plaats naar het uitvoeren van DNA-analyses voor nieuwe behandelmethodes.

Het moge inmiddels duidelijk zijn dat de grafische kaart tot véél meer in staat is dan alleen het er zo realistisch mogelijk uit te laten zien van games. Je zou daarom wel kunnen stellen dat de naam ‘grafische kaart’ hooguit nog als marketingterm correct is. Wellicht wordt het langzamerhand tijd om de benaming ‘grafisch’ laten varen en de nieuwe krachtpatser wat meer eer aan te doen?

Tekst: Maarten Pater

Deel dit artikel
Voeg toe aan favorieten