Programmering

Hvad er CUDA? Parallel programmering til GPU'er

CUDA er en parallel computerplatform og programmeringsmodel udviklet af Nvidia til generel computing på sine egne GPU'er (grafikbehandlingsenheder). CUDA gør det muligt for udviklere at fremskynde computerintensive applikationer ved at udnytte kraften fra GPU'er til den paralleliserbare del af beregningen.

Mens der har været andre foreslåede API'er til GPU'er, såsom OpenCL, og der er konkurrencedygtige GPU'er fra andre virksomheder, såsom AMD, dominerer kombinationen af ​​CUDA og Nvidia GPU'er flere applikationsområder, herunder dyb læring, og er et fundament for nogle af verdens hurtigste computere.

Grafikkort er uden tvivl lige så gamle som pc'en - det vil sige, hvis du betragter IBM Monochrome Display Adapter fra 1981 som et grafikkort. I 1988 kunne du få et 16-bit 2D VGA Wonder-kort fra ATI (virksomheden til sidst erhvervet af AMD). I 1996 kunne du købe en 3D-grafikaccelerator fra 3dfx Interactive, så du kunne køre first-person shooter Quake i fuld hastighed.

Også i 1996 begyndte Nvidia at forsøge at konkurrere på markedet for 3D-acceleratorer med svage produkter, men lærte det som det gik, og i 1999 introducerede den vellykkede GeForce 256, det første grafikkort, der blev kaldt en GPU. På det tidspunkt var hovedårsagen til at have en GPU spil. Først senere brugte folk GPU'er til matematik, videnskab og teknik.

Oprindelsen til CUDA

I 2003 afslørede et team af forskere ledet af Ian Buck Brook, den første bredt vedtagne programmeringsmodel til at udvide C med dataparallelle konstruktioner. Buck sluttede sig senere til Nvidia og førte lanceringen af ​​CUDA i 2006, den første kommercielle løsning til computing til generelle formål på GPU'er.

OpenCL vs. CUDA

CUDA-konkurrent OpenCL blev lanceret af Apple og Khronos Group i 2009 i et forsøg på at levere en standard til heterogen computing, der ikke var begrænset til Intel / AMD-CPU'er med Nvidia GPU'er. Mens OpenCL lyder attraktivt på grund af dets generelle funktion, har det ikke fungeret så godt som CUDA på Nvidia GPU'er, og mange dybe læringsrammer understøtter det enten ikke eller understøtter det kun som en eftertanke, når deres CUDA-support er frigivet.

CUDA ydeevne boost

CUDA har forbedret og udvidet sit anvendelsesområde gennem årene, mere eller mindre i lås med forbedrede Nvidia GPU'er. Fra og med CUDA version 9.2 ved hjælp af flere P100-server-GPU'er kan du realisere op til 50 gange forbedringer af ydeevnen i forhold til CPU'er. V100 (ikke vist i denne figur) er en anden 3x hurtigere for nogle belastninger. Den forrige generation af server-GPU'er, K80, tilbød 5x til 12x ydelsesforbedringer i forhold til CPU'er.

Nvidia

Hastighedsforøgelsen fra GPU'er er kommet på kort tid til højtydende computing. Den single-threaded performance-forøgelse af CPU'er over tid, som Moores lov foreslog, ville fordobles hver 18. måned, er aftaget til 10 procent om året, da chipproducenterne stødte på fysiske grænser, herunder størrelsesbegrænsninger på chipmaskeopløsning og chipudbytte under fremstillingsprocessen. og varmebegrænsninger på urfrekvenser ved kørsel.

Nvidia

CUDA-applikationsdomæner

Nvidia

CUDA og Nvidia GPU'er er blevet vedtaget i mange områder, der har brug for høj floating-point-computerydelse, som opsummeret billedligt i billedet ovenfor. En mere omfattende liste inkluderer:

  1. Computational finance
  2. Klima-, vejr- og havmodellering
  3. Datavidenskab og analyse
  4. Deep learning og machine learning
  5. Forsvar og efterretning
  6. Fremstilling / AEC (arkitektur, teknik og konstruktion): CAD og CAE (inklusive beregningsvæskedynamik, beregningsstrukturmekanik, design og visualisering og elektronisk designautomatisering)
  7. Medier og underholdning (inklusive animation, modellering og gengivelse; farvekorrektion og kornhåndtering; sammensætning; efterbehandling og effekter; redigering; kodning og digital distribution; on-air grafik; on-set, review og stereo værktøjer og vejrgrafik)
  8. Medicinsk billeddannelse
  9. Olie og gas
  10. Forskning: Videregående uddannelse og supercomputering (inklusive beregningskemi og biologi, numerisk analyse, fysik og videnskabelig visualisering)
  11. Sikkerhed og sikkerhed
  12. Værktøjer og styring

CUDA i dyb læring

Deep learning har et stort behov for beregningshastighed. For eksempel for at træne modellerne til Google Translate i 2016 udførte Google Brain og Google Translate-holdene hundreder af en uges TensorFlow-kørsler ved hjælp af GPU'er; de havde købt 2.000 server-grade GPU'er fra Nvidia til formålet. Uden GPU'er ville disse træningskørsler have taget måneder snarere end en uge at konvergere. Til produktionsimplementering af disse TensorFlow-oversættelsesmodeller brugte Google en ny brugerdefineret processorchip, TPU (tensorbehandlingsenhed).

Ud over TensorFlow er mange andre DL-rammer afhængige af CUDA for deres GPU-understøttelse, herunder Caffe2, CNTK, Databricks, H2O.ai, Keras, MXNet, PyTorch, Theano og Torch. I de fleste tilfælde bruger de cuDNN-biblioteket til de dybe neurale netværksberegninger. Dette bibliotek er så vigtigt for uddannelsen af ​​de dybe læringsrammer, at alle rammerne, der bruger en given version af cuDNN, i det væsentlige har de samme præstationsnumre til tilsvarende brugssager. Når CUDA og cuDNN forbedres fra version til version, ser alle de dybe læringsrammer, der opdateres til den nye version, præstationsgevinsterne. Hvor ydeevnen har en tendens til at variere fra ramme til ramme, er i hvor godt de skaleres til flere GPU'er og flere noder.

CUDA programmering

Nvidia

CUDA værktøjssæt

CUDA Toolkit inkluderer biblioteker, fejlretnings- og optimeringsværktøjer, en kompilator, dokumentation og et runtime-bibliotek til implementering af dine applikationer. Det har komponenter, der understøtter dyb læring, lineær algebra, signalbehandling og parallelle algoritmer. Generelt understøtter CUDA-biblioteker alle familier med Nvidia GPU'er, men klarer sig bedst på den nyeste generation, såsom V100, som kan være 3 gange hurtigere end P100 til dyb læringstræningsarbejdsbelastninger. Brug af et eller flere biblioteker er den nemmeste måde at udnytte GPU'er på, så længe de algoritmer, du har brug for, er implementeret i det relevante bibliotek.

Nvidia

CUDA dyb læringsbiblioteker

I den dybe læringssfære er der tre store GPU-accelererede biblioteker: cuDNN, som jeg tidligere nævnte som GPU-komponenten til de fleste open source dyb læringsrammer; TensorRT, som er Nvidias højtydende optimering af dyb læringsinference og runtime; og DeepStream, et videoinferensbibliotek. TensorRT hjælper dig med at optimere neurale netværksmodeller, kalibrere til lavere præcision med høj nøjagtighed og implementere de uddannede modeller til skyer, datacentre, indlejrede systemer eller produktplatforme til biler.

Nvidia

CUDA lineære algebra- og matematikbiblioteker

Lineær algebra understøtter tensorberegninger og derfor dyb læring. BLAS (Basic Linear Algebra Subprograms), en samling af matrixalgoritmer implementeret i Fortran i 1989, er blevet brugt lige siden af ​​forskere og ingeniører. cuBLAS er en GPU-accelereret version af BLAS, og den højeste ydeevne til at gøre matrixaritmetik med GPU'er. cuBLAS antager, at matricer er tætte; cuSPARSE håndterer sparsomme matricer.

Nvidia

CUDA-signalbehandlingsbiblioteker

Den hurtige Fourier-transformation (FFT) er en af ​​de grundlæggende algoritmer, der bruges til signalbehandling; det omdanner et signal (såsom en lydbølgeform) til et frekvensspektrum. cuFFT er en GPU-accelereret FFT.

Codecs, der bruger standarder som H.264, indkoder / komprimerer og dekoder / dekomprimerer video til transmission og visning. Nvidia Video Codec SDK fremskynder denne proces med GPU'er.

Nvidia

CUDA parallelle algoritmebiblioteker

De tre biblioteker til parallelle algoritmer har alle forskellige formål. NCCL (Nvidia Collective Communications Library) er til skalering af apps på tværs af flere GPU'er og noder; nvGRAPH er til parallel grafanalyse; og Thrust er et C ++ - skabelonbibliotek til CUDA baseret på C ++ - standardskabelonbiblioteket. Thrust giver en rig samling af data parallelle primitiver, såsom scanning, sortering og reduktion.

Nvidia

CUDA vs. CPU-ydeevne

I nogle tilfælde kan du bruge drop-in CUDA-funktioner i stedet for de tilsvarende CPU-funktioner. For eksempel kan GEMM-matrix-multiplikationsrutiner fra BLAS erstattes af GPU-versioner ved blot at linke til NVBLAS-biblioteket:

Nvidia

Grundlæggende om CUDA programmering

Hvis du ikke kan finde CUDA-biblioteksrutiner til at fremskynde dine programmer, bliver du nødt til at prøve din hånd på CUDA-programmering på lavt niveau. Det er meget lettere nu end det var, da jeg først prøvede det i slutningen af ​​2000'erne. Blandt andre grunde er der lettere syntaks, og der findes bedre udviklingsværktøjer. Min eneste skænderi er, at den nyeste CUDA-compiler og den nyeste C ++ -compiler (fra Xcode) på MacOS sjældent er synkroniseret. Man skal downloade ældre kommandolinjeværktøjer fra Apple og skifte til dem ved hjælp af xcode-vælg for at få CUDA-koden til at kompilere og linke.

Overvej for eksempel denne enkle C / C ++ rutine for at tilføje to arrays:

ugyldig tilføjelse (int n, float * x, float * y)

{  

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

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

}

Du kan gøre det til en kerne, der kører på GPU'en ved at tilføje __global__ nøgleord til erklæringen, og ring til kernen ved hjælp af syntaks med tredobbelt parentes:

tilføj << >> (N, x, y);

Du skal også ændre din malloc/ny og ledig/slet kalder til cudaMallocManaged og cudaFree så du tildeler plads på GPU'en. Endelig skal du vente på, at en GPU-beregning er afsluttet, før du bruger resultaterne på CPU'en, som du kan opnå med cudaDeviceSynchronize.

Den tredobbelte beslag ovenfor bruger en trådblok og en tråd. Nuværende Nvidia GPU'er kan håndtere mange blokke og tråde. For eksempel har en Tesla P100 GPU baseret på Pascal GPU-arkitekturen 56 Streaming Multiprocessors (SM'er), der hver kan understøtte op til 2048 aktive tråde.

Kernekoden skal kende dens blok og trådindeks for at finde sin forskydning i de beståede arrays. Den paralleliserede kerne bruger ofte en gitter-skridt løkke, såsom følgende:

__global__

ugyldig tilføj (int n, float * x, float * y)

{

int-indeks = blockIdx.x * blockDim.x + threadIdx.x;

int stride = blockDim.x * gridDim.x;

for (int i = indeks; i <n; i + = skridt)

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

}

Hvis du ser på prøverne i CUDA Toolkit, vil du se, at der er mere at overveje end de grundlæggende, jeg dækkede ovenfor. For eksempel skal nogle CUDA-funktionskald pakkes ind checkCudaErrors () opkald. I mange tilfælde bruger den hurtigste kode også biblioteker som f.eks cuBLAS sammen med allokeringer af værts- og enhedshukommelse og kopiering af matricer frem og tilbage.

Sammenfattende kan du accelerere dine apps med GPU'er på mange niveauer. Du kan skrive CUDA-kode; du kan ringe til CUDA-biblioteker; og du kan bruge applikationer, der allerede understøtter CUDA.

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