Parallellism på instruktionsnivå (ILP) utnyttjar det faktum att flera instruktioner i ett program kan utföras samtidigt, även om de inte uttryckligen anges som parallella. Det implementeras genom en kombination av hårdvara och kompilatortekniker. Här är en uppdelning:
Hårdvarutekniker:
* pipelining: Detta är den mest grundläggande tekniken. Instruktioner delas upp i steg (hämta, avkoda, köras, minnesåtkomst, skrivning) och flera instruktioner kan vara i olika stadier av rörledningen samtidigt. Detta ökar instruktionens genomströmning, även om det inte minskar latensen för enskilda instruktioner. Risker (datavetenden, kontrollberoende) kan begränsa effektiviteten hos rörledningar, vilket kräver tekniker som vidarebefordran och grenförutsägelse.
* superscalar arkitektur: Flera exekveringsenheter finns, vilket gör att flera instruktioner kan köras samtidigt i en enda klockcykel. Processorn planerar dynamiskt instruktioner till olika exekveringsenheter baserat på deras beroenden och tillgänglighet. Detta kräver sofistikerad instruktionsplaneringshårdvara.
* Mycket lång instruktionsord (VLIW): Kompilatorn utför omfattande statisk schemaläggning och packar flera oberoende instruktioner i ett enda, mycket långt instruktionsord. Detta förenklar hårdvaran jämfört med SuperScalar, eftersom instruktionsplaneringen görs helt vid kompileringstid. Det minskar emellertid flexibilitet och kan leda till koduppblåsning om inte tillräckligt med oberoende instruktioner finns tillgängliga.
* out-of-order exekvering: Instruktioner utförs i en beställning som skiljer sig från deras programordning, så länge databeroenden respekteras. Detta kräver komplex hårdvara för att spåra beroenden och hantera byte av register (för att undvika konflikter när instruktionerna omordnas).
* grenförutsägelse: Förutsäger resultatet av grenar (villkorade hopp) för att undvika att stoppa rörledningen när en gren stöter på. Felaktiga förutsägelser kan leda till rörledningsspolar och slösa bort cykler. Avancerade filialprognostekniker använder sofistikerade algoritmer och grenhistoriska tabeller.
* Spekulativ exekvering: Utför instruktioner innan deras beroenden löses helt (t.ex. innan en gren löses). Om spekulationen är felaktig kastas resultaten. Denna teknik förbättrar prestandan avsevärt men lägger till komplexitet och risken för felaktiga resultat om den inte hanteras noggrant.
* Dataflödesanalys: Hårdvaru spårar databeroenden mellan instruktioner för att säkerställa korrekt körningsorder även med out-of-order exekvering.
kompilatortekniker:
* Instruktionsplanering: Kompilatorn ombeställer instruktionerna för att maximera ILP med hänsyn till databeroenden och resursbegränsningar. Detta är avgörande för både superscalar och VLIW -arkitekturer.
* Loop rullning: Replikerar kroppen på en slinga flera gånger och ökar antalet tillgängliga instruktioner för parallell exekvering. Detta kan förbättra ILP men kan också öka kodstorleken.
* Programvara Pipelining: Överlappar exekveringen av iterationer av en slinga, liknande pipelining på instruktionsnivån. Detta är särskilt effektivt för slingor med betydande beroenden mellan iterationer.
* Registreringsallokering: Effektivt tilldelar register till variabler för att minimera registerutsläpp (lagring av variabler till minnet) och förbättra instruktionsplanering.
* predikatutförande: Tillåter att instruktioner kan köras villkorligt baserat på ett booleskt predikat. Detta kan förbättra ILP genom att undvika grenar i vissa fall.
Utmaningar:
* Databeroende: Instruktioner som beror på resultaten från tidigare instruktioner kan inte genomföras samtidigt. Detta begränsar mängden ILP som kan uppnås.
* Kontrollberoenden: Instruktioner som körs villkorligt (baserade på grenar) kan inte utföras förrän grenvillkoret har lösts. Grenförutsägelse hjälper till att mildra detta.
* resursbegränsningar: Begränsade exekveringsenheter och andra hårdvaruresurser kan begränsa nivån på parallellitet som kan uppnås.
* Komplexitet: Implementering av ILP -tekniker kräver betydande hårdvaru- och mjukvarukomplexitet, ökande designkostnader och strömförbrukning.
Sammanfattningsvis innebär implementering av ILP ett synergistiskt samspel mellan sofistikerade hårdvarukonstruktioner och avancerade kompilatoroptimeringar. De specifika teknikerna som används beror på målarkitekturen och egenskaperna hos programmet som genomförs. Moderna processorer använder en kombination av dessa tekniker för att uppnå höga nivåer av parallellitetsnivå.