Šta je to hUMA ?
Suštinski gledano, hUMA je stvar već viđena pre više od 20 godina. Ako se podsetimo stare dobre Amige i organizacije memorije, videćemo da ima mnogo sličnosti. Custom čipovi za grafiku i zvuk koristili su deljen adresni prostor sa CPU-om i taj deo memorije zvao se Chip RAM, kojem su pristupali i CPU i „custom“ čipovi. Ono što je zanimljivo u celoj priči je Amigin koprocesor, „copper“ koji je bio programabilan i koristio je 68K memorijske adrese za pristup memoriji. Posle više od 20 godina, istorija se ponavlja, ali je sve dodatno zakomplikovano brojnim softverskim „layer-ima“.
Originalan naziv potiče od UMA – Uniform Memory Architecture, koji predstavlja način na koji sistem vidi i pristupa memoriji. Do sada smo se susretali sa nazivima poput NUMA – Non-Uniform Memory Architecture na serverskim sistemima, gde svaki CPU čvor poseduje svoju memoriju, a koherencija se odvija putem koherentnih linkova, u slučaju Opterona putem Hypertransport linkova. Koherencija je neugodan zahtev iz prostog razloga jer znatno komplikuje programski model samog hardvera, koji mora da vrši na najoptimalniji mogući način sinhronizaciju, kopiranje i translaciju memorijskih adresa između „nodova“. Konkretno kod APU-a do sada je korišćen NUMA pristup, jer je deo memorije odvajan za GPU, a naknadno je vršena koherencija podataka između CPU-a i GPU-a.
Sada dolazimo do onoga što smo već spomenuli malopre u tekstu. APU baziran na HUMA arhitekturi koristi x86-64 pokazivače za pristup celoj memoriji. Dakle, CPU može da pristupi bilo kojem delu CPU i GPU memorije i obrnuto pri tom koristeći MMU – memory managemant unit.
Dakle, sada i sam GPU može da primi „page fault“ jer pristupa memoriji preko MMU-a, što predstavlja korak u približavanju GPU-a i CPU-a po pitanju programabilnosti.
Paging sistem
Fizičke adrese jesu realne, odnosno binarne adrese, koje se mogu reprezentovati nekim binarnim brojem i one se fizički nalaze u samom hardveru, odnosno RAM-u. Da bi znali gde je smešten podatak u memoriji, osim podatka mora da postoji i podatak o njegovoj lokaciji, odnosno adresa. U realnom životu bi to bilo najsličnije vašoj adresi stanovanja. Adresa vaše zgrade nosi nekakav broj i to je vaša fizička adresa na kojoj vi stanujete i tu nema nikakve dileme. Broj vaše zgrade je adresa, a Vi ste podatak. Ipak, zbog fleksibilnosti, operativni sistem itd… organizuju memoriju na malo drugačiji način. I dalje postoje adrese, ali operativni sistem ih reprezentuje drugačije nego sam hardver.
Dakle, imamo preslikavanje iz fizičkog u virtuelni adresni prostor i ono što operativni sistem vidi jesu virtualne, a ne fizičke memorijske adrese. Ako imate 32-bitni operativni sistem, vaš procesor može da adresira maksimalno 4 GB virtuelnog adresnog prostora, bez obzira da li imate manje fizičke memorije. Isto tako i sa 64-bitnim operativnim sistemom. Adresni prostor je mnogo veći, npr. 48-bita, a vaša fizička memorija iznosi 4 GB, 8 GB ili 16GB. Unutar virtualnog adresnog prostora mogu biti mapirane različite strukture podataka koje koristi OS. Sve ove strukture nalaze se na memorijskim stranicama koje mogu, a i ne moraju biti u fizičkoj memoriji. Ukoliko se memorijska stranica ne nalazi u fizičkoj memoriji, odnosno RAM-u, tada imamo „page fault“ i operativni sistem pristupa pagefile-u u potrazi za „izgubljenom“ memorijskom stranicom. Keširanje ovih memorijskih stranica odvija se putem TLB buffer-a u procesorskom jezgru, što pretragu kroz memoriju i pristup podacima čini višestruko bržim.
Kada je potrebno da se virtualna adresa preračuna u fizičku, procesor prvo pristupa TLB-u. Ako se stranica koja je zahtevana od procesa nalazi u TLB-u, imamo pogodak, fizička adresa je dobijena i može se dalje pristupiti memoriji. Ukoliko imamo promašaj TLB-a, memorijski menadžer pretražuje mapu stranica koja je pohranjena u drugostepenom TLB-u. Ako postoji promašaj i u drugostepenom TLB-u, pretraga tražene stranice se dalje vrši u memorijskoj mapi koju je kreirao operativni sistem i to se zove Page Walk. Ako takva strana postoji, ona se upisuje nazad u TLB, procesor dobija željeni podatak, a instrukcija koja čeka na podatak sa ogovarajuće fizičke adrese, nastavlja sa daljim izvršavanjem. Ukoliko ne postoji stranica u memoriji, tada imamo PAGE FAULT i stranica se učitava sa diska. Stranica koja je učitana sa diska, učitava se u tabelu stranica i u TLB. Ovaj sistem funkcioniše automatski, na nivou samog hardvera, koji je inicijalizovan preko CR3 registra. Postavljanje flag-a u CR3 registar od strane kernela operativnog sistema znači da je MMU uključen i da operativni sistem koristi paging sistem za rad sa memorijom. Ovo ne znači nužno da sistem mora koristiti swap file. Na primer u slučaju Page Fault-a, kod nekih sistema, poput Androida, aplikacija automatski gasi proces u slučaju nedostatka fizičke memorije. Kod hUMA arhitekture, GPU takođe koristi MMU kao i procesor.
Da GPU ne bi usporavao CPU u radu sa memorijom GPU koristi svoj keš da bi iskeširao memorijske strane. Koherencija između procesorskog i GPU keša odvija se na nivou hardvera, tako da u svakom trenutku CPU „zna“ šta GPU „hoće“.
U klasičnom sistemu, kada GPU završi sa izvršavanjem, rezultat izračunavanje se kopira u CPU memoriju. Isključivo je moguće kopiranje nizova podataka, ali ne i kompleksnijih struktura podataka, kao npr. binarnih stabala pretrage, stack-ova, heap-ova, povezanih listi i sličnih gde god se koriste pointeri na neki podatak ili strukturu podataka. Da bi ovo sve bilo jasnije nekome ko nije C/C++ developer objasnićemo da je pointer, odnosno pokazivač, varijabla, odnosno promenljiva koja sadrži memorijsku adresu i referencira na određeni tip podatka ili segment koda. Developer ne mora da zna koja je to tačno adresa u memoriji, već joj daje ime. Pointerima je moguće manipulisati na isti način kao i sa bilo kojom drugom varijablom. Adresa predstavlja jedan 32-bitni ceo broj u 32-bitnom sistemu, kod 64-bitnih se koriste 48-bitne adrese, dakle pointer sadrži 48-bitni ceo broj i informaciju o tipu podatka na koji pokazuje.
Kod hUMA arhitekture CPU može da prosledi GPU pokazivač, odnosno pointer na kompletnu strukturu podataka.
Dodaj komentar