Hlavní stránka Hardware Procesory, paměti AMD Bulldozer – Nová architektura CPU od AMD
AMD Bulldozer – Nová architektura CPU od AMD
autor: Z. Obermaier , publikováno 6.9.2010
AMD Bulldozer – Nová architektura CPU od AMD

Většina světových médií přinesla zevrubný pohled na novou architekturu procesorů AMD už minulý týden. My máme sice krapet zpoždění, nabídneme vám ale také více informací. Kromě obecně známých skutečností si podrobně popíšeme architekturu jádra, a pohovoříme více o výkonu budoucí generace procesorů AMD.


AMD Bulldozer – Nová architektura CPU od AMD

Sdílení prostředků mezi jádry v jednom bloku je hlavní znak architektury Bulldozer. Sdílení prostředků začíná samozřejmě na počátku instrukční pipeline – na front-endu. Proti předchozí architektuře K8 (10h) byl front-end notně přepracován a obsluhuje nyní obě jádra v jednom modulu. Některé jeho prvky byly tedy rozšířeny.

Instrukce

Front-end – První část procesoru sestává ze získávání instrukcí (Fetch) a jejich dekódování. Všechny moderní procesory pracují s vnitřními microOPs instrukcemi, tedy jakýmisi jednoduchými operacemi, které umí jeho výpočetní jednotky přímo zpracovat. Instrukce zadané programátorem (tedy sada x86 a jí rozšiřující sady) jsou na tyto instrukce převáděny (dekódovány). Procesor tedy nepracuje přímo s x86 instrukcemi (tzv. macroOPs), ale jejich ekvivalenty microOPs, přičemž jedna x86 instrukce je rozdělena na jednu nebo více microOPs, dle složitosti.

Front-end Bulldozer modulu se skládá z několika od sebe oddělených částí. První je Branch prediction, následuje přesun instrukcí (Fetching), Dekódování a macroOP Dispatcher. Stěžejní funkcí je přepínání mezi oběma thready jež je zajištěno každý cyklus. Systém sleduje vytížení pipeline a výpočetních jader, vzhledem k tomu pak přiděluje jednomu nebo druhému threadu prioritu. Nejdůležitější komponentou front-endu je Branch prediction, jež je u architektury Bulldozer zásadně přepracována, po vzoru architektury Nehalem od Intelu.

Branch prediction – Dekodér při své činnosti využívá předdekódování a Branch Prediction Table. O co jde? V programu jsou často podmínkové skoky. Když je výsledek nějaké operace takový, provede se jeden kód, pokud onaký, provede se jiný kód. Protože instrukce jsou vnitřně v procesoru vykonávány v jiném pořadí, než jsou v programu za sebou (tzv. out-of-order), je možné obejít čekání na data, urychlit výpočet spočtením subvýpočtů naráz (1+2+3+4 bude trvat dva početní cykly, protože se nejprve sečte současně 1+2 a 3+4 a potom výsledky – tím se ušetří jeden cyklus) nebo dokonce začít počítat kód, který následuje až po podmínkovém skoku. Procesor odhadne, jaký asi bude výsledek podmínky ještě před tím, než jí skutečně vypočte, a rovnou začne počítat tu větev kódu, o které si myslí, že je ta správná. Aby mohl tyto odhady provádět, musí průběžně sledovat tok instrukcí a odhadnout tak, jak se bude program dále vyvíjet. Sledování toku instrukcí se provádí tak, že instrukce jsou dekódovány, ale nejsou tvořeny OPs, ale záznamy (RIP) v Branch Prediction Table. Tomu se říká předdekódování.

Při vysokých frekvencích procesoru se může díky delší pipeline ztratit více instrukcí, což znamená penalizaci ztráty výkonu a nevyužitou spotřebu energie. Tento problém řešil dlouhodobě Intel a věnoval mnoho prostředků a zkoumání jak vylepšit předvídání větvení kódu, první vylepšení Branch prediction přišlo s Pentiem 4 a s každou generací je dále notně vylepšeno. Z dostupných informací je jasné, že předvídání je u Bulldozer vůči K8 (10h) znatelně lepší, jak si ale povede proti Intelu zjistíme až při testování reálného produktu. Papírově ale vypadá hodně slušně, mnoho použitých vlastností se v architektuře Nehalem osvědčilo.

AMD Bulldozer – Nová architektura CPU od AMD

Branch predictor je v modulu sdílen oběma jádry a je od instrukční fronty oddělen dvěma predikčními frontami (queue). Každé jádro má svou vlastní. Každá jednotka vytváří RIP (relativní instrukční značky) až do chvíle, kdy je instrukční fronta plná. Prvním krokem je určení směru větvení, a nezáleží zda bude předvídáno nebo nikoliv. Poté co je směr určen, následuje zjištění cílové instrukce. Pokud se jedná o kód s jedinou cílovou adresou, je je směrována do BTB (branch target buffer). Ten byl po vzoru Nehalemu rozšířen do dvou stupňů. L1 BTB má 512 vstupů a čtyřcestné spojení, předpověď větvení zde nabere jeden cyklus zpoždění vůči instrukcím v pipeline. BTB v paměti L2 cache má 5120 vstupů a pětici spojení, rozšíření kapacity znamená také větší latence (zpoždění). I když jsou BTB sdíleny pro obě jádra měly by i tak mít větší efektivitu než samostatné pro každé jádra architektury K8 (10h). Důležitou vlastností jsou i opravné funkce větvení, v případě, že bylo větvení předvídáno špatně. Bulldozer přináší opravnou funkci, jež sníží možnosti špatných predikcí, stejně jako to umí architektura Nehalem. Bližší detaily o funkčnosti ale nejsou známé.

Jelikož je Branch predictor oddělen od ostatních jednotek může pracovat efektivněji a rychleji než instrukční fronta v modulu. To umožňuje lépe rozložit zátěž Branch predictor pro obě jádra a snížit dopad vyšších latencí vznikajících při predikci. Důležité také je, že je takto možné mít připraveno více RIP v daný okamžik, čímž je dostatek dat pro prefetching v instrukční frontě. Předpřipravení toku instrukcí tak může snížit dopad vyšších latencích vzniklých v předchozím stupni.

AMD Bulldozer – Nová architektura CPU od AMD

Pokud byl vytvořen RIP a uložen do predikční fronty, instrukční jednotka přistoupí ke sdílené L1 cache a ITLB (Instrukční Translation Look-Aside buffer). ITLB je součást procesoru, speciální cache HW podpory překladu virtuálních adres na fyzické. ITLB obsahuje záznamy ze stránkovacích tabulek, které byly použity v poslední době, aby se při opakovaném přístupu na tytéž adresy nemusely vyhledávat znovu. L1 ITLB je plně asociativní s 72 vstupy pro různě veliké stránky. Zde je vidět vylepšení proti nynější architektuře, Bulldozer totiž v L1 ITLB podporuje všechny stránky od 4KB až po 1GB, starší generace toto neumožňovala. U L2 ITLB sice AMD povolila jen 4KB stránky, navýšila ale počet vstupů na 512 při čtyřcestném spojení.

Poslední zastávkou před dekódováním instrukcí je IBB (instrukční bytový buffer). IBB odděluje instrukce od dekodérů, v jednom modulu jsou dvě IBB každá pro jedno jádro. IBB obsahuje šestnáct oken, každé z oken může nést 16B x86 instrukcí. Maximální počet instrukcí je v tomto případě 256B pro jedno jádro.

Dekodéry

Než se posuneme dále, vysvětleme si dále použité pojmy. Jak už víte, různě dlouhé x86 instrukce jsem před okamžikem nazval macroOPs, ty výpočetní jádra neumí zpracovat, jsou tedy dekódovány na microOPs jednoduché instrukce, kterým jádra rozumí. O celém tomto procesoru je tato kapitola. Oba termíny macroOPs (pro x86 instrukci) a microOPs (vnitřní instrukce) ale používá spíše společnosti Intel, u AMD vložili ještě jeden mezistupeň. V terminologii AMD je x86 instrukce pouze ta z AMD64 instrukčního setu, ta může být různě složitá a různě dlouhá. MacroOPs jsou už vnitřní instrukce konstantní délky, s různou složitostí a provádějící více různých operací (výpočetní, práce s pamětí). Tyto instrukce AMD nazývá někdy jako komplexní macroOPs neboli cops.

Poslední instance microOPs je jednodušší než u konkurence, má konstantní délku a vykonává vždy jen jednu operaci (výpočet, load nebo store), ovšem vždy jen jednu z nich, nikoliv kombinaci. V samotných výpočetních jádrech se tedy zpracovávají až microOPs stejně jako u Intelu, Nehalem ale umí zpracovat složitější instrukci (ekvivalent macroOPs u AMD). Abychom si mohli udělat představuje jedna microOPs Intelu je komplexní jako macroOPs u AMD, jež se dále dělí na tři microOPs. Na stejné úrovni jsou tedy u Intelu microOPs a u AMD macroOPs. Dále tedy budu používat označení AMD.

AMD Bulldozer – Nová architektura CPU od AMD

Dekodér u jádra architektury Bulldozer se od jeho předchůdce nijak neliší, ze tří původních pro jedno jádro se jejich počet zvýšil na čtyři, tentokrát ale pro dvě jádra. Jádro architektury K8 (10h) zvládalo za jeden takt vykonat 3 macroOPs instrukce pro jedno jádro, u nové architektury jsou to 4 MacroOPs pro dvě jádra. Počet instrukcí na jádro se tedy snížil. Teď záleží jak efektivní bude přísun dat a střídání mezi thready, aby se to neprojevilo negativně na výkonu.

Bulldozer, stejně jako předchozí architektura dělí instrukce do tří skupin. První je Fast Patch Single, jejíž výstupem je jedna MacroOPs instrukce. Druhá se nazývá Fast Patch Double a produkuje dvojici macroOPs instrukcí. Třetí skupinou je Vector Patch vytvářející vše ostatní. Jak jsem si řekli, macroOPs u AMD jsou složité a komplexní, většina instrukcí se tedy dekóduje jako Fast Patch Single do jedné macroOPs instrukce. To není ovšem případ 256-bitových AVX instrukcí, které se vykonají zároveň ve dvou 128-bitových výpočetních jednotkách (FPU). Tím vzniknou dvě macroOPs zároveň.

Dekódování začíná v okamžiku nahlédnutí do prvních dvou 16B oken v IBB (instrukční bytový buffer) pro jedno jádro, v ideálním případě jsou se vezmou instrukce z obou oken, pokud tomu nebrání další faktory omezující dekódování jen na jedno okno. Aby bylo možné "nakrmit" obě jádra dostatkem instrukcí, byl počet dekodérů navýšen ze tří na čtyři, což jsem říkal už před chvilkou. Jeden modul Bulldozer tedy vykoná čtyři instrukce za takt, architektura Nehalem má nejen větší okno (18B), ale vykoná také více microOPs instrukcí za takt – sedm. Ve finálních číslech macroOPs je to 4 macroOPS pro Bulldozer modul a 5 macroOPS pro konkurenční jádro architektury Nehalem. Pokud to sečteme na celý procesor, dokáže osmijádrový čip s jádrem Orochi vyprodukovat 16 macroOPs za takt, šestijádro s jádrem Gulftown dokáže téměř dvakrát tolik – 30 macroOPs. Výkon v celých x86 instrukcích ale záleží na aplikaci a použité instrukční sadě, nedá se tedy nyní odhadnout. To nám ukáže až přímé srovnání v jedné aplikaci.

Branch fusion

Součástí dekódování je také technika fúzování macroOPs známá již z Core architektury (Branch fusion). Nadcházející čipy od AMD jsou první procesory tohoto výrobce s touto funkcí. Tato funkce se snaží o zvýšení účinnosti instrukčních dekodérů tak, že dvě jednodušší x86 instrukce vymění za jednu složitější. Typickým příkladem může být kombinace instrukcí cmp a jne („porovnej s předdefinovanými údaji a pokud není identické, nastav instrukce na adresu“), tedy typického podmínkového skoku, která je nahrazena jedinou instrukcí cmpjne. Cmpjne se v sadě x86 nenachází, jedná se tedy o „smyšlenou“ instrukci procesoru, které ale dekodéry umístěné dále rozumí.

Výhodou fúzování je, že komplexnější microOP zabírá v instrukčním okně jeden záznam na místo dvou, tedy efektivně zvyšuje paralelismus, a zároveň zvyšuje tempo dekódování. Tato technika nyní funguje i v 64bit režimu. V okamžiku, kdy jsou instrukce dekódovány do macroOPs jsou seřazeny po skupin po čtyřech a putují ke zpracování výpočetními jádry – o nich další kapitola.



 
Komentáře naleznete na konci poslední kapitoly.
153 čtenářů navrhlo autorovi prémii: 68.5Kč Prémie tohoto článku jsou již uzavřené, děkujeme za váš zájem.
Tento web používá k poskytování služeb soubory cookie.