Haswell pod lupom
Ako posmatramo šta je do sada urađeno na papiru, Haswell zaista predstavlja radikalan redizajn. Iako u realnom radu ne donosi previše, procesori bazirani na ovom jezgru ipak donose dosta toga novog. Sigurno se pitate zbog čega je tako? Čemu sav trud i rad, ulaganje u istraživanje i razvoj, ako su rezultati relativno slabi. Haswell donosi potpuno redizajniran izvršni endžin, još dublje buffere, veći broj instrukcija u letu, što mu naravno omogućava da radi brže u single i multithread režimu. Razlika u single thread režimu nije velika u odnosu na Ivy Bridge, dok je skaliranje u multithread režimu nešto bolje. Haswell u sebi umesto tri ALU bloka ima sada ukupno 4, što je jednako broj izvršnih jedinica u recimo AMD Piledriver modulu koji sadrži dva jezgra. Povećan je i broj AGU jedinica za rad sa memorijskim adresama, a više o tome pisaćemo dalje u tekstu.
Front end
Deo koji sadrži L1 instrukcijski keš, dekodere instrukcija, prediktor grananja i uOp keš je ostao identičan, izuzev što sada dekoderi prepoznaju nove FMA3 instrukcije, kao i AVX2 instrukcije za rad sa celobrojnim vektorima. Da podsetimo: jedan od glavnih aduta Sandy Bridge arhitekture je bio uOp cache, koji sadrži ukupno 32 seta, sa po 8 linija i u svakoj po 6 mikroinstrukcija. uOp cache može da isporuči maksimalno 4 mikrooperacije odjednom, ali sa veličinom instrukcija od ukupno 32 bajta, što je dvostruko više nego što je „fetch bandwidth“ koji je i dalje na žalost ostao samo 16B. Ipak, zahvaljujući pametnoj implementaciji ovog keša problem uskog grla je otklonjen još kod SB.
Ipak, postoji razlika, Haswell može da kešira i petlje u uOp cache-u dok je Sandy Bridge keširao petlje isključivo preko niza dekodiranih instrukcija (FIFO struktura). Ovime se postiže eventualno veća efikasnost u izvršavanju programskih petlji koje sadrže veći broj instrukcija (non-tight loops). Ta efikasnost se ogleda u tome da u pojedinim situacijama nije neophodan još 1 ciklus da bi se instrukcije ubacile u niz za izvršavanje. Druga razlika se ogleda u tome da red dekodiranih mikrooperacija sadrži ukupno 56 mikrooperacija, ali za razliku od Ivy Bridgea, ovaj red nije fiksno particionisan po tredovima, već svaki tred može da „uzme“ koliko mu treba. Primera radi, kod Sandy-ja postojala su dva niza od po 28 mikrooperacija, dok je kod Ivy Bridgea omogućeno korišćenje celih 56 mikrooperacija u tight loop-u, ali u particijama od po 2×28 ili 1×56 (fiksno particionisanje), a kod Haswella je to izvedeno tako što svaki tred može da koristi onoliko koliko mu treba, čime se izbegavaju eventualna uska grla.
Back end – izvršna mašina
Haswell predstavlja sam vrhunac takozvanih „debelih“ FAT jezgara. Opšte je poznato da karikanjem paralelizma za linearan dobitak u IPC-u se dobija eksponencijalni rast složenosti čipa. Problem je što povećanje internog paralelizma utiče na potrošnju i zagrevanje i naravno negativno na brzinu procesorskog kloka. Držeći se Murovog zakona ko pijani plota, razvojni tim iz Oregona je odlučio da je pametnije uložiti koji milion tranzistora u dodatnu ALU jedinicu. Da se razumemo, dizajn Haswell jezgra je „masterpiece“ u svetu mikroprocesora. Handcrafted dizajn sa minimalnim brojem tranzistora nije nikakva novina kada su u pitanju Intelovi mikroprocesori. Jedan od razloga zbog čega Intelov CPU u „full load-u“ troši 50% manje od AMD-ovog je upravo optimizacija. Nema redundantnih tranzistora, ili ako ih ima njihov broj je minimalan. Verujemo da je na ove optimizacije potrošen ogroman budžet, ali s druge strane sama paradigma po kojoj Intel dizajnira svoje procesore je upitna. Cena ovog „quad-a“ od nekih 300 € ne čudi obzirom na ulaganja u razvoj, počev od proizvodnog procesa, pa do mikroarhitekture i same platforme.
Sada ćemo se vratiti na temu: Haswell jezgro sadrži umesto 6 izvršnih portova, ukupno 8, što znači da je u paralelno moguće izvršiti maksimalno 8 mikrooperacija. Da bi se nahranio ovoliki izvršni endžin, neophodno je bilo povećati veličinu Reorder Buffer-a.
Veći ROB buffer omogućuje efikasnije punjenje scheduler-a, odnosno RS – Reservation Station-a, odakle se dalje izvršavanje odvija na izvršnim jedinicama. Veći broj instrukcija u letu povećava IPC – broj instrukcija po ciklusu, zbog toga što u slučaju Data Cache miss-a ili iz bilo kog drugog razloga da dotok podataka nije dovoljno efikasan, Out Of Order mašina može da nastavi sa izvršavanjem instrukcija koje mogu da se izvrše i to se vrši paralelno.
OoO prozor je povećan, pa sad ROB – ReOrder Buffer sadrži čak 192 ulaza, u odnosu na 128 kod Nehalem arhitekture, odnosno 168 kod Sandy/Ivy Bridge. ROB-a sadrži uređenu listu instrukcija. Instrukcije koje su dodate na kraj liste se uklanjaju nakon što su izvršene. Na ovaj način instrukcije se uklanjaju u istom poretku kao što su i raspodeljenje na izvršavanje. Implementacija ROB-a predstavlja obično kružnu povezanu listu, gde pokazivač sa kraja pokazuje na početni element liste. Struktura u Reorder Bufferu sadrži status registra, memorijsku adresu instrukcije, mikrooperaciju i imena arhitekturalnih registara koji se koriste.
Instrukcije koje su dekodirane u mikrooperacije do 4 po klok signalu, su pohranjene u ROB od ulaza 0 do ulaza 191 u striktnom redosledu po kome je pisan programski kod. Na početku kada je lista prazna, startna pozicija buffera i krajnja pozicija buffera pokazuju na nulti ulaz. Punjenje ROB-a kreće od pozicije 0 i puni se jedna po jedna redom. Posle nekog vremena pokazivač sa kraja buffera pokazuje gde će sledeća mikrooperacija biti sačuvana, a početak buffera pokazuje na najstariju mikrooperaciju u njemu, što odgovara najstarijoj instrukciji u programu. U „retire“ fazi, proceosor uklanja po četiri najstarije mikrooperacije iz buffera. Tada se oslobađaju mesta za nove mikrooperacije. Procesor uvek dodaje nove mikrooperacije na kraj bafera inkrementirajući pokazivač na kraj buffera i isto tako uklanja najstariju mikrooperaciju inkrementirajući pokazivač na početak buffera.
PRF – physical register file je povećan na 168 mikrooperacija za rad sa celim brojevima i sa pokretnim zarezom. Kod SB/IB registarski bafer sadržao je 144 lokacije za FP, odnosno 160 za INT.
U odnosu na SB/IB izvršni blok je znatno širi. Broj izvršnih portova je povećan za dva, što znači da teoretski gledano Haswell može da izvrši do 8 instrukcija po ciklusu ukoliko su one fuzionisane.
Haswell kao i Ivy Bridge ne koristi mikrooperacije za pomeranje sadržaja iz registra u registre. Baš kao i svi dosadašnji Intelovi procesori bazirani na P6 (Pentium Pro) mikroarhitekturi i Haswell koristi jedinstveni scheduler za instrukcije, kako integer, tako i floating point.
AMD u Piledriver/Bulldozer za razliku od Intela koristi takođe unifikovane schedulere, ali su oni razdvojeni na FP i INT deo. Kada se sve uzme u obzir, Haswell koristi do sada najveći instrukcijski prozor, od čak 300 instrukcija u letu, kad se uzmu u obzir load/store bufferi, scheduleri, reorder buffer itd..
Load i Store bufferi su povećani u odnosu na Sandy Bridge sa 64 na 72 ulaza, odnosno sa 36 na 42.
Izvršne jedinice kod Haswell-a su pretrpele značajan redizajn. Dodatna dva porta sadrže dodatnu integer ALU, kao i store AGU, tako da je moguće istovremeno izvršiti računanje memorijske adrese za tri memorijske operacije istovremeno.
Primera radi, Sandy Bridge, Ivy Bridge, kao i AMD Piledriver procesori koriste po dve AGU, pa je istovremeno moguće upisivati i čitati iz memorije najviše dve transakcije. Sandy Bridge može da izvrši do tri operacije nad L1 Data kešom, ali ne mogu sve tri operacije biti sa memorijom. Kod Haswell-a je moguće istovremeno pročitati dva 256-bitna vektora i upisati jedan 256-bitni, ali i bilo koje druge operacije. Dovoljno protoka je ostavljeno da nesmetano mogu da se nahrane dve FMA jedinice koje imaju širinu punih 256-bita. Postojeće 256-bitne AVX instrukcije mogu imati solidne koristi od dvostrukog 256-bitnog load-a, jer „donji“ i „gornji“ deo vektora se učitavaju u „komadu“ i ne moraju biti poravnati u memoriji. SB/IB su nasuprot ovome učitavali 256-bita tako što su preko jednog ulaznog porta u L1D kešu učitavali „donjih“ 128-bita, a preko drugog porta „gornjih“ 128-bita. Takođe sada je moguće istovremeno učitati dva 256-bitna vektora iz L1D keša direktno u registre, što u određenim situacijama može znatno da ubrza rad sa AVX kodom.
Dakle, L1-Data keš je sada ima dvostruko veći bandwidth nego što je to bio slučaj kod SB/IB i to sa sobom donosi određene koristi. Ako ovo uporedimo sa AMD Piledriver jezgrom, t.j. modulom, videćemo da se ovde radi o resursu dvostruke veličine.
Haswell može da izvrši ukupno dve 256-bitne FMA3 operacije, odnosno 2×256-bit ADD i 2×256-bit MUL, što je praktično 16DP FLOPS operacija po ciklusu po jezgru. Na 4 jezgra to je ukupno 64 DP FLOPS-a, što iznosi čak 224 DP GFLOPS-a na 3,5 GHz, odnosno 448 SP GFLOPS-a + integrisani GPU. Poređenja radi, AMD FX8350 na 4 GHz može da izvuče najviše 128 DP GFLOPS-a na 4 GHz, odnosno 256 SP GFLOPS-a, dok AMD Trinity APU tj. njegov Radeon HD7660D može da izgura ukupno 614 SP GFLOPS-a, ali je prilično limitiran po pitanju DP (double precision) vektora.
Sirove FPU performanse su zaista impresivne, ali na žalost od toga nećete imati nikakve koristi bez adekvatno optimizovanog softvera, kojeg za sada nema. Upotrebljivost FMA3 seta instrukcija je za sada upitna čak možda i više nego upotrebljivost OpenCL optimizovanog softvera. Prednost korišćenja FMA3/AVX2 itd jeste u tome što nije potreban poseban programerski API poput OpenCL-a, već se koristi standardna optimizacija za rad sa vektorima i odgovarajući kompajlerski switch-evi. Međutim, popularnost GPGPU programiranja u poslednje vreme raste, tako da je implementacija ovakvih instrukcija i prebudživanje FPU jedinica diskutabilno izuzev za „pokazivanje“. Tako na primer današnji moderni GPU-ovi, pa i oni u APU imaju daleko veći FP throughput nego Haswell FPU. Na kraju krajeva, FPU je doživeo veliki redizajn najviše zbog toga što je praktično dvostruko proširen u odnosu na Sandy Bridge.
Haswell-ov L1 Data keš koristi identične level 1 translate lookaside buffere, ali su TLB-ovi drugog nivoa povećani sa 512 na 1024 ulaza, što u prevodu znači da ovo jezgro bolje kešira memorijske stranice, odnosno pretraga za određenom memorijskom stranicom po zakonu verovatnoće je brža nego na jezgrima prethodne generacije. Slično poboljšanje je i AMD izvršio u svom Piledriver jezgru, što efektivno može da donese i nekoliko procenata ubrzanja.
Dodatna ALU jedinica se nalazi na zasebnom portu, pa u slučaju korišćenja FP intenzivnih aplikacija sa visokim IPC brojem, koji uzimaju portove gde se nalaze i FPU i INT blokovi, jednostavno ne dolazi do zagušenja, pa u teoriji instrukcijski miks FP/INT bolje handluje na ovom jezgru. Broj integer ALU-ova je povećan za 1, ali je broj jedinica koje mogu da vrše grananja i skokove povećan duplo. Zbog ovoga u praksi Hyperthreading primetno bolje skalira, naročito u rendering aplikacijama koje inače intenzivno koriste instrukcijski miks.
Dodaj komentar