Hva er Superscalar?

click fraud protection

Tidlige datamaskiner var helt sekvensielle. Hver instruksjon prosessoren mottok måtte fullføres i sin helhet før den neste kunne startes. Det er fem trinn til de fleste instruksjoner: Henting av instruksjoner, dekoding av instruksjoner, Utfør, Minnetilgang og Tilbakeskrivning. Henholdsvis disse stadiene får instruksjonen som må fullføres, skiller operasjonen fra verdiene operert, utfør operasjonen, åpne registeret som resultatet skal skrives på, og skriv resultatet til det åpnede registrere.

Hver av disse stadiene bør ta en syklus å fullføre. Dessverre, hvis dataene ikke er i et register, må de forespørres fra CPU-cachen eller system-RAM. Dette er mye tregere, og legger til dusinvis eller hundrevis av klokkesykluser med latens. I mellomtiden må alt annet vente siden ingen andre data eller instruksjoner kan behandles. Denne typen prosessordesign kalles subskalær da den kjører mindre enn én instruksjon per klokkesyklus.

I en subskalær prosessor uten pipeline, blir hver del av hver instruksjon utført i rekkefølge. Denne designen kan bare oppnå mindre enn én instruksjon fullført per syklus.

Rørledning til skalar

En skalar prosessor kan oppnås ved å bruke en systempipeline. Hvert av de fem stadiene av en instruksjon som utføres kjøres i forskjellige biter av maskinvare i selve prosessorkjernen. Derfor, hvis du er forsiktig med dataene du mater inn i maskinvaren for hvert trinn, kan du holde hver av dem opptatt hver syklus. I en perfekt verden kan dette føre til 5x hastighet og at prosessoren blir perfekt skalar, og kjører en full instruksjon per syklus.

I en skalær pipelinet prosessor kan hvert trinn i en instruksjonsutførelse utføres én gang per klokkesyklus. Dette tillater en maksimal gjennomstrømning på én fullført instruksjon per syklus.

I virkeligheten er programmer komplekse og reduserer gjennomstrømningen. For eksempel, hvis du har to tilleggsinstruksjoner "a = b + c" og "d = e + f", kan disse kjøres i en pipeline uten problemer. Hvis du derimot har "a = b + c" etterfulgt av "d = a + e" har du et problem. Forutsatt at disse to instruksjonene er rett etter hverandre, vil prosessen for å beregne den nye verdien av "a" ikke ha fullført, enn si skrives tilbake til minnet før den andre instruksjonen leser den gamle verdien av "a" og deretter gir feil svar for "d".

Denne oppførselen kan motvirkes med inkludering av en koordinator, som analyserer kommende instruksjoner og sikrer at ingen instruksjoner som er avhengige av en annen kjøres i for tett rekkefølge. Den kjører faktisk programmet i feil rekkefølge for å fikse dette. Dette fungerer, fordi mange instruksjoner ikke nødvendigvis er avhengige av resultatet av en tidligere.

Utvider rørledningen til superskalar

En superskalar prosessor er i stand til å kjøre mer enn én full instruksjon per syklus. En måte å gjøre dette på er å utvide rørledningen slik at det er to eller flere maskinvarebiter som kan håndtere hvert trinn. På denne måten kan to instruksjoner være i hvert trinn av rørledningen i hver syklus. Dette resulterer åpenbart i økt designkompleksitet ettersom maskinvare dupliseres, men det tilbyr utmerkede ytelsesskaleringsmuligheter.

I en superskalar pipelined prosessor kan mer enn én instruksjon være i hvert trinn av pipeline hver syklus. Dette tillater en maksimal instruksjonsgjennomstrømning på mer enn én fullført instruksjon per syklus.

Ytelsesøkningen fra økende rørledninger skaleres så langt effektivt. Termiske og størrelsesbegrensninger setter noen begrensninger. Det er også betydelige planleggingskomplikasjoner. En effektiv avsender er nå enda mer kritisk ettersom den må sørge for at ingen av to sett med instruksjoner er avhengig av resultatet av noen av de andre instruksjonene som behandles.

En grenprediktor er en del av senderen som blir mer og mer kritisk jo mer superskalar en prosessor er. Noen instruksjoner kan ha to potensielle utfall, som hver fører til forskjellige følgende instruksjoner. Et enkelt eksempel ville være en "hvis"-setning. "Hvis dette er sant, gjør det, ellers gjør du denne andre tingen." En grenprediktor forsøker å forutsi utfallet av en grenoperasjon. Den planlegger og utfører deretter instruksjonene på forhånd etter det den mener er det sannsynlige resultatet.

Det er mye kompleks logikk i moderne grenprediktorer, som kan resultere i grenprediksjonssuksessrater i størrelsesorden 98%. En korrekt prediksjon sparer tiden som kunne vært bortkastet på å vente på det faktiske resultatet, en feil prediksjon nødvendiggjør at den predikerte instruksjoner og alle resultatene deres forkastes og de sanne instruksjonene kjøres i stedet, som kommer med en liten straff over å ha bare ventet. Dermed kan høye suksessrater for prediksjoner øke ytelsen merkbart.

Konklusjon

En dataprosessor regnes som superskalær hvis den kan utføre mer enn én instruksjon per klokkesyklus. Tidlige datamaskiner var helt sekvensielle, og kjørte bare én instruksjon om gangen. Dette betydde at hver instruksjon tok mer enn én syklus å fullføre, og derfor var disse prosessorene subskalære. En grunnleggende pipeline som muliggjør bruk av den trinnspesifikke maskinvaren for hvert trinn i en instruksjon, kan utføre maksimalt én instruksjon per klokkesyklus, noe som gjør den skalær.

Det skal bemerkes at ingen individuell instruksjon blir fullstendig behandlet i en enkelt klokkesyklus. Det tar fortsatt minst fem sykluser. Flere instruksjoner kan imidlertid være i pipelinen samtidig. Dette tillater en gjennomstrømming av én eller flere fullførte instruksjoner per syklus.

Superscalar må ikke forveksles med hyperscaler som refererer til selskaper som kan tilby hyperscale dataressurser. Hyperscale databehandling inkluderer muligheten til sømløst å skalere maskinvareressurser, for eksempel databehandling, minne, nettverksbåndbredde og lagring, med etterspørsel. Dette finnes vanligvis i store datasentre og cloud computing-miljøer.