Grafiekprefetcher: alvast de juiste gegevens ophalen in een wirwar van verbindingen
Stel je voor dat je door een bibliotheek loopt waarin elk boek verwijst naar een paar andere boeken, verspreid door het hele gebouw, zonder enige logische volgorde. Om een vraag te beantwoorden moet je van boek naar boek springen, en telkens weer helemaal naar een andere plank lopen. Dat is ongeveer wat een computerchip meemaakt wanneer hij door een graaf navigeert: een datastructuur van punten ("knopen") die met lijnen ("verbindingen" of "edges") aan elkaar hangen, zoals vriendschappen in een sociaal netwerk of kruispunten in een wegenkaart.
Een grafiekprefetcher is een stukje techniek, in hardware of software, dat probeert te raden welk boek je hierna nodig hebt en dat alvast van de plank pakt voordat je erom vraagt. In computertermen: het haalt data uit het trage hoofdgeheugen al op voordat de rekenkern (de "processor" of "CPU") erom vraagt, en zet die data klaar in een snel, klein geheugen vlak bij de rekenkern, het zogeheten cachegeheugen. Bij gewone lijstjes met getallen is dat raadwerk simpel, maar bij grafen springt de volgende benodigde gegeven vaak willekeurig door het geheugen heen. Dat maakt het voorspellen bijzonder lastig, en precies dat probleem probeert een grafiekprefetcher op te lossen.
Wat is het precies?
Om te snappen waarom dit een apart vakgebied is, moet je eerst weten wat een gewone prefetcher doet. Elke moderne processor bevat al decennialang eenvoudige prefetchers: schakelingen die het geheugenverkeer in de gaten houden en patronen herkennen. Lees je adres 100, dan 101, dan 102? Dan verwacht de chip dat adres 103 zo ook wordt opgevraagd, en haalt die vast op. Dat werkt uitstekend voor rijtjes getallen die netjes na elkaar in het geheugen staan, zoals een lijst met temperatuurmetingen.
Grafen worden echter meestal niet zo netjes opgeslagen. Een veelgebruikte opslagvorm heet CSR (compressed sparse row): één array houdt bij welke buren elke knoop heeft, en een tweede array bevat de eigenlijke gegevens van al die buren. Het probleem is dat de indexen in die eerste array naar willekeurige plekken in de tweede array wijzen. De chip moet dus eerst het ene stukje geheugen lezen om te ontdekken wáár het volgende stukje staat, en pas dan dat volgende stukje ophalen. Dit heet pointer chasing (letterlijk: aanwijzers achternalopen), en gewone stride-prefetchers herkennen hier geen patroon in.
Een grafiekprefetcher probeert dit op een paar manieren te omzeilen. Sommige ontwerpen zijn indirect: ze snappen dat een waarde uit de ene array meteen als adres in de andere array gebruikt gaat worden, en voeren die stap alvast automatisch uit, één niveau vooruit. Andere ontwerpen zijn programmeerbaar: de programmeur of compiler geeft de chip kennis over de datastructuur mee (bijvoorbeeld "dit is een boom" of "dit is een CSR-graaf"), zodat de prefetcher gericht naar buren, kinderen of volgende knopen kan zoeken. Weer andere aanpakken zijn puur software-matig: in de broncode van het algoritme wordt een expliciete instructie toegevoegd die zegt "haal de gegevens van knoop X alvast op", een aantal stappen voordat ze echt nodig zijn. Al deze varianten proberen hetzelfde: de wachttijd voor het geheugen (de "latency") verbergen door op tijd te beginnen met ophalen.
Wat wil men ermee bereiken?
De kern van het probleem heet in de informatica wel de geheugenmuur: rekenkernen zijn de afgelopen decennia veel sneller geworden, maar het hoofdgeheugen (RAM) nauwelijks. Bij grafiekbewerkingen zoals PageRank (de klassieke Google-methode om het belang van webpagina's te berekenen), breedte-eerst-zoeken (het snelst mogelijke pad vinden in een netwerk) of het opsporen van gemeenschappen in sociale netwerken, staat de rekenkern een groot deel van de tijd stil te wachten op geheugen in plaats van te rekenen. Onderzoekers melden voor dit soort workloads regelmatig dat de processor tachtig procent of meer van zijn tijd kwijt is aan wachten, al hangt dat sterk af van de precieze graaf en het algoritme.
Het doel van een grafiekprefetcher is dus simpel te formuleren, ook al is de uitvoering lastig: reken sneller, verspil minder energie aan stilstaande rekenkernen, en maak het haalbaar om steeds grotere grafen in real time te doorzoeken. Dat laatste wordt actueler nu grafen een centrale rol spelen in kunstmatige intelligentie, met name in graph neural networks (GNN's), modellen die voorspellingen doen op basis van verbindingen tussen dingen, bijvoorbeeld aanbevelingen op basis van wie met wie bevriend is, of fraudedetectie op basis van geldstromen tussen rekeningen. Bedrijven met enorme grafen, zoals sociale netwerken en betaaldiensten, hebben direct belang bij goedkopere en snellere grafiekverwerking.
Voorbeelden uit de praktijk
Concrete, met naam genoemde projecten op dit gebied zijn vrijwel allemaal academisch onderzoek, met soms een link naar de industrie:
- Graphicionado (Georgia Institute of Technology, gepresenteerd op de vakconferentie ISCA in 2016): een voorgestelde speciale rekenchip voor grafiekanalyse die, naast andere trucs, het geheugenverkeer pijplijnt en vooraf regelt zodat rekeneenheden minder hoeven te wachten op willekeurige toegangen.
- Onderzoek van Sam Ainsworth en Timothy Jones aan de University of Cambridge (werk gepubliceerd rond 2016-2018): programmeerbare prefetchers die kennis van de datastructuur gebruiken om bijvoorbeeld bomen en grafen te doorlopen en alvast de juiste knopen op te halen, in plaats van te vertrouwen op generieke patroonherkenning.
- GAP Benchmark Suite van de University of California, Berkeley: geen prefetcher zelf, maar een veelgebruikte, publiek beschikbare verzameling standaardgrafieken en -algoritmen (PageRank, BFS, connected components en meer) waarmee onderzoekers wereldwijd hun prefetch- en versnellingstechnieken vergelijken.
- UPMEM, een Frans hardwarebedrijf, biedt sinds enkele jaren commerciële geheugenmodules met rekenkracht ingebouwd in het geheugen zelf ("processing-in-memory"). Dit is strikt genomen geen prefetcher, maar een verwant antwoord op hetzelfde probleem: in plaats van data naar de rekenkern te halen, verplaats je de berekening naar waar de data al staat, wat bij zeer onregelmatige grafiektoegang soms effectiever is.
- Diverse simulatorstudies op conferenties als MICRO, HPCA en ASPLOS testen "indirecte" of "irreguliere" prefetchers die verder gaan dan grafen alleen, maar waarvan grafiekverwerking steevast een belangrijke testcase is.
Belangrijk om te beseffen: geen van deze voorbeelden is een kant-en-klaar product dat een consument kan kopen. Het zijn onderzoeksprototypes, gesimuleerd of op kleine schaal gebouwd, bedoeld om aan te tonen dat een aanpak werkt.
Hoe ver is de techniek?
Grafiekprefetching is grotendeels een onderzoeksveld, geen marktrijpe technologie. De meeste resultaten die hierboven staan, zijn gemeten in simulatoren zoals gem5 of ChampSim, waarin onderzoekers een fictieve chip nabootsen op een gewone computer. Dat is de standaardmanier om nieuwe hardware-ideeën te testen voordat iemand echt een chip laat maken, maar het betekent ook dat de gerapporteerde snelheidswinsten (vaak tientallen procenten) nog niet automatisch gelden voor een chip die je in een winkel kunt kopen.
Grote chipmakers als Intel, AMD en Arm hebben geen prefetcher die publiekelijk als "grafiekprefetcher" wordt aangeprezen in hun consumenten- of serverprocessoren. Wel hebben deze bedrijven onderzoeksafdelingen die actief publiceren over indirecte en irreguliere prefetching, en het is aannemelijk dat delen van die kennis geleidelijk doorsijpelen in algemenere verbeteringen van bestaande prefetchers, zonder dat dit als apart kenmerk wordt vermarkt. Dat maakt het lastig om precies te zeggen hoeveel van dit onderzoek al "in het echt" meedraait in de chips die mensen dagelijks gebruiken.
De grootste obstakels zijn tweeledig. Ten eerste verschillen grafen enorm van vorm: sommige knopen hebben duizenden verbindingen, andere maar één (dit heet een "machtswet"-verdeling), waardoor één vaste strategie zelden voor alle grafen even goed werkt. Ten tweede kost elke extra slimheid in de chip zelf transistoren, stroom en ontwerpcomplexiteit, en chipmakers moeten afwegen of dat opweegt tegen een specialistische toepassing als grafiekanalyse, tegenover generiekere winst voor alledaagse software. Voortgang in dit veld is daarom vooral incrementeel: elke paar jaar een nieuw idee dat iets beter presteert dan het vorige, zonder dat er één doorbraak is die het probleem definitief oplost.
Wie werken eraan?
Het onderzoek is verspreid over een handvol universitaire groepen en de researchlabs van grote chipbedrijven. Bekende academische centra zijn de University of Cambridge (Computer Laboratory, onderzoek naar programmeerbare en datastructuur-bewuste prefetchers), Georgia Institute of Technology (onder meer met Graphicionado), en UC Berkeley (met de GAP Benchmark Suite als veelgebruikt gereedschap voor het hele veld). Ook andere Amerikaanse en Europese universiteiten publiceren regelmatig op de grote computerarchitectuurconferenties ISCA, MICRO, HPCA en ASPLOS.
Aan de industriekant hebben Intel Labs, AMD Research en Arm onderzoeksteams die zich met geheugenlatency en prefetching bezighouden, al is niet altijd duidelijk hoeveel daarvan specifiek op grafen gericht is versus prefetching in het algemeen. Op het gebied van processing-in-memory, de verwante aanpak waarbij rekenkracht dichter bij het geheugen wordt gezet, zijn spelers als het Franse UPMEM en geheugenfabrikanten als Samsung en SK hynix actief met eigen onderzoekslijnen. Bedrijven met zeer grote grafieken in hun eigen diensten, zoals sociale netwerken, betaaldiensten en zoekmachines, publiceren soms over hun praktijkervaring met grafiekverwerking op schaal, wat weer input geeft aan academisch onderzoek naar geheugenoptimalisatie, al gaat het daarbij niet altijd specifiek om prefetch-hardware.