Programování

Co je CUDA? Paralelní programování pro GPU

CUDA je paralelní výpočetní platforma a programovací model vyvinutý společností Nvidia pro obecné výpočty na vlastních GPU (grafické procesorové jednotky). CUDA umožňuje vývojářům urychlit aplikace náročné na výpočetní výkon využitím výkonu GPU pro paralelizovatelnou část výpočtu.

I když existují další navrhovaná rozhraní API pro GPU, jako je OpenCL, a existují konkurenční GPU od jiných společností, jako je AMD, kombinace CUDA a Nvidia GPU dominuje několika aplikačním oblastem, včetně hlubokého učení, a je základem pro některé z nejrychlejší počítače na světě.

Grafické karty jsou pravděpodobně stejně staré jako PC - to znamená, pokud považujete Monochrome Display Adapter z roku 1981 za grafickou kartu. V roce 1988 jste mohli získat 16bitovou 2D VGA Wonder kartu od ATI (společnost nakonec získala AMD). V roce 1996 jste si mohli koupit 3D grafický akcelerátor od společnosti 3dfx Interactive, abyste mohli střílet střílečky z pohledu první osoby Quake na plnou rychlost.

Také v roce 1996 se Nvidia začala snažit konkurovat na trhu 3D akcelerátorů slabými produkty, ale naučila se, jak to šlo, a v roce 1999 představila úspěšnou GeForce 256, první grafickou kartu, která se nazývá GPU. V té době bylo hlavním důvodem, proč mít GPU, hraní her. Teprve později lidé používali GPU pro matematiku, vědu a inženýrství.

Původ CUDA

V roce 2003 představil tým vědců pod vedením Iana Bucka Brook, první široce přijímaný programovací model, který rozšířil C o datově paralelní konstrukce. Buck se později připojil k Nvidii a vedl uvedení CUDA v roce 2006, prvního komerčního řešení pro všeobecné použití na GPU.

OpenCL vs. CUDA

Konkurenční CUDA OpenCL byl spuštěn společností Apple a skupinou Khronos v roce 2009 ve snaze poskytnout standard pro heterogenní výpočty, který se neomezuje pouze na procesory Intel / AMD s GPU Nvidia. Zatímco OpenCL zní díky své obecnosti atraktivně, na GPU Nvidia neprobíhal tak dobře jako CUDA a mnoho frameworků pro hluboké učení jej buď nepodporuje, nebo jej podporuje až dodatečně po vydání podpory CUDA.

Zvýšení výkonu CUDA

CUDA v průběhu let vylepšila a rozšířila svoji působnost, víceméně v lockstepu s vylepšenými GPU Nvidia. Od verze CUDA 9.2 můžete pomocí více grafických procesorů serveru P100 dosáhnout až 50krát vyššího výkonu oproti procesorům. V100 (na tomto obrázku není zobrazen) je u některých zátěží ještě 3x rychlejší. Předchozí generace serverových GPU, K80, nabídla 5x až 12x vylepšení výkonu oproti CPU.

Nvidia

Zvýšení rychlosti z GPU přišlo v pravý čas pro vysoce výkonné výpočty. Jednorázové zvýšení výkonu CPU v průběhu času, které Mooreův zákon navrhl zdvojnásobit každých 18 měsíců, se zpomalilo na 10 procent ročně, protože výrobci čipů narazili na fyzické limity, včetně omezení velikosti rozlišení masky čipu a výtěžku čipu během výrobního procesu a tepelné limity hodinových frekvencí za běhu.

Nvidia

Domény aplikací CUDA

Nvidia

Grafické procesory CUDA a Nvidia byly přijaty v mnoha oblastech, které vyžadují vysoký výpočetní výkon s plovoucí desetinnou čárkou, jak je ilustrováno na obrázku výše. Komplexnější seznam obsahuje:

  1. Výpočetní finance
  2. Podnebí, počasí a oceánské modelování
  3. Věda o datech a analytika
  4. Hluboké učení a strojové učení
  5. Obrana a zpravodajství
  6. Výroba / AEC (architektura, strojírenství a stavebnictví): CAD a CAE (včetně výpočetní dynamiky tekutin, výpočetní strukturální mechaniky, návrhu a vizualizace a automatizace elektronického návrhu)
  7. Média a zábava (včetně animace, modelování a vykreslování; korekce barev a správa zrna; skládání; dokončování a efekty; úpravy; kódování a digitální distribuce; ​​on-air grafika; on-set, recenze a stereo nástroje; a počasí grafika)
  8. Lékařské zobrazování
  9. Ropa a plyn
  10. Výzkum: Vysokoškolské vzdělávání a superpočítače (včetně výpočetní chemie a biologie, numerické analýzy, fyziky a vědecké vizualizace)
  11. Bezpečnost a zabezpečení
  12. Nástroje a správa

CUDA v hlubokém učení

Hluboké učení má velkou potřebu výpočetní rychlosti. Například pro školení modelů pro Google Translate v roce 2016 týmy Google Brain a Google Translate provedly stovky týdenních běhů TensorFlow pomocí GPU; za tímto účelem koupili 2 000 serverových grafických procesorů od společnosti Nvidia. Bez GPU by se tyto tréninkové běhy sblížily spíše než měsíce než týden. Pro produkční nasazení těchto překladových modelů TensorFlow Google použil nový vlastní čip zpracování, TPU (jednotka zpracování tenzorů).

Kromě TensorFlow se mnoho dalších rámců DL spoléhá na podporu CUDA pro svou podporu GPU, včetně Caffe2, CNTK, Databricks, H2O.ai, Keras, MXNet, PyTorch, Theano a Torch. Ve většině případů používají pro výpočty hlubokých neuronových sítí knihovnu cuDNN. Tato knihovna je pro školení rámců hlubokého učení tak důležitá, že všechny rámce používající danou verzi cuDNN mají v zásadě stejná čísla výkonu pro ekvivalentní případy použití. Když se CUDA a cuDNN vylepšují z verze na verzi, všechny hluboké výukové rámce, které se aktualizují na novou verzi, vidí zvýšení výkonu. Kde se výkon liší od rámce k rámci, je to, jak dobře se rozšiřují na více GPU a více uzlů.

Programování CUDA

Nvidia

Sada nástrojů CUDA

Sada CUDA Toolkit zahrnuje knihovny, nástroje pro ladění a optimalizaci, kompilátor, dokumentaci a běhovou knihovnu pro nasazení vašich aplikací. Má komponenty, které podporují hluboké učení, lineární algebru, zpracování signálu a paralelní algoritmy. Knihovny CUDA obecně podporují všechny rodiny GPU Nvidia, ale nejlépe fungují na nejnovější generaci, jako je V100, která může být 3krát rychlejší než P100 pro trénink s hlubokým učením. Nejjednodušší způsob, jak využít výhod GPU, je použití jedné nebo více knihoven, pokud algoritmy, které potřebujete, byly implementovány v příslušné knihovně.

Nvidia

Knihovny hlubokého učení CUDA

V oblasti hlubokého učení existují tři hlavní knihovny zrychlené GPU: cuDNN, kterou jsem zmínil dříve jako součást GPU pro většinu otevřených rámců hlubokého učení; TensorRT, což je vysoce výkonný nástroj pro optimalizaci a běh inferencí hlubokého učení Nvidia; a DeepStream, knihovna pro odvození videa. TensorRT vám pomůže optimalizovat modely neuronových sítí, kalibrovat pro nižší přesnost s vysokou přesností a nasadit trénované modely do cloudů, datových center, vestavěných systémů nebo platforem automobilových produktů.

Nvidia

CUDA knihovny lineární algebry a matematiky

Lineární algebra podporuje tenzorové výpočty, a tedy hluboké učení. BLAS (Basic Linear Algebra Subprograms), sbírka maticových algoritmů implementovaných ve Fortranu v roce 1989, byla od té doby používána vědci a inženýry. cuBLAS je verze BLAS s akcelerací GPU a nejvýkonnější způsob provádění maticové aritmetiky s GPU. cuBLAS předpokládá, že matice jsou husté; cuSPARSE zpracovává řídké matice.

Nvidia

Knihovny pro zpracování signálu CUDA

Rychlá Fourierova transformace (FFT) je jedním ze základních algoritmů používaných pro zpracování signálu; převádí signál (například zvukový průběh) na spektrum frekvencí. cuFFT je FFT urychlený GPU.

Kodeky pomocí standardů jako H.264 kódují / komprimují a dekódují / dekomprimují video pro přenos a zobrazení. Sada Nvidia Video Codec SDK tento proces urychluje pomocí GPU.

Nvidia

Knihovny paralelních algoritmů CUDA

Všechny tři knihovny pro paralelní algoritmy mají různé účely. NCCL (Nvidia Collective Communications Library) je pro škálování aplikací napříč více GPU a uzly; nvGRAPH je pro paralelní analýzu grafů; a Thrust je knihovna šablon C ++ pro CUDA založená na standardní knihovně šablon C ++. Thrust poskytuje bohatou sbírku dat paralelních primitiv, jako je skenování, třídění a zmenšování.

Nvidia

Výkon CUDA vs. CPU

V některých případech můžete použít ekvivalentní funkce CUDA namísto ekvivalentních funkcí CPU. Například rutiny násobení matic GEMM od BLAS lze nahradit verzemi GPU jednoduše propojením s knihovnou NVBLAS:

Nvidia

Základy programování CUDA

Pokud nemůžete najít rutiny knihovny CUDA, které by urychlily vaše programy, budete si muset vyzkoušet programování CUDA na nízké úrovni. To je teď mnohem jednodušší, než to bylo, když jsem to poprvé vyzkoušel koncem 2000. Mimo jiné existuje jednodušší syntaxe a jsou k dispozici lepší vývojové nástroje. Moje jediná hádka spočívá v tom, že na MacOSu jsou nejnovější kompilátor CUDA a nejnovější kompilátor C ++ (z Xcode) zřídka synchronizovány. Je třeba stáhnout starší nástroje příkazového řádku od společnosti Apple a přepnout na ně pomocí xcode-select získat kód CUDA ke kompilaci a propojení.

Zvažte například tuto jednoduchou rutinu C / C ++ pro přidání dvou polí:

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

{  

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

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

}

Můžete z něj udělat jádro, které bude běžet na GPU, přidáním __globální__ klíčové slovo k deklaraci a zavolejte jádro pomocí syntaxe trojitého závorky:

přidat << >> (N, x, y);

Musíte také změnit svůj malloc/Nový a volný, uvolnit/vymazat volá na cudaMalloc Spravováno a cudaFree takže přidělujete místo na GPU. Nakonec musíte počkat na dokončení výpočtu GPU, než použijete výsledky na CPU, kterých můžete dosáhnout cudaDeviceSynchronize.

Trojitá závorka výše používá jeden blok závitu a jeden závit. Aktuální GPU Nvidia zvládnou mnoho bloků a vláken. Například GPU Tesla P100 založené na architektuře Pascal GPU Architecture má 56 streamovacích multiprocesorů (SM), každý schopný podporovat až 2048 aktivních vláken.

Kód jádra bude potřebovat znát svůj index bloků a vláken, aby našel svůj posun do předaných polí. Paralelizované jádro často používá a mřížka smyčka, například následující:

__globální__

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

{

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

int stride = blockDim.x * gridDim.x;

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

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

}

Pokud se podíváte na ukázky v CUDA Toolkit, uvidíte, že je třeba vzít v úvahu více než základy, které jsem popsal výše. Například je třeba zabalit některá volání funkcí CUDA checkCudaErrors () hovory. V mnoha případech bude nejrychlejší kód používat také knihovny jako cuBLAS spolu s přidělením paměti hostitele a zařízení a kopírováním matic tam a zpět.

Souhrnně můžete své aplikace urychlit pomocí grafických procesorů na mnoha úrovních. Můžete napsat kód CUDA; můžete zavolat do knihoven CUDA; a můžete používat aplikace, které již podporují CUDA.