Programmēšana

Kas ir CUDA? Paralēla programmēšana GPU

CUDA ir paralēla skaitļošanas platforma un programmēšanas modelis, ko Nvidia izstrādājusi vispārējai skaitļošanai uz saviem GPU (grafikas procesoriem). CUDA ļauj izstrādātājiem paātrināt skaitļošanas ietilpīgas lietojumprogrammas, izmantojot GPU jaudu paralelizējamajai skaitļošanas daļai.

Lai gan ir bijuši arī citi GPU piedāvātie API, piemēram, OpenCL, un ir konkurētspējīgi citu uzņēmumu, piemēram, AMD, procesori, CUDA un Nvidia GPU kombinācija dominē vairākās lietojumprogrammu jomās, ieskaitot dziļu mācīšanos, un ir pamats dažiem no ātrākie datori pasaulē.

Grafikas kartes neapšaubāmi ir tikpat vecas kā personālais dators - tas ir, ja jūs uzskatāt, ka 1981. gada IBM vienkrāsainā displeja adapteris ir grafikas karte. Līdz 1988. gadam jūs varētu iegūt 16 bitu 2D VGA Wonder karti no ATI (uzņēmums, kuru galu galā iegādājās AMD). Līdz 1996. gadam jūs varētu iegādāties 3Dfx Interactive 3D grafisko paātrinātāju, lai ar pilnu ātrumu varētu vadīt pirmās personas šāvēju Quake.

Arī 1996. gadā Nvidia sāka mēģināt konkurēt 3D paātrinātāju tirgū ar vājiem produktiem, taču mācījās, kā tas gāja, un 1999. gadā ieviesa veiksmīgo GeForce 256, pirmo grafisko karti, ko sauc par GPU. Tajā laikā galvenais GPU iegūšanas iemesls bija spēles. Tikai vēlāk cilvēki izmantoja GPU matemātikai, zinātnei un inženierzinātnēm.

CUDA izcelsme

2003. gadā Iana Buka vadītā pētnieku grupa atklāja Bruku - pirmo plaši pieņemto programmēšanas modeli, kas paplašināja C ar datiem paralēlām konstrukcijām. Vēlāk Buks pievienojās Nvidia un vadīja CUDA izlaišanu 2006. gadā - pirmo komerciālo risinājumu vispārējas nozīmes skaitļošanai uz GPU.

OpenCL pret CUDA

CUDA konkurentu OpenCL uzsāka Apple un Khronos grupa 2009. gadā, mēģinot nodrošināt neviendabīgas skaitļošanas standartu, kas neaprobežotos tikai ar Intel / AMD procesoriem ar Nvidia GPU. Lai gan OpenCL izklausās pievilcīgi sava vispārīguma dēļ, Nvidia GPU tas nav darbojies tikpat labi kā CUDA, un daudzi dziļu mācību ietvarstruktūras to vai nu neatbalsta, vai arī atbalsta tikai kā pēcpārdomu, tiklīdz viņu CUDA atbalsts ir atbrīvots.

CUDA veiktspējas palielināšana

CUDA gadu gaitā ir uzlabojusi un paplašinājusi tā darbības jomu, vairāk vai mazāk slēdzot ar uzlabotiem Nvidia GPU. Sākot ar CUDA versiju 9.2, izmantojot vairākus P100 servera GPU, jūs varat sasniegt pat 50x veiktspējas uzlabojumus salīdzinājumā ar CPU. V100 (nav parādīts šajā attēlā) dažām slodzēm ir vēl 3x ātrāks. Iepriekšējās paaudzes servera GPU, K80, piedāvāja 5x līdz 12x veiktspējas uzlabojumus salīdzinājumā ar CPU.

Nvidia

GPU ātruma palielinājums ir pienācis laiks augstas veiktspējas skaitļošanai. Vienu pavedienu CPU veiktspējas pieaugums laika gaitā, ko Mūra likums ieteica divkāršot ik pēc 18 mēnešiem, ir palēninājies līdz 10 procentiem gadā, jo mikroshēmu ražotāji ražošanas procesā saskārās ar fiziskām robežām, ieskaitot mikroshēmas maskas izšķirtspējas lieluma ierobežojumus un mikroshēmu ražu un siltuma ierobežojumi pulksteņa frekvencēs izpildlaikā.

Nvidia

CUDA lietojumprogrammu domēni

Nvidia

CUDA un Nvidia GPU ir pieņemti daudzās jomās, kurām nepieciešama augsta peldošā komata skaitļošanas veiktspēja, kā tas ir attēlots iepriekš attēlā. Plašākā sarakstā ietilpst:

  1. Skaitļošanas finanses
  2. Klimata, laika apstākļu un okeāna modelēšana
  3. Datu zinātne un analīze
  4. Dziļa mācīšanās un mašīnmācīšanās
  5. Aizsardzība un izlūkošana
  6. Ražošana / AEC (arhitektūra, inženierzinātnes un celtniecība): CAD un CAE (ieskaitot skaitļošanas šķidruma dinamiku, skaitļošanas strukturālo mehāniku, dizainu un vizualizāciju un elektronisko dizaina automatizāciju)
  7. Multivide un izklaide (ieskaitot animāciju, modelēšanu un atveidošanu; krāsu korekcija un graudu pārvaldība; komponēšana; apdare un efekti; rediģēšana; kodēšana un digitālā izplatīšana; ēteriskā grafika; iestatīšanas, pārskata un stereo rīki; un laika grafika)
  8. Medicīniskā attēlveidošana
  9. Eļļa un gāze
  10. Pētījumi: Augstākā izglītība un superdatori (ieskaitot skaitļošanas ķīmiju un bioloģiju, skaitlisko analīzi, fiziku un zinātnisko vizualizāciju)
  11. Drošība
  12. Rīki un pārvaldība

CUDA dziļās mācībās

Dziļai mācībai ir pārāk liela vajadzība pēc skaitļošanas ātruma. Piemēram, lai apmācītu Google tulkotāja modeļus 2016. gadā, Google Brain un Google Translate komandas veica simtiem vienas nedēļas TensorFlow skrējienu, izmantojot GPU; viņi šim nolūkam no Nvidia bija iegādājušies 2000 servera līmeņa GPU. Bez GPU šiem apmācības braucieniem būtu vajadzējuši mēnešus, nevis nedēļu, lai saplūstu. Šo TensorFlow tulkošanas modeļu izvietošanai Google izmantoja jaunu pielāgotu apstrādes mikroshēmu TPU (tenzora apstrādes vienība).

Papildus TensorFlow daudziem citiem DL ietvariem GPU atbalsts ir atkarīgs no CUDA, tostarp Caffe2, CNTK, Databricks, H2O.ai, Keras, MXNet, PyTorch, Theano un Torch. Lielākajā daļā gadījumu viņi izmanto cuDNN bibliotēku dziļo neironu tīkla aprēķiniem. Šī bibliotēka ir tik svarīga dziļo mācību sistēmu apmācībai, ka visiem ietvariem, kas izmanto noteiktu cuDNN versiju, būtībā ir vienādi veiktspējas numuri līdzvērtīgiem lietošanas gadījumiem. Kad CUDA un cuDNN uzlabojas no vienas versijas uz citu, visi dziļo mācību ietvari, kas tiek atjaunināti uz jauno versiju, uzlabo veiktspēju. Ja veiktspēja parasti atšķiras atkarībā no ietvara, ir tas, cik labi tie tiek mērogoti līdz vairākiem GPU un vairākiem mezgliem.

CUDA programmēšana

Nvidia

CUDA rīkkopa

CUDA rīkkopa ietver bibliotēkas, atkļūdošanas un optimizācijas rīkus, kompilatoru, dokumentāciju un izpildlaika bibliotēku, lai izvietotu lietojumprogrammas. Tam ir komponenti, kas atbalsta dziļu mācīšanos, lineāru algebru, signālu apstrādi un paralēlus algoritmus. Kopumā CUDA bibliotēkas atbalsta visas Nvidia GPU saimes, taču vislabāk darbojas jaunākajā paaudzē, piemēram, V100, kas var būt 3 reizes ātrāks nekā P100 dziļu mācību treniņu slodzei. Vienas vai vairāku bibliotēku izmantošana ir vienkāršākais veids, kā izmantot GPU priekšrocības, ja vien nepieciešamie algoritmi ir ieviesti attiecīgajā bibliotēkā.

Nvidia

CUDA dziļo mācību bibliotēkas

Dziļās mācīšanās sfērā ir trīs galvenās ar GPU paātrinātās bibliotēkas: cuDNN, kuru jau iepriekš minēju kā GPU komponentu lielākajai daļai atvērtā koda dziļo mācību sistēmu; TensorRT, kas ir Nvidia augstas veiktspējas dziļo mācību secinājumu optimizētājs un izpildlaiks; un DeepStream, video secinājumu bibliotēka. TensorRT palīdz jums optimizēt neironu tīkla modeļus, kalibrēt ar zemu precizitāti ar augstu precizitāti un apmācītos modeļus izvietot mākoņos, datu centros, iegultās sistēmās vai automobiļu produktu platformās.

Nvidia

CUDA lineārās algebras un matemātikas bibliotēkas

Lineārā algebra ir tenzora aprēķinu pamatā, un tāpēc tā ir dziļa mācīšanās. BLAS (Basic Linear Algebra Subprograms), matricas algoritmu kolekciju, kas ieviesta Fortranā 1989. gadā, kopš tā laika izmanto zinātnieki un inženieri. cuBLAS ir BLAS paātrināta GPU versija un vislielākās veiktspējas veids, kā veikt matricu aritmētiku ar GPU. cuBLAS pieņem, ka matricas ir blīvas; cuSPARSE apstrādā retas matricas.

Nvidia

CUDA signālu apstrādes bibliotēkas

Ātrā Furjē transformācija (FFT) ir viens no pamata algoritmiem, ko izmanto signālu apstrādei; tas signālu (piemēram, audio viļņu formu) pārvērš par frekvenču spektru. cuFFT ir GPU paātrināta FFT.

Kodekus, izmantojot tādus standartus kā H.264, kodē / saspiež un atšifrē / atšifrē video pārraidei un attēlošanai. Nvidia Video Codec SDK paātrina šo procesu ar GPU.

Nvidia

CUDA paralēlo algoritmu bibliotēkas

Trīs paralēlo algoritmu bibliotēkām ir atšķirīgi mērķi. NCCL (Nvidia Collective Communications Library) ir paredzēta lietotņu mērogošanai vairākos GPU un mezglos; nvGRAPH ir paredzēts paralēlu grafu analīzei; un Thrust ir CUDA veidņu bibliotēka CUDA, kuras pamatā ir C ++ standarta veidņu bibliotēka. Vilciens nodrošina bagātīgu datu paralēlu primitīvu kolekciju, piemēram, skenēšanu, šķirošanu un samazināšanu.

Nvidia

CUDA pret CPU veiktspēju

Dažos gadījumos līdzvērtīgu CPU funkciju vietā varat izmantot nolaižamās CUDA funkcijas. Piemēram, BLAS GEMM matricas reizināšanas rutīnas var aizstāt ar GPU versijām, vienkārši izveidojot saiti uz NVBLAS bibliotēku:

Nvidia

CUDA programmēšanas pamati

Ja nevarat atrast CUDA bibliotēkas rutīnas programmu paātrināšanai, jums būs jāizmēģina savs darbs zemā līmeņa CUDA programmēšanā. Tagad tas ir daudz vieglāk nekā tad, kad es to izmēģināju 2000. gadu beigās. Cita iemesla dēļ ir vieglāka sintakse un ir pieejami labāki izstrādes rīki. Mana vienīgā problēma ir tā, ka MacOS jaunākais CUDA kompilators un jaunākais C ++ kompilators (no Xcode) reti tiek sinhronizēti. Ir jālejupielādē vecāki komandrindas rīki no Apple un jāpārslēdzas uz tiem, izmantojot xcode-select lai iegūtu CUDA kodu apkopošanai un saistīšanai.

Piemēram, apsveriet šo vienkāršo C / C ++ rutīnu, lai pievienotu divus masīvus:

void add (int n, float * x, float * y)

{  

par (int i = 0; i <n; i ++)

y [i] = x [i] + y [i];

}

Jūs varat to pārvērst par kodolu, kas darbosies GPU, pievienojot __global__ deklarācijas atslēgvārds un izsauciet kodolu, izmantojot trīskavas iekavas sintaksi:

pievienot << >> (N, x, y);

Jums arī jāmaina savs malloc/jauns un bez maksas/dzēst zvani uz cudaMallocManaged un cudaFree lai jūs piešķirtu vietu GPU. Visbeidzot, pirms CPU rezultātu izmantošanas jums ir jāgaida GPU aprēķinu pabeigšana, ar kuru jūs varat veikt cudaDeviceSynchronize.

Iepriekš minētajā trīskāršajā kronšteinā tiek izmantots viens pavedienu bloks un viens pavediens. Pašreizējie Nvidia GPU var apstrādāt daudzus blokus un pavedienus. Piemēram, Tesla P100 GPU, kas balstīts uz Pascal GPU arhitektūru, ir 56 straumēšanas daudzprocesori (SM), no kuriem katrs spēj atbalstīt līdz 2048 aktīviem pavedieniem.

Kodola kodam būs jāzina tā bloks un pavedienu indekss, lai atrastu tā nobīdi nodotajos masīvos. Paralelētais kodols bieži izmanto a režģis-solis cilpa, piemēram:

__global__

void add (int n, float * x, float * y)

{

int indekss = blockIdx.x * blockDim.x + threadIdx.x;

int solis = blockDim.x * gridDim.x;

for (int i = indekss; i <n; i + = solis)

y [i] = x [i] + y [i];

}

Aplūkojot CUDA rīkkopa paraugus, redzēsiet, ka ir jāņem vērā vairāk nekā pamati, kurus es aplūkoju iepriekš. Piemēram, daži CUDA funkciju izsaukumi ir jāiesaiņo checkCudaErrors () zvani. Daudzos gadījumos visātrākajā kodā tiks izmantotas tādas bibliotēkas kā cuBLAS kopā ar resursdatora un ierīces atmiņas piešķiršanu un matricu kopēšanu turp un atpakaļ.

Apkopojot, jūs varat paātrināt savas lietotnes ar GPU daudzos līmeņos. Jūs varat uzrakstīt CUDA kodu; jūs varat piezvanīt CUDA bibliotēkām; un jūs varat izmantot programmas, kas jau atbalsta CUDA.

$config[zx-auto] not found$config[zx-overlay] not found