- výkonný, ale náročná režie hw
- pravé = raw
- nepravé = waw, war -> vzniká změnou pořadí instrukcí
- nevím, jestli se nepotkají adresy po výpočtu adresy = ve fázi Execute
- řešení speciální jednotkou load/store = 3 stupně
- loady se vyřizují hned; store mají zpoždění (uložení na ROB, čekání na probublání na vršek bufferu)
- RPW - při rozbalování smyček - nelze bez toho žít
- Na písemce: zkouší obě metody
-
- způsob
- bypassing - load přeskočí všechny předešlé store, pokud načítá z jiné adresy
- slide 14 - nechceme čekat, spekulativní vykonávání, spekulujeme, že Y != Z, problém když se rovná, musí se vše od spekulativního bodu zahodit
-
- způsob
- forwarding - load načítá data z předešlého store - můžeme si v jádře přímo vzít data
- na x86 = storequeue
- na začátku neznám ani data ani adresu (
data = ?, adresa = ?)
- po vypočítání dat nastaví do bufferu na
ready, až znám adresu vložím adresu
- po zápisu do paměti =
data = completed, nelze už změnit ani spekulace
- load operace:
- po vypočítání adresy hledám shodu ve store bufferu
- nemá shodu = musí čekat
- má shodu = bere ze storebufferu
- Výpočet adresy až po načtení spekulativního loadu = load buffer
- store vypočte adresu pro store
- hledá kolize v load bufferu
- v případě, že najde kolizi dojde k vypláchnutí = load načetl data před store nad stejnou adresou = má načtená špatná data
- relaxovaná paměťová konzistence
- cache line = 64 Byte (stále aktuální)
- při načítání i jen 1 bitu mimo cacheline se natahuje celé nová cache line
- velice krátká doba vystavení řádků
- 2 takty na výsledek řádku
- problém s kolizí - 4k aliasing
- sw řešení: změna velikosti matice (přidání prázdné vycpávky)
- hw řešení: více možností cache line
- problém: přidám 1 takt získání, musím získat která možnost má data
- u malých cache
- TLB, Rezervační stanice
- problém prohledávání každé položky - drahé
- intel
- cache sdílí data
- L2 obsahuje vše co L1
- výhoda, při vylití L1 (read=only) mám kopii v L2
- nevýhoda neefektivní využití místa
- cache pro urychlení překladu stránek - aby nebylo nutné vždy brát z paměti
- V/V cache = zabije interproces adresaci, ale rychlé, při výpadku mimo L1, se použije fyzická v L2 (tedy jen v 5%)