Mikroarhitektura
O mikroarhitekturi je već bilo reči, ali u vreme kada smo pisali tekst, neke od informacija još nisu bile dostupne. Sada ćemo upotpuniti tekst sa dodatnim informacijama i potkrepićemo analizu činjeničnom situacijom. AMD je sa razvojem ZEN-a krenuo potpuno od nule. Ovaj projekat nema gotovo nikakve veze sa Bulldozerom, kao ni sa ranijim generacijama AMD procesora. Zen namenjen čitavoj gami budućih AMD procesora, počev od low-power rešenja, pa do serverskih i workstation procesora visokih performansi.
Zen mikroarhitektura je inicijalno prema navodima AMD-a donosila oko 40% više instrukcija po kloku od Excavator jezgra, koje otprilike ima oko 20% veći IPC od Piledriver jezgra. Međutim, ovog puta AMD je nadmašio svoja očekivanja, tako da je IPC u odnosu na Excavator veći za 52%!
Kao i svaki superskalarni CPU i Zen poseduje pipeline. Stanja u pipeline-u su podeljena na dovlačenje (fetch) instrukcija, dekodiranje, izvršavanje, pristup memoriji i upis rezultata. Dakle, ovo je osnovni 5 stepeni pipeline koji je kod modernih procesora usitnjen u daleko veći broj stanja, minimum 10, a taj broj stanja u pipeline-u može da dostigne i cifru od 20-30. U teoriji procesori koji imaju duži pipeline mogu da postignu veće radne frekvencije, međutim produženje pipeline-a povećava i latencije u samom procesoru, te je za svako nepredviđeno grananje, penal onoliki broj procesorskih ciklusa koliko je dugačak pipeline. Na frekvenciju takođe utiče i broj paralelnih pipeline-a, odnosno broj instrukcija i mikrooperacija koje CPU može istovremeno da procesira. Zen sam po sebi ima ukupno 10 paralelnih izvršnih jedinica, što je poprilično široka mikroarhitektura. U poređenju sa ovim, Skylake i Haswell imaju ukupno 8 izvršnih portova. Da bi se „nahranio“ ovako širok CPU potreban je veoma dobro dizajniran front-end.
Razlog za ovako širok izvršni endžin leži i u SMT implementaciji. Dva treda će znati bolje da iskoriste veći broj resursa kod Zen arhitekture, nego što je to slučaj kod Intela. Zbog toga je skaliranje na Ryzen procesorima u SMT režimu uglavnom osetno bolje nego na Intelovom Hyperthreadingu. Prva novost u odnosu na Bulldozer/Piledriver arhitekture je trostepeni TLB – Translate Look Aside Buffer za instrukcijski keš. Ovi baferi su svojevrsne keš memorije za pamćenje memorijskih stranica, čime se značajno skraćuje traženje podataka u memoriji. L1 i L2 nisu bitno veći ili manji nego na prethodnim procesorima, a L0 i TLB je bez ikakvih ograničenja po pitanju asocijativnosti, sa tabelom od maksimalno 8 memorijskih strana i bez ograničenja po pitanju veličine memorijske strane za L0 i L1 instrukcijski TLB.
Da pojasnimo stvari: TLB keš (TLB – Translate Look Aside Buffer – memorija za keširanje memorijskih stranica) je organizovan u dva nivoa. Nulti nivo iznosi 8 pozicija, dok prvi nivo iznosi 64 pozicije, potpuno je asocijativan, kao i prvi. Ukoliko se tražena stranica ne nalazi ukeširana na L0 DTLB, traži se u prvom nivou, a ako nije ni u prvom nivou, onda se traži u drugom koji iznosi 512 lokacija. U poređenju sa Piledriver arhitekturom, broj L1 TLB-a je nešto manji, 64 vs 72 entry-ja, ali postoji L0 i L2 identične veličine, od 512 entry-ja, u ovom slučaju nepoznate asocijativnosti, najverovatnije četvorostruke, što bi trebalo da je više nego dovoljno. L1 instrukcijski keš je vraćen na veličinu koju je posedovao u vreme Athlona, Phenoma itd… Sada je 64KB, ali je asocijativnost povećana na četvorostruku, umesto dvostruke koliko je bila na svim AMD procesorima od 1999.
Prediktor grananja u kodu je odvojen od pipeline-a, slično kao i kod Bulldozer arhitekture. Veličina BTB tabela nije poznata izuzev da je moguće pamtiti dva grananja po svakom mestu u BTB tabeli, najverovatnije za dva treda kojima procesor može da upravlja. Novost u celoj priči je Op Cache, koji kešira već dekodirane mikrooperacije, koji je opet povezan sa branch predictorom, čime se smanjuje latencija, odnosno penal u slučaju nepredviđenog grananja. Ovakav keš postoji na Intel procesorima još od Sandy Bridge jezgra, ali ovde nije poznata njegova veličina. Osim ovoga, Op Cache funkcioniše odlično prilikom izvršavanja petlji, odnosno u loop kodu, čime se značajno štedi energija koja je potrebna za ponovno dekodiranje instrukcija.
Dekoder je u stanju da dekodira maksimalno 4 x86 instrukcije, što je dovoljno za izvršavanje dva solidna treda, odnosno jednog, ali efikasno izvršavanog. Stack engine, branch fusion, store to load forwarding su noviteti koji su odavno poznati kod Intelovih Core procesora i koji su jedan od razloga njihove efikasnosti. Zen-ov front end je u stanju da spoji instrukcije skoka (branch) sa spojivim instrukcijama u jednu operaciju, odnosno micro Op. Stack Engine Memfile poseduje tabelu, odnosno stek strukturu u kojoj se čuvaju memorijske operacije koje treba da se izvrše. Po prirodi stvari, upis ide uvek nakon čitanja, međutim pošto se ovde radi o Out Of Order procesorima, bitno je da se kod izvršava što efikasnije, pa je moguć upis u memoriju one varijable koja ne poseduje zavisnost od one koja treba da se pročita. Stack mašina ima zadatak da otkrije da li je upis koji je na steku zavisan od čitanja koje se nalazi pre njega. S obzirom da je stek LIFO struktura, zadnji koji je ušao prvi silazi, prema tome, zadnji upis se skida sa steka i stek se lista dalje dok se ne utvrdi zavisnost promenljive koja se čita.
Ako bacimo pogled na broj izvršnih jedinica koje mogu paralelno da operišu sa celim brojevima i pokretnim zarezom, videćemo da je Zen do sada „najširi“ x86 CPU. „Količina“ hardvera koju sadrži ovo jezgro je veća nego količina hardvera koju sadrži jedan Piledriver modul sa dva jezgra. Sa po četiri ALU jedinice, raspoložive za jedan ili dva treda i dve AGU jedinice, ovaj procesor je prava zver, slična Haswell-u ili Skylake-u. Za razliku od Haswell-a, Zen koristi odvojene FP i INT blokove, kao i do sada što je bila praksa. Broj instrukcija koje može da odjednom „otpusti“ na obradu je čak 10, dok je kod Haswell-a taj broj 8. Organizacija je totalno drugačija kod AMD-a. Svaka izvršna jedinica ima po jedan „port“ kojim je povezana sa scheduler-om, koji predstavlja svojevrsni bafer instrukcija koje treba da se izvrše. Kod Intela je to rešeno što je na svaki od izvršnih portova „naređano“ nekoliko izvršnih jedinica, po principu steka. Izvršavanje preko datog porta je moguće samo na jednoj izvršnoj jedinici istovremeno. Tako na primer kod Intela imamo na portu 0 ALU, 256-bitnu vektorsku integer i 256-bitnu FMA, odnosno FADD. To znači kada se mikrooperacija šalje na port nula, u tom trenutku sve ostale jedinice čekaju da se port oslobodi i nije mnoguće istovremeno koristiti ALU0 i FADD. Srećom, tu je još 6 izvršnih portova, a veliki broj instrukcija u „letu“ omogućuje da se instrukcija izvrši naknadno, kada je port „oslobođen“.
Zen ima 10 potpuno nezavisnih portova, 4 ALU, 2 AGU i 4 FPU. AMD sa Zen arhitekturom poseduje jednak broj instrukcija u letu kao Haswell, čak 192 za integer rename, odnosno ROB (Reorder Buffer), PRF (Physical Register File) sadrži 168 registara za integer, takođe jednako Haswell-u, ali manje od Skylake-a i 160 registara za PRF za FP instrukcije, što je marginalno manje nego za Skylake i Haswell koji poseduju 168.
Kada je u pitanju OoO izvršavanje, Zen bi trebalo da bude negde na nivou Haswell-a u single thread-u, na istom kloku, ali IPC ne zavisi isključivo od ovih parametara, već i od rada sa keš memorijom, od hendlovanja load/store operacija. Kada je u pitanju rad sa celim brojevima, performanse Zen jezgra bi mogle biti vrlo blizu Haswell-u ili Skylake-u, naročito ako se uzme u obzir da je povećanje broja instrukcija u letu na Skylake-u donelo vrlo malo poboljšanja u odnosu na Haswell. Nismo bili daleko kada smo tvrdili da je IPC blizak Haswellu, možda malo za nijansu bolji.
Physical Register File je za FPU identične veličine kao i na Bulldozer i Piledriver modulima, dok je za INT blok znatno povećan, konkretno Bulldozer poseduje 96-entry PRF, kao i Piledriver, dok je taj buffer kod Zen-a povećan na 168. Razlog ovome je i SMT po jezgru, da bi uspešno hendlovao dva treda, neophodna je solidna dubina register file-a i veliki broj instrukcija u letu. Intel u svakoj novoj generaciji povećava ovaj „instrukcijski prozor“, baš da bi povećao efikasnost HyperThreading-a, odnosno „throughput“.
FP pipeline-a ima ukupno četiri i to 128-bitna. 2x FADD i 2x FMUL/FMA. Izvršavanje 256-bitnih AVX i FMA instrukcija može da rezultuje povećanom latencijom, jer su potrebne dve mikrooperacije da bi se izvršila ovakva instrukcija. Zen izvršava maksimalno jednu 256-bitnu FMA instrukciju po jezgru, odnosno dve 128-bitne FMA, ali moguće je izvršiti i četiri 128-bitne SSE2/3 instrukcije, dve FADD i dve FMUL.
Za razliku od ovoga Haswell koristi 2×256 bitnu FMA + 1 x 256b shuffle. Ako posmatramo throughput, od četiri FP jedinice dve bi mogle da rade kao 1×256 bit FMA, što je za HPC ekvivalentno polovini bandwidth-a Haswell-ovih FP jedinica za 256-bitne FMA instrukcije. Međutim, throughput je znatno veći za starije setove instrukcija, jednostavno, veći broj jedinica je na raspolaganju. Tako na primer za 128-bitne SSE operacije, Ryzen izvršava 2x128bit FADD i 2x128bit FMUL, dok Haswell, Skylake… itd.. .mogu 1×128-bit FADD i 1×128-bit FMUL.
Zen teoretski može paralelno da izvrši dvostruko manje DP FLOPS-a od Haswell ili Skylake, odnosno dvostruko više FLOPS-a po jezgru od Piledrivera, što je bitno isključivo u HPC (High Performance Computing) primeni, sa korišćenjem Intel MKL ili OpenBLAS matematičkih kernela pisanih u asemblerskom kodu. Zen s druge strane može da izvrši 2x više SSE instrukcija nego Haswell, što bi u SMT režimu bi trebalo da mu omogući značajnu prednost. Ovime se dobrim delom i anulira prednost korišćenja ICC kompajlera, jer je FP snaga Ryzen-a pri korišćenju SSE2 instrukcija jednaka snazi Haswell jezgra koje koristi AVX instrukcije.
Zen jezgro može da dekodira ukupno 4 instrukcije, ali one mogu da budu spojene kao dve mikrooperacije, tako da dekoderi mogu da otpuste maksimalno 8 mikrooperacija, dok uOp queue može da prihvati najviše četiri. Međutim, uOp keš može da iskešira do 8 mikrooperacija u ciklusu što je dovoljno za izvršenje maksimalno 4 integer operacije i 4 FP operacije. Bandwidth uOp queue-a je dvostruko veći na Zen arhitekturi nego na Intel što značajno poboljšava skaliranje SMT-a. uOp keš je nešto veći na Ryzenu.
Podržana su dva grananja po ciklusu, što je korisno za SMT, ali je isto tako korisno i za single thread izvršavanje. Ono što je zanimljivo je da AMD kod integer jedinica ponovo koristi separatni „scheduler“, kao što je to bio slučaj od prvog K7 pa sve do K10. Piledriver je koristio unifikovani scheduler za 4 izvršne jedinice, 2xALU i 2xAGU, dok Zen koristi 6 odvojenih schedulera dubine 14 mikrooperacija, 4x za ALU i 2x za AGU. Šest mikrooperacija se šalje na odvojene scheduler-e paralelno, gde se u svakom scheduler-u formira niz (queue) mikrooperacija, koje se redom izvršavaju na već određenoj ALU ili AGU. Ukupan broj memorijskih kalkulacija je dva, dok je kod Intela 3. Broj ALU operacija je jednak Haswell/Skylake arhitekturama.
Zen sadrži i dve Load/Store jedinice, što je u principu više nego dovoljno, a dubina LS buffer-a je 72 LS operacije, što je jednako Skylake-u i Haswell-u. Nije poznato koliko Store operacija ovaj buffer može da buffer-uje, ali kod Haswell-a je taj broj dosta manji od 72 i iznosi 42, dok je kod Skylake-a 56.
Moguće su čak tri keš operacije istovremeno iako postoje samo dve AGU jedinice, ukupno 2×128-bit LOAD i 1×128-bit STORE, zahvaljujući dubokim Load/Store baferima. Za razliku od ovoga, kod Intelovih procesora moguć je 2×256-bit load i 1×256-bit store, što ima smisla ukoliko se koriste 256-bitne FMA3 instrukcije. S obzirom da Zen koristi 2×128-bit FMA, latencija za dobijanje vektorskih operanada je jednaka onoj na Intelovim procesorima. L1 Data keš nema potrebu za 2×256-bitnim učitavanjem, jer ne postoje prave 256-bitne FP jedinice.
AMD-ov SMT je zasnovan na široj osnovi nego Intelov Hyperthreading. Ukupno veći broj mikrooperacija je na raspolaganju za SMT, tako da ne čudi što je skaliranje SMT-a osetno bolje nego skaliranje Hyperthreadinga. Micro-op Queue ima za cilj da razvrsta instrukcije na INT ili FP i ovaj niz sadrži redove sa do 6 mikrooperacija. Jedan element ovog Micro-Op queue-a pripada jednom tredu ekskluzivno, sledeći drugom i tako naizmenično, ovaj deo procesorskog pipeline-a je produžen za jedno stanje. Takođe i Retire Queue je povećan za jedno stanje, opet zbog naizmeničnog upisa izvršenih instrukcija. U poređenju sa ovim Intel koristi maksimalno 4 mikrooperacije za reorder buffer i za raspodelu ka izvršnim jedinicama. Scheduleri na AMD-u mogu da istovremeno „otpuste“ do 10 mikrooperacija na izvršavanje u jednom ciklusu, dok je Intel ovde ograničen sa maksimalno 8 mikrooperacija, jer unifikovani scheduler poseduje ukupno 8 portova. AMD od 10 mikrooperacija izvršava 8 FP/ALU i 2 memorijske, dok Intel može da otpusti na obradu 4FP/ALU i 4 memorijske, nezavisno. U pogledu OoO izvršavanja AMD drži prednost kada je u pitanju SMT, ali Intel je u prednosti kada je u pitanju OoO memorijsko izvršavanje.
Da bi iskorišćenost resursa bila bolja, AMD je u Ryzen implementirao malo veštačke inteligencije. U pitanju su neuronske mreže. Zvuči baš „fancy“ ?
Ova oblast veštačke inteligencije spada u mašinsko učenje. Svaka izvršna jedinica predstavlja čvor u neuronskoj mreži, u grafu koji predstavlja procesorsko jezgro. Zapravo se radi o branch prediktoru, koji na osnovu istorije grananja i tipova instrukcija ima mogućnost da odredi najbolju putanju kroz CPU. U pitanju je najverovatnije običan „perceptron“ branch prediktor, mada ta informacija nije dostupna. Postoje još dva tipa branch prediktora koja su se pokazala kao superiorna: OGHEL i TAGE. TAGE je najefikasniji branch prediktor prema površini čipa. Ovakav BP radi ispred procesora i dovlači instrukcije iz instrukcijskog keša, što je uobičajena praksa kod mnogih procesora. AMD najverovatnije koristi TAGE BP algoritam, mada on ne donosi naročitu prednost po pitanju IPC-a u odnosu na ostale tipove prediktora grananja, iako je dosta kompleksniji po pitanju dizajna. Vrlo verovatno je da AMD zna neke stvari koje poznati svetski stručnjaci u ovoj oblasti ne znaju. AMD je u kod Ryzena verovatno koristio „perceptron“ prediktor sa TAGE algoritmom.
Dodaj komentar