Proudové zpracování instrukcí II. Hazardy v proudovém zpracování Proudové zpracování FP instrukcí Ing. Miloš Bečvář
Osnova přednášky Implementace pozastavení v pipeline Datové hazardy a jejich řešení (pozastavení, forwarding) Řídicí hazardy implementace instrukce podmíněného skoku (zpožděný a rušící skok) Strukturní hazardy - příklady Proudové zpracování FP instrukcí Komplexní hazardy v FP pipeline a jejich řešení
Ideální proudové zpracování instrukcí Latency to fill pipeline Pipeline produces result every clock cycle instr1 instr.2 instr.3 instr.4 instr.5 CPI pipeline_ideal = 1
Příklad narušení sémantiky SUB přečte starou hodnotu R1 ADD zapíše novou hodnotu R1 ADD R1,R2,R3 SUB R4,R1,R3 Programátor očekává toto provádění: Write ADD R1,R2,R3 Read SUB R4,R1,R3 Čtení R1 instr. SUB má být provedeno po zápisu R1 instrukcí ADD. V pipeline toto pořadí není dodrženo.tuto situaci nazýváme Read after Write (RAW) hazard.
Řešení datového hazardu pomocí pozastavení SUB čte starou hodnotu R1 ADD zapisuje novou hodnotu do R1 ADD R1,R2,R3 SUB R4,R1,R3 Řešení: Pozastavení pipeline v ID dokud není hazard odstraněn. ADD R1,R2,R3 SUB R4,R1,R3 IF ID stall ID stall ID EX MEM WB SUB čeká v ID dokud ADD nezapíše novou hodnotu do R1 Pozastavení = pipeline stall, pipeline bubble insertion, pipeline interlock
Reálné proudové zpracování pozastavení 1 takt 1 2 3 4 5 6 7 8 9 instr1 instr.2 IF ID stall ID EX MEM WB instr.3 IF stall instr.4 Žádná instrukce nenačtena v taktu č. 3 Žádná instrukce nedokončena v taktu č.6 CPI pipeline_real = CPI pipeline_ideal + Stalls Per Instruction
Zrychlení pomocí proudového zpracování (S je počet stupňů pipeline) Speedup = T cpu_no_pipeline T cpu_pipeline = IC * CPI no_pipeline * T clk_no_pipeline IC * CPI pipeline_real * T clk_pipe CPI no_pipeline = 1; CPI pipeline_real = CPI pipeline_ideal + SPI Stalls per Instruction Speedup = 1 CPI pipeline_ideal + SPI * T clk_no_pipeline T clk_pipe Speedup = S CPIpipeline_ideal + SPI S = 1 + SPI Cílem je minimalizace SPI => maximalizace zrychlení.
Jiný diagram proudového zpracování Clock cycle IF stage ID stage EX stage MEM stage WB stage 1 Instr1 Instr0 Instr-1 Instr-2 Instr-3 2 Instr2 Instr1 Instr0 Instr-1 Instr-2 3 Instr3 Instr2 Instr1 Instr0 Instr-1 4 Instr4 Instr3 Instr2 Instr1 Instr0 5 Instr5 Instr4 Instr3 Instr2 Instr1 Clock cycle IF stage ID stage EX stage MEM stage WB stage 1 Instr1 Instr0 Instr-1 Instr-2 Instr-3 2 Instr2 Instr1 Instr0 Instr-1 Instr-2 3 Instr3 Instr2 Instr1 Instr0 Instr-1 4 Instr3 Instr2 NOP Instr1 Instr0 5 Instr4 Instr3 Instr2 NOP Instr1 6 Instr5 Instr4 Instr3 Instr2 NOP 7 Instr6 Instr5 Instr4 Instr3 Instr2 Instr2 je pozastavena ve stupni ID
Způsob implementace pozastavení pipeline Stage 1 Stage 2 Stage 3 Stage 4 Comb. Log. S1 Comb. Log. S2 Comb. Log. S3 Comb. Log. S4 Stall occurred here Recycle all stages before the stall source until stall is resolved Continue flow through the pipeline Insert NOP in the following stage until stall is resolved
Proč pozastavujeme pipeline? - Pipeline musí být pozastavována k zabránění hazardům. Hazard je potenciální narušení sémantiky vykonávání programu. Datové hazardy: narušení datových nebo jmenných závislostí Řídicí hazardy: narušení řídicích závislostí Strukturní hazardy: důsledek neúplné replikace prostředků v pipeline, kolize na sdílených prostředcích (paměti, porty reg. polí, funkční jednotky ) Všimněte si, že datové a řídicí hazardy jsou důsledkem konfliktu mezi sémantikou programu a pipeliningem. Strukturní hazardy jsou důsledkem nedokonalého pipeliningu. CPI = 1 + SPI data + SPI control + SPI struct
Datové a jmenné závislosti vlastnosti programu Instr I Variable1, Variable2, Variable3... Instr J Variable4, Variable5, Variable1 Instr I Variable1, Variable2, Variable3 (True) Data Dependency (Skutečná) datová závislost... Instr J Variable1, Variable4, Variable5 Output Dependency Výstupní závislost Instr I Variable3, Variable2, Variable1... Instr J Variable1, Variable4, Variable5 Antidependency Protizávislost Name (False) Dependencies = Output Dependency + Antidependency Jmenné (Falešné) Závislosti = Výstupní závislost + Protizávislost
Datové závislosti typické sekvence v programu Instr I Variable1, Variable2, Variable3... Data Dependency Instr J Variable5, Variable4, Variable1 Output Dependency. Antidependency Instr K Variable1, Variable6, Variable7 Typická define-use-reuse sekvence pro Variable1 Instr I Variable1, Variable2, Variable3... Output Dependency Instr J Variable1, Variable4, Variable5 Redundantní výpočet Variable1 typický postranní efekt agresivní optimalizace programu. Závislosti existují mezi proměnnými v registrech (snadno rozpoznatelné) a také proměnnými v paměti (více obtížné pro rozpoznání).
Datové hazardy klasifikace Datové hazardy jsou potenciální narušení datových a jmenných závislostí v programu při proudovém zpracování. Nechť i < j jsou 2 celá čísla (Instrukce i je dříve v programu než instr. j) RAW (Read After Write) hazard : 1. Mezi i a j je skutečná datová závislost 2. Instrukce j chce číst novou hodnotu dříve než ji instrukce i může zapsat. WAR (Write After Read) hazard : 1. Mezi i a j je protizávislost 2. Instrukce j chce zapsat výsledek dříve než instrukce i přečte předchozí hodnotu. WAW (Write After Write) hazard : 1. Mezi i a j je výstupní závislost 2. Instrukce j chce to zapsat výsledek dříve než instrukce i Existence hazardu závisí na - vzdálenosti mezi i a j vzhledem k latencím v pipeline - pořadí ve kterém instrukce čtou a zapisují operandy vzhledem k jejich programovému pořadí. Pouze RAW hazardy mohou nastat v naší celočíselné pipeline. Proč?
Pouze RAW hazardy hrozí v celočíselném DLX Proměnné v registrech 1. 2. 3. 4. 5. All instructions IF ID EX MEM W B read write Všechny instrukce jsou vykonávány v programovém pořadí. Čtení registrů nastává ve 2. taktu, zápis do registru v 5. taktu. Nechť j>i: Instrukce j je načtena v taktu j, instrukce i v taktu i RAW hazard? Instrukce j čte v taktu j+1, instrukce i zapisuje v taktu i+4 RAW hazard hrozí pokud j+1<i+4 => j<i+3 WAW hazard? Instrukce j zapisuje v taktu j+4, Instrukce i zapisuje v taktu i+4 WAW hazard nemůže nastat neboť platí j+4>i+4 WAR hazard? Instrukce j zapisuje v taktu j+4, Instrukce i čte v taktu i+1 WAW hazard nemůže nastat neboť platí j+4>i+1 Podobně lze dokázat že RAW, WAR ani WAW hazardy nehrozí mezi load a store instrukcemi.
Ne každá datová závislost vede na hazard! SUB čte starou hodnotu R1 ADD zapisuje novou hodnotu do R1 ADD R1,R2,R3 Závislost a hazard SUB R4,R1,R3 ADD R1,R2,R3 OR R5,R2,R3 Závislost ale ne hazard AND R6,R2,R6 SUB R4,R1,R3 Překladač může vložit nezávislé instrukce a odstranit tak hazard!
Příklad RAW datového hazardu 1) Řešeno pozastavením pipeline: ADD R1,R2,R3 SUB R4,R1,R3 IF ID stall ID stall ID EX MEM WB 2) Lepší řešení (přeposílání) forwarding (též zvaný register bypassing) ADD R1,R2,R3 Forward the new value for R1 SUB R4,R1,R3 Výsledek instrukce ADD vypočítaný ve stupni EX je ihned forwardován následující instrukci => není třeba pozastavovat pipeline!
Forwarding princip HW řešení Instruction Memory IF stage Instruction ID stage Comb Logic EX stage Comb. Logic jump_now MEM stage Comb. Logic WB stage Comb. Logic PC Addr busw Rw Ra Rb 32 32-bit Registers MEM/EX busa busb ALU zero jump_now Imm16 Disp26 Ext Imm32 Forwarding ctrl Addr Next Addr. Logic PC PC+4 Add Data Memory Jump/Branch Target Address Target Address Calculation WB/EX Výsledky jsou přeposílány pomocí MEM/EX a WB/EX zpětné cesty.
RAW hazard s nutností pozastavení LW R1, (R2) +5 Forwarding zpět v čase? SUB R4,R1, R3 SUB potřebuje data Data jsou k dispozici z paměti Data od instrukce LOAD jsou k dispozici na konci stupně MEM, ale jsou třeba na začátku stupně EX násl. instrukce => nelze přeposílat zpátky v čase.
RAW hazard s nutností pozastavení (pokr.) LW R1,(R2)+5 Forward SUB R4, R1,R3 IF IDstall ID EX MEM WB Tomuto zpoždění se říká LOAD - USE delay. Je typická pro RISC pipeline. Toto zpoždění lze eliminovat vložením nezávislé instrukce mezi LOAD a USE instrukce. Jde o typickou úlohu optimalizujícího překladače.
Vliv datových hazardů na CPI a) Celočíselná pipeline s pozastavováním Nechť i je pozice instrukce produkující výsledek, j je pozice instrukce spotřebovávající výsledek: j i+1 i+2 i+3 a více Počet taktů pozastavení 2 stalls 1 stall 0 stals P Dyn. četnost (neoptimalizovaný program) 40 % 20 % 40 % Typ instrukce F (Dynamická četnost) SPI data = (F alu + F load )*(p 1 *2 +p 2 *1) ALU Load Store Branch (control) 48 % 26 % 13 % 13 % SPI data =(0,48 + 0,26)*(0,4*2 +0,2*1) SPI data =0,74 CPI pipe_real >=1,74!
Vliv datových hazardů na CPI b) Celočíselná pipeline s forwardingem Nechť i je pozice instrukce Load, j je pozice závislé instrukce: j i+1 i+2 a více Počet taktů pozastavení 1 stall 0 stalls P Dyn. četnost (neoptim. prog.) 40 % 60 % Typ instrukce ALU Load Store Branch (control) F (Dynamická frekvence) 48 % 26 % 13 % 13 % SPI data = F load *p 1 *1 SPI data = 0,26*0,4*1 SPI data =0,104 CPI pipe_real >=1,104! T clk ovšem může být ovlivněna forwardingem negativně (vzrůst).
Řídící hazard instrukce podm. skoku Instruction Memory IF stage Instruction ID stage Comb Logic EX stage Comb. Logic jump_now MEM stage Comb. Logic WB stage Comb. Logic PC Addr busw Rw Ra Rb 32 32-bit Registers MEM/EX busa busb ALU zero jump_now Imm16 Disp26 Ext Imm32 Condition Evaluation Addr Next Addr. Logic PC PC+4 Add Data Memory Jump/Branch Target Address Target Address Calculation WB/EX Podmínka vyhodnocena ve stupni EX, PC změněno ve stupni MEM.
Řešení řídicího hazardu pomocí pozastavení BEQZ R3, M1 instr.2 IF stall IF stall IF stall instr.3 instr.4 M1: ADD R4,R6,R7 vyhodnocení podmínky & výpočet nového PC PC změněno Toto řešení znamená 3 takty pozastavení (3 stalls) na každou prováděnou instrukci podmíněného skoku (13 %). SPI control = 0,13*3 = 0,39! Latence skoku doba mezi IF skoku a určením správného PC: Latence skoku =cpi branch = 4 takty SPI control = Branch Frequency * (cpi branch - 1)
Podmíněný skok s vypláchnutím pipeline BEQZ R3, M1 instr.2 instr.3 IF ID EX NOP IF ID NOP Cancelled (flushed) Instructions instr.4 IF NOP M1: ADD R4,R6,R7 condition resolution & address calculation PC changed Instrukce 2,3 a 4 jsou vypláchnuty pouze v případě provedení skoku 3 ztracené takty (bubliny v pipeline) pouze pro každý provedený skok. SPI control = Branch Frequency *Taken Frequency * Branch Penalty = 0.13*0.67*3 = 0.26
Vylepšení implementace podmíněného skoku Vylepšení skoku má dvě části: - Vyhodnocení podmínky dříve - Výpočet cílové adresy a změna PC dříve Možná implementace - Přidání logiky pro vyhodnocení podmínky do stupně ID - Výpočet cílové adresy do stupně ID Výsledný vliv na CPI : 1 pozastavení místo 3 => SPI = 0.0871 Všimněte si ovšem, že modifikovaný skok nemůže využít forwardingu do stupně EX =>nárůst SPI data Také T clk může vzrůst v důsledku komplexnější logiky v ID
Implementace vylepšeného podm. skoku (v ID) Instruction Memory IF stage Instruction ID stage Comb Logic EX stage Comb. Logic MEM stage Comb. Logic WB stage Comb. Logic PC Addr Imm16 Disp26 busw Rw Ra Rb 32 32-bit Registers MEM/EX busa busb ALU jump_now Ext Imm32 Addr Next Addr. Logic PC PC+4 Condition Evaluation Logic Data Memory Jump/Branch Target Address Add Target Address Calculation WB/EX
Vylepšený podmíněný skok BEQZ R3, M1 instr.2 M1: ADD R4,R6,R7 IF condition evaluation & address calculation, PC changed NOP Cancelled (flushed) Instruction Instrukce za skokem je zrušena pokud je skok proveden (angl. taken) jinak je dokončena. SPI control = Branch Frequency *Taken Frequency * Branch Penalty = 0.13*0.67*1 = 0.0871 Není škoda instrukci za skokem zrušit, když už byla načtena?
Dále vylepšený skok Zpožděný skok BEQZD R3, M1 instr.2 M1: ADD R4,R6,R7 condition evaluation & address calculation U normálního (nezpožděného skoku) je instrukce v delay slotu zrušena, pokud dojde ke skoku (změně PC). U RISC je výhodné zavést tzv. zpožděný skok (BEQZD / BNEZD) s odlišnou sémantikou. Instrukce následující za skokem (v tzv. branch delay slotu) je vždy provedena. SPI control = Branch Frequency * Branch Penalty Branch Delay Slot Pokud instrukce v delay slotu udělá nějaký užitečný výpočet, branch penalty je redukována na nulu.
Které instrukce může překladač umístit do Branch Delay Slotu? ADD R1, R2, R3 BEQZD R4, LAB Delay Slot LAB: Řešení č.1: Instrukce před skokem BEQZD R4, LAB ADD R1, R2, R3 LAB: Toto je bezpečné řešení. Branch Penalty je redukována na nulu. Podmíněný skok nesmí (datově) záviset na instrukci umístěné do delay slotu.
Které instrukce může překladač umístit do Branch Delay Slotu (2)? ADD R7, R2, R3 ADD R7, R2, R3 BEQZD R7, LAB Delay Slot OR R5, R6, R7 LAB: SUB R4, R5, R7 Řešení č.2: Z cíle skoku Řešení č.3: Ze sekvenčního pokračování BEQZD R7, LAB SUB R4, R5, R7 OR R5, R6, R7 LAB: ADD R7, R2, R3 BEQZD R7, LAB OR R5, R6, R7 LAB: SUB R4, R5, R7
Které instrukce může překladač umístit do Branch Delay Slotu (3)? º Branch Penalty je u řešení 2 a 3 redukována pouze pokud program pokračuje v očekávané cestě ze které pochází instrukce v delay slotu. º Řešení č.2 a 3 jsou legální (tj. bezpečná) pouze pokud instrukce v delay slotu může být bezpečně provedena když skok vede opačným směrem než je cesta ze které pochází instrukce v delay slotu. º Instrukce v branch delay slotu nesmí způsobit výjimku je-li provedena v cestě, kdy původně provedena nebyla. typicky problém Load, Store instrukcí (Virtual Memory Protection Fault) Poznámka: Některé RISC procesory zavádí třetí typ instrukce skoku tzv. canceling branch (rušící skok). Instrukce za rušícím skokem je provedena pouze pokud se skáče. Instrukce za rušícím skokem je zrušena v případě sekvenčního pokračování. To umožňuje umísťovat za rušící skok instrukce z cíle skoku.
Zpožděné skoky - shrnutí Některé RISC procesory mají až 3 typy podm. skoků: º Zpožděný skok použit pokud instrukce v delay slotu může být provedena bez ohledu na vykonání skoku. º Normální skok Instrukce v delay slotu je zrušena pokud je skok proveden (tj. když se skáče) º Rušící skok Instrukce v delay slotu je zrušena pokud skok není proveden (tj. když se pokračuje sekvenčně) º Zpožděné skoky fungují velmi dobře pro jednoduchou pipeline, ale komplikují řešení výjimek (přerušení) a superskalární provádění instrukcí ve výkonnějších modelech pipeline.
Způsoby implementace skoku shrnutí Předpokládejme, že 13 % instrukcí jsou skoky, - 67 % skoků je provedeno (skáče), - 33 % skoků sekvenčně pokračuje. Sémantika skoku Vyhodnocení podmínky / změna PC Instrukce za skokem SPI control normální EX / MEM Pozastavena v IF 3 takty 0,13 * 3 = 0,39 normální EX / MEM 3 instrukce vypláchnuty, je-li skok proveden 0,13 * 0,67 * 3 = 0,26 normální ID / ID 1 instrukce vypláchnuta, je-li skok proveden 0,13 * 0,67 * 1 = 0,087 zpožděný ID / ID 1 instrukce za skokem vždy provedena 0,13 * (1 FD) = 0,065 FD = 50 % FD četnost provedení užitečné instrukce v delay slotu Poznámka: první řešení se reálně nepoužívá, ostatní ano.
Strukturní hazardy Strukturní hazardy: důsledek neúplné replikace prostředků v pipeline, kolize na sdílených prostředcích (paměti, porty reg. polí, funkční jednotky ) V našem celočíselném DLX nejsou žádné sdílené prostředky mezi stupni pipeline a proto SPI struct = 0 V reálných procesorech mohou takové prostředky být (v důsledku šetření plochou čipu nebo praktičnosti implementace) a díky tomu vznikají strukturní hazardy strukturní pozastavování (structural stalls)
Příklad strukturního hazardu společná paměť dat a instr. Load instr.2 instr.3 IF ID EX MEM W B IF ID EX MEM W B IF ID EX MEM W B Stall instr.4 Lost instruction slot (Pipeline buble) IF ID EX MEM W B Instrukce č. 4 nemůže začít ve 4. taktu neboť Load v tu dobu přistupuje ke sdílené paměti dat a instrukcí. Toto lze chápat jako pozastavení 4. Instrukce ve stupni IF. Vliv sdílené paměti (cache) na výkonnost: Při přístupu k datům nelze načíst novou instrukci. 26 % instrukcí jsou typu Load, 13 % Store => CPI = 1,39
Příklad strukturního hazardu chybějící stupeň MEM Load ADD IF ID EX MEM W B IF ID EX W B Collision on write port into register file. Důvod: Instrukce procházejí odlišný počet stupňů pipeline. Řešení: Přidání zápisového portu k reg. poli, to ovšem není vždy vhodné (plocha čipu, zpoždění ). Pozastavení je snazší řešení. Load ADD instr.3 IF ID EX stall WB IF ID stall EX WB instr.4 IF stall ID EX MEM W B instr.5 stall => Toto je důvod proč ALU instrukce procházejí zdánlivě prázdným MEM stupněm u 5-stupňového DLX.
Hledání strukturních hazardů (1) Označ takty ve kterých jsou části pipeline (zdroje) používány různými typy instrukcí. Příklad č.1 sdílená paměť 1 2 3 4 5 Load, Store Other instr. IF ID EX MEM W B 1 2 3 4 5 IF ID EX MEM W B Shared Memory Used Příklad č.2 rozdílný počet stupňů pipeline 1 2 3 4 5 Load IF ID EX MEM W B Store Other instr. 1 2 3 4 IF ID EX MEM 1 2 3 4 IF ID EX WB Register File Write Port Used Sdílený zdroj je část pipeline používaná instrukcemi ve více různých taktech => strukturní hazardy zde mohou nastat.
Hledání strukturních hazardů (2) Clock cycle -> Instruction num ber 1. 2. 3. 4. Load instr.2 instr.3 instr.4 1. 2. 3. 4. 5. 6. 7. 8. IF ID EX MEM W B IF ID EX MEM W B IF ID EX MEM W B IF ID EX MEM W B Instrukce j používající sdílený zdroj v taktu c2 má kolizi s instrukcí i která používá tento sdílený zdroj v taktu c1 IFF j = i + (c1 c2) V našem příkladě: i=1, c1=4 j=4, c2=1
Výkonnost DLX (se zpožděným skokem) na SPECInt95 Průměrné SPI ve SPECInt95 : SPI control = 0,06, SPI data 0,05 Průměrné CPI (pro ideální paměťový systém) = 1.11 Zrychlení oproti neproudovému DLX je 4.5 David Patterson, CS152 UCB 1996
DLX a vícetaktové instrukce FP pipeline EX Integer Unit IF ID EX FP/Int Multiply MEM WB WinDLX Model EX FP ADD/SUB EX FP/Int Divide Funkční Jednotky
DLX FP Pipeline reálnější model Integer Unit E M FP multiplier F D MX1 MX2 MX3 W FP adder AX1 AX2 AX3 AX4 FP DIV DX1-DX28 SQRT (multicycle)
Parametry funkčních jednotek Latence - počet taktů než je k dispozici výsledek - typicky odpovídá počtu stupňů pipeline v jednotce Spouštěcí (opakovací) interval - počet taktů něž další instrukce může používat tuto funkční jednotku Latence pipeline = 5 taktů IF ID EX MEM WB IF Spoušť. interval = 1 takt Latence of celočíselné jednotky pro ALU operaci = 1 takt ID EX MEM WB
Příklady parametrů funkčních jednotek Funkční jednotka (Typ prováděné instrukce) Integer (ALU Reg-Reg, Reg- Imm) Integer (Load instrukce) FP MULT (pipelined) FP ADD (pipelined) DIVIDER (iterative) Latence 1 2 6 3 28 Spouštěcí interval 1 1 1 1 28 Ve WinDLX jsou všechny jednotky s výjimkou celočíselné vícetaktové (latence = spouštěcí interval) Na druhou stranu můžeme používat více jednotek stejného typu a tím snížit spouštěcí interval.
Instrukční latence a spouštěcí interval Latence instrukce -Počet taktů než je k dispozici výsledek pro datově závislou instrukci Závisí na: -Latenci funkční jednotky pro danou instrukci -Forwardovacích cestách v procesoru -Typu závislé instrukce (kdy daná instrukce potřebuje data) Spouštěcí (opakovací) interval instrukce -Počet taktů než může být spuštěna další instrukce daného typu (bez strukturních hazardů) Závisí na: -Počtu funkčních jednotek a jejich spouštěcích intervalech M ne-proudových funkčních jednotek s latencí M má stejný spouštěcí interval jako jedna proudově pracující funkční jednotka latence M. Viz též doplňkový shrnující materiál o různých DLX implementacích
Nové problémy u FP pipeline o Větší počet strukturních hazardů konflikty u neproudových jednotek, zápisové porty u registrového pole o RAW hazardy jsou častější (větší latence instrukcí) o WAR hazardy nemohou nastat neboť operandy jsou čteny na začátku provádění instrukce a instrukce jsou prováděny v programovém pořadí. o WAW hazardy mohou nastat neboť instrukce jsou dokončeny mimo programové pořadí (mají různou latenci) tzv. In-order-issue + out-of-order completion o Složitá logika detekce hazardů ve stupni ID
Nové strukturní hazardy kolize na reg. poli 1 2 3 4 5 6 7 8 9 10 FMULT F0, F4, F6 IF ID MX1 MX2 MX3 MX4 MX5 MX6 MEM WB Integer instr. Integer instr. FADD F2, F4, F6 IF ID MX1 AX1 MX2 AX2 MX3 AX3 MEM WB Integer instr. LDF F3, 15(R1) Potřeba více zápisových portů u reg. pole (až 4). Tento konflikt nastává u WinDLX ve stupni MEM (pouze jedna instrukce může být ve stupni MEM u WinDLX) V reálném CPU -Stupeň MEM u FP instrukcí nemá smysl (nezabrání odlišným latencím) -Instrukce Store nemusí mít konflikt neboť nic nezapisuje - Celočíselné instrukce nemusí mít konflikt s FP instrukcemi (separátní registrová pole), může být více zápisových portů u FP reg. pole
Příklad WAW hazardu 1 2 3 4 5 6 7 8 9 10 FMULT F0, F4, F6 IF ID MX1 MX2 MX3 MX4 MX5 MX6 MEM WB Integer instr. FADD F0, F3, F2 IF ID MX1 AX1 MX2 AX2 MX3 AX3 MEM WB º Hodnota FADD může být přepsána dřívější FMULT º WAW hazard může být vyřešen pozastavením FADD instrukce ve stupni ID º Vliv na výkonnost není významný neboť tato situace nastává zřídka ( viz redundantní výpočet na slajdu č.10)
Výkonnost FP DLX (SPECfp95) David Patterson, CS152 UCB 1996
Výkonnost FP DLX (SPECfp95) David Patterson, CS152 UCB 1996
Výkonnost FP DLX º Celočíselné SPI zanedbatelné vůči FP SPI º Pozastavení kvůli RAW hazardům je dominantní částí SPI (viz sloupce FP result stalls ) º Strukturní hazardy kvůli děličce jsou zanedbatelné Počet ztracených taktů na FP operaci je přibližně 50 % of její latence (zbytek je překryt výpočtem ostatních instrukcí) tzv. partial latency hiding - 14,2 taktů pozastavení pro dělení (latence = 28 taktů) - 2,7 taktů pozastavení pro násobení (latence = 6 taktů) Vliv na CPI (FP SPI) o Závisí na aplikaci - SPI mezi 0.65-1.21 o SPECfp průměrné SPI je 0.87 o DLX FP CPI = 1.87 (SPECfp95) David Patterson, CS152 UCB 1996
Závěry Výkonnost proudově pracujícího procesoru je limitována pozastavováním kvůli strukturním, datovým a řídicím hazardům Datové hazardy jsou RAW, WAW a WAR Některé techniky pro minimalizaci pozastavování (forwarding, zpožděný skok, plánování instrukcí překladačem) Následující 3 přednášky : Paměťová hierarchie (co se skrývá pod IF a MEM) Poté se podíváme na problematiku pokročilých technik proudového zpracování (superskalární procesory, dynamické plánování instrukcí, predikce skoku, spekulativní provádění instrukcí )