Aktuality  |  Články  |  Recenze
Doporučení  |  Diskuze
Grafické karty a hry  |  Procesory
Storage a RAM
Monitory  |  Ostatní
Akumulátory, EV
Robotika, AI
Průzkum vesmíru
Digimanie  |  TV Freak  |  Svět mobilně

Intel Core - pohled na architekturu II

3.5.2006, Eagle , článek
Intel Core - pohled na architekturu II
Po včerejším povídáním o dekódování a Out-of-Order zpracování se dnes zaměříme na výpočetní část, práci s pamětí, prefetch, termální management a konečně i na spekulativní vykonávání instrukcí. Věděli jste, že Core je silně zaměřen na multimediální aplikace?
Speculative precomputation

Přestože spekulativní předpočítávání není součástí žádné architektury (jedná se totiž o softwarovou záležitost), jedná se o princip, který bezpochyby velmi významně ovlivnil návrh nových procesorů Conroe, Woodcrest a Merom.

Co to spekulativní předpočítávání je? Jedním z největších problémů při snaze o dosažení vysokého výkonu jsou latence pamětí RAM. Operační paměť (dnes obvykle DDR2 SDRAM) je prostě příliš pomalá a než dodá nějaká data, uplyne věčnost. Pokud při Out-of-Order řazení instrukcí procesor zjistí, že nemá příslušná data, nepošle microOP do výpočetní jednotky. Tato microOP bude místo toho muset počkat. V situaci, kdy přístup do paměti RAM může trvat klidně 200 hodinových cyklů procesoru, je zpomalení obrovské - pokud by vše s dodávkou dat probíhalo bez problémů, Core by dokázal vykonat za stejnou dobu cca. 800 microOPs. Pokud se ale celý výpočet zadrhne na jedné instrukci, celá pipeline se zastaví a výkon bude prakticky nulový.


Spekulativní předpočítávání generuje pomocná výpočetní vlákna

Jedním ze způsobů, jak tento problém obejít, je dodat data do vyrovnávací paměti cache, která je podstatně rychlejší než RAM. Dodávka probíhá jednak na úrovni cache line požadavků, ale také na úrovni prefetch mechanismů (prefetch můžeme přeložit jako dodávku dat ještě před tím, než jsou vyžadovány).

Cache je v procesoru organizována do tzv. lines. To jsou datové bloky o určité velikosti - obvykle 64 bytů (512 bitů). Programy vytvořené se statickými proměnnými, tedy proměnnými definovanými přímo ve zdrojovém kódu (... a nikoli těmi, které se vytváří na základě nějakého dynamicky (za chodu) se sestavujícího řetězce údajů s adresami na další záznam), kompilátor při tvorbě strojového kódu obvykle umístí ihned vedle sebe. Procesor tohoto faktu využívá k vylepšování rychlosti formou přísunu dat do cache a to tak, že načte nejen požadovanou proměnnou, ale také data kolem ní. Paměť RAM má velmi dlouhou dobu vyhledávání, ale samotná dodávka dat je poměrně rychlá. Pokud tedy dodá nejen jedinou proměnnou o velikosti např. 4 byte, ale také další byty okolo, nebude jí to trvat příliš mnoho času navíc. Procesor takto načte nejen požadovanou proměnnou, ale také mnoho proměnných umístěných v kódu hned vedle, přičemž pravděpodobnost přístupu k datům hned vedle nedávno požadované proměnné je velmi vysoká (často téměř 100%). Tím dojde k obrovskému zvýšení rychlosti.

Nevýhodou načítání dat na bázi cache line je, že neeliminují prvotní čekání. Systém tak sice odstraní velkou většinu čekání, nikoli ale všechny. Z toho důvodu jsou ještě používány prefetch mechanismy.
Prefetch instrukce je příkaz procesoru, že má načíst určitý blok dat z paměti RAM do paměti cache. První prefetch instrukce byly součástí sady 3Dnow! u procesorů AMD K6-2. Intel je poprvé uvedl v SSE v Pentiu III. Prefetch instrukce jsou dobré pro odstranění prvotního čekání, mají však dva velké nedostatky. Prvním (a zároveň nejzávažnějším) je, že adresa umístění dat v paměti musí být známa. Pokud tato závisí na předchozích výpočtech, nelze prefetch příliš uspíšit před okamžikem, kdy jsou data skutečně potřeba, neboť Out-of-Order zpracování se týká relativně malého počtu instrukcí (v architektuře Core "pouze" 96 záznamů v Reorder Buffer), zatímco čekání na RAM trvá věčnost. Druhým problémem pak je, že prefetch instrukce vyžaduje vygenerování microOP, takže snižuje aktuálně dostupný výpočetní výkon.



Řešením uvedeného problému může být dvoujádrový procesor. Nikoli však pro zpracování typické vícevláknové aplikace, nýbrž pro zpracování "jednovláknové" (v uvozovkách proto, že ona zas tak plně jednovláknová není). Dnešní vícevláknové programy, aby využily výkon vícejádrového procesoru, obsahují dva nebo více zátěžových threadů, které mají plus mínus stejné požadavky na výkon. Toto je symetrický multithreading.

Procesory se sdílenou L2 cache, mezi které patří i ty založené na architektuře Core, mohou využít asymetrického multithreadingu ve formě spekulativního předpočítávání. To spočívá v tom, že program je vytvořen s pomocnými vlákny, která projíždí kód ještě před hlavním výpočetním vláknem, počítají adresy a vyvolávají prefetch instrukce. Tato vlákna jsou přiřazena druhému jádru a prefetch probíhá do L2 cache. Výpočetní vlákno je obsluhováno prvním jádrem, které pak potřebná data nachází již v L2 cache připravená. Tímto způsobem jsou prakticky eliminovány latence pamětí RAM.


Sdílená cache umožňuje snadné sdílení nejen výsledků, ale také prefetchovaných dat.

Předpokladem úspěšnosti je, že vytvoření pomocných threadů bude možné. Program navíc musí být správně kompilován, tj. na již existujících programech toto nefunguje. A konečně na procesorech s oddělenou L2 cache pro každé jádro tato technika spíše zhorší celkový výkon, neboť se data načtou do cache k jádru, které je nepotřebuje. Následný přesun do druhého jádra pak bude mít tendenci zahltit komunikační sběrnici (ať už FSB nebo specializovanou vnitřní datovou linku). Budoucnost je ale patrně spíše vyhrazena dvoujádrovým procesorům, které budou L2 cache sdílet.


Hardwarový prefetch

Kromě přípravy na spekulativní předpočítávání obsahuje architektura Core samozřejmě také hardwarový prefetch. To je takový prefetch, který vykonává procesor sám na základě svých odhadů toho, jakým způsobem program nakládá s daty. Tento způsob nevyžaduje žádnou microOP a nevyžaduje také překompilování programů (zlepší již existující). Na druhou stranu jeho efektivita nemusí být úplně ideální.

Hardwarový prefetch byl poprvé použit v procesoru Pentium III s jádrem Tualatin, které zvýšilo výkon oproti jádru Coppermine předchozí generaci až o cca. 10 % při stejné frekvenci. Přínos mechanismu je tedy značný. Jednou z limitací ale je, že prefetch klade poměrně značné nároky na paměťový subsystém a svým způsobem ho zahlcuje. Vyvolává totiž neustále požadavky na načítání dat. Pokud se tyto požadavky vyskytnou v okamžiku, kdy procesor v kódu narazí na instrukci, která chce data, jež nejsou v cache ani na ně nebyl vyvolán požadavek prefetcherem, výpočet se zastaví. Dodávka takových dat by pak měla mít prioritu před vším ostatním. To ale v dnešních designech není ošetřeno, tudíž v takové situaci může hardwarový prefetch zhoršit výkon.


Prefetch může dodávat data do všech úrovní cache

Standardně hardwarový prefetch dodává data z paměti RAM do L2 cache. U architektury Core je tomu jinak. Zde funguje předběžné načítání dat nejen do L2, ale také přímo do L1 a to jak z RAM, tak také z L2. Procesor tak obsahuje víc hardwarových prefetcherů. Aby nedošlo k zahlcení, jsou tyto koordinovány na základě aktuálních požadavků - pokud první jádro bude zpracovávat datově náročný výpočet a bude neustále žádat data z paměti, zatímco druhé jádro bude využité jen málo, přiřadí hardwarový prefetch prioritu jádru prvnímu a bude dodávat data především pro něj. Druhé jádro mezi tím počká. Uvedená optimalizace plyne z faktu, že prefetch je spekulativní - předem načtená data mohou, ale zároveň nemusí být použita.