Projekat Bulldozer
Prošlo je dvanaest dugih godina od izlaska poslednje od temelja nove mikroarhitekture. Davne 1999. godine AMD je predstavio K7 Athlon procesor, izrađen u tada naprednom 250nm proizvodnom procesu. K7 je bio stvoren da parira i pobedi Intelov Pentium III koji je zasnovan na dobro poznatoj P6 mikroarhitekturi, čije evolutivne naslednike i danas imamo u Nehalem i Sandy Bridge mikroarhitekturama. K7 je tada bio izuzetno uspešan projekat, pravi kvantni skok u odnosu na prethodni K6, koji je AMD-u omogućio značajniji upliv u tržište x86 procesora. Ono po čemu je K7 arhitektura prepoznatljiva je koprocesorska organizacija – integer blok je odvojen od FPU bloka. Na ovom temelju je zasnovan i Bulldozer koncept, sa dodatnom izmenom u celoj paradigmi: Bulldozer modul poseduje dva integer bloka i jedan FPU koji je deljen između ova dva klastera.
Da podsetimo: integer blokovi sadrže ALU jedinice koje služe za celobrojne operacije sabiranja, oduzimanja, množenja (deljenje je dodato tek kasnije u K10 do tada je bilo mikrokodovano). ALU osim što radi sa celim brojevima, radi i sa logičkim operacijama. (ALU – Arithmetic Logic Unit) Logičke operacije su izuzetno bitan faktor za funkcionisanje programskog koda. Operacije poput XOR, AND, NOT, NOR, OR su implementirane u najsitnijim segmentima ALU jedinice i logička kola čija je ovo funkcija su osnovni gradivni elementi svakog procesora. Osim aritmetičko logičkih operacija INT/ALU blok poseduje AGU (address generation units), jedinice za adresne kalkulacije i load/store jedinice. To znači da integer blok u AMD procesorima može da izvršava aritmetičke operacije, logičke operacije i memorijske operacije. Ovde već praktično imamo kompletan funkcionalan procesor, koji zovemo procesorsko jezgro, bez FPU-a. Procesor bez load/store jedinica nije procesor. Dakle, modularni koncept podrazumeva pakovanje dva procesorska jezgra i jedan deljen FPU u entitet koji se naziva „Compute Unit“ ili kraće „modul“.
Cilj ovakve organizacije je pakovanje dva procesorska jezgra na manju površinu i korišćenje relativno malog broja tranzistora pri čemu se ostvaruje disipacija koja je na nivou jednog velikog jezgra, poput Sandy Bridge-a. Istina, Bulldozer modul zahvata površinu od nekih 30mm^2 sa sve 2MB L2 keša. Poređenja radi, Sandy Bridge jezgro uzima oko 20 mm^2 sa 256K L2 keša. Bulldozer modul bez L2 keša je uporediv po površini sa Sandy Bridge jezgrom bez L2 keša.
Modul sadrži dva integer klastera (procesorska jezgra u grubim crtama), i jedan FPU klaster koji je deljen između ova dva integer bloka. Oni svi zajedno dele L1 instrukcijski keš i front end koji služi da „hrani“ izvršnu mašineriju instrukcijama iz memorije i L1 keša.
Analizom programskog koda, kao i u simulacijama procesora shvaćeno je da FPU jedinica i front end nisu u potpunosti iskorišćeni i da su kao takvi podesni da budu deljeni resurs u takozvanoj klasterovanoj arhitekturi. CMT – „Clustered Based Multithreading“ je osnovni koncept koji je pokretač Bulldozer projekta.
Ako analiziramo FP intenzivni kod u šta spada većina rendering softvera, masa igara, HPC – „High Performance Computing“ aplikacija poput meterooloških modela, simulacija sudara, kalkulacija fizike u relnom vremenu, CAD/CAM primena, shvatićemo da procesori zapravo izvršavaju instrukcijski miks FP i ALU operacija. Konkretan primer je Cinema 4D rendering endžin. Prilikom izvršavanja renderinga prosečan broj instrukcija po ciklusu IPC, iznosi oko 1.3. Od te 1.3 instrukcije po ciklusu nekih 0.5 instrukcija su SIMD SSE2, koje spadaju u FP (floating point operacije rade sa realnim brojevima u pokretnom zarezu).
Maksimalni kapacitet FPU jedinice je do 3 FPU instrukcije po ciklusu, od čega su dve aritmetičke. Naš FPU u K10 procesoru sadrži tri pipeline-a. Jedan je FADD, drugi je FMUL, a treći je FMISC. Prvi i drugi služe za obavljanje aritmetičkih operacija. Konkretno naš FPU može da obavi jednu operaciju sabiranja vektora, jednu množenja i jednu „store“ operaciju, pohranjivanja podatka u registar ili memoriju. Sada shvatamo da je FPU od 3 IPC-a praktično neiskorišćen. Ova neiskorišćenost je donekle proizvod niskog nivoa ILP-a u samom kodu. (ILP – Instruction Level Paralelism je broj operacija koje program može da izvrši simultano i zavisi od međusobnih zavisnosti podataka. Npr, ako neki rezultat zavisi od međurezultata koji nije prethodno izračunat jer se čeka rezultat podatak iz keš memorije, onda računanje ovog rezultata mora da „sačeka“ potreban podatak. )
Ideja je bila da se uz pomoć dva integer bloka i dva programska thread-a poveća iskorišćenost FPU jedinice.
Front End u modulu ima mogućnost dovlačenja i dekodiranja do 4 x86 instrukcije po ciklusu, što je u većini slučajeva više nego dovoljno za hranjenje izvršnog endžina sa dva „jaka“ threada.
Zahvaljujući svemu ovome, dva thread-a u modulu mogu da skaliraju i sa preko 80% u odnosu na jedan thread. Može se reći da dva jezgra u modulu sadrže do 90% snage hipotetičkog dual core procesora, što je osnovna paradigma CMT arhitekture. Naravno, stepen dobitka zavisi mnogo od paralelizacije softvera, kao i od toga u kojoj meri se koriste deljeni resursi. U testovima koje smo sproveli primećuje se određen penal prilikom izvršavanja FP intenzivnog koda, naročito tamo gde se vrše kalkulacije nad velikim matricama – konkretno rešavanje sistema pomoću LU dekompozicije. Za HPC primenu, gde je rad sa matricama najčešća operacija AMD je uveo novi set instrukcija – FMA4 – Fused Multiply Add, gde je jednom instrukcijom moguće izvršiti operaciju množenja i sabiranja oblika A = B + C * D. A, B, C i D su operandi, odnosno vektori koji mogu da budu dužine od 128 do 256-bita. FMA u principu zamejuje dve instrukcije – FADD i FMUL, koje su česte u gorepomenutim operacijama. Da bi se iskoristile ove mogućnosti neophodno je rekompajlirati kod.
BD je kao koncept dobra osnova za serversko okruženje, cloud computing, pa i HPC primenu gde je veoma bitan veliki broj jezgara sa niskom disipacijom. Kod HPC primene u superračunarima, kod koji se izvršava je visokooptimizovan i paralelizovan, gde je korišćenje FMA seta instrukcija preporuka.
Dodaj komentar