GPU-kernel: de bouwstenen van razendsnelle berekeningen
Elke keer dat een chatbot een antwoord genereert, een zelfrijdende auto een voetganger herkent, of een filmstudio een complexe scène rendert, draait er ergens een GPU-kernel. Dat is een klein stukje programmacode dat speciaal is geschreven om op een grafische kaart (GPU, graphics processing unit) te draaien. Waar een gewone processor (CPU) taken grotendeels na elkaar afhandelt, bevat een GPU duizenden kleine rekenkernen die tegelijk kunnen werken. Een GPU-kernel is de instructie die aan al die rekenkernen verteld wat ze precies moeten doen.
Een bruikbare analogie is een enorme keuken met duizenden koks die allemaal exact dezelfde beweging maken, maar dan elk op hun eigen stukje ui. Eén kok die alles alleen doet (de CPU) is flexibel maar traag bij massawerk; duizend koks die synchroon dezelfde snijbeweging herhalen (de GPU) zijn extreem snel, zolang het recept zich daarvoor leent. De GPU-kernel is dat recept: een klein, strak geoptimaliseerd script dat miljoenen keren tegelijk wordt uitgevoerd, bijvoorbeeld om de getallen in een neuraal netwerk te vermenigvuldigen.
Wat is het precies?
Een GPU bestaat uit duizenden kleine rekeneenheden, vaak 'cores' genoemd, die gegroepeerd zijn in clusters. Een kernel is code die een programmeur schrijft om één specifieke, vaak simpele bewerking razendsnel te herhalen over een groot blok data, zoals het optellen van twee lange rijen getallen of het vermenigvuldigen van matrices (rechthoekige roosters van getallen die de basis vormen van veel AI-berekeningen).
Het schrijven van zo'n kernel gebeurt meestal in een speciale programmeertaal of uitbreiding daarvan. De bekendste is CUDA, ontwikkeld door chipmaker NVIDIA, waarmee ontwikkelaars in een C-achtige taal code schrijven die direct op NVIDIA-GPU's draait. Concurrenten hebben eigen varianten: AMD gebruikt ROCm/HIP, en er bestaan meer universele benaderingen zoals OpenCL en Intels oneAPI.
Belangrijk is dat een kernel heel precies rekening moet houden met de architectuur van de chip: hoe data tussen geheugen en rekenkernen heen en weer gaat, hoeveel threads (lichte rekentaken) tegelijk lopen, en hoe je voorkomt dat rekenkernen op elkaar moeten wachten. Een slecht geschreven kernel kan een GPU laten draaien op een fractie van zijn mogelijke snelheid, ook al is de hardware identiek. Dit verklaart waarom 'kernel-optimalisatie' een vak apart is geworden: specialisten herschrijven bestaande berekeningen zo dat ze beter passen bij hoe het geheugen en de rekenkernen van een specifieke chip werken.
Een recentere ontwikkeling is dat programmeurs niet langer alles met de hand in CUDA hoeven te schrijven. Talen en compilers zoals Triton (ontwikkeld door OpenAI) laten ontwikkelaars kernels schrijven in een Python-achtige stijl, waarna de compiler automatisch de complexe, laagliggende optimalisaties voor zijn rekening neemt.
Wat wil men ermee bereiken?
De kern van de ambitie is simpel: meer rekenkracht uit dezelfde chip halen. Trainings- en inferentiekosten (het daadwerkelijk gebruiken van een getraind AI-model) van grote taalmodellen lopen op tot miljoenen euro's per training. Een kernel die twee keer zo snel is, betekent in de praktijk twee keer zo weinig GPU-tijd, en dus aanzienlijk lagere kosten en energieverbruik.
Daarnaast speelt een strategisch belang: wie de software-laag onder AI-modellen beheerst, heeft grip op het hele ecosysteem. NVIDIA's CUDA-platform is zo dominant geworden dat veel onderzoekers en bedrijven er bijna vanzelfsprekend voor kiezen, wat NVIDIA een sterke marktpositie geeft. Concurrenten en academische groepen proberen daarom alternatieve, vaak opensource routes te bouwen die minder afhankelijk zijn van één fabrikant.
Een derde doelstelling is toegankelijkheid. Het handmatig schrijven van CUDA-kernels vereist diepgaande kennis van chiparchitectuur, iets wat maar een beperkte groep specialisten goed beheerst. Projecten als Triton en automatische kernel-generatoren proberen die drempel te verlagen, zodat meer onderzoekers zelf geoptimaliseerde code kunnen maken zonder jarenlange ervaring met low-level programmeren.
Voorbeelden uit de praktijk
FlashAttention (Tri Dao en collega's, Stanford, 2022, met vervolgversies FlashAttention-2 in 2023 en FlashAttention-3 in 2024) is wellicht het bekendste voorbeeld van een doorbraak-kernel. Het herschrijft de aandachtmechanismen in taalmodellen (de berekening die bepaalt welke woorden in een zin relevant zijn voor elkaar) zodat ze veel efficiënter omgaan met geheugen. Dit maakte training van grote taalmodellen tot wel drie keer sneller en met minder geheugengebruik.
Triton, open source uitgebracht door OpenAI in 2021, wordt inmiddels gebruikt in populaire AI-raamwerken zoals PyTorch om automatisch geoptimaliseerde kernels te genereren zonder dat ontwikkelaars CUDA hoeven te schrijven.
ThunderKittens, een project van onderzoekers aan Stanford (2024), is een voorbeeld van een nieuwe, compactere programmeerstijl voor het schrijven van GPU-kernels die specifiek inspeelt op de architectuur van NVIDIA's H100-chips.
ROCm van AMD is het antwoord van die chipmaker op CUDA: een opensource softwarestack waarmee kernels geschreven kunnen worden voor AMD's Instinct-GPU's, gebruikt in onder meer de supercomputer Frontier (Oak Ridge National Laboratory, VS, operationeel sinds 2022).
cuDNN, NVIDIA's bibliotheek met kant-en-klare, hooggeoptimaliseerde kernels voor neurale netwerken, wordt sinds de introductie in 2014 continu bijgewerkt en vormt de onderliggende motor achter een groot deel van de huidige AI-training wereldwijd.
Hoe ver is de techniek?
GPU-kernels zijn geen nieuwe technologie; CUDA bestaat al sinds 2007. Wat wel sterk versnelt, is de mate van specialisatie en automatisering. Tot enkele jaren geleden was het schrijven van een performante kernel vooral handwerk door een kleine groep specialisten. Inmiddels groeit het aantal tools dat (deels) automatisch kernels genereert of optimaliseert, gedreven door de enorme vraag vanuit AI-ontwikkeling.
Een belangrijk obstakel blijft de sterke koppeling tussen software en specifieke hardware. Een kernel die perfect is afgestemd op de ene generatie NVIDIA-chips, moet vaak opnieuw worden geoptimaliseerd voor de volgende generatie, omdat geheugenbandbreedte, cache-groottes en reken-eenheden telkens veranderen. Dit maakt het onderhoud van kernel-bibliotheken arbeidsintensief.
Daarnaast blijft er een reëel gat tussen theoretische en praktische prestaties: fabrikanten adverteren vaak met piekrekenkracht die alleen onder ideale omstandigheden haalbaar is. Goed geschreven kernels proberen dichter bij dat plafond te komen, maar perfecte benutting van de hardware blijft zeldzaam, vooral bij complexere, nieuwere typen berekeningen.
Ook neemt de concurrentie tussen softwareplatforms toe. AMD's ROCm en Intels oneAPI winnen terrein, maar CUDA's voorsprong in volwassenheid, documentatie en bestaande codebases blijft vooralsnog groot. Het verkleinen van die achterstand is een proces van jaren, geen maanden.
Wie werken eraan?
NVIDIA (Verenigde Staten) is met CUDA en bibliotheken zoals cuDNN de dominante speler en investeert continu in nieuwe kernel-optimalisaties voor elke nieuwe chipgeneratie, zoals de Hopper- (H100) en Blackwell-architecturen.
AMD (Verenigde Staten) bouwt met ROCm een opensource alternatief en werkt samen met Amerikaanse nationale laboratoria, zoals Oak Ridge, aan supercomputertoepassingen.
OpenAI (Verenigde Staten) ontwikkelt met Triton een laagdrempeliger alternatief voor handgeschreven CUDA-code en onderhoudt dit als actief opensource project.
Stanford University, met name de onderzoeksgroep rond Tri Dao, heeft met FlashAttention en ThunderKittens belangrijke academische bijdragen geleverd die breed door de industrie zijn overgenomen.
Daarnaast dragen grote AI-labs zoals Google DeepMind (met de XLA-compiler voor hun eigen TPU-chips, een ander type AI-versneller) en Meta (via PyTorch en bijbehorende kernel-compilers) actief bij aan het ecosysteem. Ook Intel investeert, via oneAPI, in een poging een meer hardware-onafhankelijke standaard te bevorderen.