Programovanie

Čo je to CUDA? Paralelné programovanie pre GPU

CUDA je paralelná výpočtová platforma a programovací model vyvinutý spoločnosťou Nvidia pre všeobecné výpočty na vlastných GPU (jednotky grafického spracovania). CUDA umožňuje vývojárom zrýchliť výpočtovo náročné aplikácie využitím sily GPU pre paralelizovateľnú časť výpočtu.

Aj keď pre GPU existujú ďalšie navrhované rozhrania API, ako napríklad OpenCL, a existujú konkurenčné GPU od iných spoločností, ako je AMD, kombinácia CUDA a Nvidia GPU dominuje v niekoľkých aplikačných oblastiach vrátane hlbokého učenia a je základom pre niektoré z nich. najrýchlejšie počítače na svete.

Grafické karty sú pravdepodobne rovnako staré ako počítač - to znamená, ak považujete monochromatický grafický adaptér IBM z roku 1981 za grafickú kartu. Do roku 1988 ste mohli dostať 16-bitovú 2D VGA Wonder kartu od ATI (spoločnosť nakoniec získala AMD). Do roku 1996 ste si mohli kúpiť 3D grafický akcelerátor od spoločnosti 3dfx Interactive, aby ste mohli spustiť strieľačku z pohľadu prvej osoby Quake plnou rýchlosťou.

Tiež v roku 1996 sa Nvidia začala snažiť konkurovať na trhu 3D akcelerátorov slabými produktmi, ale poučila sa, ako to šlo, a v roku 1999 predstavila úspešnú GeForce 256, prvú grafickú kartu, ktorá sa volá GPU. V tom čase bolo hlavným dôvodom, prečo vlastniť GPU, hranie hier. Až neskôr ľudia používali GPU na matematiku, prírodné vedy a inžinierstvo.

Pôvod CUDA

V roku 2003 tím výskumníkov pod vedením Iana Bucka predstavil Brook, prvý široko prijatý programovací model na rozšírenie C o dátovo paralelné konštrukcie. Buck sa neskôr pripojil k spoločnosti Nvidia a v roku 2006 viedol uvedenie CUDA, prvého komerčného riešenia pre univerzálne výpočty na GPU.

OpenCL vs. CUDA

Konkurenčný program CUDA OpenCL bol uvedený na trh spoločnosťou Apple a spoločnosťou Khronos Group v roku 2009 v snahe poskytnúť štandard pre heterogénne výpočty, ktorý sa neobmedzuje iba na procesory Intel / AMD s grafickými procesormi Nvidia. Aj keď OpenCL znie atraktívne kvôli svojej všeobecnosti, na GPU Nvidia nedosahoval také dobré výsledky ako CUDA a mnoho frameworkov hlbokého učenia ho buď nepodporuje, alebo ho podporuje až dodatočne po vydaní podpory CUDA.

Zvýšenie výkonu CUDA

CUDA v priebehu rokov vylepšila a rozšírila svoj rozsah, viac-menej v krokoch s vylepšenými GPU Nvidia. Od verzie CUDA 9.2 s použitím viacerých grafických procesorov servera P100 môžete dosiahnuť až 50-násobné zlepšenie výkonu oproti procesorom. V100 (na tomto obrázku nie je zobrazený) je pri niektorých zaťaženiach ešte 3x rýchlejší. Predchádzajúca generácia serverových GPU, K80, ponúkla oproti procesorom 5 až 12-násobné zlepšenie výkonu.

Nvidia

Zvýšenie rýchlosti z GPU prišlo v pravý čas pre vysokovýkonné výpočty. Jednovláknové zvýšenie výkonu procesorov v priebehu času, ktoré Moorov zákon navrhol zdvojnásobiť každých 18 mesiacov, sa spomalilo na 10 percent ročne, pretože výrobcovia čipov narazili na fyzické limity, vrátane obmedzenia veľkosti rozlíšenia masky čipu a výťažku čipu počas výrobného procesu. a tepelné limity na časových frekvenciách za behu.

Nvidia

CUDA aplikačné domény

Nvidia

Grafické procesory CUDA a Nvidia boli prijaté v mnohých oblastiach, ktoré si vyžadujú vysoký výpočtový výkon s pohyblivou rádovou čiarkou, ako je to zhrnuté obrazne na obrázku vyššie. Komplexnejší zoznam obsahuje:

  1. Výpočtové financovanie
  2. Podnebie, počasie a oceánske modelovanie
  3. Veda a analýza údajov
  4. Hlboké učenie a strojové učenie
  5. Obrana a spravodajstvo
  6. Výroba / AEC (architektúra, strojárstvo a stavebníctvo): CAD a CAE (vrátane výpočtovej dynamiky tekutín, výpočtovej štrukturálnej mechaniky, návrhu a vizualizácie a automatizácie elektronického návrhu)
  7. Médiá a zábava (vrátane animácie, modelovania a vykresľovania; korekcia farieb a úprava zrna; kompozícia; konečná úprava a efekty; úpravy; kódovanie a digitálna distribúcia; letecká grafika; nástroje na natáčanie, recenzie a stereo; a poveternostná grafika)
  8. Lekárske zobrazovanie
  9. Olej a benzín
  10. Výskum: Vysokoškolské vzdelávanie a superpočítače (vrátane výpočtovej chémie a biológie, numerickej analýzy, fyziky a vedeckej vizualizácie)
  11. Bezpečnosť a ochrana
  12. Nástroje a správa

CUDA v hlbokom učení

Hlboké učenie má mimoriadnu potrebu výpočtovej rýchlosti. Napríklad na školenie modelov pre Google Translate v roku 2016 tímy Google Brain a Google Translate vykonali stovky týždenných behov TensorFlow pomocou GPU; za týmto účelom kúpili od spoločnosti Nvidia 2 000 serverových grafických procesorov. Bez GPU by konvergencia týchto tréningových behov trvala skôr mesiace ako týždeň. Na produkčné nasadenie týchto prekladových modelov TensorFlow použil Google nový vlastný čip na spracovanie, TPU (tensor processing unit).

Okrem TensorFlow sa na podporu CUDA spolieha mnoho ďalších rámcov DL, vrátane Caffe2, CNTK, Databricks, H2O.ai, Keras, MXNet, PyTorch, Theano a Torch. Vo väčšine prípadov používajú na výpočty hlbokej neurónovej siete knižnicu cuDNN. Táto knižnica je pre výcvik rámcov hlbokého učenia taká dôležitá, že všetky rámce používajúce danú verziu cuDNN majú v zásade rovnaké výkonnostné čísla pre rovnaké prípady použitia. Keď sa CUDA a cuDNN zlepšujú z verzie na verziu, všetky rámce hlbokého učenia, ktoré sa aktualizujú na novú verziu, zaznamenajú zvýšenie výkonu. Výkon sa zvyčajne líši od rámca k rámcu v tom, ako dobre sa škáluje na viac GPU a viac uzlov.

Programovanie CUDA

Nvidia

Sada nástrojov CUDA

Sada CUDA Toolkit obsahuje knižnice, ladiace a optimalizačné nástroje, kompilátor, dokumentáciu a runtime knižnicu na nasadenie vašich aplikácií. Má komponenty, ktoré podporujú hlboké učenie, lineárnu algebru, spracovanie signálu a paralelné algoritmy. Knižnice CUDA vo všeobecnosti podporujú všetky rodiny GPU Nvidia, ale najlepšie fungujú na najnovšej generácii, ako je napríklad V100, ktorá môže byť 3krát rýchlejšia ako P100 pre tréningové úlohy s hlbokým učením. Používanie jednej alebo viacerých knižníc je najjednoduchší spôsob, ako využiť výhody grafických procesorov, pokiaľ sú potrebné algoritmy implementované v príslušnej knižnici.

Nvidia

Knižnice hlbokého učenia CUDA

V oblasti hlbokého učenia existujú tri hlavné knižnice akcelerované pomocou GPU: cuDNN, o ktorých som sa zmienil už skôr ako o súčasti GPU pre väčšinu otvorených rámcov hlbokého učenia; TensorRT, čo je vysoko výkonný optimalizátor inferencie a runtime hlbokého učenia spoločnosti Nvidia; a DeepStream, knižnica pre odvodenie videa. TensorRT vám pomôže optimalizovať modely neurónových sietí, kalibrovať pre nižšiu presnosť s vysokou presnosťou a nasadiť trénované modely do cloudov, dátových centier, zabudovaných systémov alebo platforiem automobilových produktov.

Nvidia

CUDA knižnice lineárnej algebry a matematiky

Lineárna algebra podporuje tenzorové výpočty, a teda hlboké učenie. Vedci a inžinieri odvtedy používajú BLAS (základné lineárne algebrické podprogramy), súbor maticových algoritmov implementovaných vo Fortrane v roku 1989. cuBLAS je verzia BLAS akcelerovaná GPU a najvýkonnejší spôsob, ako robiť maticovú aritmetiku s GPU. cuBLAS predpokladá, že matice sú husté; cuSPARSE spracováva riedke matice.

Nvidia

Knižnice na spracovanie signálu CUDA

Rýchla Fourierova transformácia (FFT) je jedným zo základných algoritmov používaných na spracovanie signálu; premení signál (napríklad zvukový priebeh) na spektrum frekvencií. cuFFT je FFT akcelerovaný GPU.

Kodeky pomocou štandardov ako H.264 kódujú / komprimujú a dekódujú / dekomprimujú video na prenos a zobrazenie. Sada Nvidia Video Codec SDK tento proces urýchľuje pomocou grafických procesorov.

Nvidia

Knižnice paralelných algoritmov CUDA

Všetky tri knižnice pre paralelné algoritmy majú rôzne účely. NCCL (Nvidia Collective Communications Library) slúži na škálovanie aplikácií na viacerých GPU a uzloch; nvGRAPH je na paralelnú analýzu grafov; a Thrust je knižnica šablón C ++ pre CUDA založená na štandardnej knižnici šablón C ++. Thrust poskytuje bohatú zbierku dát paralelných primitívov, ako je skenovanie, triedenie a zmenšovanie.

Nvidia

Výkon CUDA vs. CPU

V niektorých prípadoch môžete namiesto ekvivalentných funkcií procesora použiť prídavné funkcie CUDA. Napríklad rutiny násobenia matice GEMM od BLAS je možné nahradiť verziami GPU jednoduchým prepojením na knižnicu NVBLAS:

Nvidia

Základy programovania CUDA

Ak nenájdete rutiny knižnice CUDA na zrýchlenie vašich programov, budete si musieť vyskúšať programovanie na nízkej úrovni CUDA. Je to teraz oveľa jednoduchšie, ako to bolo, keď som to prvýkrát vyskúšal koncom 2000. rokov. Okrem iných dôvodov existuje ľahšia syntax a sú k dispozícii lepšie vývojové nástroje. Mojou jedinou hádkou je, že v systéme MacOS sú najnovší kompilátor CUDA a najnovší kompilátor C ++ (z Xcode) zriedka synchronizované. Jeden si musí stiahnuť staršie nástroje príkazového riadku od Apple a prepnúť na ne pomocou xcode-select získať kód CUDA na zostavenie a prepojenie.

Zvážte napríklad túto jednoduchú rutinu C / C ++ na pridanie dvoch polí:

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

{  

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

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

}

Môžete ho zmeniť na jadro, ktoré bude bežať na GPU, pridaním __global__ kľúčové slovo k deklarácii a zavolajte jadro pomocou syntaxe trojitej zátvorky:

pridať << >> (N, x, y);

Musíte tiež zmeniť svoje malloc/Nový a zadarmo/vymazať volá na cudaMallocManaged a cudaFree aby ste pridelili miesto na GPU. Nakoniec musíte počkať na dokončenie výpočtu GPU, až potom použijete výsledky na CPU, ktoré môžete dosiahnuť cudaDeviceSynchronize.

Trojitá zátvorka hore používa jeden blok závitu a jeden závit. Súčasné GPU Nvidia zvládnu veľa blokov a vlákien. Napríklad GPU Tesla P100 založená na architektúre Pascal GPU Architecture má 56 streamovacích multiprocesorov (SM), každý schopný podporovať až 2048 aktívnych vlákien.

Kód jadra bude musieť poznať index svojich blokov a vlákien, aby našiel svoj posun do odovzdaných polí. Paralelizované jadro často používa a mriežka-krok slučka, napríklad:

__global__

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

{

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

int stride = blockDim.x * gridDim.x;

pre (int i = index; i <n; i + = krok)

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

}

Ak sa pozriete na ukážky v súbore CUDA Toolkit, uvidíte, že je potrebné vziať do úvahy viac než len základy, ktorým som sa venoval vyššie. Napríklad je potrebné zabaliť niektoré volania funkcií CUDA checkCudaErrors () hovory. V mnohých prípadoch najrýchlejší kód tiež použije knižnice ako cuBLAS spolu s pridelením pamäte hostiteľa a zariadenia a kopírovaním matíc tam a späť.

Stručne povedané, svoje aplikácie môžete urýchliť pomocou grafických procesorov na mnohých úrovniach. Môžete napísať kód CUDA; môžete volať knižnice CUDA; a môžete používať aplikácie, ktoré už podporujú CUDA.

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