Superračunala
Superračunalo je računalo iznimne procesne moći i svako novo je vrhunac trenutne moći obrade, kapaciteta i brzine izvođenja operacija. Sam koncept predstavio je Seymour Cray je davne 1960 godine, prije nego što je šira javnost uopće imala potrebu i spoznaju o računalima. Razvojem računarstva i softverskog inženjerstva ona su zauzimala svoj tržišni udio, a Seymour je sa svojom privatnom tvrtkom Cray bio tržišni vođa. S godinama u igru stižu tržišni lideri na području računalnih tehnologija, poput IBM-a i HP-a. Superračunala su strojevi kratkog vijeka. Nešto što je danas superračunalo, uskoro će biti obično računalo. U početku, to su bila brza računala sa skalarnim procesorima, tipično deset puta brži od običnih računala. Sedamdesetih godina, većina proizvođača počinje koristiti vektorske procesore, osamdesetih počinje se ugrađivati nekoliko vektorskih procesora koji operacije izvode paralelno, a devedesetih počinje biti poznat koncept masivnog paralelizma sa tisućama običnih CPU. Danas se tipična superračunala sastoje od PowerPC procesora, Opteron ili Xeon. Njihova primjena je snažno zastupljena u zadacima sa koji zahtijevaju intenzivno računanje, primjerice problemi predviđanja vremena, istraživanje klime, molekularno modeliranje, fizičke simulacije, kvantna fizika, simulacije detonacije nuklearnih oružja i nuklearne fuzije i mnogi drugi. Jedan skup problema koji je zanimljivo izdvojiti su Grand Challenge problemi. GC problemi postavljeni su kasnih osamdesetih kako bi se uspostavilo istraživanje računala i komunikacija visokih performansi. To su fundamentalni problemi znanosti i inženjerstva sa širokom mogućnošću primjene. Primjerice to su:OpenCL
Današnji grafički procesori (GPU) postali su značajno fleksibilniji od svojih prethodnika i time su otvorili dodatne mogućnosti obrade visokog paralelizma. OpenCL je standard, odnosno paket API-ja koji omogućuju pristup do svih procesnih jedinica računala. Prvenstveno namijenjen za Mac računala, postao je otvoreni standard i omogućuje nevjerojatne performanse.Performanse superračunala
Svaka nova generacija grafičkih procesora omogućuje veću realnost, vjernost i razlučivost digitalno stvorenih slika. Svaka tvrtka grafičkih procesora želi dostaviti što jaču grafičku karticu, prema navedenim kriterijima kako bi korisniku omogućila bolji doživljaj virtualne stvarnosti. Vođeni takvom utakmicom GPU su postali moćni procesori sa snažnim procesnim moćima i visokim stupnjem paralelizma. GPU mogu renderirati milijarde piksela u sekundi. Svaki piksel je rezultat niza složenih matematičkih operacija. S računske perspektive, operacije koje izvršava GPU su na razini performansi superračunala. Nešto bolji grafički procesori imaju mogu izvrišiti oko jedan trilijun računskih operacija u sekundi (1000 GFlops).Masivni paralelizma
Uz značajan porast računske moći grafičkih procesora došlo je i da velikog porasta posla koji GPU radi istovremeno. Kako prosječan monitor ima rezoluciju 1024×768 tipični grafički procesor se mora nositi s gotovo milijun i više piksela odjednom. Zbog toga čipovi GPU arhitekture sadrže veći broj elemenata za procesiranje piksela. Što je više tih elemenata svi potrebni proračuni se mogu brže izvršiti, čime je i čitava slika za ispis na zaslonu prije pripremljena. Najnoviji procesori simultano izvršavaju stotine operacija kako bi pripremili piksele za složene 3D scene naprednih grafičkih engine-a.Izvan grafičkih mogućnosti
Inicijalni grafički procesori su dizajnirani tako da bi implementirali programske standarde za grafičku obradu, primjerice OpenGL. Čvrsta povezanost između programskog jezika i internog rada čipova omogućila je visoke performanse za većinu grafičkih primjena. No, ta čvrsta veza je ograničila grafičke procesore samo na ono što je definirano u grafičkom jeziku. Kako bi se prevazišla ta ograničenja, arhitekti GPU-a omogućili su pristup do procesnih elemenata korištenjem specijaliziranih programa, shader-a (u daljnjem tekstu shader, shaderi). S vremenom, shaderi jednostavnih asemblerskih jezika evoluirali su u shadere s programskim jezicima više razine koji omogućuju razvoj bogatih scena današnjih najsloženijih 3D softvera. Kako bi to omogućili, arhitekti GPU-a su ugradili dodatne procesne mogućnosti poput općih matematičkih operacija, logike i operacija toka podataka. To je stvorilo nove prilike za povećanje brzine računanja.Hvatanje procesne moći grafičkih procesora
Programeri i proizvođači grafičkih procesora ubrzo su shvatili da je trend razvoja procesnih mogućnosti golem i da se otvara nova prilika za obradu izvan klasičnih grafičkih namjena. Sve što je potrebno je ne-grafički API koji bi omogućio pristup do te goleme procesne moći. Jedna od tehnologija je OpenCL. Ona svakoj aplikaciji daje sredstva za pristup performansi superračunala unutar GPU-a.OpenCL izbliza
OpenCL je razvijen od nule i omogućuje podizanje performansi aplikacije korištenjem GPU za izračune generalne namjene. To je okvir temeljen na C jeziku i omogućuje visok paralelizma. API koji omogućuje primjenu jednog ili više OpenCL uređaja (GPU, CPU). Arhitektura obuhvaća sloj platforme, runtime i kompiler. Sloj platforme implementira specifične funkcije koje aplikacijama omogućuju konfiguraciju računanja, inicijalizaciju uređaja za računanje i pohranu konteksta kernela. Runtime je set API poziva koje aplikacije koriste kako bi upravljale izvršavanjem kernela, objektima, alokacijom memorije. Kompajler omogućuje kompiliranje i povezivanje aplikacija. Dodatni tipovi koji su uvedeni su vektori, slike i kvantifikatori adrese koji se koriste za kontrolu pristupa memoriji. Također uključena je novo math.h zaglavlje s optimizranim operacijama za paralelnu obradu. Često se koriste za simulaciju ponašanja tekućina, eksplozija, procesiranje slike, signala, FFT, financijsko modeliranje, igre i slično.OpenCL C
OpenCL koristi OpenCL C, koji je varijanta C99 jezika no nešto prilagođenog za GPU programiranje i podržava paralelno procesiranje. Za povećanje učinkovitosti OpenCL C sadrži veću podršku za vektorske tipove podataka i tokove podataka. Kako bi se zadržala matematička konzistentnost na GPU hardveru različitih dobavljača definiran je i zahtjev numeričke preciznosti prema standardu IEEE-754:2008. Kako bi se podigle performanse programa, OpenCL je namijenjen re-kodiranje metoda koje koriste veliku količinu podataka. Tijekom re-kodiranja, te metode se razbiju na elementarne dijelove koji se tada mogu paralelno izvršavati. Rezultirajući kod ovog postupka sličan je tradicionalnim C funkcijama, a naziva se OpenCL kernel. Za razliku od klasičnih C programa, OpenCL nije kompiliran u aplikaciju. OpenCL kod se kompilira u zadnjoj fazi kako bi se optimirao za hardver korisnika.OpenCL API
OpenCL API omogućuje aplikaciji upravljanje zadacima paralelne obrade, pobrojava OpenCL uređaje sustava, uspostavlja dijeljenje struktura podataka između aplikacija i OpenCL-a, upravlja kompiliranjem i slanjem kernela na GPU i ima bogat skup funkcija za upravljanje redovima i sinkronizacijama.OpenCL izvršavanje
Tijekom izvršavanja OpenCL učinkovito razmjenjuje podatke između glavne memorije računala i video memorije grafičke kartice. Također, upravlja izvođenjem kernela na GPU hardveru. Tijekom izvođenja, OpenCL runtime upravlja zavisnostima između kernela i upravlja GPU procesnim elementima za njihovu učinkovitiju upotrebu.OpenCL na djelu
Za vrijeme podizanja, aplikacija poziva OpenCL API-je kako bi odredila dostupne grafičke procesore. Nakon toga odabire prikladne GPU i kreira redove naredbi. Aplikacija učitava i kompilira OpenCL kernele koje će koristiti. Kada je aplikacija spremna za izvršavanje kernela, ona poziva OpenCL API-je kako bi odredila potrebne podatke i broj paralelnih kernela. OpenCL runtime premješta podatke s glavne memorije računala u memoriju grafičke kartice. GPU simultano izvršava kernele na procesnim elementima. Paralelno izvođenje kernela je ključ za izvrsne perofrmanse koje omogućuje OpenCL. Korištenjem GPU OpenCL može izvršiti 200 izračuna u svakoj iteraciji i to simultano. OpenCL se može koristiti za složene primjene kao što su fizika igre i simulacije, obradu zvuka, složenu grafičku obradu i prezentaciju, matematičke izračune kao što su kompresija i kriptografija.OpenCL standard
Iako je inicijalno sam razvio OpenCL Apple je odlučio da bi trebao otvoriti standard i u suradnji s drugim kompanijama mogao razviti bolji standard za paralelno programiranje GPU-a i CPU-a. S podrškom AMD-a, Intel-a i NVIDIA-e Apple je Khronos Group konzorciju predložio OpenCL kao novi standard. Time je OpenGL dalje razvijen za podršku DSP (digital signal processor) i druge specijalizirane procesne arhitekture. U prosincu 2008 godine ratificiran je kao otvoren standard.CUDA
Kao što je rečeno, prije nekoliko godina nešto domišljatiji programeri otkrili su mogućnost kako moćne grafičke procesore grafičkih kartica iskoristiti za druge namjene. Ti improvizirani programi su bili donekle nespretno izvedeni, a piksel shreaderi na čipovima nisu bili idealni za programiranje opće namjene. NVIDIA je uhvatila tu priliku kako bi dizajnirali bolje programske modele i poboljšali shreadere za opću primjenu. Na tržištu procesora visokih performansi, NVIDIA shreadere naziva procesorima toka ili dretvenim procesorima. Srećom, to nije samo marketinški trik, svaki taj dretveni procesor je GPU NVIDIA GeForce 8 serije koji može obraditi 96 konkurentnih dretvi. Svaki taj procesor ima svoj FPU (engl. floating point unit), registre i dijeljenu lokalnu memoriju. CUDA platforma za paralelno procesiranje na NVIDIA GPU. Ključni elementi su C/C++ izvorni kod s drukčijim kompajlerom za CPU i GPU. Funkcijska zaglavlja koja pojednostavljuju programiranje i apstrakcija hardvera koja od programera skriva nepotrebne detalje GPU arhitekture Kako slika prikazuje, CUDA uključuje razvojne alate za C/C++, funkcijska zaglavlja i koja pojednostavljuju programiranje te od programera skrivaju nepotreban GPU hardver. Iako CUDA zahtjeva pisanje posebnog koda za paralelno procesiranje, nije potrebno eksplicitno upravljanje dretvama, u konvencionalnom smislu. Ta činjenica znatno olakšava programiranje. Razvojni alati za CUDA rade zajedno s konvencionalnim C/C++ kompajlerima, stoga programer može ispreplitati GPU kod sa općim kodom za CPU. Za sad, CUDA cilja prema aplikacijama koje koriste velike količine podataka i trebaju jednostruku preciznost (32 bita, maksimalne vrijednosti (2-2-23)x2127). Najčešće to su aplikacije za znanstvenu i inženjersku primjenu, aplikacije s potrebama visokih računskih performansi, obrada videa i slike). Dvostruka preciznost dostupna je na novijim grafičkim karticama iz Tesla serije.Prikrivanje procesora
NVIDIA je uvijek skrivala arhitekturu svojih grafičkih procesora ispod API-ja. Time programeri nikad nisu imali direktni pristup do GPU-a. Takav pristup prikrivanja hardvera ima dvije prednosti. Prvo, jednostavnije je programiranje na višoj programskoj razini. Drugo, apstrakcija hardvera dopušta NVIDIA čestu i radikalnu promjenu GPU arhitekture. Arhitektura NVIDIA GeForce 8. GPU se sastoji od 128 dretvenih procesora. Svaki procesor ima FPU jednostruke preciznosti, 1024 registra veličine 32 bita. Svaki klaster od 8 procesora ima 16KB dijeljene memorije s podrškom za paralelni pristup. Poseban sklop zadužen je za automatsko dodjeljivanje dretvi pojedinim procesorima. Najveći broj konkurentnih dretvi je 12288. Jedna prednost koji ima NVIDIA je kompiliranje i vremenu instalacije. Kada korisnik preuzme neku aplikaciju za GPU arhitekturu, tijekom instalacije aplikacija komunicira sa GPU i automatski kompilira kod za pripadnu arhitekturu. Korisnik nikad ne vidi taj kompajler, već ima dojam instalacije softvera. CUDA radi na način da podatke podijeli u puno malih dijelova. Nakon toga, svaki dretveni procesor može dijeliti te djeliće podataka. Lokalna pohrana podataka smanjuje potrebu pristupa van čipa čime se povećavaju performanse. Naravno, ponekad je potrebno i pristupiti podacima iz glavne memorije. Prema CUDA modelu, pristup memoriji van samog sklopa grafičke kartice neće zaustaviti rad dretvenog procesora. Dretva koja je prekinuta sprema se na registar, zajedno sa svojim kontekstom i umjesto nje se izvršava neka druga dretva koja je spremna za izvođenje. Kada je zaustavljena dretva završena s dohvatom podataka, ona se prebacuje u red dretvi spremnih za izvođenje. Kada neki dretveni procesor postane slobodan, slijedeća dretva iz reda ide na obradu. Već je spomenuto kako programer ne mora eksplicitno pisati kod za dretve. Hardverski upravitelj dretvi sam upravlja dretvama. Automatsko upravljanje dretvi je nešto što je prijeko potrebno kada govorimo o višedretvenosti na razini od nekoliko tisuća. Otklanjanjem ovog tereta, NVIDIA pojednostavljuje način programiranja i eliminira čitav set mogućih bugova.Programiranje
Ono što je najprije potrebno je napraviti dobru analizu podataka, potrebno je rješenje izraziti u obliku C/C++ koda. CUDA nudi nekoliko specijaliziranih API poziva za paralelno procesiranje. Slika prikazuje isječak koda za konvencionalni CPU program i za višedretveni GPU program. Obje izvode SAXPY funkciju (skalarni alfa X plus Y). Ekstenzija jezika __global__ je deklaracija koja kompajleru govora da se naredni dio koda mora kompilirati za NVIDIA GPU a ne za CPU. Taj kernel je globalno dostupan u čitavom programu. Još jedna ekstenzija C/C++ jezika su trostruke špičaste zagrade, odnosno operatori toka <<OpenCL vs CUDA?
Kakav je odnos CUDA i OpenCL? – CUDA koristi vlastiti C kompajler s ugrađenim ekstenzijama, a istovremeno daje temelj za korištenje API-ja za paralelizam. OpenCL je otvoreni standard API-ja. S perspektive programera, koja je razlika? – Čisti CUDA je C, OpenCL je API niske razine. Obje tehnologije kompiliraju na PTX razinu. Kod CUDA C jezika, memorijom upravlja C, dok kod OpenCL-a, memorijom upravlja sam programer. To je temeljna prednost CUDA i NVIDIA tu činjenicu koristi za prodaju svojih kartica. S druge strane OpenCL je dostupan na ostalom GPU hardveru, koji nije NVIDIA.nVidia Tesla
Tesla je serija posebnih računala koja su i do 250 puta brža od običnih PC računala, a dostupna su za gotovo jednaku cijenu. Svako računalo sadrži Tesla GPU s CUDA tehnologijom za masivni paralelizam, te uključuje alate za razvoj i API-je za najkorištenije jezike visokih performansi, C, C++, Fortran. Za ostale jezike postoje dostupni omotači, a uključena je i podrška za OpenCL i DirectCompute. Primjerice računalo sa 2 Intel Xeon Quad-Core procesora na 2.00GHz, 6 GB DDR3 RAM, 250GB HDD i NVIDIA Tesla C1060 GPU Computing Processor gen 2.0 košta oko $4.500,00. Nešto jača verzija sa 4 takva NVIDIA Tesla C1060 grafička GPU, dakle ukupno 940 jezgri, 2 Intel Xeon Quad-Core procesora na 2.13GHz, 12GB DDR3 RAM, 2TB HDD košta oko $9.000,00. Kako uzmemo u obzir procesne moći i cijene CPU superračunala dobivamo sjajan omjer. NVIDIA Tesla superračunala postižu brzine od 2 do 60 TFlops. Trenutno najbrže superračunalo na svijetu ima brzinu od 1700 do 2330 TFlops, Cray Jaguar i koštalo je oko milijun dolara. Superračunalo analogne brzine, napravljeno NVIDIA Tesla tehnologijom bilo bi gotovo 1/3 jeftinije. Brzine od 60 TFlopsa su za fakultete i znanstvenike sasvim prihvatljive, a za njihove financijske planove njihova cijena je još prihvatljivija. Bioinformatika – sekvenciranje proteina (engl. sequencing and protein docking) Kemija - kvantni kodovi(engl. quantum chemistry codes) Generiranje slučajnih brojeva za MonteCarlo simulaciju.FERMI
NVIDIA Tesla serije 20 je novost koja je tek nedavno predstavljena. Redizajnirana tehnologija specijalizirana za računarstvo visokih performansi. Nova serija kodnog naziva Fermi temelji se na CUDA GPU arhitekturi nove generacije, kako kažu u NVIDIA. Novosti se najviše tiču proširenja ciljanog tržišta NVIDIA – enterprise područje. Tehnologija uključuje ECC sustav za korekciju pogrešaka u memoriji, točnost i skalabilnost bez kompromisa, podrška za C++ preko Visual Studia, 8 puta brža dvostruka preciznost veća od Tesla 10 serije. U usporedbi s četverojezgrenim CPU, GPU Tesla serije 20 ima 20 puta veće performanse za 1/10 cijene. Također sadrži 512 GPU CUDA jezgri.Tesla vs Fermi
Simulacija tsunamija
Umjesto zaključka nekoliko video primjera OpenCL/CUDA tehnologije na djelu
First OpenCL demo on a GPU
Next Generation GPU Fluids - CUDA
Volumetric particle shadows - CUDA
NVIDIA PhysX Fluid Demo - CUDA
nBody CPU vs CUDA
Particle fluid simulation demo (SLI vs CPU vs dedicated CUDA PhysX)
nVidia vs. ATI
Literatura
Fakultet organizacije i informatike, Varaždin 2009 © Ivan Švogor