Ontdek John Hennessy’s kernideeën over architectuur: waarom prestaties niet langer “gratis” scherper schalen, hoe parallelisme helpt en welke afwegingen moderne systemen vormgeven.

John Hennessy is een van de architecten die het duidelijkst uitlegde waarom computers sneller worden — en waarom die vooruitgang soms stokt. Naast het ontwerpen van invloedrijke processors en het populair maken van RISC-ideeën, gaf hij systeembouwers een praktisch vocabulaire voor prestatiekeuzes: wat je moet optimaliseren, wat niet, en hoe je het verschil ziet.
Als mensen het hebben over “prestatie-scaling”, bedoelen ze vaak “mijn programma draait sneller”. In echte systemen is schalen een driehoeksverhouding tussen snelheid, kosten en vermogen/energie. Een wijziging die één workload 20% sneller maakt, kan de chip duurder maken, de server moeilijker koelbaar of de batterij sneller leegtrekken. Hennessy’s kijk is belangrijk omdat hij die beperkingen als normale engineering-ingeven behandelt — niet als vervelende verrassingen.
Ten eerste parallelisme: meer werk tegelijkertijd doen. Dat zie je binnen een core (instructie-niveau), over cores heen (threads) en over hele machines.
Ten tweede specialisatie: het juiste gereedschap voor de klus. GPU’s, video-encoders en ML-accelerators bestaan omdat algemene CPU’s niet alles efficiënt kunnen.
Derde is afwegingen: elke “winst” heeft een prijs. Het gaat erom te begrijpen waar de grens ligt — rekenkracht, geheugen, communicatie of energie.
Dit is geen diepgaande biografie. Het is een set praktische concepten die je kunt gebruiken bij het lezen van benchmarks, het kiezen van hardware of het ontwerpen van software die met de vraag moet meegroeien.
Gedurende lange periodes voelde prestatieverbetering bijna automatisch. Toen transistors kleiner werden, konden chipfabrikanten er meer op een processor plaatsen en vaak op hogere kloksnelheden draaien. Softwareteams konden hetzelfde programma op een nieuwe machine uitbrengen en zien dat het sneller klaar was — zonder herontwerp.
Dat was de periode waarin een nieuwe CPU-generatie vaak hogere GHz, lagere kosten per transistor en merkbare snelheidswinst voor gewone code betekende. Veel van die winst vergde niet dat ontwikkelaars anders gingen denken; compilers en hardware-upgrades deden het zware werk.
Uiteindelijk stopte het verhogen van de klok een eenvoudige winst te zijn omdat vermogen en warmte te snel stegen. Transistors kleiner maken verlaagde niet automatisch het energieverbruik zoals vroeger, en hogere frequenties maakten chips heter. Op een gegeven moment was de limiterende factor niet meer “Kunnen we het sneller maken?” maar “Kunnen we het betrouwbaar koelen en van stroom voorzien?”
Denk aan een automotor. Je kunt vaak harder rijden door hoger in toeren te gaan — tot je grenzen raakt: brandstofverbruik schiet omhoog, onderdelen oververhitten en het systeem wordt onveilig. CPU’s raken een vergelijkbare grens: het opschroeven van het “RPM” (kloksnelheid) kost onevenredig meer energie en levert meer warmte dan het systeem kan verdragen.
Toen klokschaalvergroting vertraagde, werd prestatie iets dat je verdient door ontwerp: meer parallel werk, beter gebruik van caches en geheugen, gespecialiseerde hardware en zorgvuldige softwarekeuzes. Hennessy’s boodschap past bij die verschuiving: grote winsten komen nu doordat het hele systeem — hardware en software — samenwerkt, niet doordat je op de volgende chip vertrouwt.
Instruction-Level Parallelism (ILP) is het idee van kleine stappen tegelijk uitvoeren binnen een enkele CPU-core. Zelfs als je programma “single-threaded” is, kan de processor vaak werk overlappen: terwijl de ene instructie op iets wacht, kan een andere beginnen — als ze niet afhankelijk van elkaar zijn.
Een eenvoudige manier om ILP voor te stellen is pipelining. Denk aan een lopende band: de ene fase haalt een instructie, de volgende decodeert, de volgende voert uit en de laatste schrijft het resultaat. Als de pijplijn vol is, kan de CPU ruwweg één instructie per cycle afronden, ook al duurt het meerdere fasen voordat een instructie helemaal doorloopt.
Pipelining verbeterde jarenlang de prestaties omdat het doorvoer verhoogde zonder dat programmeurs alles moesten herschrijven.
Echte programma’s lopen niet in een rechte lijn. Ze stuiten op takken (“als dit, dan dat”), en de CPU moet beslissen wat hij daarna ophaalt. Als hij wacht om het te weten, kan de pijplijn stokken.
Branch prediction is de manier waarop de CPU het volgende pad raadt zodat het werk blijft stromen. Als de gok goed is, blijven de prestaties hoog. Als hij fout is, gooit de CPU het werk op het verkeerde pad weg en betaalt een prijs — verspilde cycli en energie.
Verder pushen van ILP vereist meer hardware om onafhankelijke instructies te vinden, ze veilig te herschikken en te herstellen van fouten zoals mispredicties. Dat voegt complexiteit en validatiewerk toe, verhoogt vermogengebruik en levert vaak elke generatie kleinere winst op.
Dit is een terugkerende les van Hennessy: ILP is waardevol, maar het bereikt praktische grenzen — dus blijvende prestatiegroei heeft andere hefbomen nodig, niet alleen “slimmere” single-core uitvoering.
Amdahl’s Law herinnert ons eraan dat het versnellen van een deel van een taak de hele taak niet sneller kan maken dan wat het resterende trage deel toestaat. Je hebt geen zware wiskunde nodig — je hoeft alleen maar te kijken naar wat niet te paralleliseren valt.
Stel je een supermarkt voor met één klant en een kassa-wereldbeeld:
Als betalen altijd bijvoorbeeld 10% van de totale tijd kost, kun je, zelfs als scannen “direct” wordt door meer kassa’s toe te voegen, niet beter dan ongeveer 10× versnellen in totaal. Het seriële deel wordt de bovengrens.
Koken toont hetzelfde patroon: je kunt groenten hakken terwijl water kookt (parallel), maar je kunt het bakken van een cake van 30 minuten in de oven niet “paralleliseren”.
Het belangrijke inzicht is dat de laatste paar procent seriëel werk alles limiteren. Een programma dat “99% parallel” klinkt geweldig — tot je het over veel cores wil schalen en ontdekt dat die 1% seriële delen de bottleneck zijn.
Amdahl’s Law verklaart waarom “gewoon meer cores toevoegen” vaak teleurstelt. Meer cores helpen alleen als er genoeg parallel werk is én de seriële knelpunten (synchronisatie, I/O, single-thread-fases, geheugenstops) klein blijven.
Het verklaart ook waarom accelerators lastig kunnen zijn: als een GPU één kernel versnelt maar de rest van de pijplijn seriëel blijft, kan de totale winst bescheiden zijn.
Voordat je in parallelisme investeert, vraag: Welk deel is echt parallel en wat blijft seriëel? Besteed je inspanning waar de tijd werkelijk naar toe gaat — vaak het “saaie” seriële pad — want dat bepaalt de grens.
Jarenlang betekende prestatie vooral één CPU-core sneller maken. Die aanpak stuitte op praktische grenzen: hogere kloksnelheden verhoogden warmte en energie, en diepere pijplijnen leverden niet altijd proportionele snelheidswinst in de praktijk. Het gangbare antwoord was meerdere cores op één chip zetten en prestaties verbeteren door meer werk tegelijk te doen.
Multicore helpt op twee manieren:
Dit onderscheid is belangrijk bij planning: een server profiteert vaak meteen van het afhandelen van meer verzoeken tegelijk, terwijl een desktop-app alleen sneller aanvoelt als het eigen werk ook paralleliseert.
Thread-level parallelisme komt niet vanzelf. Software moet parallel werk blootleggen met threads, taak-queues of frameworks die een taak in onafhankelijke eenheden delen. Het doel is om cores bezig te houden zonder constant op elkaar te wachten.
Praktische stappen zijn onder andere paralleliseren van lussen, scheiden van onafhankelijke fases (bijv. decode → process → encode) of meerdere verzoeken/events gelijktijdig afhandelen.
Multicore-scaling strandt vaak op overhead:
Hennessy’s bredere boodschap geldt hier: parallelisme is krachtig, maar echte snelheidswinst vereist zorgvuldige systeemontwerpen en eerlijke metingen — niet alleen meer cores.
Een CPU kan alleen werken met data die het beschikbaar heeft. Als de data nog onderweg is — omdat het uit geheugen moet komen — moet de CPU wachten. Die wachttijd is geheugenlatentie, en die kan een “snelle” processor veranderen in een dure idlemachine.
Zie geheugen als een magazijn aan de andere kant van de stad. Zelfs als je werknemers (de CPU-cores) razendsnel zijn, kunnen ze niets assembleren als de onderdelen in de file staan. Moderne processors kunnen miljarden operaties per seconde uitvoeren, maar een reis naar main memory kan honderden CPU-cycli duren. Die gaten lopen snel op.
Om wachten te verminderen gebruiken computers caches, kleine en snelle geheugens dichter bij de CPU — als schappen met de onderdelen die je het meest gebruikt. Als de benodigde data al op het schap staat (een “cache hit”), gaat het werk vlot door. Bij een “miss” moet de CPU verder weg halen en betaal je de volledige latentieprijs.
Latentie is “hoe lang tot het eerste item arriveert”. Bandbreedte is “hoeveel items er per seconde aankomen”. Je kunt een brede snelweg (hoge bandbreedte) hebben maar alsnog lange reistijd (hoge latentie). Sommige workloads streamen veel data (bandbreedte-gebonden), andere vragen herhaaldelijk kleine, verspreide stukken op (latentie-gebonden). Beide kunnen een systeem traag laten aanvoelen.
Hennessy’s bredere punt over grenzen verschijnt hier als de memory wall: CPU-snelheid verbeterde jarenlang sneller dan geheugen-latenties, waardoor processors steeds meer tijd wachtend doorbrachten. Daarom komen prestatieverbeteringen vaak door betere datalokalisatie (waardoor caches meer helpen), het herdenken van algoritmes of het veranderen van de systeembalans — niet alleen door de core sneller te maken.
Lang was “sneller” vooral “hogere klok”. Die denkwijze valt weg zodra je vermogen als harde limiet beschouwt in plaats van bijzaak. Elke extra watt wordt warmte die je moet afvoeren, batterij die je leegtrekt of elektriciteit die je betaalt. Prestaties blijven het doel — maar prestaties per watt bepalen wat er daadwerkelijk geleverd en opgeschaald wordt.
Vermogen is niet slechts een technisch detail; het is een productbeperking. Een laptop die goed op synthetische tests presteert maar na twee minuten gaat throttle-en, voelt traag. Een telefoon die een pagina direct rendert maar 20% batterij verliest, is een slechte ervaring. Ook in datacenters kan je rekencapaciteit ruim voorhanden zijn, maar geen extra vermogen of koelcapaciteit.
Het verhogen van de frequentie is onevenredig duur omdat vermogen sterk stijgt als je voltages en schakelingen opvoert. In vereenvoudigde termen volgt dynamisch vermogen ruwweg:
Dus de laatste 10–20% van kloksnelheid kan veel meer watt vragen — wat tot thermische limieten en throttling leidt in plaats van blijvende winst.
Dit is waarom moderne ontwerpen efficiëntie benadrukken: vaker parallelisme gebruiken, slimme energiebeheerstrategieën en “goed genoeg” kloks gecombineerd met betere microarchitectuur. In datacenters is stroom een kostenpost die hardwarekosten op lange termijn kan evenaren. In de cloud kan inefficiënte code direct je rekening opdrijven — omdat je betaalt voor tijd, cores en (vaak indirect) energie.
Hennessy’s terugkerende punt is simpel: prestatie-scaling is geen alleen-hardware- of alleen-softwareprobleem. Hardware–software co-design betekent CPU-functies, compilers, runtimes en algoritmes op echte workloads afstemmen — zodat het systeem sneller wordt in wat je werkelijk draait, niet alleen wat op een specsheet goed staat.
Een klassiek voorbeeld is compilerondersteuning die hardwaremogelijkheden ontgrendelt. Een processor kan brede vectorunits (SIMD), branch prediction of instructies hebben die operaties samenvoegen, maar software moet zo gestructureerd zijn dat de compiler ze kan gebruiken.
Als de bottleneck geheugenstops, lock-contentie of I/O is, verplaatst een hogere klok of meer cores vaak nauwelijks het meetpunt. Het systeem bereikt gewoon sneller dezelfde grens. Zonder softwarewijzigingen — betere parallele structuur, minder cache-misses, minder synchronisatie — kan de nieuwe hardware onbenut blijven.
Bij het overwegen van een optimalisatie of nieuw platform, vraag:
RISC (Reduced Instruction Set Computing) is minder een slogan dan een strategische keuze: houd de instructieset klein en regelmatig, en je kunt elke instructie snel en voorspelbaar laten uitvoeren. John Hennessy hielp dit idee populair maken door te benadrukken dat prestaties vaak verbeteren wanneer het werk van de hardware eenvoudiger is, zelfs als software uiteindelijk meer instructies gebruikt.
Een gestroomlijnde instructieset heeft vaak consistente formaten en eenvoudige operaties (load, store, add, branch). Die regelmaat maakt het voor een CPU makkelijker om:
Het belangrijkste is dat wanneer instructies makkelijk te verwerken zijn, de processor meer tijd kan besteden aan nuttig werk en minder aan het afhandelen van uitzonderingen en randgevallen.
Complexe instructies kunnen het aantal instructies in een programma verminderen, maar verhogen vaak hardwarecomplexiteit — meer schakelingen, meer randgevallen, meer energie voor controrologica. RISC draait dat om: gebruik eenvoudige bouwstenen en laat compilers en microarchitectuur snelheid halen.
Dat kan ook energie-efficiëntie opleveren. Een ontwerp dat minder cycli aan overhead verspilt, verbruikt vaak minder joules — cruciaal als vermogen en warmte bepalen hoe snel een chip kan draaien.
Moderne CPU’s — op telefoons, laptops of servers — lenen veel van RISC-principes: regelmatige pijplijnen, sterke optimalisaties rond eenvoudige operaties en veel vertrouwen op compilers. ARM-systemen zijn een zichtbare RISC-afstamming in de mainstream, maar de bredere les is niet “welk merk wint”.
De blijvende gedachte is: kies eenvoud als dat hogere doorvoer, betere efficiëntie en makkelijker opschalen mogelijk maakt.
Specialisatie betekent hardware gebruiken die één klasse werk buitengewoon goed doet, in plaats van een algemene CPU alles te laten doen. Voorbeelden zijn GPU’s voor graphics en parallelle rekenkunde, AI-accelerators (NPUs/TPUs) voor matrixbewerkingen en vaste-functieblokken zoals video-codecs voor H.264/HEVC/AV1.
Een CPU is ontworpen voor flexibiliteit: veel instructies, veel controrologica en snelle afhandeling van “branchy” code. Accelerators ruilen die flexibiliteit in voor efficiëntie. Ze steken meer van het chipbudget in de benodigde operaties (bijv. multiply–accumulate), minimaliseren controle-overhead en gebruiken vaak lagere precisie (zoals INT8 of FP16) waar nauwkeurigheid het toelaat.
Die focus betekent meer werk per watt: minder instructies, minder databeweging en meer parallelle uitvoering. Voor workloads die gedomineerd worden door een repetitieve kernel — rendering, inference, encoding — kan dit dramatische snelheidswinst opleveren met beheersbaar vermogen.
Specialisatie heeft kosten. Je verliest flexibiliteit (de hardware is uitstekend in één taak en middelmatig in andere), betaalt hogere engineering- en validatiekosten en raakt afhankelijk van een software-ecosysteem — drivers, compilers, libraries — dat achter kan lopen of je aan een leverancier bindt.
Kies een accelerator als:
Blijf bij CPU’s als de workload onregelmatig, snel veranderend is of als de softwarekosten de besparingen overstijgen.
Elke prestatiewinst in computerarchitectuur heeft een rekening. Hennessy komt steeds terug op een praktische waarheid: een systeem optimaliseren betekent kiezen wat je bereid bent op te geven.
Een paar spanningen komen steeds terug:
Latentie versus doorvoer: Je kunt één verzoek sneller laten afronden (lagere latentie) of meer verzoeken per seconde afhandelen (hogere doorvoer). Een CPU voor interactieve taken voelt vaak responsiever, terwijl een ontwerp voor batchverwerking streeft naar totale verwerkte hoeveelheid.
Eenvoud versus features: Eenvoudige ontwerpen zijn vaak makkelijker te optimaliseren, verifiëren en opschalen. Veel features helpen bepaalde workloads, maar voegen complexiteit toe die de veelvoorkomende gevallen kan vertragen.
Kosten versus snelheid: Snellere hardware kost meestal meer — meer siliciumoppervlak, meer geheugenbandbreedte, meer koeling, meer engineeringtijd. Soms is de goedkoopste “snelheidswinst” het veranderen van software of workload.
Het is makkelijk om voor één nummer te optimaliseren en per ongeluk de gebruikerservaring te verslechteren.
Bijvoorbeeld, het opvoeren van kloksnelheid verhoogt vermogen en warmte, wat throttling kan veroorzaken en de aanhoudende prestaties schaadt. Meer cores verhogen parallelle doorvoer, maar kunnen contentie voor geheugen vergroten, waardoor elke core minder effectief wordt. Een grotere cache kan misses verminderen (goed voor latentie) maar chipgebied en energie per toegang verhogen (slecht voor kosten en efficiëntie).
Hennessy’s perspectief is pragmatisch: definieer de workload die je belangrijk vindt en optimaliseer voor die realiteit.
Een server die miljoenen gelijksoortige requests afhandelt, geeft om voorspelbare doorvoer en energie per operatie. Een laptop geeft om responsiviteit en batterij. Een datapijplijn accepteert mogelijk hogere latentie als de totale jobtijd verbetert. Benchmarks en specs helpen alleen als ze op jouw use case lijken.
Overweeg een kleine tabel met kolommen zoals: Beslissing, Helpt, Schaadt, Het beste voor. Rijen kunnen “meer cores”, “grotere cache”, “hogere frequentie”, “bredere vectorunits” en “sneller geheugen” bevatten. Dat maakt afwegingen concreet en houdt de discussie aan uitkomsten gekoppeld, niet aan hype.
Prestatieclaims zijn alleen zo goed als de meting erachter. Een benchmark kan technisch “correct” zijn en toch misleiden als hij niet op jouw echte workload lijkt: andere datasizes, cachegedrag, I/O-patronen, concur-rentie of zelfs de mix van reads vs writes kan resultaten omkeren. Daarom behandelen architecten in de Hennessy-traditie benchmarking als een experiment, niet als een trofee.
Doorvoer is hoeveel werk je per tijdseenheid afhandelt (requests/seconde, jobs/uur). Het is goed voor capaciteitsplanning, maar gebruikers voelen geen gemiddelden.
Tail-latentie richt zich op de langzaamste verzoeken — vaak p95/p99. Een systeem kan uitstekende gemiddelde latentie hebben terwijl p99 vreselijk is door wachtrijen, GC-pauzes, lock-contentie of noisy neighbors.
Utilisatie is hoe “bezet” een hulpbron is (CPU, geheugenbandbreedte, schijf, netwerk). Hoge utilizatie kan goed zijn — tot het lange wachtrijen en hoge tail-latentie veroorzaakt.
Gebruik een herhaalbare lus:
Houd aantekeningen bij van configuratie, versies en omgeving zodat je resultaten reproduceerbaar zijn.
Kies niet de “beste run”, het vriendelijkste dataset of één metric die je wijziging flattert. Generaliseer niet te snel: een winst op één machine of benchmark-suite geldt mogelijk niet voor jouw deployment, kostenbeperkingen of piekverkeer van gebruikers.
Hennessy’s blijvende boodschap is praktisch: prestaties schalen niet door wensdenken — ze schalen wanneer je de juiste vorm van parallelisme kiest, energielimieten respecteert en optimaliseert voor de workloads die er echt toe doen.
Parallelisme is de hoofdroute vooruit, maar nooit “gratis”. Of je nu ILP, multicore-doorgeef of accelerators nastreeft, de gemakkelijke winst raakt op en coördinatiekost groeit.
Efficiëntie is een feature. Energie, warmte en databeweging limiteren echte snelheid vaak lang voordat de piek-"GHz"-cijfers dat doen. Een sneller ontwerp dat niet binnen stroom- of geheugenlimieten blijft, levert geen zichtbare winst.
Workload-focus verslaat generieke optimalisatie. Amdahl’s Law herinnert je eraan moeite te besteden waar de tijd gaat. Profiel eerst; optimaliseer daarna.
Deze ideeën gelden niet alleen voor CPU-ontwerpers. Als je een applicatie bouwt, verschijnen dezelfde beperkingen als wachtrijen, tail-latentie, geheugendruk en cloudkosten. Een praktische manier om “co-design” te operationaliseren is architectuurbeslissingen dicht bij workload-feedback te houden: meet, iterate en ship.
Voor teams die een chat-gestuurde build-workflow gebruiken zoals Koder.ai, is dit bijzonder nuttig: je kunt snel een service of UI prototypen en daarna met profiling en benchmarks beslissen of je parallelisme wilt nastreven (bijv. request-concurrentie), datalokalisatie wilt verbeteren (minder round-trips, strakkere queries) of specialisatie wilt invoeren (heavy tasks uitbesteden). Het platform’s planning mode, snapshots en rollback maken het makkelijker om prestatie-impactvolle veranderingen stapsgewijs te testen — zonder van optimalisatie een onomkeerbare keuze te maken.
Als je meer posts zoals deze wilt, bekijk /blog.