Parni Valjak – Steamroller
Kada govorimo o razvoju mikroarhitekture, postoje dva pristupa – evolutivni i revolucionarni. Evolutivni pristup podrazumeva razvoj i optimizaciju već postojećeg koncepta i ovakav princip Intel već dugo vremena primenjuje na svojoj Core arhitekturi. Kada pomenemo revolucionarni pristup, prvo čega se setimo je Intelova zaboravljena NetBurst mikroarhitektura, ali ni AMD-ov Bulldozer nije previše daleko od toga. Problem sa revolucionarnim pristupom je što često takav proizvod izađe na tržište nedovoljno „upeglan“, optimizovan i kao takav u mnogim situacijama pokazuje i lošije performanse nego što je to bio slučaj sa prethodnom generacijom. U najboljem slučaju dešava se da novi procesor ne bude dovoljno brži i efikasniji u većini postojećih softvera od trenutno aktuelne generacije, ali i da znatno zaostaje za evolucionim pomacima konkurentskih kompanija. Steamroller ispravlja nedostatke i uska grla koja su bila prisutna kod Bulldozer i Piledriver jezgrima.
Istraživanje, razvoj i optimizacija mikroarhitekture je veoma skup posao, što znači da ukoliko želite procesor koji radi brzo, koji ima visok IPC faktor, ali i visoke frekvencije, neophodna je „handcraft“ optimizacija svakog njegovog dela, uz minimalizaciju broja elektronskih kola za odgovarajuću logičku funkciju. Korišćenjem softverskih biblioteka često se gomilaju redundantni tranzistori i električna kola koja utiču na povećanje potrošnje, a broj funkcija koje mogu da izvrše je relativno mali. Na kraju se sve svodi na odnos između IPC faktora, broja jezgara/thread-ova i potrošnje koje procesor generiše za date performanse. Na ovo sve utiče i razvoj proizvodnog procesa koji je takođe izuzetno skup.
Tako na primer, ulaganje u jednu fabriku poluprovodnika košta više milijardi dolara, a da bi se to isplatilo, neophodno je prodati i zaraditi taj novac u nekom doglednom vremenu. Zbog toga je AMD svojevremeno večito bio u finansijskoj dubiozi, što je na kraju rezultovalo prodajom većinskog dela FAB-ova poluprovodničkom konlomeratu Global Foundaries. Jasno, outsorcing-om je rešen finansijski problem vezan za razvoj procesora i poluprovodničkih tehnologija, ali je sa druge strane prelazak na sitniji proizvodni proces usporen, što u globalu može napraviti još veću razliku između Intela i AMD-a. Na kraju je jasno zbog čega i odakle toliki zaostatak u razvoju i dizajnu mikroprocesora u odnosu na Intel. Troškovi razvoja proizvodnog procesa se povećavaju, jer se dostižu polako ali sigurno fizički limiti, dok Intel još uvek ima dovoljan obrt da može da pokrije svoje ogromne troškove. Sa druge strane AMD pokušava da na vreme pogura priču oko heterogenog procesiranja što u velikoj meri ima smisla i smatramo da će se tokom vremena pokazati da su bili u pravu.
Novi Steamroller modul donosi navodno oko 15% poboljšanja performansi po Watt-u u odnosu na Piledriver, odnosno oko 30% u odnosu na Bulldozer. Ključna razlika u odnosu na prethodnu „evoluciju“ predstavljaju promene u „front end“ delu procesora koji je zadužen za „fetch“ instrukcija (dovlačenje) i dekodiranje. Ova mikroarhitektura poseduje zasebne x86 dekodere. Kod Bulldozer i Piledriver modula, dekoding se vršio preko zajedničkih dekodera, pa je fetch i decode faza bila u stanju takozvanog vertikalnog multithreadinga.
Teoretski gledano, Piledriver modul po threadu ili za oba threada može da izvrši i dekodira do 4 x86-64 operacije, što ukupno za ceo procesor, odnosno 4 modula i 8 threadova daje teoretski maksimum od 16 instrukcija. Ovaj broj je kod Steamroller modula povećan dvostruko, što naravno ne znači da je Steamroller dva puta brži. Zbog kraćeg pipelinea i većeg paralelizma u „prednjem delu“ procesora, manja je i latencija instrukcija, što se ogleda u manjem gubitku performansi u slučaju promašaja u grananju. Dakle, procesor sa kraćim pipelineom nema manji postotak promašaja u pogađanju grananja, već ima manji penal prilikom promašaja. U AMD-u su naglasili da je procenat promašaja manji za 20%, ali za tako nešto je potrebno povećanje BTB-a, odnosno Branch Target Buffer-a, posebnog keša, koji „pamti“ koliko je instrukcija prošlo od prethodnog uslovnog skoka.
L2 BTB je navodno povećan dva puta, sa 5120, na 10240 ulaza, a prema našim merenjima, ubrzanje u single thread aplikacijama je u granicama od 0-10% iako je glavni cilj „Steamroller-a“ bio poboljšanje „single thread“ performansi, koje za krajnji cilj ima poboljšanje izvršavanja serverskih i klijentskih operacija i poboljšanje performansi po watt-u. Ipak, nešto veća razlika „klok za klok“ je u situacijama gde se intenzivno koriste oba jezgra u modulu. Skaliranje Steamroller jezgara je znatno bolje nego što je to slučaj kod Piledriver-a.
Veći paralelizam unutar modula, kao i manja latencija instrukcija zbog kraćeg pipelinea postignuta je tako što je dupliran broj dekodera. Umesto naizmeničnog „dovlačenja“ instrukcija iz prvog i drugog thread-a u instrukcijskim prozorima od po 32-bajtova, sada imamo dva paralelna instrukcijska prozora veličine po 16 bajtova, što je u većini slučajeva više nego dovoljno za „napajanje“ jezgara i FPU bloka. Dakle, fetch queue jeste 32 bajta, ali za oba thread-a kod Steamroller-a, dok je kod Piledrivera 32 bajta, ali svaki drugi ciklus, što ne predstavlja problem ukoliko kod koji se izvršava ne poseduje malo veći broj grananja i ukoliko je L1 instruction cache hit-rate, odnosno procenat pogotka L1 instrukcijskog keša dovoljno visok. Kod sekvencijalnog koda, „pipelining“ skriva dodatnu latenciju instrukcija koja se javlja zbog ovakvog front enda i produženog pipelinea, a potencijal za veće frekvencije je povećan.
Programski kod je takav da se instrukcije nižu jedna za drugom u memoriji, međutim, nisu sve instrukcije iste dužine gledano u bajtovima, ali isto tako i nije latencija svake instrukcije ista, a i 16 bajtni fetch je retko kada do kraja popunjen. Zapravo u većini slučajeva 16 bajta je više nego dovoljno za dovlačenje instrukcija po jednom thread-u, naročito ako je tu prisutan i „loop stream buffer“, koji čuva dekodirane MakroOp-ove koje se izvršavaju u kratkim „tight loop“ petljama. Tako na primer ako je iskorišćeno manje od 16 bajtova za 1 thread, što je obično slučaj, tada imamo dodatni 1 ciklus unutar pipeline-a za proces dovlačenja, kao i dodatni ciklus za dekodiranje. Ovo u prevodu znači da je kod BD/PD mikroarhitektura single thread žrtvovan zarad vertikalnog multithreading-a u samom front end-u. Ako posmatramo samo instrukcijski fetch, onda je po threadu gledano 16 bajtni fetch po jednom threadu je „downgrade“ još u odnosu na AMD K10 arhitekturu, ali slično kao i kod Intela sa Haswell jezgrom koji takođe koristi 16 bajtni fetch. Problem uskog grla instrukcijskog dovlačenja rešava se uz pomoć uOp keša ili loop stream buffer-a. Za AMD je ipak relativno skupo rešenje implementacija uOp ili makroOp keša, ali su inženjeri ovde pribegli sličnom rešenju kao što je Intel uradio još kod Nehalem arhitekture – ubačen je loop stream cache, koji je nepoznate veličine, a ima funkciju da rastereti front end i dekodere kada se izvršavaju operacije u programskim petljama. Jedna od bitnijih prednosti ovakvog dizajna je i to što je na ovaj način značajno smanjena potrošnja prilikom izvršavanja koda koji ima visok IPC faktor.
Može se reći da je donekle zbog paralelizacije dekodera smanjen potencijal za postizanje viših frekvencija, mada dodatnim „štelovanjem“ proizvodnog procesa moguće je postići i veće frekvence nego što je to trenutno slučaj.
Prva generacija CMT arhitekture kod AMD-a, odnosno Bulldozer i Piledriver dele kompletan front-end, ali izvršne jedinice i back end nisu deljeni, izuzev FP bloka. Steamroller deli L1 instrukcijski keš, prediktore grananja, ali instrukcijski fetch i dekoderi su razdvojeni, kao i integer jedinice i data keš, dok je FPU deljen. Sada je jasno zbog čega Steamroller donosi najviše ubrzanja u single thread režimu – prevashodno zbog kraćeg pipeline-a i manjih latencija instrukcija, ali i zbog još par stvari.
Najavljeno je i povećanje L1 instrukcijskog keša, odnosno smanjenje „cache miss-a“ – promašaja pri čitanju za 30%. Da podsetimo, instrukcijski keš je kod Bulldozer procesora bukvalno „nasleđen“ od ranije mikroarhitekture – AMD K10, gde je instrukcijski keš opsluživao jedno jezgro. Asocijativnost i kapacitet L1 instrukcijskog keša je povećan za 50%, pa sada kapacitet iznosi 96 KB, dok je asocijativnost trostruka (3-way set associative). Zahvaljujući većem L1 instrukcijskom kešu vidno je poboljšanje u izvršavanju 2 thread-a na jednom modulu. Usko grlo BD arhitekture jeste L1 instrukcijski keš, zbog samo dvostruke, 2-way asocijativnosti, prilikom izvršavanja dva threada, često se dešava da jedan drugog „kompromitiju“ u izvršavanju. Kao rezultat ovoga, Steamroller bi trebalo da omogući do 25% više instrukcija po ciklusu ka izvršnim jedinicama.
Jezgra, odnosno klasteri za rad sa celobrojnim vrednostima (integer execution/ALU) nisu bitno izmenjeni u odnosu na Bulldozer, sadrže kao što je poznato „scheduler-e“, koji služe da u pravom momentu pošalju instrukciju na izvršavanje ukoliko za to postoji odgovarajući podatak koji stiže iz „register file-a“ i L1-Data keša. Glavna razlika u integer blokovima ogleda se u povećanom kapacitetu scheduler-a, pa je samim tim i poboljšano Out Of Order izvršavanje, odnosno broj instrukcija koje po ciklusu mogu da se izvrše, jer je omogućen veći instrukcijski „prozor“.
Data keš je nešto drugačiji nego što je to slučaj kod Bulldozer, odnosno Piledriver arhitektura. Iako i dalje koristi Write Through način upisa, značajno poboljšanje se ogleda u „store handing-u“. Upis u L1 data keš je dvostruko veći nego što je to slučaj kod Piledriver jezgra i omogućene su ukupno dve 64-bitne „store“ operacije po ciklusu u L1-D kešu. Na ovaj način je postignut i efikasniji rad izvršnih jedinica u jezgrima, odnosno povećanje brzine „store-to-load“ operacija, gde se vrši operacija čitanja unapred, pre operacije pisanja podatka, predstavlja jedan od krucijalnih faktora za poboljšanje rada sa memorijom i za efikasniji rad izvršnih jedinica.
Između ostalog ubrzan je i upis i čitanje iz L2 keša, mada to nije dokumentovano. Međutim, primetili smo da je latencija u komunikaciji sa RAM-om takođe povećana što se u pojedinim, ali relativno retkim situacijama negativno odražava na performanse.
Iz ovog latency testa se jasno vidi da je komunikacija sa memorijom veoma dugačkih 350 ciklusa, u odnosu na Richland kod kojeg ova latencija iznosi tek nekih 260 ciklusa. Latencije L1 i L2 keša su identične kao i na prethodnoj generaciji jezgara i iznose 4 ciklusa za L1, odnosno 20-21 ciklus za L2 keš.
Prema rečima ljudi iz AMD-a MAL (MMX) SIMD pipeline za rad sa celobrojnim vektorima sada dele izvesne resurse sa FMA/FP pajpovima koji rade sa pokretnim zarezom. Drugim rečima FPU ne bi nikako trebalo da bude nižih performansi, već viših, a akcenat je stavljen na optimizaciju po pitanju potrošnje. Zapravo, prema našim merenjima, FP operacije nigde nisu sporije nego na prethodnoj generaciji.
FPU jedinica je jedan od najvećih potrošača u procesorima. AMD je pri dizajnu Steamroller-a koristio alate koji koriste tzv. „high density library“. Ovime je postignuta ušteda u površini od 30% za identičnu logiku i naravno, značajna ušteda u potrošnji. Za proizvode koje AMD trenutno plasira na tržištu, koristi se kombinacija automatizovanog dizajna, kao i ručnog „hand placed“ koji ima za cilj smanjenje površine čipa i njegovu potrošnju.
AMD-ova tvrđenja nam govore da je prosečno povećanje performansi na istom kloku na Steamroller jezgru veće između 5 i 25%, a da bi proverili ove tvrdnje i sami smo napravili određeno istraživanje koje možete videti kasnije u rezultatima.
Dodaj komentar