Piledriver mikroarhitektura
Ako posmatramo blok dijagram Piledriver jezgra, jasno vidimo da je u pitanju evolucija Bulldozer mikroarhitekture. Međutim, unapređenja ima nekoliko i uglavnom su ključna. Unapređena je jedinica za predviđanje granja u programskom kodu, odnosno Branch Prediction Unit.
Kao što smo već pisali, kod Bulldozer arhitekture je Branch Predictor postavljen na samom početku pipelinea i nalazi se ispred instrukcijskog keša. Ovakav prediktor radi unapred i ubacuje u dva odvojena predikcijska reda (queue – FIFO (first in first out) struktura) podatke o predikciji grananja. Prediktor grananja radi unapred i beleži u BTB (Branch Target Buffer) nove RIP – (Relative Instruction Pointers) – relativni instrukcijski pokazivači predstavljaju udaljenost u broju instrukcija, odnosno statusu u PC – program counter-u, u odnosu na prethodne uslovne skokove. Uslovni skok je skok na potprogram, odnosno neku određenu adresu koji je izazvan nekim događajem. Npr. sekvenca koda if(a == 0) then funkcija(b). Bilo kakav kod ovog tipa koji izaziva promenu kontrole toka u programu zahteva precizno predviđanje grananja u procesorima sa dubokim pipeline-om.
Prediktor grananja je kod Piledriver mikroarhitekture unapređen, ali se ne zna tačno o kakvoj vrsti unapređenja je reč. Do sada je bilo poznato da je BPU sastavljen u dva nivoa, gde prvi sadrži 512 rekorda grananja, a drugi nivo sadrži 5120. Oba nivoa imaju određenu asocijativnost, konkretno prvi nivo ima četvorostruku 4-way, dok drugi nivo ima petostruku, odnosno 5-way asocijativnost. Asocijativnost branch target buffer-a je bitna jer povećava procenat predviđanja grananja. Dakle, nije poznato da li je AMD izmenio veličinu BTB-a ili je povećao asocijativnost ili je možda u pitanju samo optimizacija već postojećih algoritama za predikciju grananja koda. Ono zbog čega je BP jedinica prva na „udaru“ kada je redizajn mikroarhitekture u pitanju je to što je ovaj deo procesora je ključan kod dizajna kakav je BD. Za visokofrekventni dizajn, koji poseduje dugačak pipeline, promašaj u predikciji grananja košta značajnog smanjenja IPC-a (broja izvršenih instrukcija po ciklusu).
Instrukcijski TLB-ovi su ostali nepromenjeni u odnosu na Bulldozer, ali su TLB-ovi za podatke, prvog i drugog nivoa povećani. Konkretno TLB – Translate Lookaside Buffer jeste keš koji se koristi da bi se poboljšalo vreme pristupa memoriji. Konkretno TLB kešira indekse memorijskih stranica, čime se znatno povećava brzina translacije virtualnih memorijskih adresa u fizičke.
Da pojasnimo malo šta to znači. Fizičke adrese jesu realne, odnosno binarne adrese, koje se mogu reprezentovati nekim binarnim brojem i one se fizički nalaze u samom hardveru, odnosno RAM-u. Da bi znali gde je smešten podatak u memoriji, osim podatka mora da postoji i podatak o njegovoj lokaciji, odnosno adresa. U realnom životu bi to bilo najsličnije vašoj adresi stanovanja. Adresa vaše zgrade nosi nekakav broj i to je vaša fizička adresa na kojoj vi stanujete i tu nema nikakve dileme. Broj vaše zgrade je adresa, a Vi ste podatak. Ipak, zbog fleksibilnosti, operativni sistem itd… organizuju memoriju na malo drugačiji način. I dalje postoje adrese, ali operativni sistem ih reprezentuje drugačije nego sam hardver.
Ako imate 32-bitni operativni sistem, vaš procesor može da adresira maksimalno 4 GB virtuelnog adresnog prostora, bez obzira da li imate manje fizičke memorije. Isto tako i sa 64-bitnim operativnim sistemom. Adresni prostor je mnogo veći, npr. 48-bita, a vaša fizička memorija iznosi 4 GB, 8 GB ili 16GB. Unutar virtualnog adresnog prostora mogu biti mapirane različite strukture podataka koje koristi OS, na primer STACK, HEAP, CODE SEGMENT itd…Tako se na primer STACK nalazi na početku virtuelnog adresnog prostora, dok se HEAP nalazi na kraju, dok opet CODE SEGMENT ima svoje mesto u virtuelnoj memoriji. TLB sadrži reference fizičke i virtualne memorije u vidu tabele. Virtualna memorija je podeljena na stranice. Tabela memorijskih stranica je struktura od koje se gradi virtualna memorija i koja sadrži mape između virtualnih i fizičkih adresa. Virtualne adrese su jedinstvene za proces koji im pristupa, dok su fizičke adrese jedinstvene za sam hardver, odnosno RAM. TLB ima određen broj lokacija u kojima se keširaju memorijske mape koje predstavljaju uređeni parovi: <fizička adresa,virtuelna adresa>.
Bulldozer poseduje 32 lokacije za L1 DTLB, dok je kod Piledriver jezgra taj broj je dvostruko veći i iznosi 64 lokacije. Dakle, TLB sam po sebi nije adresabilan poput RAM memorije, on je CAM – Content-addressable memory. Primera radi, fizički RAM koji poseduje memorijske adrese da bi se pretražio određeni podatak, potrebno je provrteti u nekakvoj petlji sve moguće adrese ukoliko operativni sistem ne koristi MMU (memory managment unit). Ako je podatak prisutan, na nekoj lokaciji, onda je pronađen u najgorem slučaju O(n) (linearno vreme pretrage), što znači da je u najgorem slučaju kod klasičnog modela adresacije potrebno proći ceo RAM da bi se pronašao podatak. Sa druge strane CAM keš, kakav je TLB predstavlja asocijativni niz iz kojeg se traženi podatak dobija trenutno, u vremenu O(1) (konstantno vreme pretrage).
Kada je potrebno da se virtualna adresa preračuna u fizičku, procesor prvo pristupa TLB-u. Ako se stranica koja je zahtevana od procesa nalazi u TLB-u, imamo pogodak, fizička adresa je dobijena i može se dalje pristupiti memoriji. Ukoliko imamo promašaj TLB-a, memorijski menadžer pretražuje mapu stranica koja je pohranjena u drugostepenom TLB-u. Ako postoji promašaj i u drugostepenom TLB-u, pretraga tražene stranice se dalje vrši u memorijskoj mapi koju je kreirao operativni sistem i to se zove Page Walk. Ako takva strana postoji, ona se upisuje nazad u TLB, procesor dobija željeni podatak, a instrukcija koja čeka na podatak sa ogovarajuće fizičke adrese, nastavlja sa daljim izvršavanjem. Ukoliko ne postoji stranica u memoriji, tada imamo PAGE FAULT i stranica se učitava sa diska. Stranica koja je učitana sa diska, učitava se u tabelu stranica i u TLB. Ovaj sistem funkcioniše automatski, na nivou samog hardvera, koji je inicijalizovan preko CR3 registra. Postavljanje flag-a u CR3 registar od strane kernela operativnog sistema znači da je MMU uključen i da operativni sistem koristi paging sistem za rad sa memorijom. Ovo ne znači nužno da sistem mora koristiti swap file. Na primer u slučaju Page Fault-a, kod nekih sistema, poput Androida, aplikacija automatski gasi proces u slučaju nedostatka fizičke memorije.
Ako uporedimo Bulldozer, K10 i Piledriver, L1 DTLB je kod Bulldozera iznosio samo 32 lokacije, dok je kod K10 jezgara iznosio 48, a kod Piledriver jezgra 64. Drugostepeni L2 DTLB kod K10 jezgara iznosi 656 ulaza i ima 4-way asocijativnost, dok je kod Piledrivera i Bulldozera 1K sa osmostrukom asocijativnošću.
Zaključak je taj da je pretraga memorije daleko brža kada je veći procenat pogotka TLB-a, što direktno utiče na smanjenje vremena pristupa podacima. Zbog ovoga je primetno ubrzan rad sa bazama podataka, arhiviranje podataka, gaming i svi drugi workload-i u kojima je čest pristup podacima na različitim lokacijama.
Jezgra za rad sa celobrojnim i logičkim operacijama su znatno unapređena. Postignuta je veća fleksibilnost u izvršavanju na taj način što sada AG0 i AG1 jedinice mogu da izvršavaju operacije koje nisu isključivo kalkulacije memorijskih adresa, što je bio slučaj kod prethodnih generacija AMD procesora. Primera radi instrukcija MOV predstavlja oko 35% programskog koda.
Instrukcije koje se mogu izvršiti na AG jedinicama su:
BEXTR reg, reg
MOV reg, reg
XADD reg, reg
XCHG reg, reg – je moguće izvršiti na AG0 i AG1 jedinicama, pored EX0 i EX1
BEXTR je nova instrukcija i pripada BMI setu, koji služi za bitovske manipulacije, o čemu ćemo pisati u produžetku. MOV instrukcija služi za kopiranje podataka, odnosno operanada iz memorije u registre, odnosno registara u registre i registara u memoriju. XADD – Exchange and ADD predstavlja zapravo dve operacije u jednoj. Konkretno radi se sabiranje:
TMP <- SRC + DST; (sabiranje)
SRC <- DST; (zamena)
DST <- TMP; (učitavanje rezultata u ciljni registar)
XCHG je srodna operacija sa prethodnom i vrši samo zamenu sadržaja registara. Operacije koje mogu da se izvršavaju na AG jedinicama su isključivo sa registrima. Ovo u prevodu znači da u nekoj „tight“ petlji u kojoj nema mnogo međuzavisnosti podataka je moguće ostvariti visok IPC, dvostruko viši nego na Bulldozeru, ali u realnom radu tek nešto viši zbog boljeg scheduling-a instrukcija.
Novost takođe predstavlja i znatno unapređena operacija celobrojnog deljenja. Do sada je ova operacija bila mikrokodirana, što znači da se izvršavala uz pomoć „softverske“ implementacije putem mikrokoda uz korišćenje IMUL EX1 integer pipe-a. Ovo je znatno sporije bilo od hardverske implementacije, najviše zbog toga što je sada potrebno daleko manje vremena za dekodiranje ove instrukcije, a i zbog efikasnosti implementiranog algoritma deljenja. Sada je ova instrukcija „hardwired“ unutar EX0 izvršne jedinice.
Store to load forwarding je unapređen zbog većeg bafera čitanja (queue-a). Unapređen je i hardverski data prefetch-er, koji služi da podaci u „stream-u“ ili u nekoj strukturi podataka budu dostupni u kešu na vreme. AMD tvrdi da je unapredio L2 keš, mada nismo uspeli da izmerimo neku vidljivu razliku u odnosu na Bulldozer jezgro kada je u pitanju rad sa L2 keš memorijom. Piledriver jezgro i dalje koristi Write Trough keš polisu za upis u L1 data keš polisu koja nalaže da se sa svakim upisom u L1, podaci izbacuju i u L2 keš. Zbog toga je upis podataka u L1 data keš i dalje bolno spor.
Sve u svemu, ova unapređenja su rezultovala između 4 i 15% višim IPC faktorom u zavisnosti od broja threadova i vrste workload-a, što nije malo, naročito ako se uzme u obzir i nešto veća frekvencija i niža disipacija koju su u stanju da postignu Piledriver bazirani čipovi.
Dodaj komentar