[go: up one dir, main page]

Academia.eduAcademia.edu

CUDA procesori

2010

CUDA je grafički procesor, nasljednik klasičnih vektorskih procesora. Procesor je izrađen od strane kompanije NVIDIA koja njime uvodi novi pojam, CUDA arhitektura. Procesor se sastoji od nekoliko stotina CUDA procesorskih jezgri i dozvoljava da i klasične aplikacije imaju mogućnost izvršavanja u paralelnom okruženju na grafičkom procesoru. Briše se granica između brzih grafičkih procesora i sporijih centralnih procesora. Upotrebom posebnih CUDA biblioteka korisnik može izraditi aplikacije na način da se njeni zahtjevniji dijelovi izvode zasebno na brzim grafičkim procesorima, paralelno, koristeći višenitnu strategiju podjele zadataka između CUDA jezgri

Primljen: 22.10.2010. Stručni rad Prihvaćen: 01.12.2010. UDK 004.31 CUDA procesori CUDA processors Bruno Trstenjak 1 Željko Knok 2 Jurica Trstenjak 3 1,2 Međimursko veleučilište Čakovec Bana Jelačića Jelačića 22a, 40000 Čakovec 3 Tehnička škola Čakovec Športska 5, 40000 Čakovec e-mail: 1btrstenjak@mev.hr, 2zknok@mev.hr, 3jtrstenjak@mev.hr Sažetak: CUDA je grafički procesor, nasljednik klasičnih vektorskih procesora. Procesor je izrađen od strane kompanije NVIDIA koja njime uvodi novi pojam, CUDA arhitektura. Procesor se sastoji od nekoliko stotina CUDA procesorskih jezgri i dozvoljava da i klasične aplikacije imaju mogućnost izvršavanja u paralelnom okruženju na grafičkom procesoru. Briše se granica između brzih grafičkih procesora i sporijih centralnih procesora. Upotrebom posebnih CUDA biblioteka korisnik može izraditi aplikacije na način da se njeni zahtjevniji dijelovi izvode zasebno na brzim grafičkim procesorima, paralelno, koristeći višenitnu strategiju podjele zadataka između CUDA jezgri. Ključne riječi: CUDA procesor, CUDA arhitektura, paralelno procesiranje, procesorska jezgra Abstract: CUDA graphics processor is a successor of classic vector processors. The processor was developed by NVIDIA, which has introduced a new concept, CUDA architecture. The processor consists of several hundred CUDA processor cores and enables classic applications to perform in a parallel environment on a graphics processor. Such an approach erases the borders between graphics and slower conventional processors. By using the special CUDA library, a user can create applications in a way that its more demanding parts are performed separately and parallelly on fast graphics processors, using multithread strategy division of tasks between CUDA kernels. Key words: CUDA processor, CUDA architecture, parallel processing, processor core 1. Uvod Još jedan od procesora u čijem su radu ugrađeni temelji vektorskih procesora, a plijeni pažnjom, je CUDA procesor (engl. Cumputer Unified Device Architecture). To je akronim za paralelnu računalnu arhitekturu razvijenu od strane NVIDIA. CUDA je grafička procesorska jedinica (engl. Graphics Processing Units GPU) koja omogućuje programerima razvoj algoritama upotrebom C programskog jezika. CUDA omogućuje direktan pristup instrukcijama procesora i memoriji izvršavajući operacije paralelno. Arhitektura posljednje verzije NVIDIA grafičkog procesora postaje nalik klasičnom procesoru s mogućnošću paralelnog izvršavanja tisuće različitih procesa. Prije pojave CUDA procesora na grafičkim procesorima izvršavale su se uglavnom računalne igre. Sada je moguće izvršavati bilo koji kod na grafičkoj kartici. Grafičke kartice nude mogućnost izvođenja zadataka na paralelni način, što računalo pretvara u superračunalo. Centralni procesor preuzima ulogu kontrole izmjene podataka i dodjeljivanje poslova, a grafički procesor koji u sebi ima stotine procesorskih jezgri preuzima posao kompleksnih izračuna. Od samog početka protočna struktura grafičkih procesora zasnovana je na zadacima. Svaki zadatak obrađuje velik broj ulaznih podataka, a izlaz iz zadatka prosljeđuje se kao ulaz u sljedeći zadatak. Pri tome se javlja podatkovni paralelizam gdje se istovremeno obrađuje više podataka unutar svake faze izvođenja instrukcije. Može se reći da je protočnost grafičkih procesora razdijeljena u prostoru, a ne u vremenu kao kod procesora opće namjene. Dio grafičkog procesora, pri tome mislimo na takozvane stream procesore, radi na jednoj fazi. 2. Građa CUDA procesora U građi novih grafičkih procesora od strane NVIDIA, kod CUDA procesora su iskorištene sve prednosti vektorskih procesora, upotreba cjevovoda i načina obrade podataka, a napravljen je i golemi iskorak u upotrebi novih 40nm tehnologija izrade elemenata. Proizvođač NVIDIA izradio je super snažnu grafičku karticu na kojoj je ugrađeno više od 3 bilijuna tranzistora u 512 CUDA procesorskih jezgri. Takva nova arhitektura koja se danas koristi u izgradnji CUDA procesora i arhitekture dobilo je kodno ime "Fermi" ili "GF100". Osnovna svojstva takvih procesora su: arhitektura koristi niz od 480 procesora (engl. Stream processors) za protočno procesiranje kod matematičkih izračuna točaka, piksela i slično (verzija kartice GeForce GTX 480); procesor upotrebljava 384 bitnu memorijsku sabirnicu, 6 nezavisnih 64-bina kontrolera, podržava brzu grafičku GDDR5 memoriju (engl. Graphics Double Data Rate, version 5); CUDA jezgre rade na taktu od 700 MHz-a; dupli takt za ALU jedinicu od 1401 MHz-a; 16 stream multiprocesora (engl. Stream Multiprocessors), uključujući 512 skalarnih ALU jedinica za računanje s pokretnim zarezom; mogućnost procesora da rezultate zapisuje simultano u 8 okvirnih međumemorija (engl. Multiple Render Target - MRT). Kada se sve navedeno uzme u obzir, a neka obilježja takvih procesora koja nismo spominjali jer nije previđeno za ovu temu, vidimo o kakvoj se procesorskoj snazi radi. Sama građa GF100 arhitekture procesora sastoji se od nekoliko klastera (engl. cluster) koji se nazivaju grafički procesorski klasteri (engl. Graphics Processing Clusters). Svaki od klastera sadrži nekoliko polja multiprocesora (engl. Streaming Multiprocessors - SM), a svaki od njih sadrži nizove stream procesora. Slika 1 prikazuje organizaciju građe jednog takvog procesora. Slika 1. Organizacijska shema GF100 arhitekture Iz slike se vide da GF100 arhitekturu čine 4 zasebna grafička klastera GPC (engl. Graphics Processing Clusters), gdje svaki od njih u sebi ima 4 SM procesora. Također vidimo da imamo 6 memorijska kontrolera koji omogućuju brz pristup raznim razinama memorije. Centralni dio organizacije poslova preuzima "GigaThread" dispečer i raspoređuje procese između polja multiprocesora, to jest prema CUDA jezgrama. Osim dispečera, unutar klastera nalaze se i elementi koji omogućuju paralelizam u izračunavanju i obradi podataka kao što su vektorske točke, poligoni i slično. Prijašnje grafičke kartice i procesori spomenute grafičke objekte izračunane su koristeći cjevovodnu strukturu u jednoj rasterskoj jedinici. Danas se unutar klaster arhitekture nalaze po četiri elementa za geometrijsko procesiranje i izračune, a ti elementi nazvani su PolyMorph Engine. Slika 2. Operacije koje podržava PolyMorph Engine Kada podaci stignu u "Engine" vrši se 5 različitih operacija nad podacima. Rezultat svake operacije sprema se i transferira u stream multiprocesor. Nakon završne operacije rezultati obrade šalju se u element za rasterizaciju (engl. Raster Engines). 3. Organizacija memorije Učinkovita organizacija unutarnje memorije procesora veoma je važna i direktno utječe na performanse. U GF100 arhitekturi organizacija memorijskog prostora podijeljena je na nekoliko razina. Slika 3 prikazuje princip organizacije. Slika 3. Organizacija memorije u GF100 arhitekturi Globalna memorija predstavlja najveću količinu memorije koja je dostupna svim stream multiprocesorima. Količina globalne memorije varira između 256 MB i 1,5 GB koliko nalazimo u najjačim grafičkim karticama. Kako je vrijeme pristupa glavnoj memoriji vrlo sporo, "Host" procesora nastoji smanjiti broj pristupa. Memorija se koristi za pohranjivanje podataka, konstanti i tekstura. Sve to čini zajedničku memoriju, ali s različitim načinom pristupa. Struktura memorijskog bloka sastoji se od zajedničke memorije, lokalne memorije i određenog broja registara. Pristupanje registrima je vrlo brzo kao i pristupanje zajedničkoj memoriji. Svaka programska nit može pristupiti samo jednom dodijeljenom registru. Unutar registra najčešće se pohranjuju privatne varijable koje koristi programska nit. Lokalna memorija također je mala, a pristupiti joj može samo jedan stream procesor unutar multiprocesora. Što se tiče zajedničke memorije, u ovom primjeru radi se o 16kB brzoj memoriji kojoj mogu pristupiti svi stream procesori unutar jednog multiprocesora. Pričuvna L1 memorija pridružena je svakom stream multiprocesoru. Iz priložene slike vidimo da je pričuvna L1 memorija razdijeljena na tri dijela. Pričuvna memorija (engl. L1 Cache) radi zajedno s dijeljenom memorijom (engl. Shared Memory) te se nadopunjavaju. Djeljiva memorija ubrzava pristup memoriji za razne poznate matematičke algoritme koji se upotrebljavaju u izračunima, dok se L1 pričuvna memorija koristi kod nepravilnih algoritama gdje se unaprijed ne zna koji podaci i na koji način će biti adresirani. Osim pričuvne memorije na razini L1, u arhitekturi se nalazi i L2 pričuvna memorija koja se upotrebljava za učitavanje i zapisivanje podataka. Priručna L2 memorija doprinosi bržoj izmjeni podataka na razini cijelog grafičkog procesora. Također, ova memorija se koristi za potrebe filtriranja podataka prema multiprocesorima u slučaju kada oni koriste iste podatke, te se na taj način smanjuje broj pristupa vanjskoj memoriji. 4. CUDA programski model Prije spomenuta prednost CUDA arhitekture, da je osim grafičkih programa, i ostalim programima omogućeno izvođenje na grafičkom procesoru, izlazi iz CUDA programskog modela. U CUDA programskom modelu u program koji želimo da se djelomično izvodi na grafičkom procesoru, dijelimo na manje dijelove. Dio programa izvodit će se na centralnom procesoru (engl. Host), a zahtjevniji dijelovi delegiraju se i šalju prema GPU-u. Za pisanje dijelova programa za koje želimo da se izvode na grafičkom procesoru koriste se dodatne biblioteke i funkcije; tada govorimo o CUDA bibliotekama, funkcijama i upravljačkim programskim rutinama. Slika 4 prikazuje programski model i strukturiranje takvih aplikacija. Dijelovi programa koji su namijenjeni grafičkom procesoru nazivamo jezgre (engl. kernels). Sam izraz asocira na UNIX operativni sustav, prvi koji je podržavao višekorisničko okruženje, njegovu jezgru, te procese koji se pokreću. Sličnost u koncepciji CUDA modela je velika. Zahtjevan posao koji treba obaviti grafički procesor dijeli se na jezgre koje se šalju na multiprocesore, formiraju se programske niti (engl. Threads) koje se simultano i paralelno izvršavaju na CUDA jezgrama (engl. CUDA core). Veliki broj CUDA jezgri daje veću propusnost i vrlo kratko vrijeme obrade pojedinih zahtjevnih operacija. Svaki programski "karnel" dijeli se i na N niti i simultano se izvodi. Slika 4. CUDA programski model Svaka programska nit delegiranog "karnela" ima svoju identifikacijsku oznaku (engl. Thread ID). Na sljedećem primjeru pokazat ćemo osnovnu razliku između vektorskog zbrajanja kod klasičnog CPU-a i grafičke verzije obrade zbrajanja. Slika 5. CPU i GPU model izvršavanja programa Slika 5 prikazuje postavke kod ova dva načina izvođenja programa. Primjer a) prikazuje CPU verziju vektorskog zbrajanja, gdje je ukupno vrijeme za operaciju jednako N * pojedinačno vrijeme i korištena je samo jedna osnovna nit za izvođenje operacija. Programske niti: Thread 1 a) CPU verzija - Ukupno vrijeme = N * vrijeme za 1 zbrajanje Primjer b) prikazuje obradu zbrajanja na način da se posao dijeli na više procesa ili niti, te se svaki posao šalje na zasebnu CUDA jezgru. Vrijeme u slučaju primjera b) je kraće za onoliko, koliko paralelno niti kreiramo. Programske niti: Thread 5 b) GPU verzija - Ukupno vrijeme = vrijeme za 1 zbrajanje Programske niti koje se formiraju unutar "karnela" grupirane su u tri osnovne skupine ovisno da li su podaci organizirani u 1D, 2D ili 3D polja (vektore). Svaka nit unutar formiranog bloka ima jedinstvenu oznaku. Sve niti u istom bloku dijele memoriju što dovodi do vrlo brzog pristupa podacima, a također je osiguran i smanjen rizik između niti. Svaki blok ima ograničen maksimalni broj niti koje pripadaju tom bloku. Blokovi iste dimenzije i veličine izvode se zajedno i tvore matricu ili rešetku (engl. Grid). Svaki blok unutar matrice ima svoju jedinstvenu oznaku (engl. Block ID). Tako organizirane niti izvode se u pozadini. Slika 6. Organiziranje Grid-a Potrebno je osigurati da sve programske niti unutar bloka završe s izvođenjem jedne faze prije nego što nastave s izvođenjem iduće faze. To se postiže posebnom funkcijom za sinkronizaciju. Kada se pozove ta funkcija, sve niti zaustavljaju izvođenje i čekaju da preostale niti unutar bloka dođu do tog mjesta izvođenja. Treba napomenuti da nije moguća sinkronizacija između različitih blokova. Programske niti se unutar bloka izvode u obliku malih skupina (engl. warps), a njihov broj ovisi o implementaciji procesora. Njihova glavna zadaća je efikasno izvođenje operacije s velikom latencijom, kao na primjer pristup memoriji. Ukoliko jedna skupina čeka na podatke, istovremeno se izvodi druga skupina. Unutar bloka omogućeno je izvođenje samo jedne takve skupine, a za to se ostvaruje pomoću oznaka prioriteta između skupina. Maksimalna učinkovitost se postiže paralelnim izvođenjem blokova, odnosno paralelnim izvođenjem jedne skupine niti iz svih blokova. Također, izvođenje svih blokova ne mora se odvijati istom brzinom. To svojstvo da se ista aplikacija izvodi različitim brzinama nazivamo transparentna skalabilnost i omogućuje programerima lakše programiranje. 5. Zaključak CUDA arhitektura i način izvođenja programa zasigurno ima budućnost. Ovi procesori približili su svojstva nekadašnjih "super računala" na razinu osobnog računala. Ideja i princip rada ovakve procesorske arhitekture već je duže vrijeme poznata široj javnosti, samo što je do sada ona bila realizirana samo kod većih računarskih sustava. Dobiveni rezultati koje postižu ovi procesori u odnosu na druge su iznenađujući (u pozitivnom smislu). Vrlo brzo ćemo biti svjedoci novih inačica sa sličnom arhitekturom, većim brojem procesorskih jezgri, povećanom brzinom rada pojedinih komponenti. Spomenuti programski model procesora utjecao je na pojavu novih programskih alata i nove filozofije u izradi programa. Napušta se klasičan način razvoja programa, način izvođenja složenih operacija, te se prelazi na potpuni paralelizam programskih naredbi već na razini procesora. Sve zajedno, razvoj arhitekture i razvoj programa, predstavlja proces koji traje, a koji će zasigurno donijeti nove i bolje ideje. Daljnji razvoj ovog procesora najviše će biti vidljiv u segmentu računalnih igara, te raznih simulacija gdje će biti presudna brza obrada velikog broja podataka. Na nama je da čekamo na brz odgovor konkurencije. Literatura Chatterjee, S. (2010). Programming GPUs with CUDA. Department of Computer Science Rice University. CUDA. http://www.nvidia.com/object/what_is_cuda_new.html. (10.07.2010.) Grauer-Gray, S.; Kafle, P. (2007). Lecture 4: Software Support for Multicore Architectures. Greater, Noida (2009). NVIDIA CUDA: Supercomputing with every computer. HBeonLabs. Guidry, M.; McClendon, C. (2009). Parallel Programming with CUDA Jim Guilkey (2009). Hardware Execution Model.The University of Utah. http://www.cs.utah.edu/~mhall/cs6963s09/lectures/6963_L4.ppt. NVIDIA Co. (2007). CUDA Programming Guide Version 1.0. http://www.nvidia.com/object/what_is_cuda_new.html. (10.7.2010.) Pipelining and vector processing. http://sjlee.sch.ac.kr/5a202/chap9.pdf. (15.7.2010.) Živković, O.; Šegović, S. (2010). Programska okruženja za programiranje na grafičkim procesorima. Zagreb, Sveučilište u Zagrebu.