Hoe een machinecyclus te begrijpen
Eerlijk gezegd zijn CPU’s tegenwoordig een nachtmerrie van complexiteit. Ze doen al die gekke dingen: instructies herschikken, meerdere cores, diepe pipelines, branch prediction, register hernoemen…het is alsof je het verkeer in een stad tijdens de spits probeert te volgen op steroïden. De kerngedachte is echter dat elke instructie een reeks fasen doorloopt – ophalen, decoderen, uitvoeren, terugschrijven – die de processor draaiende houden. Maar het is niet zoals vroeger, toen één instructie gewoon moest worden afgerond voordat de volgende kon beginnen. Nu is alles via een pipeline, wat betekent dat meerdere instructies zich tegelijkertijd in verschillende fasen bevinden. Leuk in theorie, maar best stressvol in de praktijk, omdat het begrijpen ervan helpt bij het oplossen van prestatieproblemen of CPU-problemen. Eén ding dat verrassend constant is gebleven, is wat er daadwerkelijk gebeurt bij elke stap, zelfs met al die upgrades. De processor haalt een instructie op uit het geheugen (met behulp van de Program Counter), decodeert vervolgens wat hij moet doen, voert de bewerking uit en schrijft uiteindelijk het resultaat terug. Het is een enorme prestatie om dit allemaal soepel te laten werken in hardware (en software).
De basisfasen van de pijpleiding
Elke CPU doet ongeveer hetzelfde in vrijwel dezelfde volgorde, hoewel de manier waarop hij dat doet sterk kan verschillen. Eerst haalt hij een instructie op uit het geheugen – met behulp van de programmateller om de juiste plek te vinden – en laadt die instructie vervolgens in een register. De pc werkt deze vervolgens bij om naar de volgende instructie te verwijzen – soms is dat eenvoudig, soms niet, vanwege vertakkingsvoorspellingen of sprongen, die het ophaalproces kunnen verstoren. Op sommige machines is het, tijdens het debuggen of optimaliseren, verstandig om de instructiecache of de assembly te bekijken om te zien wat er werkelijk gebeurt tijdens het ophalen. Eenmaal opgehaald, gaat de instructie naar de decode, waar de CPU uitzoekt wat hij moet doen. Dit houdt in dat de instructie wordt vertaald naar signalen voor uitvoering en dat wordt gecontroleerd welke gegevens (operanden) nodig zijn. Hier komen de cache en registers om de hoek kijken; als de benodigde gegevens niet in de L1-cache of -registers staan, kan dit vertragingen veroorzaken. Moderne CPU’s hernoemen registers ook – een beetje vreemd, maar het helpt om valse gegevens te voorkomen. Als je problemen met trage code oplost, houd dan cache-hits/misses in de gaten, want deze fase is cruciaal. De uitvoeringsfase is waar de daadwerkelijke wiskunde of logica plaatsvindt. De instructie en data worden naar de ALU- of FP-units gestuurd, waarmee de kernberekening wordt voltooid. Meestal supersnel – in veel gevallen één klokcyclus – maar als de pijplijn te diep is of er een blokkade in de pijplijn optreedt, kunnen er vertragingen optreden. Moderne CPU’s hebben ongeveer 25 pijplijnstappen, wat gek klinkt, maar het draait allemaal om het uitpersen van elke greintje prestatie. Ten slotte vindt de writeback-stap plaats. Dit is wanneer de CPU het register of geheugen bijwerkt met je resultaten. Als er hier een vertraging optreedt, wordt dit weergegeven als blokkades of trage responstijden. Door pipelining bevinden meerdere instructies zich tegelijkertijd in verschillende stappen, wat de doorvoer verhoogt, maar ook de complexiteit, vooral bij het proberen vast te stellen van prestatieproblemen.
Afronding
Een machinecyclus of instructiecyclus is dus in feite hoe een CPU één enkele instructie verwerkt via de fasen fetch-decode-execute-writeback. En zelfs met de waanzinnig moderne architectuur blijven die kernstappen vrijwel hetzelfde. Bij het oplossen van problemen met prestaties of vreemd CPU-gedrag helpt het begrijpen van dit pijplijnmodel om te begrijpen waarom dingen vastlopen of juist versnellen. CPU’s zijn ingewikkelde monsters, maar het begrijpen van deze basisprincipes maakt het geheel een stuk minder mysterieus.
Samenvatting
- CPU’s verwerken instructies in verschillende fasen: ophalen, decoderen, uitvoeren, terugschrijven.
- Met pipelining kunnen meerdere instructies zich tegelijkertijd in verschillende fasen bevinden.
- Cachefouten en pijplijnstoringen hebben een grote invloed op de prestaties.
- Als u deze begrijpt, kunt u vertragingen of vreemde CPU-problemen oplossen.