Optimizacija GPU-a - truizmi. Računanje na GPU-ovima Primjer primjene tehnologije

26.02.2022

Govoreći o paralelnom računarstvu na GPU-ovima, moramo se sjetiti u kojem vremenu živimo, danas je vrijeme kada je sve na svijetu toliko ubrzano da vi i ja gubimo pojam o vremenu, ne primjećujući kako projuri. Sve što radimo povezano je sa velikom preciznošću i brzinom obrade informacija, u ovakvim uslovima svakako su nam potrebni alati kako bismo sve informacije koje imamo obrađivali i pretvarali u podatke, osim toga, kada govorimo o ovakvim zadacima moramo imati na umu da ovi zadaci neophodni su ne samo za velike organizacije ili mega-korporacije, već i za obične korisnike koji svoje životne probleme vezane za visoku tehnologiju rješavaju kod kuće na osobnim računarima! Pojava NVIDIA CUDA nije bila iznenađujuća, već opravdana, jer će uskoro na PC-u biti potrebno obraditi znatno više vremena nego ranije. Posao koji je ranije oduzimao dosta vremena sada će trajati nekoliko minuta, a samim tim će uticati na ukupnu sliku cijelog svijeta!

Šta je GPU računarstvo?

GPU računarstvo je upotreba GPU-a za izračunavanje tehničkih, naučnih i svakodnevnih zadataka. GPU računarstvo uključuje korištenje CPU-a i GPU-a sa heterogenim uzorkovanjem između njih, odnosno: sekvencijalni dio programa preuzima CPU, dok su dugotrajni računski zadaci prepušteni GPU-u. Zahvaljujući tome dolazi do paralelizacije zadataka, što dovodi do brže obrade informacija i skraćuje vrijeme izvršenja rada, a sistem postaje produktivniji i istovremeno može obraditi veći broj zadataka nego prije. Međutim, da bi se postigao takav uspjeh, sama hardverska podrška nije dovoljna, potrebna je i softverska podrška kako bi aplikacija mogla prenijeti najzahtjevnije proračune na GPU.

Šta je CUDA

CUDA je tehnologija za programiranje algoritama na pojednostavljenom jeziku C koji se izvode na grafičkim procesorima GeForce akceleratora osme generacije i starijih, kao i odgovarajućim Quadro i Tesla karticama kompanije NVIDIA. CUDA vam omogućava da uključite posebne funkcije u tekst C programa. Ove funkcije su napisane u pojednostavljenom programskom jeziku C i izvršavaju se na GPU-u. Početna verzija CUDA SDK-a predstavljena je 15. februara 2007. godine. Za uspješno prevođenje koda na ovom jeziku, CUDA SDK uključuje NVIDIA-in vlastiti nvcc C kompajler. nvcc kompajler je baziran na otvorenom Open64 kompajleru i dizajniran je da prevede kod hosta (glavni, kontrolni kod) i kod uređaja (hardverski kod) (datoteke sa ekstenzijom .cu) u objektne datoteke pogodne za sklapanje konačnog programa ili biblioteke u bilo koje programsko okruženje, na primjer u Microsoft Visual Studio.

Tehnološke mogućnosti

  1. Standardni C jezik za paralelni razvoj aplikacija na GPU-ovima.
  2. Gotove biblioteke numeričke analize za brzu Fourierovu transformaciju i osnovni softverski paket za linearnu algebru.
  3. Specijalni CUDA drajver za računarstvo sa brzim prenosom podataka između GPU-a i CPU-a.
  4. Mogućnost povezivanja CUDA drajvera sa OpenGL i DirectX grafičkim drajverima.
  5. Podrška u operacijskoj sali Linux sistemi 32/64-bit, Windows XP 32/64-bit i MacOS.

Prednosti tehnologije

  1. CUDA Application Programming Interface (CUDA API) je baziran na standardnom C programskom jeziku sa nekim ograničenjima. Ovo pojednostavljuje i izglađuje proces učenja CUDA arhitekture.
  2. 16 KB dijeljene memorije između niti može se koristiti za korisnički organiziranu keš memoriju sa širim propusnim opsegom nego kada se preuzima iz običnih tekstura.
  3. Efikasnije transakcije između CPU memorije i video memorije.
  4. Potpuna hardverska podrška za integer i bitwise operacije.

Primjer primjene tehnologije

cRark

Dio ovog programa koji najviše oduzima vrijeme je tinktura. Program ima interfejs konzole, ali zahvaljujući uputstvima koja dolaze sa samim programom, možete ga koristiti. Sledeće je kratka uputstva za postavljanje programa. Program ćemo testirati na funkcionalnost i uporediti ga sa drugim sličnim programom koji ne koristi NVIDIA CUDA, u ovom slučaju dobro poznatim programom “Advanced Archive Password Recovery”.

Od preuzete cRark arhive potrebne su nam samo tri datoteke: crark.exe, crark-hp.exe i password.def. Crerk.exe je uslužni program za autopsiju na konzoli RAR lozinke 3.0 bez šifrovanih datoteka unutar arhive (tj. pri otvaranju arhive vidimo imena, ali ne možemo raspakovati arhivu bez lozinke).

Crerk-hp.exe je konzolni uslužni program za otvaranje RAR 3.0 lozinki sa enkripcijom cijele arhive (tj. pri otvaranju arhive ne vidimo ni ime ni same arhive i ne možemo raspakirati arhivu bez lozinke).

Password.def je bilo koja preimenovana tekstualna datoteka sa vrlo malo sadržaja (na primjer: 1. red: ## 2. red: ?* , u ovom slučaju će lozinka biti razbijena koristeći sve znakove). Password.def je direktor programa cRark. Datoteka sadrži pravila za probijanje lozinke (ili područje znakova koje će crark.exe koristiti u svom radu). Više detalja o mogućnostima odabira ovih znakova napisano je u tekstualnom fajlu koji se dobija prilikom otvaranja preuzetog sa sajta autora cRark programa: russian.def.

Priprema

Odmah ću reći da program radi samo ako je vaša video kartica zasnovana na GPU-u koji podržava CUDA 1.1 nivo ubrzanja. Dakle, serija video kartica baziranih na G80 čipu, kao što je GeForce 8800 GTX, više nije potrebna, jer imaju hardversku podršku za CUDA 1.0 ubrzanje. Program bira samo lozinke za RAR arhive verzija 3.0+ koristeći CUDA. Sve treba instalirati softver vezano za CUDA, odnosno:

Kreiramo bilo koju mapu na bilo kojem mjestu (na primjer, na C: pogonu) i zovemo je bilo kojim imenom, na primjer "3.2". Tu postavljamo datoteke: crark.exe, crark-hp.exe i password.def i lozinkom zaštićenu/šifrovanu RAR arhivu.

Zatim biste trebali pokrenuti konzolu Windows komandne linije i otići u kreiranu mapu. U operativnom sistemu Windows Vista i 7, trebalo bi da pozovete meni “Start” i unesete “cmd.exe” u polje za pretragu u Windows XP-u, iz menija “Start” prvo treba da pozovete dijalog “Run” i unesete “cmd”. .exe” u njemu. Nakon otvaranja konzole, unesite komandu poput: cd C:\folder\, cd C:\3.2 u ovom slučaju.

Regrutovanje na uređivač teksta dva reda (također možete sačuvati tekst kao .bat datoteku u folderu sa cRark-om) da pogodite lozinku RAR arhive zaštićene lozinkom sa nešifrovanim datotekama:

echo off;
cmd /K crark (ime arhive).rar

da pogodite lozinku zaštićene lozinkom i šifrovane RAR arhive:

echo off;
cmd /K crark-hp (ime arhive).rar

Kopirajte 2 reda tekstualne datoteke na konzolu i pritisnite Enter (ili pokrenite .bat datoteku).

Rezultati

Proces dešifriranja prikazan je na slici:

Brzina pogađanja na cRark-u koristeći CUDA je 1625 lozinki/sekundi. U jednoj minuti i trideset šest sekundi odabrana je lozinka sa 3 znaka: “q)$”. Za poređenje: brzina pretraživanja u Advanced Archive Password Recovery na mom dual-core Athlon procesor 3000+ je maksimalno 50 lozinki/sekundi i pretraga bi morala trajati 5 sati. Odnosno, bruteforce odabir RAR arhive u cRark-u pomoću GeForce 9800 GTX+ video kartice je 30 puta brži nego na CPU-u.

Za one koji imaju Intel procesor, dobra matična ploča sa visokom frekvencijom sistemske magistrale (FSB 1600 MHz), brzina procesora i brzina pretraživanja će biti veća. A ako imate četverojezgreni procesor i par video kartica na nivou GeForce 280 GTX, tada će se brzina brutalne lozinke značajno ubrzati. Da sumiramo primjer, treba reći da je ovaj problem riješen korištenjem CUDA tehnologije za samo 2 minute umjesto za 5 sati, što ukazuje na visok potencijal ove tehnologije!

Zaključci

Nakon što smo danas ispitali tehnologiju za paralelno računanje CUDA, jasno smo uvidjeli svu snagu i ogroman potencijal za razvoj ove tehnologije na primjeru programa za oporavak lozinke za RAR arhive. O perspektivama ove tehnologije mora se reći da će ova tehnologija sigurno naći mjesto u životu svakog čovjeka koji se odluči da je koristi, bilo da se radi o naučnim zadacima, ili poslovima vezanim za obradu videa, pa čak i ekonomskim zadacima koji zahtijevaju brzu, tačnim proračunima, sve će to dovesti do neizbježnog povećanja produktivnosti rada koje se ne može zanemariti. Danas fraza „kućni superkompjuter“ već počinje da ulazi u leksikon; Apsolutno je očigledno da svaki dom već ima alat koji se zove CUDA, da bi takav predmet postao stvarnost. Od izdavanja kartica baziranih na G80 čipu (2006.), objavljen je ogroman broj akceleratora baziranih na NVIDIA koji podržavaju CUDA tehnologiju, koja može ostvariti snove o superračunarima u svakom domu. Promoviranjem CUDA tehnologije, NVIDIA podiže svoj autoritet u očima kupaca u vidu pružanja dodatnih mogućnosti njihovoj opremi koju su mnogi već kupili. Možemo samo vjerovati da će se CUDA uskoro vrlo brzo razviti i omogućiti korisnicima da u potpunosti iskoriste sve mogućnosti paralelnog računanja na GPU-ovima.

Karakteristike AMD/ATI Radeon arhitekture

To je slično rađanju novih bioloških vrsta, kada, tokom razvoja staništa, živa bića evoluiraju kako bi poboljšala svoju prilagodljivost okolišu. Isto tako, GPU je, počevši od ubrzavanja rasterizacije i teksturiranja trouglova, razvio dodatne mogućnosti za izvršavanje shader programa za bojenje istih trouglova. Ove sposobnosti su takođe tražene u negrafičkom računarstvu, gde u nekim slučajevima obezbeđuju značajnu dobit u performansama u poređenju sa tradicionalnim rešenjima.

Povučemo dalje analogije - nakon duge evolucije na kopnu, sisari su prodrli u more, gdje su raselili obične morske stanovnike. U natjecanju, sisari su koristili kako nove napredne sposobnosti koje su se pojavile na površini zemlje, tako i one posebno stečene za prilagođavanje životu u vodi. Na isti način, GPU-ovi su, na osnovu prednosti arhitekture za 3D grafiku, sve više opremljeni posebnim funkcionalnost, korisno za obavljanje zadataka koji su daleko od grafike.

Dakle, šta omogućava GPU-ovima da traže svoj sektor u softverskom prostoru opšte namene? Mikroarhitektura GPU-a je izgrađena potpuno drugačije od one kod konvencionalnih CPU-a, i u početku sadrži određene prednosti. Grafički zadaci zahtijevaju nezavisnu paralelnu obradu, a GPU je izvorno višenitni. Ali ovaj paralelizam mu donosi samo radost. Mikroarhitektura je dizajnirana da iskoristi postojeće veliki broj niti koje zahtijevaju izvršenje.

GPU se sastoji od nekoliko desetina (30 za Nvidia GT200, 20 za Evergreen, 16 za Fermi) procesorskih jezgara, koje se u Nvidia terminologiji nazivaju Streaming Multiprocessor, a u ATI terminologiji SIMD Engine. Za potrebe ovog članka, nazvat ćemo ih miniprocesorima, jer oni izvršavaju nekoliko stotina programskih niti i mogu učiniti gotovo sve što običan CPU može, ali ipak ne sve.

Marketinški nazivi su zbunjujući - radi veće važnosti, oni označavaju broj funkcionalnih modula koji se mogu oduzimati i množiti: na primjer, 320 vektorskih "jezgri". Ova zrna su više poput zrna. Bolje je razmišljati o GPU-u kao o nekoj vrsti višejezgrenog procesora sa velikim brojem jezgara koji istovremeno izvršavaju mnoge niti.

Svaki miniprocesor ima lokalnu memoriju, 16 KB za GT200, 32 KB za Evergreen i 64 KB za Fermi (u suštini programabilnu L1 keš memoriju). Ima vrijeme pristupa slično kešu prvog nivoa konvencionalnog CPU-a i obavlja slične funkcije za najbržu isporuku podataka funkcionalnim modulima. U Fermi arhitekturi, dio lokalne memorije može se konfigurirati kao obična keš memorija. U GPU-u, lokalna memorija se koristi za brzu razmjenu podataka između izvršnih niti. Jedna od uobičajenih shema GPU programa je sljedeća: prvo se podaci iz globalne memorije GPU-a učitavaju u lokalnu memoriju. Ovo je samo obična video memorija, koja se nalazi (kao sistemska memorija) odvojeno od "svog" procesora - u slučaju video zapisa, lemljena je sa nekoliko čipova na PCB-u video kartice. Zatim nekoliko stotina niti radi s ovim podacima u lokalnoj memoriji i zapisuje rezultat u globalnu memoriju, nakon čega se prenosi u CPU. Odgovornost programera je da napiše instrukcije za učitavanje i izbacivanje podataka iz lokalne memorije. U suštini, to je particionisanje podataka [specifičnog zadatka] za paralelnu obradu. GPU takođe podržava atomske instrukcije za pisanje/čitanje u memoriju, ali one su neefikasne i obično su potrebne u završnoj fazi da bi se „slepili” rezultati proračuna svih miniprocesora.

Lokalna memorija je zajednička svim nitima koje se izvršavaju u miniprocesoru, pa se, na primjer, u Nvidia terminologiji čak naziva dijeljena, a termin lokalna memorija označava upravo suprotno, naime: određeno osobno područje ​​posebne niti u globalnoj memoriji, vidljive i dostupne samo njoj. Ali pored lokalne memorije, miniprocesor ima još jedno memorijsko područje, koje je u svim arhitekturama otprilike četiri puta veće zapremine. Podijeljeno je podjednako između svih izvršnih niti, to su registri za pohranjivanje varijabli i međurezultata proračuna. Svaka nit ima nekoliko desetina registara. Tačan broj ovisi o tome koliko niti pokreće miniprocesor. Ovaj broj je vrlo važan, budući da je latencija globalne memorije vrlo velika, stotine ciklusa, a u nedostatku keš memorije nema gdje pohraniti međurezultate proračuna.

I još jedna važna karakteristika GPU-a: „meka“ vektorizacija. Svaki miniprocesor ima veliki broj računarskih modula (8 za GT200, 16 za Radeon i 32 za Fermi), ali svi oni mogu izvršiti samo istu instrukciju, sa istom adresom programa. U ovom slučaju, operandi mogu biti različiti, različite niti imaju svoje. Na primjer, upute dodati sadržaj dva registra: istovremeno ga izvršavaju svi računarski uređaji, ali se registri uzimaju različito. Pretpostavlja se da se sve niti GPU programa, koje obavljaju paralelnu obradu podataka, uglavnom kreću u paralelnom toku kroz programski kod. Tako se svi računarski moduli ravnomjerno učitavaju. A ako se niti razilaze u svom putu izvršenja koda zbog grananja u programu, tada dolazi do takozvane serijalizacije. Tada se ne koriste svi računarski moduli, jer niti predaju različite instrukcije za izvršenje, a blok računarskih modula može izvršiti, kao što smo već rekli, samo instrukciju sa jednom adresom. I, naravno, produktivnost pada u odnosu na maksimum.

Prednost je što je vektorizacija potpuno automatska, nije programiranje pomoću SSE, MMX i tako dalje. A GPU sam rješava odstupanja. Teoretski, možete općenito pisati programe za GPU bez razmišljanja o vektorskoj prirodi izvršnih modula, ali brzina takvog programa neće biti velika. Loša strana je velika širina vektora. Veći je od nominalnog broja funkcionalnih modula i iznosi 32 za Nvidia GPU i 64 za Radeon. Niti se obrađuju u blokovima odgovarajuće veličine. Nvidia ovaj blok niti naziva terminom warp, AMD ga naziva talasnim frontom, što je ista stvar. Dakle, na 16 računarskih uređaja, „talasni front“ dužine 64 niti se obrađuje u četiri takta (pod pretpostavkom uobičajene dužine instrukcije). Autor u ovom slučaju preferira termin warp, zbog povezanosti s nautičkim pojmom warp, što znači konopac vezan od tordiranih užadi. Tako se niti "uvijaju" i formiraju čvrst snop. Međutim, „valni front“ se može povezati i s morem: upute stižu aktuatorima na isti način kao što se valovi kotrljaju na obalu jedan za drugim.

Ako su sve niti podjednako napredne u izvršavanju programa (nalaze se na istom mjestu) i samim tim izvršavaju iste instrukcije, onda je sve u redu, ali ako nije, dolazi do usporavanja. U ovom slučaju, niti iz jedne osnove ili talasnog fronta se nalaze na različitim mestima u programu, podeljene su u grupe niti koje imaju istu vrednost broja instrukcije (drugim rečima, pokazivač instrukcije). I samo se niti jedne grupe još uvijek izvršavaju u jednom trenutku - sve izvršavaju istu instrukciju, ali s različitim operandima. Kao rezultat toga, warp radi onoliko puta sporije koliko je broj grupa u koje je podijeljen, a broj niti u grupi nije bitan. Čak i ako se grupa sastoji od samo jedne niti, i dalje će trebati isto vrijeme da se izvrši kao potpuni warp. U hardveru se to implementira maskiranjem određenih niti, odnosno instrukcije se formalno izvršavaju, ali se rezultati njihovog izvršavanja nigdje ne bilježe i ne koriste se u budućnosti.

Iako u svakom trenutku svaki miniprocesor (Streaming MultiProcessor ili SIMD Engine) izvršava instrukcije koje pripadaju samo jednom warp-u (gomila niti), on ima nekoliko desetina aktivnih warp-ova u spremištu za izvršavanje. Nakon što je izvršio instrukcije jednog warpa, miniprocesor ne izvršava sljedeću instrukciju niti ovog warpa, već instrukcije nekog drugog warpa. Taj warp može biti na potpuno drugom mjestu u programu, to neće utjecati na brzinu, jer samo unutar warp-a instrukcije svih niti moraju biti iste za izvršavanje pri punoj brzini.

U ovom slučaju, svaki od 20 SIMD motora ima četiri aktivna fronta talasa, svaki sa 64 niti. Svaka nit je označena kratkom linijom. Ukupno: 64×4×20=5120 niti

Dakle, s obzirom na to da se svaki front ili front talasa sastoji od 32-64 niti, miniprocesor ima nekoliko stotina aktivnih niti koje se izvršavaju gotovo istovremeno. U nastavku ćemo vidjeti kakve arhitektonske prednosti obećava tako veliki broj paralelnih niti, ali prvo ćemo pogledati koja ograničenja imaju miniprocesori koji čine GPU.

Glavna stvar je da GPU nema stek u koji bi se mogli pohraniti parametri funkcije i lokalne varijable. Zbog velikog broja niti, jednostavno nema mjesta na čipu za stek. Zaista, budući da GPU istovremeno izvršava oko 10.000 niti, sa veličinom steka od jedne niti od 100 KB, ukupni volumen će biti 1 GB, što je jednako standardnoj količini sve video memorije. Štaviše, ne postoji način da se stog bilo koje značajne veličine postavi u samo GPU jezgro. Na primjer, ako stavite 1000 bajtova steka na nit, tada će samo jedan miniprocesor zahtijevati 1 MB memorije, što je skoro pet puta više od kombinirane količine lokalne memorije miniprocesora i memorije dodijeljene za pohranjivanje registara.

Prema tome, nema rekurzije u GPU programu, i nema mnogo toga da se uradi sa pozivima funkcija. Sve funkcije se direktno ubacuju u kod prilikom kompajliranja programa. Ovo ograničava opseg GPU aplikacija na zadatke računskog tipa. Ponekad je moguće koristiti ograničenu emulaciju steka koristeći globalnu memoriju za rekurzivne algoritme sa poznatim malim dubinama iteracije, ali ovo nije tipična GPU aplikacija. Da biste to učinili, potrebno je posebno razviti algoritam i istražiti mogućnost njegove implementacije bez garantiranja uspješnog ubrzanja u odnosu na CPU.

Fermi je prvi put uveo mogućnost korištenja virtualnih funkcija, ali opet je njihova upotreba ograničena nedostatkom velike, brze keš memorije za svaku nit. 1536 niti čini 48 KB ili 16 KB L1, odnosno virtuelne funkcije u programu se mogu koristiti relativno rijetko, inače će stog koristiti i sporu globalnu memoriju, što će usporiti izvršenje i, najvjerovatnije, neće donijeti koristi u poređenju sa CPU verzijom.

Dakle, GPU je predstavljen kao računarski koprocesor u koji se učitavaju podaci, obrađuju se nekim algoritmom i proizvodi se rezultat.

Prednosti arhitekture

Ali vrlo brzo izračunava GPU. U tome mu pomaže njegova visoka višenitnost. Veliki broj aktivnih niti omogućava djelimično sakrivanje velike latencije odvojeno locirane globalne video memorije, koja iznosi oko 500 taktova. Posebno je dobro izjednačen za kod sa velikom gustinom aritmetičkih operacija. Dakle, tranzistorska hijerarhija keša L1-L2-L3 nije potrebna. Umjesto toga, višestruki računarski moduli se mogu postaviti na čip, pružajući izvanredne aritmetičke performanse. Dok se instrukcije jedne niti ili warp-a izvršavaju, preostalih stotina niti tiho čekaju svoje podatke.

Fermi je predstavio L2 keš memoriju od oko 1 MB, ali se ne može porediti sa keš memorijom savremeni procesori, više je namijenjen komunikaciji između jezgri i raznim softverskim trikovima. Ako se njegova veličina podijeli na sve desetine hiljada niti, svaka će imati vrlo zanemarljiv volumen.

Ali pored globalnog kašnjenja memorije, postoji mnogo više kašnjenja u računarskom uređaju koje treba sakriti. Ovo je latencija prijenosa podataka na čipu sa računarskih uređaja u keš memoriju prvog nivoa, odnosno lokalnu memoriju GPU-a, te u registre, kao i keš instrukcija. Datoteka registra, kao i lokalna memorija, nalaze se odvojeno od funkcionalnih modula, a brzina pristupa im je otprilike desetak i pol ciklusa. I opet, veliki broj niti, aktivnih iskrivljavanja, može efikasno sakriti ovo kašnjenje. Štaviše, ukupni pristupni propusni opseg (propusni opseg) lokalnoj memoriji čitavog GPU-a, uzimajući u obzir broj miniprocesora koji ga sačinjavaju, znatno je veći od propusnog opsega pristupa kešu prvog nivoa modernih CPU-a. GPU može obraditi znatno više podataka u jedinici vremena.

Možemo odmah reći da ako GPU nije opremljen velikim brojem paralelnih niti, onda će imati gotovo nulte performanse, jer će raditi istim tempom kao da je potpuno opterećen, a radiće mnogo manje posla. Na primjer, neka bude samo jedna nit umjesto 10.000: performanse će pasti za oko hiljadu puta, jer ne samo da neće biti učitani svi blokovi, već će biti pogođene i sve latencije.

Problem sakrivanja kašnjenja je također akutan za moderne visokofrekventne procesore koji se koriste za njegovo otklanjanje - dubinsko izvođenje instrukcija van reda; To zahtijeva složene planere instrukcija, razne bafere, itd., što zauzima prostor na čipu. Ovo je sve potrebno za najbolja izvedba u single-thread modu.

Ali sve ovo nije potrebno za GPU, arhitektonski je brže za računarske zadatke sa velikim brojem niti. Ali pretvara višenitnost u performanse, kao što kamen filozofa pretvara olovo u zlato.

GPU je prvobitno dizajniran za optimalno izvršavanje shader programa za piksele trougla, koji su očigledno nezavisni i mogu se izvršavati paralelno. I iz ovog stanja evoluirao je dodavanjem različitih mogućnosti (lokalne memorije i adresabilnog pristupa video memoriji, kao i kompliciranja skupa instrukcija) u veoma moćan računarski uređaj, koji se i dalje može efikasno koristiti samo za algoritme koji omogućavaju vrlo paralelnu implementaciju koristeći ograničena količina lokalne memorije.

Primjer

Jedan od najklasičnijih problema za GPU je problem izračunavanja interakcije N tijela koja stvaraju gravitacijsko polje. Ali ako, na primjer, trebamo izračunati evoluciju sistema Zemlja-Mjesec-Sunce, onda je GPU loša pomoć za nas: ima malo objekata. Za svaki objekt potrebno je izračunati interakcije sa svim ostalim objektima, a postoje samo dva. U slučaju kretanja Sunčevog sistema sa svim planetama i njihovim mjesecima (oko par stotina objekata), GPU još uvijek nije baš efikasan. Međutim, zbog velikih troškova upravljanja nitima, procesor s više jezgara također neće moći prikazati svu svoju snagu i radit će u single-thread modu. Ali ako također trebate izračunati putanje kometa i objekata asteroidnog pojasa, onda je to već zadatak za GPU, budući da ima dovoljno objekata za stvaranje potrebnog broja paralelnih niti proračuna.

GPU će takođe dobro raditi ako treba da izračunate kolizije globularnih jata stotina hiljada zvezda.

Još jedna prilika za korištenje snage GPU-a u problemu N-tijela javlja se kada trebate izračunati mnogo pojedinačnih problema, iako s malim brojem tijela. Na primjer, ako trebate izračunati opcije za evoluciju jednog sistema za različite opcije za početne brzine. Tada možete efikasno koristiti GPU bez ikakvih problema.

Detalji AMD Radeon mikroarhitekture

Razmotrili smo osnovne principe organizacije GPU-a, oni su zajednički za video akceleratore svih proizvođača, budući da su u početku imali jedan ciljni zadatak - shader programe. Međutim, proizvođači su pronašli priliku da se razlikuju u detaljima mikroarhitektonske implementacije. Iako su CPU različitih proizvođača ponekad vrlo različiti, čak i ako su kompatibilni, kao što su Pentium 4 i Athlon ili Core. Nvidia arhitektura je već dosta poznata, sada ćemo pogledati Radeon i istaći glavne razlike u pristupima ovih proizvođača.

AMD video kartice su dobile punu podršku za računarstvo opšte namene počevši od porodice Evergreen, koja je takođe implementirala DirectX 11 specifikacije po prvi put. Kartice iz porodice 47xx imaju niz značajnih ograničenja, o kojima će biti reči u nastavku.

Razlike u veličini lokalne memorije (32 KB za Radeon naspram 16 KB za GT200 i 64 KB za Fermi) generalno nisu značajne. Kao i veličina fronta talasa od 64 niti za AMD naspram 32 niti u warp-u za Nvidiju. Gotovo svaki GPU program može se lako rekonfigurirati i prilagoditi ovim parametrima. Performanse se mogu promijeniti za desetine posto, ali u slučaju GPU-a to nije toliko važno, jer GPU program obično radi deset puta sporije od svog CPU kolege, ili deset puta brže, ili uopće ne radi.

Važnije je da AMD koristi tehnologiju VLIW (Very Long Instruction Word). Nvidia koristi skalar jednostavna uputstva, koji rade sa skalarnim registrima. Njegovi akceleratori implementiraju jednostavan klasični RISC. AMD video kartice imaju isti broj registara kao i GT200, ali su registri 128-bitni vektorski. Svaka VLIW instrukcija radi na više četvorokomponentnih 32-bitnih registara, što je slično SSE, ali VLIW ima mnogo više mogućnosti. Ovo nije SIMD (Single Instruction Multiple Data) kao SSE – ovdje instrukcije za svaki par operanada mogu biti različite, pa čak i zavisne! Na primjer, neka se komponente registra A nazivaju a1, a2, a3, a4; registar B je sličan. Može se izračunati pomoću jedne instrukcije koja se izvršava u jednom ciklusu takta, na primjer, broj a1×b1+a2×b2+a3×b3+a4×b4 ili dvodimenzionalni vektor (a1×b1+a2×b2, a3 ×b3+a4×b4).

To je bilo moguće zahvaljujući nižoj frekvenciji GPU-a od CPU-a i snažnom smanjenju procesne tehnologije posljednjih godina. U ovom slučaju nije potreban planer skoro sve se izvršava u ciklusu takta.

Zahvaljujući vektorskim instrukcijama, Radeonove vrhunske performanse jednostruke preciznosti su veoma visoke, dostižući teraflops.

Jedan vektorski registar može pohraniti jedan broj dvostruke preciznosti umjesto četiri broja jednostruke preciznosti. I jedna VLIW instrukcija može ili dodati dva para dvostrukih brojeva, ili pomnožiti dva broja, ili pomnožiti dva broja i dodati trećim. Dakle, vršne performanse u double je oko pet puta niže nego u float. Za starije Radeon modele, to odgovara performansama Nvidia Tesla na novoj Fermi arhitekturi i mnogo je veće od performansi duplih kartica na GT200 arhitekturi. U potrošačkim Geforce grafičkim karticama baziranim na Fermi maksimalna brzina dvostruki proračuni su smanjeni za četiri puta.


Šematski dijagram rada Radeona. Prikazan je samo jedan miniprocesor od 20 koji rade paralelno

Proizvođači GPU-a, za razliku od proizvođača CPU-a (prvenstveno onih koji su kompatibilni s x86), nisu vezani problemima kompatibilnosti. GPU program se prvo kompajlira u neki srednji kod, a kada se program pokrene, drajver kompajlira ovaj kod u mašinske instrukcije specifične za model. Kao što je gore opisano, proizvođači GPU-a su to iskoristili tako što su osmislili zgodne ISA (arhitekture skupa instrukcija) za svoje GPU-ove i mijenjali ih iz generacije u generaciju. U svakom slučaju, ovo je dodalo određeni postotak performansi zbog odsustva (kao nepotrebnog) dekodera. Ali AMD je otišao još dalje osmislivši sopstveni format za uređivanje instrukcija u mašinskom kodu. Oni nisu raspoređeni sekvencijalno (prema listi programa), već u sekcije.

Prvo dolazi odeljak uslovnih instrukcija grananja, koje imaju veze sa sekcijama kontinuiranih aritmetičkih instrukcija koje odgovaraju različitim granama. Zovu se VLIW paketi. Ove sekcije sadrže samo aritmetičke instrukcije sa podacima iz registara ili lokalne memorije. Ova organizacija pojednostavljuje upravljanje tokom instrukcija i njihovu isporuku izvršnim uređajima. Ovo je utoliko korisnije s obzirom da VLIW instrukcije imaju relativno velika veličina. Postoje i odjeljci za upute za pristup memoriji.

Odjeljci instrukcija uvjetnog skoka
Odjeljak 0Filijala 0Veza na dio 3 kontinuiranih aritmetičkih uputa
Odjeljak 1Filijala 1Link do odjeljka br. 4
Odjeljak 2Filijala 2Link do sekcije br. 5
Sekcije kontinuiranih aritmetičkih instrukcija
Odjeljak 3VLIW instrukcija 0VLIW uputstvo 1VLIW uputstvo 2VLIW uputstvo 3
Odjeljak 4VLIW uputstvo 4VLIW uputstvo 5
Odjeljak 5VLIW uputstvo 6VLIW uputstvo 7VLIW uputstvo 8VLIW uputstvo 9

GPU-ovi iz Nvidije i AMD-a također imaju ugrađene upute za brzo izračunavanje osnovnih matematičkih funkcija, kvadratnog korijena, eksponenta, logaritma, sinusa i kosinusa za brojeve jednostruke preciznosti u nekoliko ciklusa takta. Za to postoje posebne računarske jedinice. Oni „proizlaze“ iz potrebe da se implementira brza aproksimacija ovih funkcija u geometrijskim shaderima.

Čak i ako neko nije znao da se GPU-ovi koriste za grafiku, a čitao je samo tehničke karakteristike, onda bi po ovom znaku mogao pretpostaviti da su ovi računarski koprocesori nastali iz video akceleratora. Isto tako, na osnovu određenih osobina morskih sisara, naučnici su shvatili da su njihovi preci bili kopnena stvorenja.

Ali očiglednija karakteristika koja otkriva grafičko porijeklo uređaja su jedinice za čitanje 2D i 3D teksture s podrškom za bilinearnu interpolaciju. Oni se široko koriste u GPU programima, jer omogućavaju ubrzano i pojednostavljeno čitanje nizova podataka samo za čitanje. Jedno od standardnih ponašanja GPU aplikacije je da čita nizove izvornih podataka, obrađuje ih u računskim jezgrama i zapisuje rezultat u drugi niz, koji se zatim prenosi nazad u CPU. Ova šema je standardna i uobičajena jer je pogodna za GPU arhitekturu. Zadatke koji zahtijevaju intenzivno čitanje i upisivanje u jednu veliku regiju globalne memorije, tako da sadrže ovisnosti o podacima, teško je paralelizirati i efikasno implementirati na GPU. Takođe, njihova izvedba će uvelike zavisiti od latencije globalne memorije, koja je veoma visoka. Ali ako je zadatak opisan šablonom "čitanje podataka - obrada - pisanje rezultata", onda gotovo sigurno možete dobiti veliki poticaj izvršavanjem na GPU-u.

Za podatke o teksturi u GPU-u postoji posebna hijerarhija malih keš memorija prvog i drugog nivoa. To je ono što omogućava ubrzanje korištenja tekstura. Ova hijerarhija se prvobitno pojavila u GPU-ima kako bi se iskoristila prednost lokalnog pristupa teksturama: očigledno, nakon obrade jednog piksela, susjedni piksel (sa velikom vjerovatnoćom) će zahtijevati podatke o teksturi u blizini. Ali mnogi algoritmi za konvencionalne proračune imaju sličnu prirodu pristupa podacima. Tako će kešovi tekstura iz grafike biti vrlo korisni.

Iako je veličina L1-L2 keš memorija na Nvidia i AMD karticama približno slična, što je očigledno zbog zahtjeva za optimalnošću u smislu grafike igara, latencija pristupa ovim kešovima značajno varira. Nvidia ima veću latenciju pristupa, a kešovi tekstura u GeForce prvenstveno pomažu u smanjenju opterećenja memorijske magistrale, umjesto da direktno ubrzavaju pristup podacima. Ovo nije primetno u grafičkim programima, ali je važno za programe opšte namene. U Radeonu je latencija keša tekstura manja, ali je latencija lokalne memorije miniprocesora veća. Možemo dati sljedeći primjer: za optimalno množenje matrice na Nvidia karticama, bolje je koristiti lokalnu memoriju, učitavajući matricu tamo blok po blok, a za AMD je bolji oslanjaju se na keš teksture niske latencije, čitajući elemente matrice po potrebi. Ali ovo je već prilično suptilna optimizacija, i to za algoritam koji je već fundamentalno prebačen na GPU.

Ova razlika se također vidi kada koristite 3D teksture. Jedan od prvih GPU računarskih benchmarka, koji je pokazao ozbiljnu prednost za AMD, koristio je 3D teksture, jer je radio sa trodimenzionalnim nizom podataka. A kašnjenje pristupa teksturi u Radeonu je znatno brže, a 3D kućište je dodatno optimizovano u hardveru.

Da bi se postigle maksimalne performanse od hardvera različitih kompanija, potrebno je određeno podešavanje aplikacije za određenu karticu, ali to je red veličine manje značajno od razvoja algoritma za GPU arhitekturu u principu.

Ograničenja Radeon 47xx serije

U ovoj porodici podrška za GPU računarstvo je nepotpuna. Mogu se uočiti tri važne tačke. Prvo, ne postoji lokalna memorija, odnosno fizički postoji, ali nema univerzalni pristup koji zahtijeva moderni standard GPU programa. On je emuliran u softveru u globalnoj memoriji, što znači da njegova upotreba, za razliku od potpuno opremljenog GPU-a, neće donijeti prednosti. Druga stvar je ograničena podrška za različite instrukcije operacija atomske memorije i instrukcije za sinhronizaciju. I treća stvar je prilično mala veličina keša instrukcija: počevši od određene veličine programa, brzina se značajno usporava. Postoje i druga manja ograničenja. Možemo reći da će samo programi koji su idealni za GPU dobro raditi na ovoj video kartici. Iako u jednostavnim testnim programima koji rade samo sa registrima, video kartica može pokazati dobre rezultate u Gigaflopsima, problematično je efikasno programirati nešto složeno za nju.

Prednosti i mane Evergreena

Ako uporedite AMD i Nvidia proizvode, onda sa stanovišta GPU računarstva, 5xxx serija izgleda kao vrlo moćan GT200. Toliko moćan da nadmašuje Fermi u vrhunskim performansama za oko dva i po puta. Pogotovo nakon što su smanjeni parametri novih Nvidia video kartica i smanjen broj jezgara. Ali uvođenje L2 keš memorije u Fermi pojednostavljuje implementaciju nekih algoritama na GPU, čime se proširuje opseg GPU-a. Zanimljivo je da za CUDA programe koji su bili dobro optimizirani za prethodnu generaciju GT200, Fermijeve arhitektonske inovacije često nisu dale ništa. Ubrzavali su se proporcionalno povećanju broja računarskih modula, odnosno manje od dva puta (za brojeve jednostruke preciznosti), ili čak manje, jer se memorijski opseg nije povećao (ili iz drugih razloga).

A u zadacima koji su dobro prilagođeni arhitekturi GPU-a i imaju izraženu vektorsku prirodu (na primjer, množenje matrice), Radeon pokazuje performanse relativno bliske teoretskom vrhuncu i nadmašuje Fermija. Da ne spominjemo višejezgarne procesore. Posebno u problemima s brojevima jednostruke preciznosti.

Ali Radeon ima manju površinu matice, manje rasipanje topline, potrošnju energije, veći prinos i, shodno tome, nižu cijenu. A direktno u zadacima 3D grafike, Fermijev dobitak, ako uopće postoji, je mnogo manji od razlike u kristalnoj površini. Ovo je uglavnom zbog činjenice da je Radeon računarska arhitektura sa 16 računarskih jedinica po miniprocesoru, veličinom talasnog fronta od 64 niti i VLIW vektorskim instrukcijama odlična za svoj glavni zadatak - računanje grafičkih shadera. Za ogromnu većinu običnih korisnika, performanse igara i cijena su prioritet.

Sa stanovišta stručnih, naučnih programa, Radeon arhitektura pruža najbolji omjer cijena-performanse, performanse po vatu i apsolutne performanse u zadacima koji su u principu dobro prilagođeni GPU arhitekturi, omogućavajući paralelizaciju i vektorizaciju.

Na primjer, u potpuno paralelnom zadatku odabira ključeva koji se lako vektorizuje, Radeon je nekoliko puta brži od GeForce-a i nekoliko desetina puta brži od CPU-a.

Ovo je u skladu sa opštim konceptom AMD Fusion, prema kojem GPU-ovi treba da dopunjuju CPU, a u budućnosti da budu integrisani u samo jezgro CPU-a, baš kao što je matematički koprocesor prethodno premešten sa posebnog čipa na jezgro procesora (ovo dogodilo prije dvadeset godina, prije pojave prvih Pentium procesora). GPU će biti integrisana grafička jezgra i vektorski koprocesor za strimovanje zadataka.

Radeon koristi pametnu tehniku ​​miješanja instrukcija sa različitih valnih frontova kada ih izvršavaju funkcijski moduli. To je lako učiniti jer su upute potpuno neovisne. Princip je sličan cevovodnom izvršavanju nezavisnih instrukcija od strane modernih CPU-a. Očigledno, ovo omogućava efikasno izvršavanje složenih, višebajtnih vektorskih VLIW instrukcija. U CPU-u, ovo zahtijeva sofisticirani planer za identifikaciju nezavisnih instrukcija ili korištenje Hyper-Threading tehnologije, koja također opskrbljuje CPU namjerno nezavisnim instrukcijama iz različitih niti.

mjera 0mjera 1mjera 2mjera 3bar 4bar 5mjera 6mjera 7VLIW modul
talasni front 0talasni front 1talasni front 0talasni front 1talasni front 0talasni front 1talasni front 0talasni front 1
instr. 0instr. 0instr. 16instr. 16instr. 32instr. 32instr. 48instr. 48VLIW0
instr. 1VLIW1
instr. 2VLIW2
instr. 3VLIW3
instr. 4VLIW4
instr. 5VLIW5
instr. 6VLIW6
instr. 7VLIW7
instr. 8VLIW8
instr. 9VLIW9
instr. 10VLIW10
instr. 11VLIW11
instr. 12VLIW12
instr. 13VLIW13
instr. 14VLIW14
instr. 15VLIW15

128 instrukcija dva talasna fronta, od kojih se svaka sastoji od 64 operacije, izvršava 16 VLIW modula u osam taktova. Dolazi do preplitanja i svaki modul u stvarnosti ima dva ciklusa takta za izvršavanje cijele instrukcije, pod uslovom da u drugom ciklusu takta počne paralelno izvršavati novu. Ovo vjerovatno pomaže da se brzo izvrši VLIW instrukcija kao što je a1×a2+b1×b2+c1×c2+d1×d2, odnosno izvrši osam takvih instrukcija u osam ciklusa takta. (Formalno, ispada da je jedan po mjeri.)

Nvidia očigledno nema takvu tehnologiju. A u nedostatku VLIW-a, visoke performanse koje koriste skalarne instrukcije zahtijevaju rad na visokoj frekvenciji, što automatski povećava rasipanje topline i postavlja visoke zahtjeve za proces (da prisili krug da radi na višoj frekvenciji).

Nedostatak Radeona sa stanovišta GPU računarstva je njegova velika nesklonost grananju. GPU-ovi generalno ne favorizuju grananje zbog gore opisane tehnologije za izvršavanje instrukcija: u grupi niti sa jednom adresom programa odjednom. (Usput, ova tehnika se zove SIMT: Single Instruction - Multiple Threads (jedna instrukcija - mnogo niti), po analogiji sa SIMD, gdje jedna instrukcija izvodi jednu operaciju s različitim podacima.) Međutim, Radeon ne voli posebno grananje: ovo je ovo. je uzrokovana većom veličinom snopa niti. Jasno je da ako program nije potpuno vektorski, onda što je veća veličina fronta osnove ili talasa, to je gore, jer kada se susjedne niti razilaze u svojim programskim stazama, formira se više grupa koje se moraju izvršavati sekvencijalno (serijalizirano). Recimo da su sve niti razbacane, onda ako je veličina osnove 32 niti, program će raditi 32 puta sporije. A u slučaju veličine 64, kao u Radeonu, 64 puta je sporiji.

Ovo je uočljiva, ali ne i jedina manifestacija „neprijateljstva“. U Nvidia video karticama, svaki funkcionalni modul, inače nazvan CUDA jezgro, ima posebnu grananu procesorsku jedinicu. A u Radeon video karticama sa 16 računarskih modula postoje samo dvije granske kontrolne jedinice (uklonjene su iz domena aritmetičkih jedinica). Dakle, čak i jednostavna obrada instrukcije uslovnog skoka, čak i ako je njen rezultat isti za sve niti u prednjem dijelu vala, oduzima dodatno vrijeme. I brzina pada.

AMD takođe proizvodi procesore. Smatraju da je za programe sa velikim brojem grana CPU ipak bolje prilagođen, dok je GPU namijenjen čistim vektorskim programima.

Dakle, Radeon pruža manju ukupnu efikasnost programiranja, ali pruža bolju cijenu/performanse u mnogim slučajevima. Drugim riječima, manje je programa koji se mogu efikasno (profitabilno) migrirati sa CPU-a na Radeon nego što ima programa koji mogu efikasno raditi na Fermiju. Ali oni koji se mogu efikasno preneti će na mnogo načina raditi efikasnije na Radeonu.

API za GPU računarstvo

Same tehničke specifikacije Radeona izgledaju atraktivno, iako nema potrebe idealizirati i apsolutizirati GPU računarstvo. Ali ništa manje važan za produktivnost nije softver neophodan za razvoj i izvršavanje GPU programa - kompajleri iz jezika visokog nivoa i vremena rada, odnosno drajvera koji je u interakciji između dela programa koji radi na CPU-u i GPU-a. sebe. To je još važnije nego u slučaju CPU-a: CPU-u nije potreban drajver za upravljanje prijenosom podataka, a sa stanovišta kompajlera, GPU je izbirljiviji. Na primjer, kompajler se mora zadovoljiti minimalnim brojem registara da bi pohranio međurezultate proračuna, a također pažljivo integrirati pozive funkcija, opet koristeći minimum registara. Na kraju krajeva, što manje registara nit koristi, to se više niti može pokrenuti i potpunije se može učitati GPU, bolje skrivajući vrijeme pristupa memoriji.

A softverska podrška za Radeon proizvode i dalje zaostaje za razvojem hardvera. (Za razliku od situacije sa Nvidiom, gdje je puštanje hardvera odgođeno, a proizvod je pušten u smanjenom obliku.) Nedavno je OpenCL kompajler koji je proizveo AMD imao beta status, sa mnogo nedostataka. Prečesto je generisao pogrešan kod, ili je odbio da prevede kod iz ispravnog izvornog koda, ili je sam proizveo grešku i pao. Tek krajem proljeća objavljeno je izdanje visokih performansi. Ni to nije bez grešaka, ali ih je znatno manje, a one nastaju u bočnim smjerovima pri pokušaju programiranja nečega na granici ispravnosti. Na primjer, rade s tipom uchar4, koji definira 4-bajtnu četverokomponentnu varijablu. Ovaj tip je u OpenCL specifikacijama, ali ne isplati se raditi s njim na Radeonu, jer su registri 128-bitni: iste četiri komponente, ali 32-bitni. I takva uchar4 varijabla će i dalje zauzimati cijeli registar, samo će zahtijevati dodatne operacije pakovanja i pristup pojedinačnim komponentama bajta. Kompajler ne bi trebao imati greške, ali nema kompajlera bez mana. Čak i Intel Compiler nakon 11 verzija ima greške u kompilaciji. Uočene greške se ispravljaju u sljedećem izdanju, koje će biti objavljeno bliže jeseni.

Ali ima još mnogo stvari koje treba poboljšati. Na primjer, standardni Radeon GPU drajver još uvijek ne podržava GPU računanje koristeći OpenCL. Korisnik mora preuzeti i instalirati dodatni specijalni paket.

Ali najvažnija stvar je odsustvo biblioteka funkcija. Za realne brojeve dvostruke preciznosti ne postoji čak ni sinus, kosinus ili eksponent. Pa, ovo nije potrebno za sabiranje i množenje matrice, ali ako želite da programirate nešto složenije, morate napisati sve funkcije od nule. Ili pričekajte novo izdanje SDK-a. ACML (AMD Core Math Library) za Evergreen GPU porodicu sa podrškom za osnovne matrične funkcije bi uskoro trebao biti objavljen.

U ovom trenutku, prema autoru članka, korištenje Direct Compute 5.0 API-ja izgleda realno za programiranje Radeon video kartica, naravno uzimajući u obzir ograničenja: fokus na Windows platforma 7 i Windows Vista. Microsoft ima veliko iskustvo u kreiranju kompajlera, a potpuno funkcionalno izdanje možemo očekivati ​​vrlo brzo, Microsoft je direktno zainteresiran za ovo. Ali Direct Compute je fokusiran na potrebe interaktivnih aplikacija: izračunati nešto i odmah vizualizirati rezultat - na primjer, protok tekućine preko površine. To ne znači da se ne može koristiti samo za proračune, ali to nije njegova prirodna svrha. Recimo da Microsoft ne planira dodati funkcije biblioteke u Direct Compute – samo one koje AMD trenutno nema. Odnosno, ono što se sada može efikasno izračunati na Radeonu - neki ne baš sofisticirani programi - može se implementirati i na Direct Compute, koji je mnogo jednostavniji od OpenCL-a i trebao bi biti stabilniji. Osim toga, potpuno je prenosiv i radit će i na Nvidiji i na AMD-u, tako da morate samo jednom kompajlirati program, dok Nvidia i AMD OpenCL SDK implementacije nisu u potpunosti kompatibilne. (U smislu da ako razvijete OpenCL program u AMD sistem koristeći AMD OpenCL SDK, možda neće raditi tako lako na Nvidiji. Možda ćete morati sastaviti isti tekst sa koristeći Nvidia SDK. I, naravno, obrnuto.)

Zatim, postoji mnogo redundantne funkcionalnosti u OpenCL-u, budući da je OpenCL namijenjen da bude univerzalni programski jezik i API za širok spektar sistema. I GPU, i CPU, i Cell. Dakle, u slučaju da samo treba da napišete program za tipičan korisnički sistem (procesor plus video kartica), čini se da OpenCL nije „visoko produktivan“, da tako kažem. Svaka funkcija ima deset parametara, a devet od njih mora biti postavljeno na 0. A da biste podesili svaki parametar, morate pozvati posebna funkcija, koji takođe ima parametre.

A najvažnija trenutna prednost Direct Compute-a je da korisnik ne mora instalirati poseban paket: sve što je potrebno već je u DirectX 11.

Problemi razvoja GPU računarstva

Ako uzmemo u obzir sferu personalnih računara, situacija je sledeća: nema mnogo zadataka koji zahtevaju veliku računarsku snagu i uveliko nedostaje konvencionalni dvojezgarni procesor. Kao da su velika, proždrljiva, ali nespretna čudovišta ispuzala iz mora na kopno, a na kopnu se gotovo nije imalo što jesti. A iskonska prebivališta zemljine površine se smanjuju u veličini, učeći da manje troše, kao što se uvijek dešava kada postoji nedostatak prirodnih resursa. Kada bi sada postojala ista potreba za performansama kao prije 10-15 godina, GPU računarstvo bi bilo prihvaćeno sa praskom. I tako problemi kompatibilnosti i relativne složenosti GPU programiranja dolaze do izražaja. Bolje je napisati program koji radi na svim sistemima nego program koji radi brzo, ali radi samo na GPU-u.

Izgledi za GPU-ove su nešto bolji u smislu upotrebe u profesionalnim aplikacijama i sektoru radnih stanica, jer tamo postoji veća potreba za performansama. Postoje dodaci za 3D uređivače s podrškom za GPU: na primjer, za renderiranje pomoću praćenja zraka - ne treba ih brkati sa redovnim GPU renderiranjem! Nešto se pojavljuje i za 2D i prezentacijske urednike, sa bržim kreiranjem složenih efekata. Programi za obradu videa takođe postepeno dobijaju podršku za GPU. Gore navedeni zadaci, zbog svoje paralelne prirode, dobro se uklapaju u arhitekturu GPU-a, ali sada vrlo velika baza kod, debagovan, optimizovan za sve mogućnosti CPU-a, tako da će trebati vremena da se pojave dobre GPU implementacije.

U ovom segmentu ima i takvih slabosti GPU-ovi imaju ograničenu količinu video memorije - otprilike 1 GB za obične GPU-ove. Jedan od glavnih faktora koji smanjuju performanse GPU programa je potreba za razmjenom podataka između CPU-a i GPU-a preko spore magistrale, a zbog ograničene memorije, mora se prenijeti više podataka. A ovdje AMD-ov koncept kombiniranja GPU-a i CPU-a u jednom modulu izgleda obećavajuće: možete žrtvovati visoko propusnost grafičku memoriju radi lakšeg i lak pristup na zajedničku memoriju, također sa manjim kašnjenjem. Ovaj visoki propusni opseg trenutne DDR5 video memorije mnogo je traženiji direktno od grafičkih programa nego od većine GPU računarskih programa. Generalno, zajednička memorija GPU-a i CPU-a jednostavno će značajno proširiti opseg GPU-a, omogućavajući korištenje njegovih računarskih sposobnosti u malim podzadacima programa.

A GPU-i su najtraženiji u oblasti naučnog računarstva. Već je napravljeno nekoliko GPU baziranih superračunara, koji pokazuju vrlo visoke rezultate u testu matričnih operacija. Znanstveni problemi su toliko raznoliki i brojni da uvijek postoji mnogo onih koji se savršeno uklapaju u arhitekturu GPU-a, za koje korištenje GPU-a olakšava postizanje visokih performansi.

Ako odaberete jedan od svih zadataka modernih računara, to će biti kompjuterska grafika – slika svijeta u kojem živimo. A optimalna arhitektura za ovu svrhu ne može biti loša. Ovo je toliko važan i temeljan zadatak da hardver posebno dizajniran za njega mora biti univerzalan i optimalan za različite zadatke. Štaviše, video kartice se uspješno razvijaju.

Jedna od najskrivenijih karakteristika u posljednje vrijeme Windows ažuriranje 10, je mogućnost provjere koje aplikacije koriste vašu grafičku procesorsku jedinicu (GPU). Ako ste ikada otvarali Task Manager, vjerovatno ste pogledali korištenje CPU-a da vidite koje aplikacije koriste najviše CPU-a. IN najnovija ažuriranja dodao sličnu funkciju, ali za GPU grafičke procesore. Ovo vam pomaže da shvatite koliko su vaš softver i igre intenzivni na vašem GPU-u bez potrebe da preuzimate softver treće strane. Postoji još jedna zanimljiva karakteristika koja pomaže da vaš CPU rastereti na GPU. Preporučujem da pročitate kako odabrati.

Zašto nemam GPU u upravitelju zadataka?

Nažalost, neće sve video kartice moći pružiti Windows sistem statistike potrebne za čitanje GPU-a. Da biste bili sigurni, možete brzo koristiti DirectX dijagnostički alat da provjerite ovu tehnologiju.

  1. kliknite na " Počni“ i upišite u pretragu dxdiag da pokrenete DirectX Diagnostic Tool.
  2. Idi na "karticu" ekran", desno u koloni " vozači„moraš imati WDDM model više od 2.0 verzije za korištenje GPU grafova u upravitelju zadataka.

Omogućite GPU graf u upravitelju zadataka

Da biste vidjeli korištenje GPU-a za svaku aplikaciju, morate otvoriti upravitelj zadataka.

  • Pritisnite kombinaciju dugmadi Ctrl + Shift + Esc da otvorite upravitelja zadataka.
  • Kliknite desnim tasterom miša u upravitelju zadataka na "prazan" okvir ime" i provjerite iz padajućeg menija GPU Također možete primijetiti GPU jezgro da vidite koji programi ga koriste.
  • Sada u upravitelju zadataka, na desnoj strani možete vidjeti GPU graf i GPU jezgro.


Pogledajte ukupne performanse GPU-a

Možete pratiti ukupnu upotrebu GPU-a kako biste ga pratili pod velikim opterećenjima i analizirali. U tom slučaju možete vidjeti sve što vam je potrebno na kartici " Performanse" odabirom grafički procesor.


Svaki GPU element je raščlanjen na pojedinačne grafikone kako biste dobili još bolji uvid u to kako se vaš GPU koristi. Ako želite promijeniti prikazane grafikone, možete kliknuti na malu strelicu pored naziva svakog zadatka. Ovaj ekran takođe prikazuje verziju i datum vašeg drajvera, što je dobra alternativa upotrebi DXDiag-a ili Device Managera.


Koji program je potreban za rudarenje kriptovalute? Što treba uzeti u obzir pri odabiru rudarske opreme? Kako rudariti Bitcoin i Ethereum pomoću video kartice na računaru?

Ispostavilo se da moćne video kartice nisu potrebne samo ljubiteljima spektakularnih kompjuterskih igrica. Hiljade korisnika širom svijeta koriste grafičke adaptere za zaradu kriptovalute! Od nekoliko kartica sa moćnim procesorima rudari kreirati farme– kompjuterski centri koji izvlače digitalni novac praktično iz ničega!

Sa vama je Denis Kuderin, stručnjak časopisa HeatherBober za pitanja finansija i njihovog kompetentnog umnožavanja. Reći ću ti šta je to rudarenje na video kartici u 17-18, kako odabrati pravi uređaj za zaradu kriptovalute i zašto rudarenje bitcoina na video karticama više nije isplativo.

Također ćete saznati gdje kupiti najproduktivniju i najmoćniju video karticu za profesionalno rudarenje i dobijte stručne savjete o poboljšanju efikasnosti vaše rudarske opreme.

1. Rudarstvo na video kartici - laka zarada ili neopravdani troškovi

Dobra video kartica nije samo adapter digitalni signali, ali i moćan procesor, sposoban za rješavanje složenih računskih problema. I uključujući - izračunajte hash kod za blok lanac (blockchain). Ovo čini grafičke kartice idealnim alatom za rudarstvo– rudarenje kriptovaluta.

pitanje: Zašto procesor za video karticu? Na kraju krajeva, svaki računar ima CPU? Nije li logično vršiti proračune pomoću njega?

odgovor: CPU procesor također može izračunati blockchain, ali to radi stotine puta sporije od procesora video kartice (GPU). I ne zato što je jedno bolje, drugo je gore. Samo imaju različite principe rada. A ako kombinirate nekoliko video kartica, snaga takvog računalnog centra će se povećati nekoliko puta više.

Za one koji nemaju pojma kako se rudari digitalni novac, mali edukativni program. rudarstvo – glavni, a ponekad i jedini način proizvodnje kriptovalute.

Pošto niko ne kuje i ne štampa ovaj novac, a nije materijalna supstanca, već digitalni kod, neko mora da izračuna taj kod. To rade rudari, odnosno njihovi kompjuteri.

Osim izračunavanja koda, rudarenje obavlja još nekoliko važnih zadataka:

  • podrška za decentralizaciju sistema: nedostatak vezanosti za servere je osnova blockchaina;
  • potvrda transakcije– bez rudarenja, operacije neće moći ući u novi blok;
  • formiranje novih blokova sistema– i njihovo unošenje u jedinstveni registar za sve računare.

Želio bih odmah ohladiti žar rudara početnika: proces rudarenja svake godine postaje sve teži. Na primjer, korištenje video kartice dugo je bilo neisplativo.

Samo okorjeli amateri sada kopaju bilješke pomoću GPU-a, budući da su video kartice zamijenjene specijalizovanim procesorima ASIC. Ovi čipovi troše manje energije i računarski su efikasniji. Svi su dobri, ali koštaju otprilike red veličine 130-150 hiljada rubalja .

Moćan model Antminer S9

Na sreću rudara, Bitcoin nije jedina kriptovaluta na planeti, već jedna od stotina. Drugi digitalni novac – Ethereum, Zcash, Expanse, dogecoins itd. I dalje je isplativo rudariti sa video karticama. Naknada je stabilna, a oprema se isplati za otprilike 6-12 mjeseci.

Ali postoji još jedan problem - nedostatak moćnih video kartica.. Himna oko kriptovaluta dovela je do povećanja cijena ovih uređaja. Kupnja nove video kartice pogodne za rudarenje u Rusiji nije tako laka.

Rudari početnici moraju naručiti video adaptere iz online trgovina (uključujući i strane) ili kupiti rabljenu robu. Usput, ne preporučujem da radite ovo drugo: rudarska oprema zastareva i haba se fantastičnom brzinom.

Na Avitu čak prodaju cijele farme za rudarenje kriptovaluta.

Postoji mnogo razloga: neki rudari su se već „dovoljno poigrali“ rudarenja digitalnog novca i odlučili su se baviti profitabilnijim operacijama s kriptovalutama (posebno trgovinom na berzi), drugi su shvatili da nisu u stanju konkurirati moćnim kineskim klasterima koji rade na osnovu elektrana. Drugi su prešli sa video kartica na ASIC.

Međutim, niša i dalje donosi određenu zaradu, a ako odmah počnete koristiti video karticu, imat ćete vremena da uskočite u voz koji kreće u budućnost.

Druga stvar je što je sve više igrača na ovom terenu. Štoviše, ukupan broj digitalnih novčića se ne povećava iz ovoga. Naprotiv, nagrada postaje manja.

Dakle, prije šest godina nagrada za jedan blockchain Bitcoin mreže bila je jednaka 50 novčića, sada je samo 12.5 BTK. Složenost proračuna porasla je 10 hiljada puta. Istina, vrijednost samog Bitcoina je porasla mnogo puta za to vrijeme.

2. Kako rudariti kriptovalutu pomoću video kartice - upute korak po korak

Postoje dvije opcije rudarenja - solo i kao dio bazena. Teško je raditi solo rudarenje - morate imati ogromnu količinu hashrate-a(jedinice snage) tako da započeti proračuni imaju vjerovatnoću uspješnog završetka.

U njemu radi 99% svih rudara bazeni(engleski pool – pool) – zajednice koje se bave distribucijom računarskih zadataka. Zajedničko rudarenje eliminiše faktor slučajnosti i garantuje stabilan profit.

Jedan rudar kojeg poznajem je rekao o ovome: rudarim 3 godine i za to vrijeme nisam komunicirao ni sa kim ko je sam rudario.

Takvi kopači su slični rudarima zlata iz 19. stoljeća. Možete godinama tražiti svoj grumen (u našem slučaju Bitcoin) i dalje ga ne pronaći. Odnosno, blockchain nikada neće biti zatvoren, što znači da nećete dobiti nikakvu nagradu.

“Usamljeni lovci” imaju nešto veće šanse za eter i neke druge kriptovalute.

Zbog jedinstvenog algoritma enkripcije, ETH se ne rudari pomoću posebnih procesora (oni još nisu izmišljeni). Za to se koriste samo video kartice. Brojni farmeri našeg vremena još uvijek opstaju zahvaljujući Ethereumu i drugim altcoinima.

Jedna video kartica neće biti dovoljna za stvaranje punopravne farme: 4 komada – “životna plata” za rudara računajući na stabilan profit. Jednako važan je i moćan sistem hlađenja za video adaptere. I ne gubite iz vida takvu stavku troškova kao što su računi za struju.

Korak po korak upute će vas zaštititi od grešaka i ubrzati postavljanje procesa.

Korak 1. Odaberite bazen

Najveći svjetski fondovi kriptovaluta nalaze se u Kini, kao i na Islandu i u SAD-u. Formalno, ove zajednice nemaju državnu pripadnost, ali su sajtovi na ruskom jeziku retkost na internetu.

Budući da ćete najvjerovatnije morati rudariti Ethereum na video kartici, morat ćete odabrati zajednicu uključenu u izračunavanje ove valute. Iako je Ethereum relativno mlad altcoin, postoji mnogo bazena za njegovo rudarenje. Veličina vašeg prihoda i njegova stabilnost uvelike zavise od izbora zajednice.

Bazen biramo prema sljedećim kriterijima:

  • performanse;
  • radno vrijeme;
  • slava među rudarima kriptovaluta;
  • prisustvo pozitivnih recenzija na nezavisnim forumima;
  • pogodnost podizanja novca;
  • veličina provizije;
  • princip obračuna dobiti.

Promjene se događaju svakodnevno na tržištu kriptovaluta. To se odnosi i na skokove kursa i pojavu novog digitalnog novca - viljuške bitcoin. Događaju se i globalne promjene.

Tako je nedavno postalo poznato da će eter u bliskoj budućnosti preći na fundamentalno drugačiji sistem raspodjele dobiti. Ukratko, prihod u Etherium mreži ostvarit će rudari koji imaju “puno ketsa”, odnosno kovanica, a rudari početnici će morati ili zatvoriti radnju ili preći na drugi novac.

Ali takve “sitnice” nikada nisu zaustavljale entuzijaste. Štaviše, postoji program koji se zove Profitable Pool. Automatski prati najprofitabilnije altcoine za rudarenje u ovom trenutku. Postoji i usluga pretraživanja samih bazena, kao i njihove ocjene u realnom vremenu.

Korak 2. Instalirajte i konfigurišite program

Nakon registracije na web stranici bazena, morate preuzeti poseban program za rudare - nemojte ručno izračunavati kod pomoću kalkulatora. Takvih programa takođe ima dovoljno. Za Bitcoin ovo je - 50 rudar ili CGMiner, za emitovanje – Ethminer.

Postavljanje zahtijeva pažnju i određene vještine. Na primjer, morate znati šta su skripte i biti u mogućnosti da ih uklopite komandna linija vaš računar. Tehničke tačke Savjetujem vam da provjerite kod rudara koji vježbaju, jer svaki program ima svoje nijanse instalacije i konfiguracije.

Korak 3. Registrujte novčanik

Ako još nemate Bitcoin novčanik ili Ethereum skladište, morate ih registrirati. Novčanike preuzimamo sa službenih web stranica.

Ponekad i sami bazeni pružaju pomoć po ovom pitanju, ali ne besplatno.

Korak 4. Pokrenite rudarenje i pratite statistiku

Ostaje samo da pokrenete proces i sačekate prve račune. Obavezno preuzmite pomoćni program koji će pratiti status glavnih komponenti vašeg računala - opterećenje, pregrijavanje itd.

Korak 5. Povucite kriptovalutu

Računari rade non-stop i automatski, računajući kod. Sve što trebate učiniti je osigurati da kartice ili drugi sistemi ne pokvare. Kriptovaluta će teći u vaš novčanik brzinom koja je direktno proporcionalna količini hashrate-a.

Kako pretvoriti digitalnu valutu u fiat valutu? Pitanje vrijedno posebnog članka. Ukratko, najviše brz način- mjenjačnice. Oni uzimaju postotak za svoje usluge, a vaš zadatak je pronaći najisplativiju stopu uz minimalnu proviziju. U tome će vam pomoći profesionalna usluga poređenja izmjenjivača.

– najbolji resurs ove vrste u Runetu. Ovo praćenje upoređuje performanse više od 300 mjenjačnica i pronalazi najbolje kotacije za valutne parove koji vas zanimaju. Osim toga, usluga označava rezerve kriptovalute u blagajni. Monitoring liste sadrže samo proverene i pouzdane servise razmene.

3. Na šta treba obratiti pažnju pri odabiru video kartice za rudarenje

Trebate mudro odabrati video karticu. Prvi na koji naiđete ili onaj koji je već na vašem računaru će također moj, ali ova moć će biti zanemarljiva čak i za etere.

Glavni pokazatelji su sljedeći: performanse (snaga), potrošnja energije, hlađenje, izgledi za overklok.

1) Snaga

Ovdje je sve jednostavno - što su performanse procesora veće, to je bolje za izračunavanje hash koda. Odlične performanse pružaju kartice sa memorijskim kapacitetom većim od 2 GB. I izaberite uređaje sa 256-bitnom magistralom. 128-bitni nisu prikladni za ovu svrhu.

2) Potrošnja energije

Snaga je, naravno, velika - visok hashrate i sve to. Ali ne zaboravite na pokazatelje potrošnje energije. Neka produktivna gazdinstva „pojedu“ toliko električne energije da se troškovi jedva nadoknađuju ili nikako.

3) Hlađenje

Standardni se sastoji od 4-16 karata. Proizvodi prekomjernu količinu topline, koja je štetna za željezo i nepoželjna za samog farmera. Život i rad u jednosobnom stanu bez klime biće, blago rečeno, neugodan.

Kvalitetno hlađenje procesora je neophodan uslov za uspješno rudarenje

Stoga, kada birate dvije kartice sa istim performansama, dajte prednost onoj sa indikator manje toplotne snage (TDP) . Najbolje parametre hlađenja pokazuju Radeon kartice. Ovi isti uređaji rade duže od svih ostalih kartica u aktivnom načinu rada bez trošenja.

Dodatni hladnjaci ne samo da će ukloniti višak topline iz procesora, već će i produžiti njihov vijek trajanja.

4) Mogućnost overkloka

Overclocking je prisilno povećanje performansi video kartice. Mogućnost "overclockanja kartice" zavisi od dva parametra - GPU frekvencije i frekvencije video memorije. Ovo su oni koje ćete overklokovati ako želite povećati računarsku snagu.

Koje video kartice da nabavim? Trebat će vam uređaji najnovije generacije ili barem grafički akceleratori objavljeni prije 2-3 godine. Rudari koriste kartice AMD Radeon, Nvidia, GeForce GTX.

Pogledajte tabelu povrata za video kartice (podaci su aktuelni na kraju 2017. godine):

4. Gdje kupiti video karticu za rudarenje – pregled TOP 3 trgovine

Kao što sam već rekao, sa rastućom popularnošću rudarenja, video kartice su postale deficitarna roba. Da kupim potreban uređaj, morat ćete potrošiti mnogo vremena i truda.

Naša recenzija će vam pomoći najbolji poeni online prodaja.

1) TopComputer

Moskovski hipermarket specijalizovan za kompjuterske i kućne aparate. Na tržištu posluje više od 14 godina, isporučujući robu iz cijelog svijeta po gotovo proizvođačkim cijenama. Postoji brza dostava, besplatna za Moskovljane.

U vrijeme pisanja, karte su u prodaji AMD, Nvidia(8 Gb) i druge varijante pogodne za rudarenje.

2) Mybitcoinshop

specijalizirana radnja, trgovina isključivo robom za rudarstvo. Ovdje ćete pronaći sve što vam je potrebno za izgradnju kućne farme - video kartice potrebne konfiguracije, napajanja, adaptere, pa čak i ASIC rudare (za rudare nove generacije). Postoji plaćena dostava i preuzimanje iz skladišta u Moskvi.

Kompanija je više puta dobila neslužbenu titulu najbolje trgovine za rudare u Ruskoj Federaciji. Brza usluga, prijateljski odnos prema kupcima, napredna oprema su glavne komponente uspeha.

3) Ship Shop America

Kupovina i dostava robe iz SAD. Posrednička kompanija za one kojima su potrebni istinski ekskluzivni i vrhunski proizvodi za rudarstvo.

Direktan partner vodećeg proizvođača video kartica za igre i rudarenje – Nvidia. Maksimalni period čekanja na robu je 14 dana.

5. Kako povećati prihod od rudarenja na video kartici - 3 korisna savjeta

Nestrpljivi čitaoci koji žele da počnu da rudare odmah i primaju prihod od sutra ujutro, sigurno će se zapitati - koliko rudari zarađuju?

Zarada zavisi od opreme, kursa kriptovalute, efikasnosti bazena, snage farme, hashrate-a i gomile drugih faktora. Neki uspijevaju primati i do mjesečno 70.000 u rubljama , drugi su zadovoljni 10 dolara sedmično. Ovo je nestabilan i nepredvidiv posao.

Korisni savjeti će vam pomoći da povećate svoje prihode i optimizirate svoje troškove.

Ako rudarite valutu koja brzo raste u cijeni, zaradit ćete više. Na primjer, eter sada košta oko 300 dolara, Bitcoin – više 6000 . Ali morate uzeti u obzir ne samo trenutnu vrijednost, već i stopu rasta tokom sedmice.

Savjet 2. Koristite rudarski kalkulator za odabir optimalnog hardvera

Kalkulator za rudarenje na web stranici bazena ili drugoj specijaliziranoj usluzi pomoći će vam da odaberete optimalni program, pa čak i video karticu za rudarenje.

Nikada ne može biti previše jezgara...

Moderni GPU-ovi su monstruozne, brze zvijeri sposobne prožvakati gigabajte podataka. Međutim, čovjek je lukav i, koliko god računarska snaga raste, dolazi do sve složenijih problema, pa dolazi trenutak kada nažalost moramo priznati da je potrebna optimizacija 🙁

Ovaj članak opisuje osnovne koncepte kako bi se olakšalo snalaženje u teoriji optimizacije GPU-a i osnovnim pravilima kako bi se ti koncepti morali rjeđe baviti.

Razlozi zašto su GPU-ovi efikasni za rad s velikim količinama podataka koji zahtijevaju obradu:

  • imaju velike mogućnosti za paralelno izvršavanje zadataka (mnogo, mnogo procesora)
  • visok memorijski propusni opseg

Propusnost memorije- ovo je koliko informacija - bit ili gigabajt - može da se prenese po jedinici vremena - sekundi ili ciklusu procesora.

Jedan od zadataka optimizacije je korištenje maksimalne propusnosti – za povećanje performansi propusnost(idealno bi trebao biti jednak propusnosti memorije).

Da poboljšate korištenje propusnog opsega:

  • povećajte količinu informacija - iskoristite propusni opseg do maksimuma (na primjer, svaki stream radi sa float4)
  • smanjiti kašnjenje - kašnjenje između operacija

Latencija– vremenski period između trenutaka kada je kontroler zatražio određenu memorijsku ćeliju i trenutka kada su podaci postali dostupni procesoru za izvršavanje instrukcija. Na samo kašnjenje ne možemo uticati ni na koji način - ova ograničenja su prisutna na hardverskom nivou. Zbog ovog kašnjenja procesor može istovremeno servisirati nekoliko niti - dok je nit A zatražila da joj dodijeli memoriju, nit B može nešto izračunati, a nit C može čekati dok joj traženi podaci ne stignu.

Kako smanjiti kašnjenje ako se koristi sinhronizacija:

  • smanjiti broj niti u bloku
  • povećati broj blok grupa

Potpuna upotreba GPU resursa – Zauzetost GPU-a

U visokim razgovorima o optimizaciji često se pojavljuje izraz - zauzetost gpu-a ili zauzetost kernela– odražava efikasnost korišćenja resursa video kartice. Želio bih posebno napomenuti da čak i ako koristite sve resurse, to ne znači da ih koristite ispravno.

Računarska snaga GPU-a je stotine računarski gladnih procesora pri kreiranju programa - kernela - teret raspodjele opterećenja pada na ramena programera. Greška može ostaviti veliki dio ovih dragocjenih resursa neaktivnim. Sada ću objasniti zašto. Moraćemo da počnemo izdaleka.

Dozvolite mi da vas podsjetim da warp ( warp u terminologiji NVidia, talasni front – u AMD terminologiji) je skup niti koje istovremeno obavljaju istu funkciju kernela na procesoru. Niti koje je programator ujedinio u blokove dijele se u iskrivljene pomoću planera niti (posebno za svaki multiprocesor) - dok jedan warp radi, drugi čeka na obradu memorijskih zahtjeva itd. Ako neke od warp niti još uvijek izvode proračune, dok su druge već učinile sve što su mogle, postoji neefikasna upotreba računarskog resursa - popularno nazvan kapacitet mirovanja.

Svaka tačka sinhronizacije, svaka grana logike može generisati takvu situaciju mirovanja. Maksimalna divergencija (grananje logike izvršenja) zavisi od veličine osnove. Za NVidia GPU je 32, za AMD je 64.

Da biste smanjili vrijeme zastoja višeprocesora tokom izvođenja warp-a:

  • minimizirati vrijeme čekanja na barijeru
  • minimizirati divergenciju logike izvršenja u funkciji kernela

Za efikasno rešenje Za ovaj problem ima smisla otkriti kako nastaju deformacije (za slučaj sa nekoliko dimenzija). Zapravo, redoslijed je jednostavan - prvo u X, zatim u Y i, na kraju, u Z.

kernel se pokreće s blokovima veličine 64x16, niti su podijeljene na osnove po redoslijedu X, Y, Z - tj. prva 64 elementa su podijeljena u dva osnova, zatim u drugu itd.

Kernel radi sa blokovima 16x64. Prvi i drugi 16 elemenata dodaju se prvoj osnovici, treći i četvrti - drugoj osnovi itd.

Kako smanjiti divergenciju (zapamtite, grananje nije uvijek uzrok kritičnog gubitka performansi)

  • kada susjedni tokovi imaju različite puteve izvršenja - postoji mnogo uvjeta i prijelaza duž njih - potražite načine za restrukturiranje
  • potražite neuravnoteženo opterećenje niti i odlučno ga uklonite (to je kada ne samo da imamo uslove, već zbog tih uslova prva nit uvijek nešto izračuna, a peta ne ispunjava ovaj uvjet i miruje)

Kako maksimalno iskoristiti svoje GPU resurse

GPU resursi, nažalost, također imaju svoja ograničenja. I, striktno govoreći, prije pokretanja funkcije kernela, ima smisla odrediti ograničenja i uzeti ta ograničenja u obzir prilikom raspodjele opterećenja. Zašto je ovo važno?

Video kartice imaju ograničenja na ukupan broj niti koje jedan multiprocesor može izvršiti, maksimalan broj niti u jednom bloku, maksimalan broj iskrivljenja na jednom procesoru, ograničenja na različite vrste memorije, itd. Sve ove informacije mogu se zatražiti bilo programski, preko odgovarajućeg API-ja, ili prethodno korištenjem uslužnih programa iz SDK-a. (deviceQuery moduli za NVidia uređaje, CLINfo - za AMD video kartice).

Opća praksa:

  • broj blokova niti/radnih grupa mora biti višekratnik broja stream procesora
  • veličina bloka/radne grupe mora biti višekratnik veličine osnove

Treba uzeti u obzir da je apsolutni minimum 3-4 warpa/wayfronta koji se vrte istovremeno na svakom procesoru. U isto vrijeme, ne zaboravite na hardverska ograničenja!

Držanje svih ovih detalja u glavi brzo postaje dosadno, pa je za izračunavanje zauzetosti GPU-a NVidia ponudila neočekivani alat - Excel(!) kalkulator pun makroa. Tamo možete unijeti informacije o maksimalnom broju niti za SM, broju registara i veličini ukupne (dijeljene) memorije dostupne na stream procesoru, te korištene parametre pokretanja funkcije - i prikazuje efikasnost korištenja resursa kao postotak (i ​​čupate kosu shvativši da vam nedostaju registri za korištenje svih jezgara).

Informacije o upotrebi:
http://docs.nvidia.com/cuda/cuda-c-best-practices-guide/#calculating-occupancy

GPU i memorijske operacije

Video kartice su optimizirane za 128-bitne memorijske operacije. One. idealno, svaka manipulacija memorijom bi idealno trebala promijeniti 4 vrijednosti od četiri bajta odjednom. Glavni problem za programera je što moderni GPU kompajleri ne znaju kako da optimizuju takve stvari. Ovo se mora uraditi direktno u kodu funkcije i, u prosjeku, donosi djelić procenta povećanja performansi. Učestalost zahtjeva za memorijom ima mnogo veći utjecaj na performanse.

Problem je sljedeći: svaki zahtjev vraća dio podataka koji je višekratnik veličine 128 bita. I svaka nit koristi samo četvrtinu (u slučaju obične varijable od četiri bajta). Kada susjedne niti istovremeno rade s podacima koji se nalaze uzastopno u memorijskim ćelijama, to smanjuje ukupan broj pristupa memoriji. Ovaj fenomen se naziva kombinovane operacije čitanja i pisanja ( spojeni pristup – dobro! i čitati i pisati) – i sa pravilnom organizacijom koda ( brzi pristup neprekidnom komadu memorije – loše!) može značajno poboljšati performanse. Kada organizujete svoju jezgru - zapamtite - kontinuirani pristup - unutar elemenata jednog reda memorije, rad sa elementima kolone više nije tako efikasan. Želite više detalja? Svidio mi se ovaj pdf - ili google za “ tehnike spajanja memorije “.

Vodeću poziciju u kategoriji „uskog grla“ zauzima još jedna memorijska operacija – kopiranje podataka iz memorije hosta u GPU . Kopiranje se ne dešava ionako, već iz memorijske oblasti koju su posebno dodijelili drajver i sistem: kada postoji zahtjev za kopiranjem podataka, sistem prvo kopira te podatke tamo, a tek onda ih učitava u GPU. Brzina transporta podataka ograničena je propusnim opsegom magistrale PCI Express xN (gdje je N broj podatkovnih linija) preko kojih moderne video kartice komuniciraju sa hostom.

Međutim, nepotrebno kopiranje spore memorije na hostu je ponekad neopravdan trošak. Rješenje je korištenje tzv zakačena memorija – posebno označeno memorijsko područje, tako da operativni sistem nije u mogućnosti da izvrši nikakve operacije sa njim (na primjer, da ga swap/premjesti po svom nahođenju, itd.). Prijenos podataka sa hosta na video karticu vrši se bez sudjelovanja operativni sistem– asinhrono, preko DMA (direktan pristup memoriji).

I za kraj, još malo o pamćenju. Zajednička memorija na multiprocesoru je obično organizirana u obliku memorijskih banaka koje sadrže 32-bitne riječi – podatke. Broj banaka, prema dobroj tradiciji, varira od generacije do generacije GPU-a - 16/32 Ako svaka nit pristupa zasebnoj banci za podatke, sve je u redu. U suprotnom, dobijamo nekoliko zahteva za čitanje/pisanje jednoj banci i dobijamo konflikt ( konflikt zajedničke memorijske banke). Takvi konfliktni pozivi se serijaliziraju i stoga se izvršavaju sekvencijalno, a ne paralelno. Ako sve niti pristupaju jednoj banci, koristi se “broadcast” odgovor ( emitovanje) i nema sukoba. Postoji nekoliko načina za efikasno rješavanje sukoba pristupa, svidjelo mi se opis glavnih tehnika za otklanjanje sukoba pristupa memorijskim bankama – .

Kako matematičke operacije učiniti još bržim? Zapamtite to:

  • Izračuni dvostruke preciznosti su operacija velikog opterećenja sa fp64 >> fp32
  • konstante oblika 3.13 u kodu se prema zadanim postavkama tumače kao fp64 ako 3.14f nije eksplicitno specificirano
  • Da biste optimizirali matematiku, bilo bi dobro provjeriti vodiče da vidite ima li kompajler neke zastavice
  • Proizvođači uključuju funkcije u svoje SDK-ove koji iskorištavaju karakteristike uređaja za postizanje performansi (često na štetu prenosivosti)

Ima smisla da CUDA programeri obrate veliku pažnju na koncept cuda stream omogućavajući vam da pokrenete nekoliko funkcija kernela na jednom uređaju odjednom ili kombinirate asinkrono kopiranje podataka sa hosta na uređaj dok izvršavate funkcije. OpenCL još ne pruža takvu funkcionalnost :)

Biljke za profilisanje:

NVifia Visual Profiler je zanimljiv uslužni program koji analizira i CUDA i OpenCL kernele.

P.S. Kao opsežniji vodič za optimizaciju, mogu preporučiti guglanje svih vrsta vodič za najbolje prakse za OpenCL i CUDA.

  • ,