Pokročilé architektury procesorů II. Dynamická predikce skoku a plánování instrukcí Spekulativní provádění instrukcí Pipelining CISC procesorů a přesné přerušení Ing. Miloš Bečvář Osnova přednášky Zvýšení výkonnosti ILP techniky Snížení IC VLIW (více paralelních operací v jedné instrukci) Snížení CPIpipe_ideal pomocí paralelním prováděním více instrukcí superskalární proc. Snížení clk superpipelining (více stupňů pipeline) a rychlejší technologie CPU = IC * (CPI pipe_ideal + Stalls Per Instr) * clk Překrytí pozastavování (stallů) užitečným výpočtem dynamické plánování, dynamická predikce skoku, spekulativní provádění instrukcí Procesory využívající ILP Superpipelinové procesory Velký počet stupňů pipeline umožňuje dosáhnout krátkého clk CPI bývá horší v důsledku latencí v pipeline a paměťovém subsystému Statické superskalární procesory (static, in-order superscalar) Zpracovávají více instrukcí paralelně ale v programovém pořadí ypická šířka 3-4 instrukce Velmi závislé na kvalitním překladači VLIW procesory Instrukce obsahuje více paralelních operací Hazardy detekuje a řeší překladač (téměř výlučně) Šířka instrukcí typicky 6-10 paralelních operací Dynamické superskalární procesory (dynamic, out-of-order superscalar) Zpracovává více instrukcí paralelně i mimo programové pořadí Dnes typicky podporuje spekulativní provádění instrukcí za skokem a někdy i spekulativní provádění Load/Store instrukcí Zpětná kompatibilita a vysoká výkonnost? Řešení založené na překladači nepomohou tam, kde máme velké množství programů, kde rekompilace není pravděpodobná či vůbec možná Zvětšení šířky pipeline (superscalar) nebo hloubky (superpipeline) zvyšují Stalls Per Instruction (SPI) Potřebujeme HW techniky na snížení SPI =>Potřebujeme predikci skoku ke snížení pozastavování kvůli skokům => Potřebujeme překrývat pozastavování kvůli RAW hazardům užitečným výpočtem jiných instrukcí provádění instrukcí mimo pořadí (dynamické plánování) => Potřebujeme pokračovat vykonávat instrukce i když všechny hazardy nebyly ještě rozpoznány a vyřešeny - spekulativní provádění instrukcí yto techniky snižují CPI (zvyšují IPC=1/CPI) ale mohou zvýšit clk Osnova přednášky
Predikce Skoku Instr. Fetch IF ID RF EX 1 EX N WB Instr. Decode Frontend Pipeline FRONA INSR. Reg. Fetch Execute Stages Backend Pipeline Write Back U SUPER-SUPER procesorů je problém s latencí skoku. Nelze to vyřešit rozšířením delay slotu (to je častým řešením u VLIW) a proto se používá PREDIKCE skoku. Frontend načítá instrukce podle predikce a ukládá je do fronty. Backend provádí instrukce a verifikuje predikci. V případě chybné predikce vypláchneme všechny chybně načtené instrukce z pipeline (včetně zmíněné fronty) Penalizace za chybnou predikci skoku = délka pipeline Pokud instrukce za skokem jsou provedeny dříve než je ověřena jeho predikce, hovoříme o tzv. spekulativním provádění instrukcí. Dynamická predikce skoku Predikce může být Statická (v době překladu, zakódována v instrukci) nebo Dynamická (za běhu v HW) Predikce je užitečná pouze pokud cílová adresa skoku je známa dříve než výsledek podmínky (to platí pro nejčastější PC-relativní skoky) Je dynamická predikce skoku lepší než statická? - Zdá se, že ano. Nejlepší statická predikce skoku na bázi profilování kódu dosahuje přesnosti kolem 90 % pro FP programy a 70-90 % for celočíselné programy (měření SPEC). o není dostatečné pro superskalární procesory. - Dynamické prediktory často vyžaduje zahřívací dobu než se stabilizuje na správné predikci. Statická predikce (je-li správná) tuto nevýhodu nemá. Dynamická predikce je jedinou možností pokud nemůžeme změnit ISA a chceme vyšší výkonnost ze starých programů, které nelze rekompilovat. 1-bitová Branch History able (BH) v Pipeline +4 Instruction Fetch Stage 31 PC 0 Instruction Cache Pipeline Registers (IF/ID) 31 PC 0 31 IR 0 16 PC (11:0) 32 12 Branch Displacement Instruction Decode Stage BH 4096 x 1 bit Instruct. Decode + aken / Not aken (1 bit) Branch arget Address 32 It is a branch Change PC! 1-bitová Branch History able Nižší bity PC adresují tabulku 1-bitových hodnot BH indikuje zdali skok naposledy byl nebo nebyl proveden Kompletní adresa PC není kontrolována u BH (s chybnou predikcí se počítá) Problém: v cyklu, 1-bitová BH bude mít dvě chybné predikce (průměrný cyklus má 10 iterací => 20 % neúspěšnost predikce): V poslední iteraci (BH predikuje pokračování cyklu místo ukončení) V první iteraci když cyklus provádíme znovu (BH predikuje ukončení cyklu místo pokračování) Not aken Not aken instr_before_loop Predict Predict. Not aken. aken aken.. BNEZ R1, LOOP instr_after_loop Looping aken Graf přechodů jednobitové predikce skoku Next time executing this code including loop 2-bitová Branch History able Řešení: 2-bitová schemata kde se predikce mění až po dvou chybných predikcích Dvě implementační varianty (výkonnost podobná). (11) Predict Strongly aken N Saturační čítač (11) Predict Strongly aken N Hystereze (10) Predict Weakly aken (10) Predict Weakly aken N (01) Predict Weakly Not aken N (01) Predict Weakly Not aken N N (00) Predict Strongly Not aken (00) Predict Strongly Not aken Nevýhoda 2-bitového prediktoru vůči 1-bitovému - delší doba zahřívání N N Shrnutí dynamické predikce skoků 2-bitový prediktor je základem složitějších technik predikce využívající lokální a globální historii skoků Nevýhoda predikce skoku je nutné zpoždění kvůli dekódování instrukce a výpočet cílové adresy skoku (ztrácíme i při úspěšné predikci nejméně jeden takt a neumíme předpovídat počítané skoky instrukce JR) Agresivnější technikou je predikce cílové adresy skoku založené na Branch arget Address Caches (BAC), Branch arget Instruction Caches (BIC) a Return Address Stack (RAS) umožňuje implementovat tzv. zero cycle branches Pokročilé procesory kombinují několik technik predikce k docílení více než 90 % úspěšnosti predikce skoku => Vysvětlení BAC, BIC a RAS je v doplňkovém výukovém materiálu (pro zájemce).
Osnova přednášky Přidání komplexnějších instrukcí k DLX Chceme přidat následující instrukce k DLX 1. LW Rd, (Rs + Rt) Reg(Rd)=Mem(Reg(Rs)+Reg(Rt)) 2. SW (Rs + Rt), Rd Mem(Reg(Rs)+Reg(Rt))=Reg(Rd) 3. LW Rt, Imm(Rs)! Reg(Rt)=Mem(Imm+Reg(Rs)); Reg(Rs)=Reg(Rs)+Imm 4. SW Imm(Rs)!,Rt Mem(Imm+Reg(Rs)) =Reg(Rt); Reg(Rs)=Reg(Rs)+Imm Přidané instrukce v DLX pipeline ID stage LW Rd, (Rs+Rt) busa= Reg[Rs] busb= Reg[Rt] SW Rd, (Rs + Rt) busa=reg[rs] busb=reg[rt]??? = Reg[Rd] LW Rt, Imm(Rs)! busa= Reg[Rs] ImmExt = Imm SW Imm(Rs)!, Rt busa = Reg[Rs] busb = Reg[Rt] ImmExt<= Imm EX stage S= busa + busb S= busa + busb S = busa + ImmExt M=Mem(S) Reg[Rt]=M Reg[Rs]=S S = busa + ImmExt Mem(S)=busB Reg[Rs]=S MEM stage M=Mem(S) Mem(S) =??? WB stage Reg[Rd]=M 1.a 4. instrukce může být přidána do procesoru beze změny struktury pipeline. Instrukce SW Rd, (Rs + Rt) vyžaduje tři čtecí porty ve stupni ID Instrukce LW Rt, Imm(Rs)! vyžaduje dva zápisové porty ve stupni WB. yto instrukce jsou užitečné, ale ne tak časté aby se vyplatilo měnit kvůli nim pipeline. Řešením je rozbít tyto instrukce na sekvenci dvou mikroinstrukcí. - Rozbití instrukcí na mikroinstrukce SW (Rs + Rt), Rd nahradíme při dekódování sekvencí 1. add R32, Rs, Rt Reg(R32)=Reg(Rs)+Reg(Rt) 2. sw (R32), Rt Mem(Reg(R32))<=Reg(Rt) LW Rt, Imm(Rs)! nahradíme při dekódování sekvencí 1. addi Rs, Rs, Imm Reg(Rs)=Reg(Rs)+Imm 2. lw Rt, (Rs) Reg(Rt)=Mem(Reg(Rs)) Mikroinstrukce jsou v pipeline přímo proveditelné, R32 je programátorovi nepřístupný registr využívaný mikroinstrukcemi (tzv. microarchitecture scratch-pad register). CISC procesory jsou charakteristické existencí takovýchto registrů. Výsledné instrukce budou provedeny ve dvou taktech. Provádění komplexních instrukcí v pipeline SW (R1+R2), R3 IF ID add R32, R1, R2 sw (R32), R3 ID EX MEM WB Komplexní instrukce stráví více taktů ve stupni ID - V každém taktu je emitována jedna mikroinstrukce Jednoduché RISC instrukce jsou přeloženy na právě jednu mikroinstrukci. EX forwarding of R32 MEM ADD R6, R4, R5 IF stall Dekodér ve stupni ID již musí být sekvenční obvod a procesor musí obsahovat další registry (pro implementaci komplexních instr.). ato technika je používána např. v procesorech PowerPC. WB Pipelining CISC processorů Přímý pipelining komplexních instrukcí je obtížný Nativní CISC pipeline se vyznačuje vícetaktovými stupni (Pokud je třeba, stráví instrukce v daném stupni více taktů). Komplexní adresační módy a dekódování => dodatečná ALU pro výpočet efektivní adresy (Instrukce typu register-memory) Register Memory Pipeline: Fetch Decode- Register Fetch Address Calculation - Memory Execute Write Back) Složitá detekce hazardů, forwarding (instrukce čtou a zapisují data v průběhu provádění) Složité řešení přesného přerušení (schopnost přerušení a restartu uprostřed komplexní instrukce) Používaná řešení jsou unikátní pro každý CISC procesor Alternativou je rozbití komplexních instrukcí do mikroinstrukcí a implementace pipeliningu na úrovni mikroinstrukcí.
Proudový CISC: pipelining mikroinstrukcí Prediction and Fetch Control PC Instruction Cache (unif. Cache) Frontend Pipeline Flush IQueue Instr. Queue µp C Instruction Decoder and µsequencer Control Memory (µinstructions) µinstructions = µoperations = RISC-like instr. Proudově pracující CISC procesory Instrukce jsou překládány na sekvence jedné či více mikroinstrukcí. (CISC instrukce odpovídá obvykle jedné mikronstrukci protože komplexní instrukce se vyskytují v programech zřídka.) Vertikální mikroinstrukce připomínají RISC instrukce Mikronstrukce jsou vykonávány pomocí RISC-like pipeline Osnova přednášky Comb. Log. S1 Comb. Log. S2 Comb. Log. S3 ento přístup byl zvolen u pozdějších modelů CISC počítačů VAX, IBM360, M68030 a též i486 a všechny novější x86. Branches, Calls, Returns,... Microinstruction Pipeline = similar to RISC pipeline ( Backend Pipeline ) ento přístup je základem implementace moderních superskalárních CISC procesorů firem Intel i AMD. Sekvenční zpracování instrukcí - Základní cyklus Provedení Instrukce #1 Načtení Instrukce Dekódování Instrukce est Přerušení Sekvenční sémantika: Procesor zpracovává instrukce sekvenčně v programovém pořadí. Zpracování instrukcí se nepřekrývá. Běh programu může být přerušen pouze na hranici mezi instrukcemi Provedení Instrukce #N HW obsluha Přerušení Sekvenční sémantika vs proudové zpracování Požadavky na korektnost provádění programu 1. Program vypočítá správný výsledek (v souladu se sekvenční sémantikou - stejný jako na procesoru bez pipeliningu) 2. Program generuje stejná přerušení (výjimky) Stav procesoru při přerušení je konzistentní se sekvenční sémantikou provádění instrukcí (stejný jako na procesoru bez pipeliningu ) Splnění požadavků na proudově pracujícím procesoru Ad 1: Instrukce mohou být zpracovávány proudově pokud zabráníme datovým, řídícím a strukturním hazardům..j. respektujeme datové a řídící závislosti v programu. Ad 2: Splnění tohoto požadavku na proudově pracujícím procesoru není obecně zaručeno. Procesor, který má tuto vlastnost je schopen tzv. přesného přerušení (precise interrupt, precize exception). Příklady přerušení (výjimek) Žádost V/V zařízení o obsluhu (I/O device request) Volání služeb OS (Supervisor Call SVC) rasování programu, breakpoint Aritmetické přerušení přeplnění, podtečení, dělení nulou Výpadek stránky (Page Fault) Nezarovnaný přístup k paměti (Misaligned Memory Access) Porušení ochrany paměti (Memory Protection Fault) Nedefinovaná instrukce (Undefined opcode) Chyba HW parita, ECC chyba, pokles úrovně napájení (Machinecheck exception, power down, brownout)
Klasifikace typů přerušení 5 parametrů Synchronní x Asynchronní vůči běhu programu - synchronní způsobené instrukcí (vnitřní přerušení) - asynchronní způsobené externím HW (vnější přerušení) Žádané uživatelem x Vynucené - obsluha uživatelem žádaných je snazší (je možné dokončit instrukci) Maskovatelné x Nemaskovatelné - aritmetické přerušení lze u některých poč. maskovat V rámci instrukce x Mezi instrukcemi - přerušení v rámci instrukce způsobuje nemožnost instrukci dokončit Nutnost návratu po obsluze x Ukončení programu s chybou Přerušení u proudově pracujícího procesoru K přerušení může dojít v každém taktu Současně může dojít k přerušení z více zdrojů Pořadí výskytu přerušení nemusí odpovídat pořadí instrukcí v programu Stav procesoru nemusí být v okamžiku přerušení konzistentní se sekvenční sémantikou vykonávání instrukcí (sekvenčně konzistentní) Řešení je relativně snadné pro přerušení mezi instrukcemi (většina vnějších přerušení a uživatelem žádaná přerušení): 1. Dokončíme provádění rozpracovaných instrukcí (uvedeme procesor do sekvenčně konzistentního stavu) 2. Do pipeline vložíme sekvenci vnitřních instrukcí, která uloží stav PC (příp. i dalších reg.) a spustí obslužnou rutinu přerušení (viz instrukce RAP v DLX) Obtížná je přesná obsluha přerušení v rámci instrukce (většina vnitřních přerušení), která vyžadují návrat po obsluze. Zdroje vnitřních přerušení v celočíselném DLX IF ID EX Výpadek stránky, nezarovnaný přístup, chyba ochrany paměti Nedefinovaná instrukce Aritmetické přerušení (záleží na definici v ISA) MEM Výpadek stránky, nezarovnaný přístup, chyba ochrany paměti WB Nemůže nastat V každém taktu mohou nastat až 4 vnitřní přerušení Příklad programu se vznikem více přerušení LW R1, (R2)-13 MULF F0,F1,F2 ADD R5, R6, R4 VM page boundary???? Procesor má schopnost přesného přerušení pokud: 1. Procesor obsluhuje přerušení v programovém pořadí (to nemusí být shodné s pořadím jejich objevení v pipeline). 2. Stav procesoru při obsluze musí být sekvenčně konzistentní: Instrukce před zdrojem přerušení musí být dokončeny. Instrukce za zdrojem přerušení nesmí změnit stav procesoru nebo paměti. (Provedení instrukce, která je zdrojem přerušení závisí na definici v ISA a typu přerušení.) Missaligned memory access Unsupported instruction Arithmetic overflow Page fault / LB miss Podmínky pro přesné přerušení u proudového zpracování Stupeň potvrzení (commit) v pipeline Stupeň potvrzení (commit) je takový stupeň pipeline, kde platí, že všechna přerušení v pipeline mohou vzniknout nejpozději v tomto stupni. => Po stupni potvrzení již víme, že instrukce dobře dopadne (tj. nedojde k přerušení.) Podmínky pro přesné přerušení 1. Všechny instrukce dorazí do stupně potvrzenív programovém pořadí 2. Instrukce nemění stav procesoru ani paměti před stupněm potvrzení. Principy implementace: Požadavky na přerušení se akumulují ve speciálním stavovém slově, které společně s instrukcí a hodnotou jejího PC postupuje v pipeline až do stupně potvrzení. Procesor testuje přerušení u instrukcí ve stupni potvrzení, přerušení v rámci instrukce jsou potom obsluhována v pořadí jejich vzniku. Obsluha je zahájena zrušením všech instrukcí v pipeline před stupněm potvrzení a dokončení provádění instrukcí za stupněm potvrzení. Obsluha přerušení u celočíselného DLX LW R1, (R2)-13 MULF F0,F1,F2 ADD R5, R6, R4 VM page boundary???? Save WB_PC and trap to service routine IF ID EX IF ID IF Stupněm potvrzení (commit) je stupeň MEM u IntDLX Celočíselný DLX má schopnost přesného přerušení neboť 1. Všechny instrukce dorazí do MEM v programovém pořadí 2. Instrukce nemění stav procesoru ani paměti před stupněm MEM. NOP NOP NOP
Úplný DLX nemá schopnost přesného přerušení 1 2 3 4 5 6 7 8 9 10 Úplný DLX s přesným přerušením 1 2 3 4 5 6 7 8 9 10 Osnova přednášky MULF F1, F4, F6 IF ID MX1 MX2 MX3 MX4 MEM WB MULF F1, F4, F6 IF ID MX1 MX2 MX3 MX4 MEM WB SW 4(R2), R1 ADDF F0, F3, F2 IF ID MX1 AX1 MX2 AX2 AX3 MEM WB Instrukce nedorazí do stupně potvrzení (MEM) v programovém pořadí. Přerušení generované instrukcí MULF nemusí být přesné neboť následující instrukce mohla změnit stav procesoru nebo paměti. Instrukce jsou spouštěny v programovém pořadí, ale dokončeny jsou mimo programové pořadí. (In-order issue, out-of-order completion). Procesor těchto vlastností obecně nemá zaručeno přesné přerušení. SW 4(R2), R1 ID stall ID stall ID IF ID stall EX MEM WB ADDF F0, F3, F2 stall IF stall ID IF MX1 stall MX2 IF IF ID IF AX1 AX2 AX3 Pomocí pozastavení pipeline je možné opět dosáhnout přesného přerušení. Je to ovšem za cenu snížení výkonnosti o cca 20 % (dle simulace na SpecFP92). Možné přístupy k problému přesného přerušení u procesorů a) Některá přerušení příp. vůbec žádná nejsou přesná (definice v ISA) b) Dva módy činnosti: s přesným přerušením a bez něj (rychlejší) c) Kombinované techniky nepřesného přerušení se SW podporou d) HW náročné techniky založené na reorder bufferu, history file a nebo future file. (Nad rámec předmětu X36APS). Dynamické plánování instrukcí = provádění instrukcí mimo pořadí (Out of Order - OoO) Proč v HW za běhu programu? Funguje i pro závislosti nerozpoznatelné v době překladu Jednodušší překladač Program přeložený pro jeden procesor funguje dobře i na jiném Základní myšlenka: Umožnit instrukcím za pozastavením pokračovat: DIVD F0,F2,F4 ADDD F10,F0,F8 SUBD F12,F8,F14 Provádění mimo pořadí = Provádění mimo programové pořadí Nevýhody? Složitost implementace nové typy hazardů, forwarding Implementace přesných přerušení je složité Problémy dynamického plánování? Jak vyřešit WAR a WAW hazardy? mohou nastat a jsou častější Jak vyřešit problém odlišné latence instrukcí? Forwarding kvůli RAW hazardům je obtížnější. Dynamické plánování bylo vyvinuto koncem 60. let dávno před superskalárními a superpipeline procesory (CDC 6600, IBM 360/91) David Patterson, CS252 UCB 2000 Clock Cycle Number Instruction 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 LD F6,34(R2) LD F2,45(R3) MULD F0,F2,F4 IF ID stall M1 M2 M3 M4 M5 M6 M7 M8 M9 M10 MEM WB SUBD F8,F6,F2 IF ID A1 A2 MEM WB RAW DIVD F10,F0,F6 IF ID stall stall stall D1 D2 stall stall stall stall stall stall ADDD F6,F8,F2 IF ID A1 A2 MEM WB WAR DIVD je pozastaven kvůli RAW hazardu vůči MULD, ADDD je provedeno mimo pořadí => F6 je přepsáno novou hodnotou => WAR hazard může nastat Dynamické plánování základní princip Stupeň ID je rozdělen do dvou podstupňů - Issue (vydávání)- instrukce jsou dekódovány, jsou vyřešeny strukturní hazardy a instrukce jsou vloženy do instrukčního okna (rezervačních stanic) kde čekají na své operandy - Dispatch (spouštění)- instrukce které mají připravené operandy zahájí provádění - Instrukce jsou vydávány v (programovém) pořadí ale spouštěny mimo pořadí (Spuštění závisí na tom, kdy jsou operandy k dispozici tzv. datově-řízené plánování) Mezi vydáním a spuštěním čekají instrukce na data různou dobu v rezervačních stanicích (také nazývané instruction pool, instruction issue queue, scheduler, instruction window) Procesory se liší v implementaci stupňů vydávání/spouštění ale používají stejného základního principu (také terminologie se liší) Instrukce čtou a zapisují operandy mimo programové pořadí => WAW a WAR hazardy David Patterson, CS252 UCB 2000
Řešení WAW a WAR hazardů Detekce WAW a WAR hazardů instrukce nemůže být spuštěna pokud je prováděna instrukce zapisující do stejného registru (WAW) a nemůže zapsat data pokud jiná instrukce ještě potřebuje starou hodnotu (WAR) (poprvé použito v CDC6600) - vyřešeno technikou scoreboardingu - scoreboard indikuje stav všech registrů a řídí vydávání/spouštění instrukcí viz např. M88110 NEBO Odstranění WAW a WAR hazardů přejmenování registrů (IBM 360/91) - Každá instrukce dostane přidělen nový cílový fyzický registr, zdrojové registry jsou přejmenovány podle mapovací tabulky Existuje několik odlišných implementací tohoto postupu a je použit ve většině současných superskalárních procesorů (Pentium Pro a pozdější x86, Alpha 21264, MIPS R10K, R12K, IBM Power4, Power5 HP PA RISC 8600 a další,...) - Pokud každá instrukce má unikátní cílový registr, WAW a WAR hazardy nemohou nastat (Vydávání instrukcí je zastaveno až pokud nám dojdou fyzické registry.) Osnova přednášky Dosažení vyšší výkonnosti pomocí spekulace Požadavky na korektnost provádění programu 1. Program vypočítá správný výsledek (v souladu se sekvenční sémantikou - stejný jako na procesoru bez pipeliningu) 2. Program generuje stejná přerušení (výjimky) (stejně jako na procesoru bez pipeliningu ) Postačující podmínky pro dosažení korektnosti provádění programu A. Respektujeme datové závislosti (Instrukce čekají na vyřešení datových závislostí) B. Respektujeme řídicí závislosti (instrukce za skokem není provedena dokud není znám výsledek skoku) Řídicí závislosti => podmíněné datové závislosti C. Implementujeme přesné přerušení. Spekulativní provádění = částečné (dočasné) narušení podmínek A a B, při zachování korektnosti provádění programu (1. a 2.) ypy spekulativního provádění (v současnosti) Řídící spekulace : Instrukce za skokem jsou prováděny před znalostí výsledku skoku (dnes standard) Load / Store spekulace (Dynamic Memory Disambiguation) : Load je proveden před tím než je známa adresa předchozích instrukcí store (např. Itanium, Power 5, Core2) Spekulace vyžaduje dokončení instrukcí v programovém pořadí (kvůli kontrole na korektnost programu) Pokud dojde k chybné spekulaci => nastává zotavení a restart Zotavení a restart je poměrně nákladnou událostí (až desítky ztracených taktů) Dvě HW struktury podporující spekulaci a zotavení - fronty - History Buffer HB - M88110 - Reorder Buffer RB ostatní procesory Nový stupeň v pipeline - dokončení (graduování, potvrzení) : Všechny instrukce jsou při dokončení vyjmuty z HB nebo RB v programovém pořadí a je provedena kontrola správnosti spekulace a výjimky jsou obsluhovány => o zároveň řeší problém přesného přerušení (podmínka 2) Clock cycle 1 Renamed version Issued Dispatched Finished Graduated LF F0,0(R1) LF pf1, 0 (pi1) 1 First iteration Next iteration LF F0,0(R1) (initial mapping) pf1 pf2 pf3 pi1 F0 renamed to pf1 and LF issued pf physical FP reg. pi physical int. reg. Clock cycle 2 Renamed version Issued Dispatched Finished Graduated LF F0,0(R1) LF pf1, 0 (pi1) 1 2 ADDF pf4, pf1, pf2 2 LF F0,0(R1) pf1 pf2 pf4 pi1 F4 renamed to pf4 and LF dispatched
Clock cycle 3 Renamed version Issued Dispatched Finished Graduated LF F0,0(R1) LF pf1, 0 (pi1) 1 2 ADDF pf4, pf1, pf2 2 SF 0(pi1), pf4 3 Clock cycle 4 Renamed version Issued Dispatched Finished Graduated LF F0,0(R1) LF pf1, 0 (pi1) 1 2 ADDF pf4, pf1, pf2 2 SF 0(pi1), pf4 3 SUBI pi2, pi1,#4 4 Clock cycle 5 Renamed version Issued Dispatched Finished Graduated LF F0,0(R1) LF pf1, 0 (pi1) 1 2 ADDF pf4, pf1, pf2 2 SF 0(pi1), pf4 3 SUBI pi2, pi1,#4 4 5 BNEZ pi2, LOOP 5 LF F0,0(R1) LF F0,0(R1) LF F0,0(R1) pf1 pf2 pf4 pi1 SF issued, LF computes the address pf1 pf2 pf4 pi2 R1 renamed to pi2, SUBI issued, L1 Data Cache miss occured (LF) pf1 pf2 pf4 pi2 BNEZ predicted, SUBI dispatched, LF in progress Clock cycle 6 Renamed version Issued Dispatched Finished Graduated LF F0,0(R1) LF pf1, 0 (pi1) 1 2 ADDF pf4, pf1, pf2 2 SF 0(pi1), pf4 3 SUBI pi2, pi1,#4 4 5 6 BNEZ pi2, LOOP 5 6 LF F0,0(R1) LF pf5, 0(pi2) 6 pf5 pf2 pf4 pi2 SUBI finished, BNEZ dispatched, F0 renamed to pf5, new LF issued Clock cycle 7 Renamed version Issued Dispatched Finished Graduated LF F0,0(R1) LF pf1, 0 (pi1) 1 2 ADDF pf4, pf1, pf2 2 SF 0(pi1), pf4 3 SUBI pi2, pi1,#4 4 5 6 BNEZ pi2, LOOP 5 6 7 LF F0,0(R1) LF pf5, 0(pi2) 6 7 ADDF pf6, pf5, pf2 7 BNEZ finished (prediction OK), LF dispatched, F4 renamed to pf6, ADDF issued Clock cycle 8 Renamed version Issued Dispatched Finished Graduated LF F0,0(R1) LF pf1, 0 (pi1) 1 2 8 ADDF pf4, pf1, pf2 2 8 SF 0(pi1), pf4 3 SUBI pi2, pi1,#4 4 5 6 BNEZ pi2, LOOP 5 6 7 LF F0,0(R1) LF pf5, 0(pi2) 6 7 ADDF pf6, pf5, pf2 7 SF 0(pi2), pf6 8 1st LF finished (L2 cache hit), ADDF dispatched, 2nd LF calculates addr.
Clock cycle 9 Renamed version Issued Dispatched Finished Graduated ADDF pf4, pf1, pf2 2 8 SF 0(pi1), pf4 3 SUBI pi2, pi1,#4 4 5 6 BNEZ pi2, LOOP 5 6 7 LF F0,0(R1) LF pf5, 0(pi2) 6 7 9 ADDF pf6, pf5, pf2 7 9 SF 0(pi2), pf6 8 SUBI pi3, pi2, #4 9 pf5 pf2 pf6 pi3 1st LF graduated, 2nd LF finished (Cache hit), etc. Clock cycle 10 Renamed version Issued Dispatched Finished Graduated ADDF pf4, pf1, pf2 2 8 SF 0(pi1), pf4 3 SUBI pi2, pi1,#4 4 5 6 BNEZ pi2, LOOP 5 6 7 LF F0,0(R1) LF pf5, 0(pi2) 6 7 9 ADDF pf6, pf5, pf2 7 9 SF 0(pi2), pf6 8 SUBI pi3, pi2, #4 9 10 BNEZ pi3, LOOP 10 BNEZ predicted and issued Clock cycle 11 Renamed version Issued Dispatched Finished Graduated ADDF pf4, pf1, pf2 2 8 11 SF 0(pi1), pf4 3 11 SUBI pi2, pi1,#4 4 5 6 BNEZ pi2, LOOP 5 6 7 LF F0,0(R1) LF pf5, 0(pi2) 6 7 9 ADDF pf6, pf5, pf2 7 9 SF 0(pi2), pf6 8 SUBI pi3, pi2, #4 9 10 11 BNEZ pi3, LOOP 10 11 1st ADDF finished, 1st SF dispatched, SUBI fin., BNEZ disp. Clock cycle 12 Renamed version Issued Dispatched Finished Graduated ADDF pf4, pf1, pf2 2 8 11 12 SF 0(pi1), pf4 3 11 SUBI pi2, pi1,#4 4 5 6 BNEZ pi2, LOOP 5 6 7 LF F0,0(R1) LF pf5, 0(pi2) 6 7 9 ADDF pf6, pf5, pf2 7 9 12 SF 0(pi2), pf6 8 12 SUBI pi3, pi2, #4 9 10 11 BNEZ pi3, LOOP 10 11 12 2nd ADDF finished, 2nd SF dispatched Clock cycle 13 Renamed version Issued Dispatched Finished Graduated ADDF pf4, pf1, pf2 2 8 11 12 SF 0(pi1), pf4 3 11 13 SUBI pi2, pi1,#4 4 5 6 BNEZ pi2, LOOP 5 6 7 LF F0,0(R1) LF pf5, 0(pi2) 6 7 9 ADDF pf6, pf5, pf2 7 9 12 SF 0(pi2), pf6 8 12 SUBI pi3, pi2, #4 9 10 11 BNEZ pi3, LOOP 10 11 12 1st SF finished Clock cycle 14 Renamed version Issued Dispatched Finished Graduated ADDF pf4, pf1, pf2 2 8 11 12 SF 0(pi1), pf4 3 11 13 14 SUBI pi2, pi1,#4 4 5 6 BNEZ pi2, LOOP 5 6 7 LF F0,0(R1) LF pf5, 0(pi2) 6 7 9 ADDF pf6, pf5, pf2 7 9 12 SF 0(pi2), pf6 8 12 14 SUBI pi3, pi2, #4 9 10 11 BNEZ pi3, LOOP 10 11 12 First two iterations finished within 14 cycles
Clock cycle 21 Renamed version Issued Dispatched Finished Graduated ADDF pf4, pf1, pf2 2 8 11 12 SF 0(pi1), pf4 3 11 13 14 SUBI pi2, pi1,#4 4 5 6 15 BNEZ pi2, LOOP 5 6 7 16 LF F0,0(R1) LF pf5, 0(pi2) 6 7 9 17 ADDF pf6, pf5, pf2 7 9 12 18 SF 0(pi2), pf6 8 12 14 19 SUBI pi3, pi2, #4 9 10 11 20 BNEZ pi3, LOOP 10 11 12 21 -- -- -- -- First two iterations graduated within 21 cycles. Same Example on 4-way Dynamic Superscalar Renamed version Issued Dispatched Finished Graduated ADDF pf4, pf1, pf2 1 8 11 12 SF 0(pi1), pf4 1 11 13 14 SUBI pi2, pi1,#4 1 2 3 14 BNEZ pi2, LOOP 2 3 4 14 LF F0,0(R1) LF pf5, 0(pi2) 2 3 9 14 ADDF pf6, pf5, pf2 2 9 12 15 SF 0(pi2), pf6 2 12 14 15 SUBI pi3, pi2, #4 3 4 5 15 BNEZ pi3, LOOP 3 5 6 15 Note: Simple instruction finished within 6 cycles. ime between prediction of 2nd BNEZ and branch evaluation is 3 cycles (up to 12 instructions issued) Shrnutí příkladu Každá iterace použivá odlišné fyzické registry pro F0, F4 a R1 Provádění iterací se překrývá => de-facto rozbalení cyklu v HW Krátké instrukce dokončeny v průběhu 12 taktů (10 instrukcí) Provádění instrukcí s dlouhou latencí se překrývá s instrukcemi s krátkou latencí i vzájemně Spekulativní provádění : Ulož mapu registrů v době zahájení spekulace (v průběhu vydání instrukce BNEZ), obnov tuto mapu zpět v případě chybné spekulace (je k dispozici např. 4-6 map umožňující spekulovat až do hloubky 4-6 skoků...) Délka překryté latence závisí na počtu fyzických registrů a velikosti reorder bufferu (instrukce je v reorder bufferu mezi issue a graduate) Výkonnost je výrazně zlepšena načítáním, vydáváním a dokončením více instrukcí => superscalar out-of-order CPU Současné procesory kombinace těchto technik 1st generation superscalar : static scheduling, static prediction 2nd generation superscalar : dynamic scheduling, dynamic prediction 3rd generation superscalar : dynamic scheduling, dynamic prediction, speculation, superpipeline Současné superskalární CPU (Pentium 4, MIPS R12K, Power4, PowerPC 620, Alpha 21264...) jsou nejčastěji Superscalar / Superpipeline (SUPER -SUPER) dynamicky plánované spekulativní procesory Staticky plánované a nespekulativní procesory a VLIWy jsou používány v aplikacích méně náročných na výpočetní výkon, zejména ve vestavných aplikacích. Dynamické plánování a spekulace jsou velmi náročné na plochu čipu a spotřebu! Při čtení popisu soudobých komerčních procesorů je důležité se neztratit v odlišné terminologii se spoustou výrazů, které jsou jen marketingem. Nové techniky využití ILP jsou stále ve vývoji (trace caches, value speculations) ale zdá se, že jsme blízko limitu paralelismu rozpoznatelného za běhu pomocí HW. Závěry Byl prezentován přehled technik využívajících ILP ke zvýšení výkonnosti procesoru Superscalar, Superpipeline, VLIW Dynamické plánování = provádění instrukcí mimo pořadí Moderní procesory jsou kombinací těchto technik a dalších specifických optimalizací pro danou ISA. Zdá se, že současné procesory se blíží limitu HW rozpoznatelného a využitelného ILP Budoucnost může přát více kooperaci HW a SW na využití ILP IA-64 (EPIC) nebo využití paralelismu na úrovni vláken na jednom čipu buď formou multithreadingu (Pentium 4 with H) nebo implementaci multiprocesorů na čipu (IBM Power 4, Opteron, Sun Gemini) nebo obou těchto přístupů (Power 5)