Deljen front-end
Ključni element BD koncepta je deljenje resursa i ono počinje sa od „front end-a“. Ovaj deo procesora je odgovoran za nesmetano „hranjenje“ izvršne mašinerije instrukcijama.
Front end se sastoji od „instruction fetch“ (IF) faze, u kojoj se dovlače instrukcije iz L1 instrukcijskog keša i radne memorije. Drugi deo se sastoji od dekodiranja. Ove dve faze (IF->Decode), predstaljaju front end u pipeline arhitekturi svakog modernog procesora. Arbitriranje između jezgara u modulu određeno je nizom faktora kao što su određivanje prioriteta, zauzeće pipeline-a i događaji poput promašaja prediktora grananja, koji uzrokuju pražnjenje pipeline-a i vraćanje na prethodnu adresu skoka. Predikcijski endžin (koji služi da registruje istoriju grananja u programima) je napravljen da funkcioniše na čelu front-enda i da ubacuje u dva odvojena predikcijska reda (queue – FIFO 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 kvalitetno predviđanje grananja u procesorima sa dubokim pipeline-om.).
Ovaj deo procesora je ključan kod dizajna kakav je BD, zbog visokofrekventnog dizajna, promašaj u predikciji grananja košta značajnog smanjenja IPC-a (broja izvršenih instrukcija po ciklusu).
15h familija procesora koristi ne-sekvencijalno dovlačenje instrukcija. Ovo znači da ukoliko je došlo do promašaja instrukcije u L1 instrukcijskom kešu, tada se pristupa kešu višeg nivoa i instrukcija grananja poseduje adresu naredne instrucije (instrukcije skoka). Ako je adresa sledeće instrukcije određena i predikcija je prihvaćena (taken), tada se prefetch operacija izvršava koristeći predviđenu adresu skoka(grananja). Dakle, ne-sekvencijalni prefetcher ne dovlači instrukcije koje se ne nalaze iza predviđenog grananja, nego baš one koje se nalaze iza skoka. Ukoliko se tražena instrukcija nalazi u L1 kešu, dotična instrukcija se ne dovlači, čime se štedi na energiji. Ukoliko se pak predviđena adresa skoka ne nalazi u L1 kešu, pokreće se pristup kešu višeg nivoa koristeći adresu predviđenog skoka, t.j. grananja. U oba slučaja, prva adresa instrukcije se učitava u fetch stanje u pipeline-u da bi „sačekala“ dolazak instrukcije iz keša višeg nivoa ili memorije.
Može se reći da je ovakav prefetcher „pametan“. Međutim, kako to funkcioniše u realnom radu veliko je pitanje. U ovom delu možda leže najveće začkoljice Bulldozer arhitekture. Navnodno deljen L1 instrukcijski keš izaziva unakrsne invalidacije između thread-ova, pa su dovučeni podaci nekorektni u mnogim slučajevima, zbog čega moraju da se ponovo dovlače. Za ovo postoji softverska zakrpa kojom se vrši jednostavno poravnanje i obeležavanje od strane Windows/Linux kernela. Ovakva zakrpa bi mogla da donese dodatnih 10% poboljšanja u single thread performansama i čak do dva puta u multithreadu na istom modulu. Na žalost nismo uspeli da dođemo do Microsoft patch-a za Windows bazirane operativne sisteme.
ITLB – instrukcijski translate lookaside buffer-i su povećani za prvi nivo u odnosu na K10, čime je omogućena nesmetana memorije za instrukcije oba thread-a. Drugostepeni ITLB i sama L1 keš memorija je u osnovi identična kao i kod K10 i poseduje dvostruku asocijativnost. Jedina razlika je povećano vreme pristupa sa 3 na 4 ciklusa. Instrukcije iz L1 instrukcijskog keša dovlače na dekodiranje pomoću instrukcijskog reda (instruction queue). Fetch iznosi 32 bajta po ciklusu, ali nije jasno da li je AMD koristi dva instrukcijska okvira za svaki thread zasebno od po 16 bajtova ili od po 32 bajta. Dvostruki 32 bajtni fetch za svaki thread bi predstavljalo dupliranje resursa, tako da je najverovatnije fetch podeljen u dva 16B instrukcijska okvira. Ako posmatramo single thread, AMD zbog ovog pristupa gubi na single thread performansama u odnosu na K10 i do 15%, čime se efikasnost mikrojezgara u modulu može uporediti sa pređašnjom K8 mikroarhitekturom. Eventualnom implementacijom neke vrste trace keša ili Loop Stream Buffer-a (LSD), u AMD-u bi mogli da postignu verovatno nižu potrošnju i viši IPC. Pitanje je da li je takav pristup rezervisan isključivo za Intela, koji je u svom Sandy Bridge-u rešio problem smanjenog dotoka instrukcija implementacijom mOp keša.
Dekoderi su takođe deljeni. Kod 15h procesora imamo 4 dekodera. Maksimalan broj instrukcija koji je moguće dekodirati je 33% veći nego kod 10h. Instrukcije se dekodiraju na makrooperacije, odnosno na parove mikrooperacija od kojih je jedna aritmetičko-logička, a druga memorijska (load/store). AMD je kod Bulldozer arhitekture implementirao makro fuziju, slično kao što je to Intel uradio još kod Core 2 arhitekture. Operacije JMP i CMP (jum i compare) kada se dekodiraju, spajaju se u jednu mikrooperaciju, čime se poboljšava efikasnosti i iskorišćenje pipelinea.
Svaki od dekodera može da dekodira jednu do dve makrooperacije. Primera radi, 256-bitne AVX i FMA4 instrukcije dekodiraju se kao dve makrooperacije, jer se prosleđuju dvema 128-bitnim FMAC jedinicama na izvršenje. Većina 128-bitnih SIMD operacija se dekodira u jednu makrooperaciju. Instrukcije koje su mikrokodovane su praktično softverski implementirane u mCode ROM-u. U zavisnosti od kompleksnosti mikroprograma, izvršenje instrukcije može biti kompleksnije ili manje kompleksno. Obično je throughput i latencija ovako implementiranih instrukcija daleko veća. Hardwired instrukcije se dekodiraju putem FastPath single i double dekodinga. Ekvivalent u K10 arhitekturi je bio DirecPath single i double, dok je mikrokodirana instrukcija dekodirana putem VectorPath-a. Način i organizacija dekodiranja je praktično identična kao kod K7, K8 i K10. Dekodirane instrukcije se pakuju u dispach grupe, a zatim se prosleđuju na izvršavanje.
Dodaj komentar