Enhver processorinstruktion har flere trin i dens drift. Hvert af disse trin tager en enkelt CPU-cyklus at fuldføre. Disse trin er Instruktionshentning, Instruktionsdekodning, Udfør, Hukommelsesadgang og tilbageskrivning. Disse får henholdsvis den instruktion, der skal gennemføres, adskiller operationen fra de værdier, der betjenes på, udfør processen, åbn registret, hvorpå resultatet vil blive skrevet, og skriv resultatet til det åbnede Tilmeld.
Historiske processorer i orden
I tidlige computere brugte CPU'en ikke en instruktionspipeline. I disse CPU'er skulle hver enkelt-cyklus-operation ske for hver instruktion. Dette betød, at det tog fem clock-cyklusser for den gennemsnitlige instruktion at blive behandlet helt, før den næste kunne startes. Nogle operationer behøver muligvis ikke at skrive noget resultat ud til et register, hvilket betyder, at hukommelsesadgang og tilbageskrivningsstadier kan springes over.
Der lurer dog et problem, når du kører en komplet instruktion i rækkefølge, før du kan gå videre til den næste instruktion. Problemet er cache-missen. CPU'en gemmer data, som den aktivt behandler, i registret. Dette kan tilgås med en en-cyklus latency. Problemet er, at registret er lille, fordi det er indbygget i processorkernen. CPU'en skal gå til den større, men langsommere L1-cache, hvis dataene ikke allerede er blevet indlæst. Hvis den ikke er der, skal den gå til den større og langsommere L2-cache igen. Det næste trin er L3-cachen; den sidste mulighed er systemets RAM. Hver af disse muligheder tager flere og flere CPU-cyklusser at kontrollere.
Nu kan denne ekstra tilføjede latenstid være et stort problem i et system, der skal fuldføre hver instruktion i fuld rækkefølge, før den næste instruktion startes. Hvad der havde været en 5-cyklus pr. instruktionsprocessor, kan pludselig blive hængt op på en instruktion i snesevis eller hundredvis af clock-cyklusser. Alt imens kan der ikke ske noget andet på computeren. Teknisk kan dette afhjælpes noget ved at have to uafhængige kerner. Intet forhindrer dem begge i at gøre det samme, potentielt samtidigt. Så at gå ned ad multi-core ruten løser ikke dette.
Den klassiske RISC-rørledning
RISC står for Reduced Instruction Set Computer. Det er en stil med processordesign, der optimerer ydeevnen ved at gøre afkodning af hver instruktion lettere. Dette er i sammenligning med CISC eller Complex Instruction Set Computer, som designer mere komplekse instruktionssæt, hvilket tillader færre instruktioner at være nødvendige for at udføre de samme opgaver.
Det klassiske RISC-design inkluderer en instruktionspipeline. I stedet for at køre nogen af de fem instruktionstrin i en given cyklus, tillader pipelinen at udføre alle fem trin. Selvfølgelig kan du ikke køre alle fem trin af en instruktion i en cyklus. Men du kan stille fem på hinanden følgende instruktioner i kø med en forskydning på et trin hver. På denne måde kan en ny instruktion fuldføres hver urcyklus. Tilbyder en potentiel 5x ydelsesforøgelse for en relativt lav stigning i kernekompleksitet.
Processorer, der ikke har en pipeline, kan kun være sub-skalære, da de ikke kan udføre en komplet instruktion pr. cyklus. Med denne primære fem-trins pipeline kan du lave en skalar CPU, der kan fuldføre en instruktion for hver proces. Ved at skabe endnu mere vidtrækkende pipelines kan du lave superskalære CPU'er, der kan udføre mere end én instruktion pr. clock-cyklus. Selvfølgelig er der stadig potentielle problemer.
Stadig sekventiel
Intet af dette løser problemet med at vente i mange cyklusser på et svar, når det er nødvendigt at forespørge på de forskellige niveauer af cache og RAM. Det introducerer også et nyt problem. Hvad hvis en instruktion er afhængig af outputtet fra den tidligere instruktion? Disse problemer løses selvstændigt med en avanceret dispatcher. Den planlægger omhyggeligt rækkefølgen af udførelsen, så ingen instruktioner, der er afhængige af en andens output, er for tæt på hinanden. Den håndterer også cache-misser ved at parkere en instruktion og erstatte den i pipelinen med en anden instruktioner, der er klar til at køre og ikke kræver dets resultat, og genoptager instruktionen, når den er det parat.
Disse løsninger kan fungere på processorer uden pipeline, men de kræves til en superskalær processor, der kører mere end én instruktion pr. ur. En grenprædiktor er også yderst nyttig, da den kan forsøge at forudsige resultatet af en instruktion med mere end ét potentielt udfald og fortsætte med at antage, at det er korrekt, medmindre andet er bevist.
Konklusion
En pipeline giver mulighed for, at alle processorens særskilte egenskaber kan bruges i hver cyklus. Det gør den ved at køre forskellige stadier af forskellige instruktioner samtidigt. Dette tilføjer ikke engang meget kompleksitet til CPU-designet. Det baner også vejen for at tillade mere end én instruktion at udføre et enkelt trin pr. cyklus.