Ohjelmointi

Mikä on CUDA? Rinnakkaisohjelma GPU: ille

CUDA on Nvidian kehittämä rinnakkainen laskenta-alusta ja ohjelmointimalli yleiseen laskentaan omilla GPU :illaan (grafiikkaprosessoriyksiköillä). CUDA antaa kehittäjille mahdollisuuden nopeuttaa laskutoimituksellisia sovelluksia hyödyntämällä GPU: iden tehoa laskennan rinnakkaistettavassa osassa.

Vaikka grafiikkasuorittimille on ehdotettu muita sovellusliittymiä, kuten OpenCL, ja on olemassa kilpailukykyisiä grafiikkasuoritimia muilta yrityksiltä, ​​kuten AMD, CUDA: n ja Nvidia-näytönohjaimien yhdistelmä hallitsee useita sovellusalueita, mukaan lukien syvä oppiminen, ja se on perusta joillekin nopeimmat tietokoneet maailmassa.

Grafiikkakortit ovat kiistatta yhtä vanhoja kuin tietokone - toisin sanoen jos pidät vuoden 1981 IBM Monochrome Display Adapter -näytönohjainta. Vuoteen 1988 mennessä voit hankkia 16-bittisen 2D VGA Wonder -kortin ATI: ltä (AMD lopulta osti yrityksen). Vuoteen 1996 mennessä voit ostaa 3Dfx Interactive: n 3D-grafiikkakiihdyttimen, jotta voit suorittaa ensimmäisen persoonan ampuja Quaken täydellä nopeudella.

Myös vuonna 1996 Nvidia alkoi yrittää kilpailla 3D-kiihdyttimien markkinoilla heikoilla tuotteilla, mutta oppi sen myötä ja esitteli vuonna 1999 menestyvän GeForce 256: n, ensimmäisen näytönohjaimen, jota kutsutaan GPU: ksi. Tuolloin tärkein syy GPU: n saamiseen oli pelaaminen. Vasta myöhemmin ihmiset käyttivät näytönohjaimia matematiikkaan, luonnontieteisiin ja tekniikkaan.

CUDA: n alkuperä

Vuonna 2003 Ian Buckin johtama tutkijaryhmä esitteli Brookin, ensimmäisen laajalti hyväksytyn ohjelmointimallin, joka laajentaa C: tä tietojen rinnakkaisilla rakenteilla. Buck liittyi myöhemmin Nvidiaan ja johti CUDA: n lanseerausta vuonna 2006, joka on ensimmäinen kaupallinen ratkaisu GPU: n yleiskäyttöön.

OpenCL vs. CUDA

Apple ja Khronos-konserni julkaisivat CUDA-kilpailijan OpenCL: n vuonna 2009 yrittäessään tarjota standardi heterogeeniselle tietojenkäsittelylle, joka ei rajoittunut Nvidia-näytönohjaimilla varustettuihin Intel / AMD-suorittimiin. Vaikka OpenCL kuulostaa houkuttelevalta yleisyytensä vuoksi, se ei ole toiminut yhtä hyvin kuin CUDA Nvidia-suorittimissa, ja monet syvälliset oppimiskehykset joko eivät tue sitä tai tukevat sitä vain jälkikäteen, kun heidän CUDA-tukensa on vapautettu.

CUDA-suorituskyvyn parannus

CUDA on parantanut ja laajentanut soveltamisalaansa vuosien varrella, enemmän tai vähemmän lukkiutuneena parannettujen Nvidia-näytönohjaimien kanssa. CUDA-versiosta 9.2 alkaen, käyttämällä useita P100-palvelimen GPU: ita, voit toteuttaa jopa 50x suorituskyvyn parannuksia suorittimiin verrattuna. V100 (ei esitetty tässä kuvassa) on vielä 3 kertaa nopeampi joillekin kuormille. Edellisen sukupolven palvelimen näytönohjaimet, K80, tarjosivat 5–12x suorituskyvyn parannuksia suorittimiin verrattuna.

Nvidia

Grafiikkasuorittimien nopeuden lisäys on tullut ajan myötä nopean suorituskyvyn tietojenkäsittelyyn. Suorittimien yksisäikeinen suorituskyvyn nousu ajan mittaan, jonka Mooren lain mukaan kaksinkertaistuu 18 kuukauden välein, on hidastunut 10 prosenttiin vuodessa, kun sirupäälliköillä on fyysisiä rajoituksia, mukaan lukien sirun peitteen resoluution kokorajoitukset ja sirun tuotto valmistusprosessin aikana ja lämpörajat kellotaajuuksille ajon aikana.

Nvidia

CUDA-sovelluksen verkkotunnukset

Nvidia

CUDA- ja Nvidia-näytönohjaimia on otettu käyttöön monilla alueilla, jotka tarvitsevat suurta liukulukuista laskentatehoa, kuten kuvassa on tiivistetty yllä olevassa kuvassa. Kattavampi luettelo sisältää:

  1. Laskennallinen rahoitus
  2. Ilmasto-, sää- ja valtamerimallinnus
  3. Tietojenkäsittely ja analytiikka
  4. Syvä oppiminen ja koneoppiminen
  5. Puolustus ja älykkyys
  6. Valmistus / AEC (arkkitehtuuri, tekniikka ja rakentaminen): CAD ja CAE (mukaan lukien laskennallinen nestedynamiikka, laskennallinen rakennemekaniikka, suunnittelu ja visualisointi sekä elektroninen suunnitteluautomaatio)
  7. Media ja viihde (mukaan lukien animaatio, mallinnus ja renderointi; värinkorjaus ja rakeiden hallinta; säveltäminen; viimeistely ja tehosteet; muokkaus; koodaus ja digitaalinen jakelu; on-line-grafiikka; asetetut, tarkistus- ja stereotyökalut; ja säägrafiikka)
  8. Lääketieteellinen kuvantaminen
  9. Öljy ja kaasu
  10. Tutkimus: Korkeakoulutus ja supertietokoneet (mukaan lukien laskennallinen kemia ja biologia, numeerinen analytiikka, fysiikka ja tieteellinen visualisointi)
  11. Turvallisuus
  12. Työkalut ja hallinta

CUDA syvässä oppimisessa

Syvällä oppimisella on suuri tarve laskennanopeudelle. Esimerkiksi kouluttaakseen malleja Google Kääntäjälle vuonna 2016 Google Brain- ja Google Translate -tiimit tekivät satoja viikon TensorFlow-ajoja GPU: illa; he olivat ostaneet Nvidialta tätä tarkoitusta varten 2000 palvelimelle tarkoitettua GPU: ta. Ilman grafiikkasuoritimia näiden harjoittelujen lähentyminen olisi kestänyt kuukausia eikä viikkoa. Näiden TensorFlow-käännösmallien tuotantokäytössä Google käytti uutta mukautettua prosessointisirua, TPU: ta (tensor processing unit).

TensorFlow'n lisäksi monet muut DL-kehykset luottavat CUDA: han GPU-tuessaan, mukaan lukien Caffe2, CNTK, Databricks, H2O.ai, Keras, MXNet, PyTorch, Theano ja Torch. Useimmissa tapauksissa he käyttävät cuDNN-kirjastoa syvän hermoverkon laskennassa. Tuo kirjasto on niin tärkeä syvän oppimisen puitteiden koulutuksessa, että kaikilla tietyn cuDNN-version käyttävillä kehyksillä on olennaisilta osin samat suorituskyvynumerot vastaavissa käyttötapauksissa. Kun CUDA ja cuDNN paranevat versiosta toiseen, kaikki syvälle oppimisen kehykset, jotka päivitetään uuteen versioon, näkevät suorituskyvyn kasvun. Jos suorituskyky pyrkii vaihtelemaan kehyksittäin, on se, kuinka hyvin ne skaalautuvat useisiin GPU: iin ja useisiin solmuihin.

CUDA-ohjelmointi

Nvidia

CUDA-työkalupakki

CUDA-työkalupakki sisältää kirjastot, virheenkorjaus- ja optimointityökalut, kääntäjän, dokumentaation ja ajonaikaisen kirjaston sovellusten käyttöönottoa varten. Siinä on komponentteja, jotka tukevat syvää oppimista, lineaarista algebraa, signaalinkäsittelyä ja rinnakkaisia ​​algoritmeja. Yleensä CUDA-kirjastot tukevat kaikkia Nvidia-grafiikkasuorittimien perheitä, mutta toimivat parhaiten uusimmalla sukupolvella, kuten V100, joka voi olla 3 kertaa nopeampi kuin P100 syvällisen oppimisen harjoitteluun. Yhden tai useamman kirjaston käyttö on helpoin tapa hyödyntää näytönohjaimia, kunhan tarvitsemasi algoritmit on otettu käyttöön sopivassa kirjastossa.

Nvidia

CUDA-syväkirjastot

Syvän oppimisen alalla on kolme suurta GPU-nopeutettua kirjastoa: cuDNN, jonka mainitsin aiemmin GPU-komponenttina useimmille avoimen lähdekoodin syvän oppimisen puitteille; TensorRT, joka on Nvidian korkean suorituskyvyn syvällisen oppimisen päättelyoptimoija ja ajonaika; ja DeepStream, videon päättelykirjasto. TensorRT auttaa sinua optimoimaan hermoverkkomalleja, kalibroimaan alhaisemmalle tarkkuudelle suurella tarkkuudella ja käyttämään koulutettuja malleja pilviin, palvelinkeskuksiin, sulautettuihin järjestelmiin tai autoteollisuuden tuotealustoihin.

Nvidia

CUDA-lineaariset algebra- ja matematiikkakirjastot

Lineaarinen algebra tukee tensorilaskelmia ja siten syvällistä oppimista. BLAS (Basic Linear Algebra Subprograms), kokoelma matriisialgoritmeja, jotka otettiin käyttöön Fortranissa vuonna 1989, ovat siitä lähtien käyttäneet tutkijat ja insinöörit. cuBLAS on GPAS-kiihdytetty versio BLAS: sta, ja tehokkain tapa tehdä matriisiaritmeettia GPU: iden kanssa. cuBLAS olettaa, että matriisit ovat tiheitä; cuSPARSE käsittelee harvoja matriiseja.

Nvidia

CUDA-signaalinkäsittelykirjastot

Nopea Fourier-muunnos (FFT) on yksi signaalinkäsittelyssä käytetyistä perusalgoritmeista; se muuttaa signaalin (kuten äänen aaltomuodon) taajuuksien spektriksi. cuFFT on GPU-kiihdytetty FFT.

Koodekit, käyttäen standardeja kuten H.264, koodaavat / pakkaa ja purkavat / purkavat videon lähetystä ja näyttämistä varten. Nvidia Video Codec SDK nopeuttaa tätä prosessia GPU: illa.

Nvidia

CUDA-rinnakkaisalgoritmikirjastot

Kolmella rinnakkaisalgoritmien kirjastolla on kaikilla eri tarkoitukset. NCCL (Nvidia Collective Communications Library) on tarkoitettu sovellusten skaalaamiseen useille näytönohjaimille ja solmuille; nvGRAPH on tarkoitettu rinnakkaiskaavioanalytiikkaan; ja Thrust on C ++ -mallikirjasto CUDA: lle, joka perustuu C ++ -mallikirjastoon. Työntövoima tarjoaa monipuolisen datakokoelman primitiivisiä tietoja, kuten skannaus, lajittelu ja pienennys.

Nvidia

CUDA vs. suorittimen suorituskyky

Joissakin tapauksissa voit käyttää drop-in CUDA -toimintoja vastaavien suorittimen toimintojen sijaan. Esimerkiksi BLAS: n GEMM-matriisikertorutiinit voidaan korvata GPU-versioilla yksinkertaisesti linkittämällä NVBLAS-kirjastoon:

Nvidia

CUDA-ohjelmoinnin perusteet

Jos et löydä CUDA-kirjastorutiineja ohjelmiesi nopeuttamiseksi, sinun on kokeiltava kättäsi matalalla CUDA-ohjelmoinnilla. Se on nyt paljon helpompaa kuin se oli, kun kokeilin sitä ensimmäisen kerran 2000-luvun lopulla. Muiden syiden vuoksi syntaksia on helpompaa ja käytettävissä on parempia kehitystyökaluja. Ainoa hölmö on, että MacOS: lla uusin CUDA-kääntäjä ja uusin C ++-kääntäjä (Xcodesta) ovat harvoin synkronoitu. Vanhemmat komentorivityökalut on ladattava Applelta ja vaihdettava niihin käyttämällä xcode-select saada CUDA-koodi koota ja linkittää.

Harkitse esimerkiksi tätä yksinkertaista C / C ++ -rutiinia lisätäksesi kaksi taulukkoa:

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

{  

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

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

}

Voit muuttaa sen ytimeksi, joka toimii GPU: lla lisäämällä __maailma__ avainsana ilmoitukseen ja soita ytimeen käyttämällä kolmoissulkujen syntaksia:

lisää << >> (N, x, y);

Sinun on myös vaihdettava malloc/Uusi ja vapaa/poistaa puhelut cudaMallocHallinnoitu ja cudaFree niin että jaat tilaa GPU: lle. Lopuksi sinun on odotettava, että GPU-laskenta on valmis, ennen kuin käytät tuloksia suorittimella, jonka voit suorittaa cudaDeviceSynchronize.

Yllä oleva kolminkertainen kiinnike käyttää yhtä lankalohkoa ja yhtä säiettä. Nykyiset Nvidia-näytönohjaimet pystyvät käsittelemään monia lohkoja ja ketjuja. Esimerkiksi Pascal GPU -arkkitehtuuriin perustuvassa Tesla P100 -näytönohjaimessa on 56 suoratoistoprosessoria (SM), joista kukin pystyy tukemaan jopa 2048 aktiivista säiettä.

Ytimen koodin on tiedettävä sen lohko- ja ketjuindeksi löytääkseen sen siirtymä läpäiseviin matriiseihin. Rinnakkaistettu ydin käyttää usein a ruudukko-askel silmukka, kuten seuraavat:

__maailma__

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

{

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

int askeleen = blockDim.x * gridDim.x;

for (int i = indeksi; i <n; i + = harppaus)

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

}

Jos tarkastelet CUDA-työkalupaketin näytteitä, huomaat, että on enemmän harkittavaa kuin edellä käsittelemäni perusteet. Esimerkiksi jotkut CUDA-funktiokutsut on käärittävä checkCudaErrors () puhelut. Lisäksi monissa tapauksissa nopein koodi käyttää kirjastoja, kuten cuBLAS yhdessä isäntä- ja laitemuistin allokoinnin sekä matriisien kopioinnin edestakaisin.

Yhteenvetona voidaan todeta, että voit nopeuttaa sovelluksiasi näytönohjaimilla monilla tasoilla. Voit kirjoittaa CUDA-koodin; voit soittaa CUDA-kirjastoihin; ja voit käyttää sovelluksia, jotka jo tukevat CUDA: ta.