Dataressurs U SM. Hvor cuda leder: praktisk anvendelse av gpgpu-teknologi - det beste utstyret Applikasjoner som kjører på cuda

I flere tiår har Moores lov vært gjeldende, som sier at hvert annet år vil antall transistorer på en brikke dobles. Dette var imidlertid tilbake i 1965, og i løpet av de siste 5 årene har ideen om fysiske multikjerner i prosessorer i forbrukerklassen begynt å utvikle seg raskt: i 2005 introduserte Intel Pentium D, og ​​AMD introduserte Athlon X2. Den gang kunne applikasjoner med 2 kjerner telles på fingrene på én hånd. Neste generasjon Intel-prosessorer, som gjorde en revolusjon, hadde imidlertid nøyaktig 2 fysiske kjerner. Dessuten dukket Quad-serien opp i januar 2007, da Moore selv innrømmet at loven hans snart ville slutte å gjelde.

Hva nå? Dual-core prosessorer selv i budsjettkontorsystemer, og 4 fysiske kjerner har blitt normen, og dette er på bare 2-3 år. Frekvensen av prosessorer økes ikke, men arkitekturen er forbedret, antall fysiske og virtuelle kjerner økes. Imidlertid har ideen om å bruke videoadaptere utstyrt med titalls eller til og med hundrevis av "databehandlingsenheter" eksistert i lang tid.

Og selv om utsiktene for GPU-databehandling er enorme, er den mest populære løsningen Nvidia CUDA, som er gratis, har mye dokumentasjon og generelt er veldig enkel å implementere, er det ikke mange applikasjoner som bruker denne teknologien. I utgangspunktet er dette alle slags spesialiserte beregninger, som den gjennomsnittlige brukeren i de fleste tilfeller ikke bryr seg om. Men det er også programmer designet for massebrukeren, og vi vil snakke om dem i denne artikkelen.

Først litt om selve teknologien og hva den brukes med. Fordi Når jeg skriver en artikkel, fokuserer jeg på et bredt spekter av lesere, så jeg vil prøve å forklare det på et tilgjengelig språk uten komplekse termer og noe kort.

CUDA(engelsk: Compute Unified Device Architecture) er en programvare- og maskinvarearkitektur som lar deg utføre beregninger ved hjelp av NVIDIA-grafikkprosessorer som støtter GPGPU-teknologi (tilfeldig databehandling på skjermkort). CUDA-arkitekturen dukket først opp på markedet med utgivelsen av åttende generasjons NVIDIA-brikke - G80 og er til stede i alle påfølgende serier med grafikkbrikker som brukes i GeForce-, Quadro- og Tesla-akseleratorfamiliene. (c) Wikipedia.org

Innkommende strømmer behandles uavhengig av hverandre, dvs. parallell.

Det er en inndeling i 3 nivåer:

Nett- kjerne. Inneholder en en/to/tredimensjonal rekke blokker.

Blokkere– inneholder mange tråder. Tråder av forskjellige blokker kan ikke samhandle med hverandre. Hvorfor var det nødvendig å innføre blokker? Hver blokk er i hovedsak ansvarlig for sin egen deloppgave. For eksempel kan et stort bilde (som er en matrise) deles opp i flere mindre deler (matriser) og arbeides med hver del av bildet parallelt.

Tråd– flyt. Tråder innenfor en blokk kan samhandle enten gjennom delt minne, som forresten er mye raskere enn globalt minne, eller gjennom trådsynkroniseringsverktøy.

Warp er en forening av tråder som samhandler med hverandre, for alle moderne GPUer er Warp-størrelsen 32. Neste kommer halvvarp, som er halvparten av warp, fordi Minnetilgang skjer vanligvis separat for første og andre halvdel av varpen.

Som du kan se, er denne arkitekturen utmerket for parallellisering av oppgaver. Og selv om programmering utføres på C-språket med noen begrensninger, er i virkeligheten ikke alt så enkelt, fordi... ikke alt kan parallelliseres. Det er heller ingen standardfunksjoner for å generere tilfeldige tall (eller initialisering); alt dette må implementeres separat. Og selv om det er mange ferdige alternativer, gir ingenting av dette glede. Evnen til å bruke rekursjon dukket opp relativt nylig.

For klarhetens skyld ble det skrevet et lite konsollprogram (for å minimere kode) som utfører operasjoner med to arrays av float-typen, dvs. med ikke-heltallsverdier. Av grunnene nevnt ovenfor ble initialisering (fylling av matrisen med forskjellige vilkårlige verdier) utført av CPU. Deretter ble det utført 25 forskjellige operasjoner med de tilsvarende elementene fra hver matrise, mellomresultatene ble skrevet til den tredje matrisen. Størrelsen på matrisen er endret, resultatene er som følger:

Det ble gjennomført totalt 4 tester:

1024 elementer i hver matrise:

Man ser tydelig at med et så lite antall elementer er parallellberegning lite nyttig, fordi Selve beregningene er mye raskere enn forberedelsene deres.

4096 elementer i hver matrise:

Og nå kan du se at skjermkortet utfører operasjoner på arrays 3 ganger raskere enn prosessoren. Dessuten økte ikke utførelsestiden for denne testen på skjermkortet (en liten reduksjon i tid kan tilskrives en feil).

Det er nå 12288 elementer i hver matrise:

Separasjonen av skjermkortet har økt med 2 ganger. Igjen er det verdt å merke seg at utførelsestiden på skjermkortet har økt
ubetydelig, men på prosessoren mer enn 3 ganger, dvs. proporsjonal med kompleksiteten til oppgaven.

Og den siste testen er 36864 elementer i hver matrise:

I dette tilfellet når akselerasjonen imponerende verdier - nesten 22 ganger raskere på et skjermkort. Og igjen økte utførelsestiden på skjermkortet litt, men på prosessoren - de nødvendige 3 ganger, som igjen er proporsjonal med kompleksiteten til oppgaven.

Fortsetter du å komplisere beregningene, vinner skjermkortet mer og mer. Selv om eksemplet er noe overdrevet, viser den samlede situasjonen tydelig. Men som nevnt ovenfor kan ikke alt parallelliseres. For eksempel å beregne Pi. Det er kun eksempler skrevet med Monte Carlo-metoden, men nøyaktigheten på beregningene er 7 desimaler, dvs. vanlig flyte. For å øke nøyaktigheten av beregninger kreves lang aritmetikk, og det er her problemer oppstår, fordi Det er veldig, veldig vanskelig å implementere dette effektivt. Jeg kunne ikke finne eksempler på Internett som bruker CUDA og beregner Pi til 1 million desimaler. Det er gjort forsøk på å skrive en slik applikasjon, men den enkleste og mest effektive metoden for å beregne Pi er Brent-Salamin-algoritmen eller Gauss-formelen. Den velkjente SuperPI bruker mest sannsynlig (bedømt etter hastigheten på operasjonen og antall iterasjoner) den Gaussiske formelen. Og etter å dømme
På grunn av det faktum at SuperPI er entrådet, mangelen på eksempler under CUDA og feilen i mine forsøk, er det umulig å effektivt parallellisere Pi-telling.

Forresten kan du legge merke til hvordan belastningen på GPU øker under beregninger, og minne er også tildelt.

La oss nå gå videre til de mer praktiske fordelene med CUDA, nemlig de eksisterende programmene som bruker denne teknologien. For det meste er dette alle slags audio/video-konverterere og redaktører.

3 forskjellige videofiler ble brukt i testingen:

      *Historien til filmen Avatar - 1920x1080, MPEG4, h.264.
      *Serie "Lie to me" - 1280x720, MPEG4, h.264.
      *Serie "It's Always Sunny in Philadelphia" - 624x464, xvid.

Beholderen og størrelsen på de to første filene var .mkv og 1,55 GB, og den siste var .avi og 272 MB.

La oss starte med et veldig oppsiktsvekkende og populært produkt - Badaboom. Versjon brukt - 1.2.1.74 . Kostnaden for programmet er $29.90 .

Programgrensesnittet er enkelt og intuitivt - til venstre velger vi kildefilen eller disken, og til høyre - den nødvendige enheten vi skal kode for. Det er også en brukermodus der parametere stilles inn manuelt, som er det vi brukte.

La oss først se på hvor raskt og effektivt videoen er kodet «i seg selv», dvs. samme oppløsning og omtrent samme størrelse. Vi vil måle hastigheten i fps, og ikke i medgått tid - på denne måten er det mer praktisk å sammenligne og beregne hvor mye en video av vilkårlig lengde vil bli komprimert. Fordi I dag vurderer vi "grønn" teknologi, da vil grafene være tilsvarende -)

Kodingshastighet avhenger direkte av kvalitet, dette er åpenbart. Det er verdt å merke seg at lysoppløsning (la oss kalle det tradisjonelt SD) ikke er et problem for Badaboom - kodingshastigheten er 5,5 ganger høyere enn den originale (24 fps) videoframerate. Og selv tung 1080p-video konverteres av programmet i sanntid. Det er verdt å merke seg at kvaliteten på den endelige videoen er veldig nær det originale videomaterialet, dvs. Badaboom koder veldig, veldig effektivt.

Men vanligvis overfører de video til en lavere oppløsning, la oss se hvordan ting er i denne modusen. Etter hvert som oppløsningen ble redusert, ble også videobithastigheten redusert. Det var 9500 kbps for 1080p utdatafil, 4100 kbps for 720p og 2400 kbps for 720x404. Valget ble tatt ut fra et rimelig forhold mellom størrelse og kvalitet.

Ingen kommentarer nødvendig. Hvis du lager en rip fra 720p til vanlig SD-kvalitet, vil transkoding av en film som varer i 2 timer ta omtrent 30 minutter. Og samtidig vil prosessorbelastningen være ubetydelig, du kan jobbe uten å føle ubehag.

Hva om du konverterer videoen til et format for en mobilenhet? For å gjøre dette, velg iPhone-profilen (bitrate 1 Mbit/s, 480x320) og se på kodingshastigheten:

Trenger jeg å si noe? En to-timers film i normal iPhone-kvalitet omkodes på mindre enn 15 minutter. Med HD-kvalitet er det vanskeligere, men fortsatt veldig raskt. Det viktigste er at kvaliteten på utgangsvideoen forblir på et ganske høyt nivå når den vises på en telefonskjerm.

Generelt er inntrykkene fra Badaboom positive, hastigheten på operasjonen er behagelig, og grensesnittet er enkelt og oversiktlig. Alle slags feil i tidligere versjoner (jeg brukte betaen i 2008) har blitt fikset. Bortsett fra én ting - banen til kildefilen, så vel som til mappen der den ferdige videoen er lagret, skal ikke inneholde russiske bokstaver. Men sammenlignet med fordelene med programmet, er denne ulempen ubetydelig.

Neste i rekken skal vi ha Super LoiLoScope. For den vanlige versjonen spør de 3.280 rubler, og for berøringsversjonen, som støtter berøringskontroll i Windows 7, ber de om like mye 4.440 rubler. La oss prøve å finne ut hvorfor utvikleren vil ha den slags penger og hvorfor videoredigereren trenger multitouch-støtte. Siste versjon brukt - 1.8.3.3 .

Det er ganske vanskelig å beskrive programgrensesnittet med ord, så jeg bestemte meg for å lage en kort video. Jeg vil si med en gang at, som alle videokonverterere for CUDA, støttes GPU-akselerasjon kun for videoutgang i MPEG4 med h.264-kodeken.

Under koding er prosessorbelastningen 100 %, men dette forårsaker ikke ubehag. Nettleseren og andre lette applikasjoner bremser ikke ned.

La oss nå gå videre til ytelsen. Til å begynne med er alt det samme som med Badaboom - omkoding av videoen til en lignende kvalitet.

Resultatene er mye bedre enn Badaboom. Kvaliteten er også utmerket, forskjellen med originalen kan bare merkes ved å sammenligne rammer i par under et forstørrelsesglass.

Wow, her overgår LoiloScope Badaboom med 2,5 ganger. Samtidig kan du enkelt klippe og kode en annen video parallelt, lese nyheter og til og med se film, og til og med FullHD spilles av uten problemer, selv om prosessorbelastningen er maksimal.

La oss nå prøve å lage en video for en mobilenhet, la oss kalle profilen den samme som den ble kalt i Badaboom – iPhone (480x320, 1 Mbit/s):

Det er ingen feil. Alt ble kontrollert på nytt flere ganger, hver gang ble resultatet det samme. Mest sannsynlig skjer dette av den enkle grunn at SD-filen ble tatt opp med en annen kodek og i en annen beholder. Ved transkoding blir video først dekodet, delt inn i matriser av en viss størrelse og komprimert. ASP-dekoderen som brukes i tilfelle av xvid er tregere enn AVC (for h.264) ved parallell dekoding. Imidlertid er 192 fps 8 ganger raskere enn hastigheten til den originale videoen; en 23-minutters serie komprimeres på mindre enn 4 minutter. Situasjonen ble gjentatt med andre filer komprimert til xvid/DivX.

LoiloScope Jeg etterlot bare hyggelige inntrykk - grensesnittet, til tross for dets uvanlighet, er praktisk og funksjonelt, og operasjonshastigheten er uten ros. Den relativt dårlige funksjonaliteten er noe frustrerende, men ofte med enkel installasjon trenger du bare å justere litt på fargene, lage jevne overganger og legge til tekst, og LoiloScope gjør en utmerket jobb med dette. Prisen er også noe skremmende - mer enn $100 for den vanlige versjonen er normalt for utlandet, men slike tall virker fortsatt litt ville for oss. Selv om jeg innrømmer at hvis jeg for eksempel ofte filmet og redigerte hjemmevideoer, så hadde jeg kanskje tenkt på å kjøpe det. Samtidig sjekket jeg forresten muligheten for å redigere HD (eller rettere sagt AVCHD) innhold direkte fra et videokamera uten først å konvertere til et annet format; LoiloScope avslørte ingen problemer med filer som .mts.

Ny teknologi er som en nylig fremvoksende evolusjonær art. En merkelig skapning, i motsetning til de mange gamle. Noen ganger vanskelig, noen ganger morsomt. Og til å begynne med virker hans nye egenskaper på ingen måte egnet for denne faste og stabile verden.

Det går imidlertid litt tid, og det viser seg at nybegynneren løper fortere, hopper høyere og generelt sett er sterkere. Og han spiser mer fluer enn sine retrograde naboer. Og så begynner de samme naboene å forstå at det ikke nytter å krangle med denne klønete førstnevnte. Det er bedre å være venner med ham, og enda bedre å organisere en symbiose. Du vil se at det kommer flere fluer.

GPGPU-teknologi (General-Purpose Graphics Processing Units - generell grafisk prosessor) eksisterte i lang tid bare i teoretiske beregninger av smarte akademikere. Hvordan ellers? Å foreslå å radikalt endre databehandlingsprosessen som har utviklet seg over flere tiår ved å overlate beregningen av parallelle grener til et skjermkort - bare teoretikere er i stand til dette.

Logoen til CUDA-teknologien minner oss om at den vokste i dypet av
3D-grafikk.

Men GPGPU-teknologien kom ikke til å samle støv lenge på sidene til universitetstidsskrifter. Etter å ha fluffet opp fjærene til hennes beste egenskaper, vakte hun oppmerksomheten til produsentene. Slik ble CUDA født - en implementering av GPGPU på GeForce-grafikkprosessorer produsert av nVidia.

Takket være CUDA har GPGPU-teknologier blitt mainstream. Og nå er det bare de mest nærsynte og dekket med et tykt lag av latskap som utviklere av programmeringssystemer som ikke erklærer støtte for CUDA med sitt produkt. IT-publikasjoner anså det som en ære å presentere detaljene om teknologien i en rekke fyldige populærvitenskapelige artikler, og konkurrenter satte seg umiddelbart ned med mønstre og krysskompilatorer for å utvikle noe lignende.

Offentlig anerkjennelse er en drøm ikke bare for ambisiøse stjerner, men også for nyfødte teknologier. Og CUDA var heldig. Hun er godt kjent, de snakker og skriver om henne.

De skriver bare som om de fortsetter å diskutere GPGPU i tykke vitenskapelige tidsskrifter. De bombarderer leseren med en haug med begreper som "grid", "SIMD", "warp", "host", "tekstur og konstant minne". De fordyper ham helt til topps i organisasjonsdiagrammene til nVidia GPUer, leder ham langs svingete stier av parallelle algoritmer og (det sterkeste trekket) viser lange kodelister på C-språket. Som et resultat viser det seg at vi ved inngangen til artikkelen har en fersk leser med et brennende ønske om å forstå CUDA, og ved utgangen har vi den samme leseren, men med et hovent hode fylt med et rot av fakta, diagrammer , kode, algoritmer og termer.

I mellomtiden er målet med enhver teknologi å gjøre livene våre enklere. Og CUDA gjør en god jobb med dette. Resultatene av arbeidet hennes er det som vil overbevise enhver skeptiker bedre enn hundrevis av skjemaer og algoritmer.

Ikke overalt

CUDA støttes av høyytelses superdatamaskiner
nVidia Tesla.

Og likevel, før du ser på resultatene av CUDAs arbeid med å gjøre livet til den gjennomsnittlige brukeren enklere, er det verdt å forstå alle dens begrensninger. Akkurat som med en genie: ethvert ønske, men ett. CUDA har også sine akilleshæler. En av dem er begrensningene til plattformene den kan fungere på.

Listen over nVidia-skjermkort som støtter CUDA er presentert i en spesiell liste kalt CUDA-aktiverte produkter. Listen er ganske imponerende, men lett å klassifisere. CUDA-støtte nektes ikke:

    nVidia GeForce 8., 9., 100., 200. og 400. seriemodeller med minimum 256 megabyte videominne ombord. Støtte strekker seg til både desktop- og mobilkort.

    De aller fleste desktop- og mobilskjermkort er nVidia Quadro.

    Alle løsninger fra nvidia ION netbook-serien.

    Høyytelses HPC (High Performance Computing) og nVidia Tesla superdatamaskinløsninger som brukes både for personlig databehandling og for å organisere skalerbare klyngesystemer.

Derfor, før du bruker CUDA-baserte programvareprodukter, er det verdt å sjekke denne listen over favoritter.

I tillegg til selve skjermkortet kreves det en passende driver for å støtte CUDA. Det er koblingen mellom sentral- og grafikkprosessoren, og fungerer som et slags programvaregrensesnitt for tilgang til programkode og data til multikjerneskatten til GPU. For å være sikker på at du ikke gjør en feil, anbefaler nVidia at du besøker driversiden og får den nyeste versjonen.

...men selve prosessen

Hvordan fungerer CUDA? Hvordan forklare den komplekse prosessen med parallell databehandling på en spesiell GPU-maskinvarearkitektur uten å kaste leseren ned i avgrunnen av spesifikke termer?

Du kan prøve å gjøre dette ved å forestille deg hvordan sentralprosessoren utfører programmet i symbiose med grafikkprosessoren.

Arkitektonisk er den sentrale prosessorenheten (CPU) og dens grafikkmotpart (GPU) utformet annerledes. Hvis vi trekker en analogi med bilindustriens verden, så er CPU en stasjonsvogn, en av de som kalles en "låve". Det ser ut som en personbil, men på samme tid (fra utviklernes synspunkt) "er det en sveitser, en reaper og en spiller på røret." Utfører rollen som en liten lastebil, buss og hypertrofiert kombi samtidig. Stasjonsvogn, kort sagt. Den har få sylinderkjerner, men de håndterer nesten alle oppgaver, og det imponerende cache-minnet er i stand til å lagre en haug med data.

Men GPU er en sportsbil. Det er bare én funksjon: å levere piloten til mål så raskt som mulig. Derfor ingen stort bagasjeromsminne, ingen ekstra seter. Men det er hundrevis av ganger flere sylinderkjerner enn CPU.

Takket være CUDA trenger ikke GPGPU-programutviklere å fordype seg i kompleksiteten ved programmering
utvikling for grafikkmotorer som DirectX og OpenGL

I motsetning til sentralprosessoren, som er i stand til å løse enhver oppgave, inkludert grafikk, men med gjennomsnittlig ytelse, er grafikkprosessoren tilpasset en høyhastighetsløsning av én oppgave: å gjøre om en haug med polygoner ved inngangen til en haug med piksler kl. utgangen. Dessuten kan dette problemet løses parallelt ved å bruke hundrevis av relativt enkle datakjerner i GPUen.

Så hva slags tandem kan det være fra en stasjonsvogn og en sportsbil? CUDA fungerer omtrent slik: programmet kjører på CPU-en til det er en kodedel som kan kjøres parallelt. Så, i stedet for at den sakte kjøres på to (eller til og med åtte) kjerner av den kuleste CPU, overføres den til hundrevis av GPU-kjerner. Samtidig reduseres utførelsestiden for denne delen betydelig, noe som betyr at utføringstiden for hele programmet også reduseres.

Teknologisk endres ingenting for programmereren. Koden til CUDA-programmer er skrevet på C-språk. Mer presist, på sin spesielle dialekt "C med bekker" (C med bekker). Utviklet ved Stanford, kalles denne utvidelsen av C-språket Brook. Grensesnittet som overfører Brook-kode til GPUen er driveren til et skjermkort som støtter CUDA. Den organiserer hele prosesseringsprosessen til denne delen av programmet slik at for programmereren ser GPU ut som en CPU-koprosessor. Svært lik bruken av en matematisk koprosessor i de tidlige dagene av personlig databehandling. Med bruken av Brook, skjermkort med CUDA-støtte og drivere for dem, har enhver programmerer blitt i stand til å få tilgang til GPUen i programmene sine. Men før denne sjamanismen var eid av en smal krets av utvalgte mennesker som brukte år på å finpusse programmeringsteknikker for DirectX- eller OpenGL-grafikkmotorer.

I tønnen til denne pretensiøse honningen - CUDAs lovprisninger - er det verdt å legge en flue i salven, det vil si restriksjoner. Ikke alle problemer som må programmeres kan løses med CUDA. Det vil ikke være mulig å fremskynde løsningen av rutinemessige kontoroppgaver, men du kan stole på at CUDA beregner oppførselen til tusenvis av samme type jagerfly i World of Warcraft. Men dette er en oppdiktet oppgave. La oss se på eksempler på hva CUDA allerede løser veldig effektivt.

Rettferdige gjerninger

CUDA er en veldig pragmatisk teknologi. Etter å ha implementert støtten i skjermkortene sine, forventet nVidia med rette at CUDA-banneret ville bli tatt opp av mange entusiaster både i universitetsmiljøet og i handelen. Og slik ble det. CUDA-baserte prosjekter lever og gir fordeler.

NVIDIA PhysX

Når de annonserer for sitt neste spillmesterverk, legger produsentene ofte vekt på 3D-realismen. Men uansett hvor ekte 3D-spillverdenen kan være, hvis fysikkens elementære lover, som gravitasjon, friksjon og hydrodynamikk, implementeres feil, vil usannheten merkes umiddelbart.

En av egenskapene til NVIDIA PhysX fysikkmotoren er realistisk arbeid med vev.

Implementering av algoritmer for datasimulering av grunnleggende fysiske lover er en svært arbeidskrevende oppgave. De mest kjente selskapene på dette feltet er det irske selskapet Havok med sin fysiske Havok Physics på tvers av plattformer og Californian Ageia – stamfaderen til verdens første fysiske prosessor (PPU – Physics Processing Unit) og den tilsvarende PhysX-fysikkmotoren. Den første av dem, selv om den er kjøpt opp av Intel, jobber nå aktivt med å optimalisere Havok-motoren for ATI-skjermkort og AMD-prosessorer. Men Ageia med sin PhysX-motor ble en del av nVidia. Samtidig løste nVidia det ganske vanskelige problemet med å tilpasse PhysX til CUDA-teknologi.

Dette ble mulig takket være statistikk. Det er statistisk bevist at uansett hvor kompleks gjengivelse en GPU utfører, er noen av kjernene fortsatt inaktive. Det er på disse kjernene PhysX-motoren kjører.

Takket være CUDA begynte brorparten av beregninger relatert til fysikken i spillverdenen å bli utført på skjermkortet. Den frigjorte kraften til sentralprosessoren ble brukt til å løse andre spillproblemer. Resultatet lot ikke vente på seg. Ifølge eksperter har ytelsesgevinsten i spilling med PhysX som kjører på CUDA økt med minst en størrelsesorden. Sannsynligheten for å realisere fysiske lover har også økt. CUDA tar seg av den rutinemessige beregningen av implementering av friksjon, tyngdekraft og annet kjent for oss for flerdimensjonale objekter. Nå passer ikke bare heltene og utstyret deres perfekt inn i lovene i den fysiske verden vi er kjent med, men også støv, tåke, eksplosjonsbølger, flammer og vann.

CUDA-versjon av NVIDIA Texture Tools 2 teksturkomprimeringspakke

Liker du realistiske objekter i moderne spill? Det er verdt å si takk til teksturutviklerne. Men jo mer virkelighet det er i teksturen, desto større volum. Jo mer det tar opp dyrebart minne. For å unngå dette blir teksturer forhåndskomprimert og dynamisk dekomprimert etter behov. Og kompresjon og dekompresjon er rene beregninger. For å jobbe med teksturer har nVidia gitt ut NVIDIA Texture Tools-pakken. Den støtter effektiv komprimering og dekomprimering av DirectX-teksturer (det såkalte HF-formatet). Den andre versjonen av denne pakken har støtte for BC4- og BC5-komprimeringsalgoritmer implementert i DirectX 11-teknologi. Men det viktigste er at NVIDIA Texture Tools 2 inkluderer CUDA-støtte. I følge nVidia gir dette en 12-dobling av ytelsen i teksturkomprimering og dekompresjonsoppgaver. Dette betyr at spillrammer vil lastes raskere og glede spilleren med sin realisme.

NVIDIA Texture Tools 2-pakken er designet for å fungere med CUDA. Ytelsesgevinsten ved komprimering og dekomprimering av teksturer er åpenbar.

Bruk av CUDA kan forbedre effektiviteten av videoovervåking betydelig.

Videostrømbehandling i sanntid

Uansett hva man kan si, er den nåværende verden, fra et spioneringssynspunkt, mye nærmere verden til Orwells storebror enn det ser ut til. Både bilførere og besøkende på offentlige steder kjenner blikket til videokameraer.

Fullflytende elver av videoinformasjon strømmer inn i sentrene av behandlingen og ... løper inn i en smal lenke - en person. I de fleste tilfeller er han den siste myndigheten som overvåker videoverdenen. Dessuten er ikke myndigheten den mest effektive. Blinker, blir distrahert og prøver å sovne.

Takket være CUDA ble det mulig å implementere algoritmer for samtidig sporing av flere objekter i en videostrøm. I dette tilfellet skjer prosessen i sanntid, og videoen er full 30 fps. Sammenlignet med implementeringen av en slik algoritme på moderne multi-core CPUer, gir CUDA en to- eller tredobling av ytelsen, og dette, ser du, er ganske mye.

Videokonvertering, lydfiltrering

Badaboom videoomformer er den første som bruker CUDA for å øke hastigheten på konverteringen.

Det er fint å se et nytt videoutleieprodukt i FullHD-kvalitet og på en stor skjerm. Men du kan ikke ta en stor skjerm med deg på veien, og FullHD-videokodeken vil hikke på lavstrømprosessoren til en mobil dings. Konvertering kommer til unnsetning. Men de fleste som har vært borti det i praksis klager på den lange konverteringstiden. Dette er forståelig, prosessen er rutinemessig, egnet for parallellisering, og dens utførelse på CPU er ikke veldig optimal.

Men CUDA takler det med et brak. Det første tegnet er Badaboom-omformeren fra Elevental. Badaboom-utviklerne tok den riktige avgjørelsen da de valgte CUDA. Tester viser at den konverterer en standard time og en halv film til iPhone/iPod Touch-format på mindre enn tjue minutter. Og dette til tross for at når du bare bruker CPU, tar denne prosessen mer enn en time.

Hjelper CUDA og profesjonelle musikkelskere. Hvilken som helst av dem ville gi et halvt kongedømme for en effektiv FIR-crossover – et sett med filtre som deler lydspekteret inn i flere bånd. Denne prosessen er svært arbeidskrevende og, med et stort volum av lydmateriale, tvinger lydteknikeren til å "røyke" i flere timer. Implementering av en CUDA-basert FIR crossover øker hastigheten på driften hundrevis av ganger.

CUDA Future

Etter å ha gjort GPGPU-teknologi til en realitet, hviler CUDA ikke på laurbærene. Som det skjer overalt, fungerer refleksjonsprinsippet i CUDA: Nå påvirker ikke bare arkitekturen til nVidia-videoprosessorer utviklingen av CUDA SDK-versjoner, men CUDA-teknologien tvinger selv nVidia til å revurdere arkitekturen til brikkene sine. Et eksempel på slik refleksjon er nVidia ION-plattformen. Den andre versjonen er spesielt optimalisert for å løse CUDA-problemer. Dette betyr at selv i relativt rimelige maskinvareløsninger vil forbrukerne få all kraften og de strålende egenskapene til CUDA.

Og den er designet for å oversette vertskode (hoved-, kontrollkode) og enhetskode (maskinvarekode) (filer med .cu-utvidelsen) til objektfiler som er egnet for prosessen med å sette sammen det endelige programmet eller biblioteket i et hvilket som helst programmeringsmiljø, for eksempel. i NetBeans.

CUDA-arkitekturen bruker en rutenettminnemodell, klyngetrådmodellering og SIMD-instruksjoner. Gjelder ikke bare for høyytelses grafikkdatabehandling, men også for ulike vitenskapelige databehandlinger som bruker nVidia-skjermkort. Forskere og forskere bruker CUDA mye på en rekke felt, inkludert astrofysikk, beregningsbiologi og kjemi, modellering av væskedynamikk, elektromagnetiske interaksjoner, datatomografi, seismisk analyse og mer. CUDA har muligheten til å koble til applikasjoner ved hjelp av OpenGL og Direct3D. CUDA er programvare på tvers av plattformer for operativsystemer som Linux, Mac OS X og Windows.

22. mars 2010 ga nVidia ut CUDA Toolkit 3.0, som inneholdt støtte for OpenCL.

Utstyr

CUDA-plattformen dukket først opp på markedet med utgivelsen av åttende generasjons NVIDIA G80-brikke og ble til stede i alle påfølgende serier med grafikkbrikker, som brukes i GeForce-, Quadro- og NVidia Tesla-akseleratorfamiliene.

Den første serien med maskinvare som støttet CUDA SDK, G8x, hadde en 32-bits enkeltpresisjonsvektorprosessor som brukte CUDA SDK som API (CUDA støtter C-dobbeltypen, men presisjonen er nå redusert til 32-bits flytende punkt). Senere GT200-prosessorer har støtte for 64-biters presisjon (kun SFU), men ytelsen er betydelig dårligere enn for 32-biters presisjon (på grunn av det faktum at det kun er to SFUer per stream multiprosessor, mens det er åtte skalarprosessorer). GPUen organiserer multithreading av maskinvare, som lar deg bruke alle ressursene til GPUen. Dermed åpner prospektet for å overføre funksjonene til den fysiske akseleratoren til grafikkakseleratoren (et eksempel på implementering er nVidia PhysX). Det åpner også for store muligheter for å bruke datagrafikkmaskinvare for å utføre komplekse ikke-grafiske beregninger: for eksempel i beregningsbiologi og andre vitenskapsgrener.

Fordeler

Sammenlignet med den tradisjonelle tilnærmingen til å organisere generell databehandling gjennom grafikk-APIer, har CUDA-arkitekturen følgende fordeler på dette området:

Begrensninger

  • Alle funksjoner som er kjørbare på enheten støtter ikke rekursjon (CUDA Toolkit 3.1 støtter pekere og rekursjon) og har noen andre begrensninger

Støttede GPUer og grafikkakseleratorer

Listen over enheter fra utstyrsprodusenten Nvidia med erklært full støtte for CUDA-teknologi er gitt på den offisielle Nvidia-nettsiden: CUDA-Enabled GPU Products (engelsk).

Faktisk støtter følgende periferiutstyr for tiden CUDA-teknologi i PC-maskinvaremarkedet:

Spesifikasjonsversjon GPU Skjermkort
1.0 G80, G92, G92b, G94, G94b GeForce 8800GTX/Ultra, 9400GT, 9600GT, 9800GT, Tesla C/D/S870, FX4/5600, 360M, GT 420
1.1 G86, G84, G98, G96, G96b, G94, G94b, G92, G92b GeForce 8400GS/GT, 8600GT/GTS, 8800GT/GTS, 9600 GSO, 9800GTX/GX2, GTS 250, GT 120/30/40, FX 4/570, 3/580, 17/18/42000, 2xxMx, 2xxMx /370M, 3/5/770M, 16/17/27/28/36/37/3800M, NVS420/50
1.2 GT218, GT216, GT215 GeForce 210, GT 220/40, FX380 LP, 1800M, 370/380M, NVS 2/3100M
1.3 GT200, GT200b GeForce GTX 260, GTX 275, GTX 280, GTX 285, GTX 295, Tesla C/M1060, S1070, Quadro CX, FX 3/4/5800
2.0 GF100, GF110 GeForce (GF100) GTX 465, GTX 470, GTX 480, Tesla C2050, C2070, S/M2050/70, Quadro Plex 7000, Quadx 5000, 5, 6000, GFORCE (GF110)
2.1 GF104, GF114, GF116, GF108, GF106 GeForce 610M, GT 430, GT 440, GTS 450, GTX 460, GTX 550 Ti, GTX 560, GTX 560 Ti, 500M, Quadro 600, 2000
3.0 GK104, GK106, GK107 GeForce GTX 690, GTX 680, GTX 670, GTX 660 TI, GTX 660, GTX 650 TI, GTX 650, GT 640, GEFORCE GTX 670MX, GTX, GTX, GTX, GTX, GTX, GTX, GTX, GTX, GTX, GTX, GTX, GTX, GTX, GTX 660MX 660mx 660mx 660mx 660mx 660mx 640, GTX 650, GTX 650, GTX 650, GTX 650, GTX 650, GTX 650, GTX 650, GTX 650. T 650m, GeForce GT 645M, GeForce GT 640M
3.5 GK110
Nvidia GeForce for stasjonære datamaskiner
GeForce GTX 590
GeForce GTX 580
GeForce GTX 570
GeForce GTX 560 Ti
GeForce GTX 560
GeForce GTX 550 Ti
GeForce GTX 520
GeForce GTX 480
GeForce GTX 470
GeForce GTX 465
GeForce GTX 460
GeForce GTS 450
GeForce GTX 295
GeForce GTX 285
GeForce GTX 280
GeForce GTX 275
GeForce GTX 260
GeForce GTS 250
GeForce GT 240
GeForce GT 220
GeForce 210
GeForce GTS 150
GeForce GT 130
GeForce GT 120
GeForce G100
GeForce 9800 GX2
GeForce 9800 GTX+
GeForce 9800 GTX
GeForce 9800 GT
GeForce 9600 GSO
GeForce 9600 GT
GeForce 9500 GT
GeForce 9400 GT
GeForce 9400 mGPU
GeForce 9300 mGPU
GeForce 8800 GTS 512
GeForce 8800 GT
GeForce 8600 GTS
GeForce 8600 GT
GeForce 8500 GT
GeForce 8400GS
Nvidia GeForce for mobile datamaskiner
GeForce GTX 580M
GeForce GTX 570M
GeForce GTX 560M
GeForce GT 555M
GeForce GT 540M
GeForce GT 525M
GeForce GT 520M
GeForce GTX 485M
GeForce GTX 480M
GeForce GTX 470M
GeForce GTX 460M
GeForce GT 445M
GeForce GT 435M
GeForce GT 425M
GeForce GT 420M
GeForce GT 415M
GeForce GTX 285M
GeForce GTX 280M
GeForce GTX 260M
GeForce GTS 360M
GeForce GTS 350M
GeForce GTS 160M
GeForce GTS 150M
GeForce GT 335M
GeForce GT 330M
GeForce GT 325M
GeForce GT 240M
GeForce GT 130M
GeForce G210M
GeForce G110M
GeForce G105M
GeForce 310M
GeForce 305M
GeForce 9800M GTX
GeForce 9800M GT
GeForce 9800M GTS
GeForce 9700M GTS
GeForce 9700M GT
GeForce 9650MGS
GeForce 9600M GT
GeForce 9600MGS
GeForce 9500MGS
GeForce 9500M G
GeForce 9300MGS
GeForce 9300M G
GeForce 9200MGS
GeForce 9100M G
GeForce 8800M GTS
GeForce 8700M GT
GeForce 8600M GT
GeForce 8600MGS
GeForce 8400M GT
GeForce 8400MGS
Nvidia Tesla *
Tesla C2050/C2070
Tesla M2050/M2070/M2090
Tesla S2050
Tesla S1070
Tesla M1060
Tesla C1060
Tesla C870
Tesla D870
Tesla S870
Nvidia Quadro for stasjonære datamaskiner
Quadro 6000
Quadro 5000
Quadro 4000
Quadro 2000
Quadro 600
Quadro FX 5800
Quadro FX 5600
Quadro FX 4800
Quadro FX 4700 X2
Quadro FX 4600
Quadro FX 3700
Quadro FX 1700
Quadro FX 570
Quadro FX 470
Quadro FX 380 lavprofil
Quadro FX 370
Quadro FX 370 lavprofil
Quadro CX
Quadro NVS 450
Quadro NVS 420
Quadro NVS 290
Quadro Plex 2100 D4
Quadro Plex 2200 D2
Quadro Plex 2100 S4
Quadro Plex 1000 Model IV
Nvidia Quadro for mobil databehandling
Quadro 5010M
Quadro 5000M
Quadro 4000M
Quadro 3000M
Quadro 2000M
Quadro 1000M
Quadro FX 3800M
Quadro FX 3700M
Quadro FX 3600M
Quadro FX 2800M
Quadro FX 2700M
Quadro FX 1800M
Quadro FX 1700M
Quadro FX 1600M
Quadro FX 880M
Quadro FX 770M
Quadro FX 570M
Quadro FX 380M
Quadro FX 370M
Quadro FX 360M
Quadro NVS 5100M
Quadro NVS 4200M
Quadro NVS 3100M
Quadro NVS 2100M
Quadro NVS 320M
Quadro NVS 160M
Quadro NVS 150M
Quadro NVS 140M
Quadro NVS 135M
Quadro NVS 130M
  • Modellene Tesla C1060, Tesla S1070, Tesla C2050/C2070, Tesla M2050/M2070, Tesla S2050 tillater GPU-beregninger med dobbel presisjon.

Funksjoner og spesifikasjoner for ulike versjoner

Funksjonsstøtte (ulistede funksjoner er
støttes for alle datafunksjoner)
Beregningsevne (versjon)
1.0 1.1 1.2 1.3 2.x

32-bits ord i globalt minne
Nei Ja

flyttallverdier i globalt minne
Heltalls atomfunksjoner som opererer på
32-bits ord i delt minne
Nei Ja
atomicExch() som opererer på 32-bit
flyttallverdier i delt minne
Heltalls atomfunksjoner som opererer på
64-bits ord i globalt minne
Warp stemme funksjoner
Dobbelpresisjon flyttalloperasjoner Nei Ja
Atomfunksjoner som opererer på 64-bit
heltallsverdier i delt minne
Nei Ja
Flytepunkt atomtilsetning opererer på
32-bits ord i globalt og delt minne
_stemmeseddel()
_threadfence_system()
_syncthreads_count(),
_syncthreads_and(),
_syncthreads_or()
Overflatefunksjoner
3D rutenett av trådblokk
Tekniske spesifikasjoner Beregningsevne (versjon)
1.0 1.1 1.2 1.3 2.x
Maksimal dimensjonalitet til rutenettet av gjengeblokker 2 3
Maksimal x-, y- eller z-dimensjon for et rutenett av trådblokker 65535
Maksimal dimensjonalitet til gjengeblokk 3
Maksimal x- eller y-dimensjon for en blokk 512 1024
Maksimal z-dimensjon for en blokk 64
Maksimalt antall tråder per blokk 512 1024
Renningsstørrelse 32
Maksimalt antall residente blokker per multiprosessor 8
Maksimalt antall innbyggede varps per multiprosessor 24 32 48
Maksimalt antall faste tråder per multiprosessor 768 1024 1536
Antall 32-bits registre per multiprosessor 8K 16K 32K
Maksimal mengde delt minne per multiprosessor 16 KB 48 KB
Antall delte minnebanker 16 32
Mengde lokalt minne per tråd 16 KB 512 KB
Konstant minnestørrelse 64 KB
Cache arbeidssett per multiprosessor for konstant minne 8 KB
Cache arbeidssett per multiprosessor for teksturminne Enhetsavhengig, mellom 6 KB og 8 KB
Maksimal bredde for 1D-tekstur
8192 32768
Maksimal bredde for 1D-tekstur
referanse bundet til lineært minne
2 27
Maksimal bredde og antall lag
for en 1D lagdelt teksturreferanse
8192 x 512 16384 x 2048
Maksimal bredde og høyde for 2D
teksturreferanse bundet til
lineært minne eller en CUDA-array
65536 x 32768 65536 x 65535
Maksimal bredde, høyde og antall
av lag for en 2D lagdelt teksturreferanse
8192 x 8192 x 512 16384 x 16384 x 2048
Maksimal bredde, høyde og dybde
for en 3D-teksturreferanse bundet til lineær
minne eller en CUDA-array
2048 x 2048 x 2048
Maksimalt antall teksturer som
kan være bundet til en kjerne
128
Maksimal bredde for en 1D overflate
referanse bundet til en CUDA-matrise
Ikke
støttes
8192
Maksimal bredde og høyde for en 2D
overflatereferanse bundet til en CUDA-matrise
8192 x 8192
Maks antall flater som
kan være bundet til en kjerne
8
Maks antall instruksjoner pr
kjerne
2 millioner

Eksempel

CudaArray* cu_array; tekstur< float , 2 >tex; // Tildel array cudaMalloc( & cu_array, cudaCreateChannelDesc< float>(), bredde høyde) ; // Kopier bildedata til array cudaMemcpy( cu_array, image, width* height, cudaMemcpyHostToDevice) ; // Bind matrisen til teksturen cudaBindTexture(tex, cu_array); // Kjør kernel dim3 blockDim(16, 16, 1) ; dim3 gridDim(width / blockDim.x, height / blockDim.y, 1); kjerne<<< gridDim, blockDim, 0 >>> (d_odata, bredde, høyde) ; cudaUnbindTexture(tex) ; __global__ void kjerne(float * odata, int høyde, int width) ( usignert int x = blockIdx.x * blockDim.x + threadIdx.x ; usignert int y = blockIdx.y * blockDim.y + threadIdx.y ; float c = texfetch(tex, x, y); odata[ y* width+ x] = c; )

Importer pycuda.driver som drv import numpy drv.init() dev = drv.Device(0) ctx = dev.make_context() mod = drv.SourceModule( """ __global__ void multiply_them(float *dest, float *a, float *b) ( const int i = threadIdx.x; dest[i] = a[i] * b[i]; ) """) multiply_them = mod.get_function ("multiply_them") a = numpy.random .randn (400 ) .astype (numpy.float32 ) b = numpy.random .randn (400 ) .astype (numpy.float32 ) dest_like numpy.zeros (a) multiply_them( drv.Out (dest) , drv.In (a) , drv.In (b) , block= (400 , 1 , 1 ) ) print dest-a*b

CUDA som fag på universiteter

Fra desember 2009 undervises CUDA-programvaremodellen ved 269 universiteter rundt om i verden. I Russland gis det opplæringskurs om CUDA ved St. Petersburg Polytechnic University, Yaroslavl State University. P. G. Demidov, Moskva, Nizhny Novgorod, St. Petersburg, Tver, Kazan, Novosibirsk, Novosibirsk State Technical University, Omsk og Perm State University, International University of the Nature of Society and Man "Dubna", Ivanovo State Energy University, Belgorod State University , MSTU dem. Bauman, Russian Chemical Technical University oppkalt etter. Mendeleev, Interregional Supercomputer Center RAS, . I tillegg, i desember 2009, ble det kunngjort at det første russiske vitenskapelige og pedagogiske senteret "Parallel Computing", som ligger i byen Dubna, begynte å operere, hvis oppgaver inkluderer opplæring og konsultasjoner om å løse komplekse dataproblemer på GPUer.

I Ukraina undervises kurs om CUDA ved Kiev Institute of System Analysis.

Linker

Offisielle ressurser

  • CUDA Zone (russisk) - offisiell CUDA-nettside
  • CUDA GPU Computing (engelsk) - offisielle nettfora dedikert til CUDA-databehandling

Uoffisielle ressurser

Toms maskinvare
  • Dmitrij Tsjekanov. nVidia CUDA: databehandling på et skjermkort eller død av CPU? . Toms maskinvare (22. juni 2008). Arkivert
  • Dmitrij Tsjekanov. nVidia CUDA: Benchmarking GPU-applikasjoner for massemarkedet. Tom's Hardware (19. mai 2009). Arkivert fra originalen 4. mars 2012. Hentet 19. mai 2009.
iXBT.com
  • Alexey Berillo. NVIDIA CUDA - ikke-grafisk databehandling på GPUer. Del 1 . iXBT.com (23. september 2008). Arkivert fra originalen 4. mars 2012. Hentet 20. januar 2009.
  • Alexey Berillo. NVIDIA CUDA - ikke-grafisk databehandling på GPUer. Del 2. iXBT.com (22. oktober 2008). - Eksempler på implementering av NVIDIA CUDA. Arkivert fra originalen 4. mars 2012. Hentet 20. januar 2009.
Andre ressurser
  • Boreskov Alexey Viktorovich. CUDA Basics (20. januar 2009). Arkivert fra originalen 4. mars 2012. Hentet 20. januar 2009.
  • Vladimir Frolov. Introduksjon til CUDA-teknologi. Nettmagasinet "Computer Graphics and Multimedia" (19. desember 2008). Arkivert fra originalen 4. mars 2012. Hentet 28. oktober 2009.
  • Igor Oskolkov. NVIDIA CUDA er en rimelig billett til en verden av store databehandlinger. Computerra (30. april 2009). Hentet 3. mai 2009.
  • Vladimir Frolov. Introduksjon til CUDA-teknologi (1. august 2009). Arkivert fra originalen 4. mars 2012. Hentet 3. april 2010.
  • GPGPU.ru. Bruke skjermkort til databehandling
  • . Parallell Computing Center

Notater

se også

I utviklingen av moderne prosessorer er det en tendens til en gradvis økning i antall kjerner, noe som øker deres evner i parallell databehandling. Imidlertid har det lenge vært tilgjengelige GPUer som er betydelig overlegne CPUer i denne forbindelse. Og disse egenskapene til GPUer har allerede blitt tatt i betraktning av noen selskaper. De første forsøkene på å bruke grafikkakseleratorer for ikke-måldatabehandling har blitt gjort siden slutten av 90-tallet. Men bare fremveksten av shaders ble drivkraften for utviklingen av en helt ny teknologi, og i 2003 dukket konseptet med GPGPU (General-purpose graphics processing units) opp. En viktig rolle i utviklingen av dette initiativet ble spilt av BrookGPU, som er en spesiell utvidelse for språket C. Før bruken av BrookGPU kunne programmerere kun jobbe med GPUer gjennom Direct3D eller OpenGL API. Brook tillot utviklere å jobbe med et kjent miljø, og kompilatoren selv, ved å bruke spesielle biblioteker, implementerte interaksjon med GPU på et lavt nivå.

En slik fremgang kunne ikke unngå å tiltrekke oppmerksomheten til lederne av denne industrien - AMD og NVIDIA, som begynte å utvikle sine egne programvareplattformer for ikke-grafisk databehandling på skjermkortene sine. Ingen vet bedre enn GPU-utviklere alle nyansene og funksjonene til produktene deres, noe som gjør at de samme selskapene kan optimalisere programvarepakken for spesifikke maskinvareløsninger så effektivt som mulig. For tiden utvikler NVIDIA CUDA (Compute Unified Device Architecture)-plattformen; AMD kaller en lignende teknologi CTM (Close To Metal) eller AMD Stream Computing. Vi vil se på noen av egenskapene til CUDA og i praksis evaluere databehandlingsevnene til G92-grafikkbrikken til GeForce 8800 GT-skjermkortet.

Men først, la oss se på noen av nyansene ved å utføre beregninger ved hjelp av GPUer. Deres største fordel er at grafikkbrikken i utgangspunktet er designet for å utføre flere tråder, mens hver kjerne i en konvensjonell CPU utfører en strøm av sekvensielle instruksjoner. Enhver moderne GPU er en multiprosessor som består av flere databehandlingsklynger, med mange ALUer i hver. Den kraftigste moderne GT200-brikken består av 10 slike klynger, som hver har 24 strømprosessorer. Det testede GeForce 8800 GT-skjermkortet basert på G92-brikken har syv store dataenheter med 16 strømprosessorer hver. CPU-er bruker SIMD SSE-blokker for vektorberegninger (enkelt instruksjon flere data - en instruksjon utføres på flere data), som krever transformering av data til 4 vektorer. GPUen behandler tråder skalært, dvs. en instruksjon brukes over flere tråder (SIMT - single instruction multiple threads). Dette sparer utviklere fra å konvertere data til vektorer, og tillater vilkårlig forgrening i strømmer. Hver GPU-dataenhet har direkte minnetilgang. Og videominnets båndbredde er høyere, takket være bruken av flere separate minnekontrollere (på topp-enden G200 er det 8 64-bits kanaler) og høye driftsfrekvenser.

Generelt, i visse oppgaver når du arbeider med store datamengder, er GPUer mye raskere enn CPUer. Nedenfor ser du en illustrasjon av denne uttalelsen:


Diagrammet viser dynamikken i CPU- og GPU-ytelsesvekst siden 2003. NVIDIA liker å sitere disse dataene som reklame i sine dokumenter, men de er bare teoretiske beregninger og i virkeligheten kan gapet selvfølgelig vise seg å være mye mindre.

Men uansett så er det et enormt potensial av GPUer som kan brukes, og som krever en spesifikk tilnærming til programvareutvikling. Alt dette er implementert i CUDA maskinvare- og programvaremiljøet, som består av flere programvarenivåer - høynivå CUDA Runtime API og lavnivå CUDA Driver API.


CUDA bruker standard C-språk for programmering, som er en av hovedfordelene for utviklere. I utgangspunktet inkluderer CUDA bibliotekene BLAS (grunnleggende lineær algebra-pakke) og FFT (Fourier-transformasjon). CUDA har også muligheten til å samhandle med OpenGL eller DirectX grafikk APIer, evnen til å utvikle på et lavt nivå, og er preget av en optimalisert fordeling av datastrømmer mellom CPU og GPU. CUDA-beregninger utføres samtidig med grafikk, i motsetning til den lignende AMD-plattformen, hvor en spesiell virtuell maskin lanseres for beregninger på GPU. Men et slikt "samliv" er også full av feil hvis en stor belastning skapes av grafikk-APIet mens CUDA kjører samtidig - tross alt har grafiske operasjoner fortsatt høyere prioritet. Plattformen er kompatibel med 32- og 64-biters operativsystemer Windows XP, Windows Vista, MacOS X og ulike versjoner av Linux. Plattformen er åpen og på nettsiden kan du i tillegg til spesielle drivere for skjermkortet laste ned programvarepakker CUDA Toolkit, CUDA Developer SDK, inkludert en kompilator, debugger, standardbiblioteker og dokumentasjon.

Når det gjelder den praktiske implementeringen av CUDA, ble denne teknologien i lang tid bare brukt til høyt spesialiserte matematiske beregninger innen partikkelfysikk, astrofysikk, medisin eller prognose endringer i finansmarkedet, etc. Men denne teknologien blir gradvis nærmere vanlige brukere, spesielt dukker det opp spesielle plug-ins for Photoshop som kan bruke datakraften til GPU. På en spesiell side kan du studere hele listen over programmer som bruker egenskapene til NVIDIA CUDA.

Som en praktisk test av den nye teknologien på MSI NX8800GT-T2D256E-OC skjermkortet, vil vi bruke programmet TMPGEnc. Dette produktet er kommersielt (fullversjonen koster $100), men for MSI-skjermkort kommer det som en bonus i en prøveversjon i en periode på 30 dager. Du kan laste ned denne versjonen fra utviklerens nettsted, men for å installere TMPGEnc 4.0 XPress MSI Special Edition trenger du den originale disken med drivere fra MSI-kortet - uten den vil ikke programmet bli installert.

For å vise den mest komplette informasjonen om databehandlingsmuligheter i CUDA og sammenligne dem med andre videoadaptere, kan du bruke det spesielle CUDA-Z-verktøyet. Dette er informasjonen den gir om vårt GeForce 8800GT skjermkort:




Sammenlignet med referansemodellene, opererer vår kopi ved høyere frekvenser: rasterdomenet er 63 MHz høyere enn det nominelle, og skyggeenhetene er raskere med 174 MHz, og minnet er 100 MHz raskere.

Vi vil sammenligne konverteringshastigheten til den samme HD-videoen når vi kun beregner ved bruk av CPU og med ekstra aktivering av CUDA i TMPGEnc-programmet på følgende konfigurasjon:

  • Prosessor: Pentium Dual-Core E5200 2,5 GHz;
  • Hovedkort: Gigabyte P35-S3;
  • Minne: 2x1GB GoodRam PC6400 (5-5-5-18-2T)
  • Skjermkort: MSI NX8800GT-T2D256E-OC;
  • Harddisk: 320GB WD3200AAKS;
  • Strømforsyning: CoolerMaster eXtreme Power 500-PCAP;
  • Operativsystem: Windows XP SP2;
  • TMPGEnc 4.0 XPress 4.6.3.268;
  • Skjermkortdrivere: ForceWare 180.60.
For tester ble prosessoren overklokket til 3 GHz (i 11,5x261 MHz-konfigurasjonen) og til 4 GHz (11,5x348 MHz) med en RAM-frekvens på 835 MHz i det første og andre tilfellet. Video i Full HD 1920x1080 oppløsning, ett minutt og tjue sekunder lang. For å skape ekstra belastning ble et støyreduksjonsfilter slått på, hvis innstillinger ble stående som standard.


Koding ble utført ved hjelp av DivX 6.8.4-kodeken. I kvalitetsinnstillingene til denne kodeken er alle verdier som standard, multithreading er aktivert.


Multithreading-støtte i TMPGEnc er først aktivert i CPU/GPU-innstillinger-fanen. CUDA er også aktivert i samme seksjon.


Som du kan se fra skjermbildet ovenfor, er filterbehandling med CUDA aktivert, men maskinvarevideodekoderen er ikke aktivert. Programdokumentasjonen advarer om at aktivering av den siste parameteren øker filbehandlingstiden.

Basert på resultatene av testene ble følgende data oppnådd:


Ved 4 GHz med CUDA aktivert fikk vi bare et par sekunder (eller 2%), noe som ikke er spesielt imponerende. Men ved en lavere frekvens lar økningen fra aktivering av denne teknologien deg spare omtrent 13% av tiden, noe som vil være ganske merkbart når du behandler store filer. Men resultatene er likevel ikke så imponerende som forventet.

TMPGEnc-programmet har en CPU- og CUDA-belastningsindikator; i denne testkonfigurasjonen viste den CPU-belastningen på omtrent 20 %, og grafikkjernen på de resterende 80 %. Som et resultat har vi samme 100% som ved konvertering uten CUDA, og det er kanskje ikke tidsforskjell i det hele tatt (men den eksisterer fortsatt). Den lille minnekapasiteten på 256 MB er heller ikke en begrensende faktor. Etter avlesningene fra RivaTuner å dømme, ble det ikke brukt mer enn 154 MB videominne under drift.



konklusjoner

TMPGEnc-programmet er et av de som introduserer CUDA-teknologi til massene. Ved å bruke GPU i dette programmet kan du øke hastigheten på videobehandlingsprosessen og betydelig avlaste sentralprosessoren, noe som lar brukeren komfortabelt utføre andre oppgaver samtidig. I vårt spesifikke eksempel forbedret GeForce 8800GT 256MB skjermkort timing-ytelsen litt ved konvertering av video basert på en overklokket Pentium Dual-Core E5200-prosessor. Men det er tydelig at når frekvensen reduseres, øker gevinsten ved å aktivere CUDA; på svake prosessorer vil gevinsten fra bruken være mye større. På bakgrunn av denne avhengigheten er det ganske logisk å anta at selv med en økning i belastningen (for eksempel bruk av et veldig stort antall ekstra videofiltre), vil resultatene av et system med CUDA utmerke seg med en mer signifikant delta av forskjellen i tiden brukt på kodingsprosessen. Ikke glem at G92 ikke er den kraftigste brikken for øyeblikket, og mer moderne skjermkort vil gi betydelig høyere ytelse i slike applikasjoner. Mens applikasjonen kjører, er imidlertid ikke GPU fullastet, og sannsynligvis avhenger lastfordelingen av hver konfigurasjon separat, nemlig på prosessor/skjermkort-kombinasjonen, som til slutt kan gi en større (eller mindre) økning i prosent av CUDA-aktivering. Uansett, for de som jobber med store mengder videodata, vil denne teknologien fortsatt tillate dem å spare tid betydelig.

Riktignok har CUDA ennå ikke fått stor popularitet; kvaliteten på programvaren som jobber med denne teknologien krever forbedring. I TMPGEnc 4.0 XPress-programmet vi gjennomgikk, fungerte ikke alltid denne teknologien. Den samme videoen kunne kodes på nytt flere ganger, og så plutselig, neste gang den ble lansert, var CUDA-belastningen allerede 0 %. Og dette fenomenet var helt tilfeldig på helt andre operativsystemer. Dessuten nektet det aktuelle programmet å bruke CUDA ved koding til XviD-formatet, men det var ingen problemer med den populære DivX-kodeken.

Som et resultat kan så langt CUDA-teknologi øke ytelsen til personlige datamaskiner betydelig bare i visse oppgaver. Men anvendelsesområdet for slik teknologi vil utvide seg, og prosessen med å øke antall kjerner i konvensjonelle prosessorer indikerer en økning i etterspørselen etter parallell multi-threaded databehandling i moderne programvareapplikasjoner. Det er ikke for ingenting at alle industriledere nylig har blitt besatt av ideen om å kombinere CPU og GPU i én enhetlig arkitektur (bare husk den mye annonserte AMD Fusion). Kanskje CUDA er en av stadiene i prosessen med denne foreningen.


Vi takker følgende selskaper for å levere testutstyr:

– et sett med programvaregrensesnitt på lavt nivå ( API) for å lage spill og andre høyytelses multimedieapplikasjoner. Inkluderer støtte for høy ytelse 2D- Og 3D-grafikk, lyd og inndataenheter.

Direct3D (D3D) – grensesnitt for visning av tredimensjonal primitiver(geometriske legemer). Inkludert i .

OpenGL(fra engelsk Åpne grafikkbiblioteket, bokstavelig talt - åpent grafikkbibliotek) er en spesifikasjon som definerer et programmeringsspråkuavhengig programmeringsgrensesnitt på tvers av plattformer for å skrive applikasjoner ved hjelp av todimensjonal og tredimensjonal datagrafikk. Inkluderer over 250 funksjoner for å tegne komplekse 3D-scener fra enkle primitiver. Brukes til å lage videospill, virtuell virkelighet og visualisering i vitenskapelig forskning. På plattformen Windows konkurrerer med .

OpenCL(fra engelsk Åpne dataspråk, bokstavelig talt – et åpent språk for beregninger) – rammeverk(programvaresystemrammeverk) for å skrive dataprogrammer relatert til parallell databehandling på forskjellig grafikk ( GPU) Og ( ). Til rammeverket OpenCL inkluderer et programmeringsspråk og appli( API). OpenCL gir parallellitet på instruksjonsnivå og på datanivå og er en implementering av teknikken GPGPU.

GPGPU(forkortet fra engelsk) Generelle bruks grafiske bearbeidingsenheter, bokstavelig - GPU generell bruk) er en teknikk for å bruke en grafikkbehandlingsenhet (GPU) eller skjermkort for generell databehandling som vanligvis utføres av en datamaskin.

Shader(Engelsk) skyggelegger) – et program for å konstruere skygger på syntetiserte bilder, brukt i tredimensjonal grafikk for å bestemme de endelige parameterne til et objekt eller bilde. Inkluderer vanligvis vilkårlig komplekse beskrivelser av lysabsorpsjon og spredning, teksturkartlegging, refleksjon og brytning, skyggelegging, overflateforskyvning og etterbehandlingseffekter. Komplekse overflater kan visualiseres ved hjelp av enkle geometriske former.

Gjengivelse(Engelsk) gjengivelse) – visualisering, i datagrafikk, prosessen med å få et bilde fra en modell ved hjelp av programvare.

SDK(forkortet fra engelsk) Programvareutviklingssett) – et sett med programvareutviklingsverktøy.

prosessor(forkortet fra engelsk) Sentralenhet, bokstavelig talt – sentral/hoved/hoveddatamaskinenhet) – sentral (mikro), en enhet som utfører maskininstruksjoner; en maskinvare som er ansvarlig for å utføre beregningsoperasjoner (spesifisert av operativsystemet og applikasjonsprogramvaren) og koordinere driften av alle enheter.

GPU(forkortet fra engelsk) Grafisk prosesseringsenhet, bokstavelig talt – grafisk dataenhet) – grafisk prosessor; en separat enhet eller spillkonsoll som utfører grafisk gjengivelse (visualisering). Moderne GPUer er svært effektive til å behandle og vise datagrafikk på en realistisk måte. Grafikkprosessoren i moderne videoadaptere brukes som en 3D-grafikkakselerator, men i noen tilfeller kan den også brukes til beregninger ( GPGPU).

Problemer prosessor

I lang tid skjedde økningen i ytelsen til tradisjonelle hovedsakelig på grunn av en konsekvent økning i klokkefrekvensen (omtrent 80% av ytelsen ble bestemt av klokkefrekvensen) med en samtidig økning i antall transistorer på en brikke . En ytterligere økning i klokkefrekvensen (ved en klokkefrekvens på mer enn 3,8 GHz blir brikkene ganske enkelt overopphetet!) støter på en rekke grunnleggende fysiske barrierer (siden den teknologiske prosessen nesten har nærmet seg størrelsen på et atom: , og størrelsen på et silisiumatom er omtrent 0,543 nm):

For det første, når krystallstørrelsen avtar og klokkefrekvensen øker, øker lekkasjestrømmen til transistorene. Dette fører til økt strømforbruk og økt varmeutslipp;

For det andre er fordelene med høyere klokkehastigheter delvis negert av minnetilgangsforsinkelse, ettersom minnetilgangstider ikke holder tritt med økende klokkehastigheter;

For det tredje, for noen applikasjoner blir tradisjonelle serielle arkitekturer ineffektive ettersom klokkehastighetene øker på grunn av den såkalte "von Neumann-flaskehalsen", en ytelsesbegrensning som følge av sekvensiell beregningsflyt. Samtidig øker de resistiv-kapasitive signaloverføringsforsinkelsene, som er en ekstra flaskehals forbundet med en økning i klokkefrekvensen.

Utvikling GPU

Parallelt med dette skjedde (og er!) utvikling GPU:

november 2008 – Intel introduserte en linje med 4-kjerne Intel Core i7, som er basert på en ny generasjon mikroarkitektur Nehalem. Prosessorene opererer med en klokkefrekvens på 2,6-3,2 GHz. Laget ved hjelp av en 45nm prosessteknologi.

Desember 2008 – leveranser av 4-kjerne startet AMD Phenom II 940(kodenavn - Deneb). Fungerer med en frekvens på 3 GHz, produsert ved hjelp av en 45-nm prosessteknologi.

mai 2009 – selskap AMD introduserte GPU-versjonen ATI Radeon HD 4890 med kjerneklokkehastigheten økt fra 850 MHz til 1 GHz. Dette er den første grafikk prosessor som kjører på 1 GHz. Datakraften til brikken, takket være økningen i frekvens, økte fra 1,36 til 1,6 teraflops. Prosessoren inneholder 800 (!) datakjerner og støtter videominne GDDR5, DirectX 10.1, ATI CrossFireX og alle andre teknologier som er iboende i moderne skjermkortmodeller. Brikken er produsert på grunnlag av 55 nm teknologi.

Hovedforskjeller GPU

Karakteristiske egenskaper GPU(sammenlignet med ) er:

- en arkitektur maksimalt rettet mot å øke hastigheten på beregningen av teksturer og komplekse grafiske objekter;

– typisk toppeffekt GPU mye høyere enn det ;

– takket være en spesialisert transportørarkitektur, GPU mye mer effektiv i å behandle grafisk informasjon enn .

"Krise av sjangeren"

"Sjangerkrise" for modnet i 2005 - det var da de dukket opp. Men, til tross for utviklingen av teknologi, økningen i produktiviteten til konvensjonelle redusert merkbart. Samtidig ytelse GPU fortsetter å vokse. Så i 2003 krystalliserte denne revolusjonerende ideen - bruk datakraften til grafikk for dine behov. GPUer har blitt stadig mer brukt til "ikke-grafisk" databehandling (fysikksimulering, signalbehandling, beregningsmatematikk/geometri, databaseoperasjoner, beregningsbiologi, beregningsøkonomi, datasyn, etc.).

Hovedproblemet var at det ikke fantes et standard programmeringsgrensesnitt GPU. Utviklerne brukte OpenGL eller Direct3D, men det var veldig praktisk. Selskap NVIDIA(en av de største produsentene av grafikk-, media- og kommunikasjonsprosessorer, samt trådløse medieprosessorer; grunnlagt i 1993) begynte å utvikle en enhetlig og praktisk standard – og introduserte teknologien CUDA.

Hvordan det startet

2006 – NVIDIA demonstrerer CUDA™; begynnelsen på en revolusjon innen databehandling GPU.

2007 – NVIDIA utgir arkitektur CUDA(original versjon CUDA SDK ble sendt inn 15. februar 2007); nominasjon "Beste nye produkt" fra magasinet Populærvitenskap og "Lesernes valg" fra publikasjonen HPCWire.

2008 – teknologi NVIDIA CUDA vant kategorien "Technical Excellence" fra PC Magasinet.

Hva har skjedd CUDA

CUDA(forkortet fra engelsk) Compute Unified Device Architecture, bokstavelig talt - enhetlig dataarkitektur for enheter) - arkitektur (et sett med programvare og maskinvare) som lar deg produsere på GPU generelle formål beregninger, mens GPU fungerer faktisk som en kraftig medprosessor.

Teknologi NVIDIA CUDA™ er det eneste utviklingsmiljøet i et programmeringsspråk C, som lar utviklere lage programvare som løser komplekse dataproblemer på kortere tid, takket være prosessorkraften til GPUer. Millioner av mennesker jobber allerede i verden GPU med støtten CUDA, og tusenvis av programmerere bruker allerede (gratis!) verktøy CUDAå akselerere applikasjoner og løse de mest komplekse, ressurskrevende oppgavene - fra video- og lydkoding til olje- og gassutforskning, produktmodellering, medisinsk bildebehandling og vitenskapelig forskning.

CUDA gir utvikleren muligheten til, etter eget skjønn, å organisere tilgang til settet med instruksjoner til grafikkakseleratoren og administrere minnet, og organisere komplekse parallelle beregninger på det. Støtte for grafikkakselerator CUDA blir en kraftig programmerbar åpen arkitektur, lik dagens . Alt dette gir utvikleren lavt nivå, distribuert og høyhastighets tilgang til maskinvare CUDA et nødvendig grunnlag for å bygge seriøse verktøy på høyt nivå, som kompilatorer, debuggere, matematiske biblioteker og programvareplattformer.

Uralsky, ledende teknologispesialist NVIDIA, sammenligne GPU Og , sier dette: " – Dette er en SUV. Han kjører alltid og overalt, men ikke særlig fort. EN GPU– Dette er en sportsbil. På en dårlig vei vil den rett og slett ikke gå noe sted, men gi den et godt underlag, og den vil vise all farten, som en SUV aldri har drømt om!

Teknologiske evner CUDA