Hva er CUDA Meld deg i dag Intro til Parallell Programmering En åpen, online kurs fra Udacity Instruktører: Dr. John Owens, UC Davis og Dr. David Luebke, NVIDIA CUDA reg er en parallell databehandling plattform og programmeringsmodell oppfunnet av NVIDIA. Det muliggjør dramatiske økninger i databehandlingsytelsen ved å utnytte kraften til grafikkbehandlingsenheten (GPU). Med millioner av CUDA-aktiverte GPUer som er solgt til dags dato, finner utviklere, forskere og forskere omfattende bruksområder for GPU-databehandling med CUDA. Her er noen eksempler: Identifiser skjult plakk i arterier. Hjerteangrep er den ledende dødsårsaken over hele verden. Harvard Engineering, Harvard Medical School og Brigham Womens Hospital har samlet seg for å bruke GPUer til å simulere blodstrøm og identifisere skjult arteriell plakk uten invasiv avbildningsteknikker eller utforskende kirurgi. Analyser flytrafikkstrømmen. Det nasjonale luftromssystemet styrer landsomfattende samordning av flytrafikkstrømmen. Datamodeller hjelper til med å identifisere nye måter å lette overbelastning og holde flytrafikken på en effektiv måte. Ved å bruke beregningsstyrken til GPUer oppnådde et lag på NASA en stor ytelsesøkning, noe som reduserte analysetiden fra ti minutter til tre sekunder. Visualisere molekyler. En molekylær simulering kalt NAMD (nanoskala molekylær dynamikk) får en stor ytelse boost med GPUer. Hastigheten er et resultat av den parallelle arkitekturen til GPUer, noe som gjør det mulig for NAMD-utviklere å bruke port-beregningsintensive deler av applikasjonen til GPU ved hjelp av CUDA Toolkit. Bakgrunn GPU-databehandling: Revolusjonen Du står overfor imperativer: Forbedre ytelsen. Løs et problem raskere. Parallell prosessering ville være raskere, men læringskurven er bratt, det er ikke lenger. Med CUDA, kan du sende C, C og Fortran kode direkte til GPU, ingen monteringsspråk kreves. Utviklere hos firmaer som Adobe, ANSYS, Autodesk, MathWorks og Wolfram Research vekker den sovende giganten GPU - å gjøre generell vitenskapelig og teknisk databehandling på en rekke plattformer. Ved hjelp av språk på høyt nivå kjører GPU-akselererte applikasjoner den sekventielle delen av arbeidsbelastningen på CPU-en, som er optimalisert for enkeltspunnet ytelse mens akselererende parallellbehandling på GPU. Dette kalles GPU-databehandling. GPU-databehandling er mulig fordi dagens GPU gjør mye mer enn gjengitt grafikk: Det sizzles med en teraflop av flytende poeng ytelse og crunches applikasjonsoppgaver designet for alt fra finans til medisin. CUDA distribueres bredt gjennom tusenvis av applikasjoner og publiserte forskningspapirer og støttes av en installert base på over 375 millioner CUDA-aktiverte GPUer i bærbare datamaskiner, arbeidsstasjoner, beregne klynger og superdatamaskiner. Besøk CUDA Zone for eksempler på applikasjoner i ulike vertikale markeder og vekke GPU-giganten din. Historikk av GPU Computing De første GPUene ble utformet som grafikkakseleratorer, som kun støtter bestemte fastfunksjonsrørledninger. Begynnelsen på slutten av 1990-tallet ble maskinvaren blitt programmerbar, som kulminerte i NVIDIAs første GPU i 1999. Mindre enn et år etter at NVIDIA hadde laget termen GPU, var kunstnere og spillutviklere de eneste som gjorde banebrytende arbeid med teknologien: Forskere var tapping sin ypperlige flytende ytelse. General Purpose GPU (GPGPU) bevegelsen hadde oppstått. Men GPGPU var langt fra lett tilbake da, selv for de som visste grafikkprogrammeringsspråk som OpenGL. Utviklere måtte kartlegge vitenskapelige beregninger på problemer som kunne representeres av trekanter og polygoner. GPGPU var praktisk talt utenfor begrensninger for de som ikke hadde memorisert de nyeste grafikk-APIene før en gruppe av forskere fra Stanford University satte seg på å reimagine GPU som en streaming-prosessor. I 2003 avslørte et team av forskere ledet av Ian Buck Brook, den første allment godkjente programmeringsmodellen for å utvide C med data-parallelle konstruksjoner. Ved hjelp av begreper som strømmer, kjerne og reduksjonsoperatører, avslørte Brook kompilatoren og runtime systemet GPU som en generell prosessor på et høyt nivå språk. Viktigst, Brook-programmer var ikke bare lettere å skrive enn håndjustert GPU-kode, de var syv ganger raskere enn tilsvarende eksisterende kode. NVIDIA visste at lynrask rask maskinvare måtte kobles med intuitive programvare og maskinvareverktøy, og inviterte Ian Buck til å bli med i selskapet og begynne å utvikle en løsning som sømløst kjører C på GPU. Ved å legge programvare og maskinvare sammen, avslørte NVIDIA CUDA i 2006, verdens første løsning for generell databehandling på GPUer. Verktøy og trening I dag øker CUDA økosystem raskt, etterhånden som flere og flere bedrifter tilbyr verktøy, tjenester og løsninger i verdensklasse. Hvis du vil skrive din egen kode, er den enkleste måten å utnytte ytelsen til GPUer med CUDA Toolkit. som gir et omfattende utviklingsmiljø for C og C-utviklere. CUDA Toolkit inneholder en kompilator, matematikkbibliotek og verktøy for feilsøking og optimalisering av ytelsen til dine applikasjoner. Du finner også kodeprøver, programmeringsveiledninger, brukerhåndbøker, API referanser og annen dokumentasjon for å hjelpe deg med å komme i gang. NVIDIA gir alt dette gratis, inkludert NVIDIA Parallel Nsight for Visual Studio, bransjens første utviklingsmiljø for massivt parallelle applikasjoner som bruker både GPUer og CPUer. Lære å bruke CUDA er praktisk, med omfattende online opplæring tilgjengelig, samt andre ressurser, som webinarer og bøker. Over 400 universiteter og høyskoler lærer CUDA programmering, inkludert dusinvis av CUDA Centers of Excellence og CUDA Research and Training Centers. For DevelopersFor en annen tilnærming, kan du avkorte det eksponentielle glidende gjennomsnittsvinduet og deretter beregne det filtrerte signalet ditt ved å gjøre en konvolusjon mellom signalet ditt og vinduet eksponensielt. Konvolusjonen kan beregnes ved å bruke det frie CUDA FFT-biblioteket (cuFFT) fordi, som du kanskje vet, kan konvolusjonen uttrykkes som den punktvise multiplikasjonen av de to signalene i fourier-domenet (Dette er det passende navnet Konvolutionsteorem, som løper med en kompleksitet av O (n log (n))). Denne typen tilnærming vil minimere CUDA kjernekoden og kjøre veldig veldig raskt, selv på en GeForce 570 Spesielt så hvis du kan gjøre alle dine beregninger i enkel (flyt) presisjon. besvart 30 april 14 kl 17:04 Jeg vil foreslå å manipulere ovennevnte forskjellsligning som angitt nedenfor og deretter bruke CUDA Thrust Primitives. FORSKELLIG EQUATION MANIPULATION - EXPLICIT FORM OF THE DIFFERENCE Equation Med enkel algebra kan du finne følgende: Følgelig er den eksplisitte formen følgende: CUDA THRUST IMPLEMENTERING Du kan implementere den eksplisitte skjemaet ovenfor ved å følge disse trinnene: Initialiser en inngangssekvens dinput til alfa bortsett fra dinput0 1. Definer en vektor d1overbetatothen lik 1, 1beta, 1beta2, 1beta3. Multiply elementwise dinput av d1overbetatothen Utfør en inklusivskanning for å oppnå sekvensen av yn-betan Del den ovennevnte sekvensen med 1, 1beta, 1beta2, 1beta3. Ovennevnte tilnærming kan anbefales for lineære tidsvarierende (LTV) systemer. For Linear Time-Invariant (LTI) systemer, kan FFT-tilnærmingen nevnt av Paul anbefales. Jeg gir et eksempel på denne tilnærmingen ved å bruke CUDA Thrust og cuFFT i mitt svar på FIR filter i CUDA. Bruk filter er windowed filter av lineær klasse, som jevner signalet (bildet). Filteret fungerer som lavpass en. Den grunnleggende ideen bak filteret er for ethvert element av signalet (bildet) et gjennomsnitt over hele nabolaget. Hvis vi har en mxn-matrise, og vi vil bruke gjennomsnittlig filter med størrelse k på den, så vil hvert punkt i matrisen p: (i, j) verdien av punktet være gjennomsnittet av alle punkter i firkanten. Denne figuren er for kvadratkjernen med filtrering med størrelse 2. at den gule boksen er pikselet som skal gjennomsnittes, og alt gridet er kvadratet av nabopiksler, at pikslens nye verdi vil være gjennomsnittet av dem. Problemet er at denne algoritmen er veldig treg, spesielt på store bilder, så jeg tenkte på å bruke GPGPU. Spørsmålet er nå. Hvordan kan dette implementeres i cuda, hvis det er mulig Dette er et klassisk tilfelle av pinlig parallelt bildebehandling problem som kan være veldig enkelt kartlagt til CUDA rammeverket. Gjennomsnittlig filter er kjent som Box Filter i bildebehandling domener. Den enkleste tilnærmingen vil være å bruke CUDA-teksturer for filtreringsprosessen, da grenseforholdene kan håndteres veldig lett av teksturer. Forutsatt at du har kilde - og destinasjonspoeng som er allokert på verten. Prosedyren ville være noe sånt. Allokere nok minne til å holde kilden og destinasjonsbildene på enheten. Kopier kildebilde fra vert til enhet. Bind kildebilde-enhetspekeren til tekstur. Angi en passende blokkstørrelse og et rutenett som er stor nok til å dekke alle piksler av bildet. Start filterkjernen ved hjelp av det angitte rutenettet og blokkstørrelsen. Kopier resultatene tilbake til verten. Unbind tekstur Gratis enhetspekere. Eksempelutførelse av boksfilter Den gode nyheten er at du ikke trenger å implementere filteret selv. CUDA Toolkit leveres med gratis signal - og bildebehandlingsbibliotek som heter NVIDIA Performance Primitives, som er NPP, laget av NVIDIA. NPP benytter CUDA-aktiverte GPUer for å akselerere prosessering. Gjennomsnittlig filter er allerede implementert i NPP. Den nåværende versjonen av NPP (5.0) har støtte for 8 bit, 1 kanal og 4 kanalbilder. Funksjonene er: nppiFilterBox8uC1R for 1 kanal bilde. nppiFilterBox8uC4R for 4-kanals bilde. svarte jan 15 13 klokken 10:50 Svaret ditt synes å være veldig bra, men jeg er egentlig ikke klar over hva du beskriver her oppe, da jeg hovedsakelig programmerer på matlab, og jeg har god kunnskap om C-programmering, det jeg trenger er en kodehjelp, tror jeg at kjernefunksjonens prototype ville være: global tomt ApplyAverageFilter (int Image, int Resultat, int filterSize). Jeg trenger hjelp med koden. ndash Sameh Kamal Jan 15 13 kl 10:56 Oh. Jeg har oppdatert svaret mitt og lagt til en lenke for CUDA-kjernen for boksfiltrering. Men du må lære CUDA først å bruke den. Ellers er NPP et bedre alternativ hvis du ikke har mye CUDA-bakgrunn. ndash sgarizvi Jan 15 13 kl 10:59 Hvis filterstørrelsen er normal og ikke humongøs, er det gjennomsnittlige filteret et veldig godt tilfelle for implementering med CUDA. Du kan sette opp dette ved hjelp av firkantede blokker, og hver tråd av blokken er ansvarlig for beregningen av verdien av en piksel, ved å summere og gjennomsnittsgrense sine naboer. Hvis du lagrer bildet i Global Memory, kan det programmeres enkelt, men du vil ha mange bankkonflikter. En mulig optimalisering er at du laster blokker av bildet inn i blokkene Delt minne. Ved hjelp av fantomelementer (slik at du ikke vil overskride de delte blokkdimensjonene når du ser etter nabobillede), kan du beregne gjennomsnittet av pikslene i en blokk. Den eneste tenkningen du må være forsiktig med er hvordan sømingen vil bli gjort til slutt, fordi de delte minneblokkene vil overlappe (på grunn av ekstra utfyllingspiksler) og du ikke vil beregne sine verdier to ganger. besvart jan 15 13 kl 9:27 Ditt svar 2017 Stack Exchange, Inc
No comments:
Post a Comment