Your cart is currently empty!
Processorprestaties niet simuleren maar schatten
De vele optimalisatieslagen in een processor, zoals superscalariteit, out-of-order-uitvoering, branch prediction en simultaneous multithreading, maken het lastig om inzicht te krijgen wat er precies gebeurt bij het uitvoeren van een stuk code. Voor processorontwerpers is dit echter essentiële kennis. Aan de Universiteit Gent ontwikkelde promovendus Stijn Eyerman een analytisch model dat snel inzicht verschaft op basis van de kosten van missers.
De tijd dat een processor zichzelf gezapig instructie voor instructie door een programma heen at, ligt ver achter ons. De processor, in samenwerking met de compiler en het besturingssysteem, mangelt en mengt de instructiestromen om de rekenpaden zo intensief mogelijk te belasten en geen instructieslot verloren te laten gaan. Ten eerste zijn veel processoren superscalair, wat zo veel wil zeggen dat ze meerdere gelijktijdige rekenpaden hebben. Dat betekent dat de front-end van processor soms één, maar meestal meerdere bewerkingen per kloktik naar de back-end stuurt. Dan is elk rekenpad als een lopende-bandwerkplaats opgedeeld in verschillende stadia, zodat deze elk moment met meer dan een operatie tegelijk bezig kan zijn. Ook hier is de bezetting van deze plekken weer variabel. Om deze pijplijnen op te vullen gebruiken processoren gebruik out-of-order-uitvoering. De front-end bepaalt de optimale volgorde van de instructies om zijn pijplijn zo goed mogelijk te vullen. Aan het eind zet de processor de resultaten dan weer in de juiste volgorde. En dan is er nog speculative execution, waarin de processor van te voren probeert te voorspellen welke conditionele tak de code gaat nemen en deze alvast begint uit te rekenen.
Meer recent is daar nog simultaneous multithreading (SMT) bij gekomen, ook wel hyperthreading genoemd. Een multitasking besturingssysteem wekt de indruk meerdere processen tegelijkertijd te draaien door steeds snel van thread te wisselen. Een SMT-processor mixt instructies uit meerdere threads in zijn front-end en kan daardoor tegelijk instructies uit meerdere processen in zijn pijplijn sturen. Allemaal om deze zo goed mogelijk te vullen. En dan is er natuurlijk nog multicore, dat nog een geheel nieuw niveau van parallellisme introduceert.