Studerende vil tæmme gamer-grafikkortets tusinde kerner

To ingeniørstuderende fra Aalborg Universitet arbejder på software, der skal gøre det lettere at udnytte den store, parallelle regnekraft i moderne grafikkort.

Mens en almindelig CPU i en pc kan lave eksempelvis fire samtidige beregninger, kan et potent grafikkort til computerspil i samme pc foretage over 1.000 samtidige beregninger. Og det giver unikke muligheder for at lave algoritmer, der kan knuse regnekraftudfordringer i forbindelse med alt fra aktiehandler til vejrmodeller.

Det skyldes, at moderne grafikprocessorer kan indeholde mere end 1.000 kerner, mens en CPU tilsammenligning har omkring 4.

Det kan dog være sin sag at lave software, der kan udnytte den latente regnekraft i grafikkortets processor, kaldet GPU (Graphical Processing Unit). Men to danske ingeniørstuderende ved Institut for Elektroniske Systemer ved Aalborg Universitet arbejder på at sætte regnekraften fri, så den kan bruges til optimering af ikke-konveks optimeringsproblemer.

De to ingeniørstuderende ved Aalborg Universitet Søren Rasmussen (t.v.) og Mads Berre arbejder på at gøre det lettere at udnytte kræfterne i moderne grafikkort. Foto: Martin Christensen

Regnemuskler skal udnyttes

Søren Rasmussen og Mads Berre er på vej til USA for at lave deres 9. og 10.-semesters afgangsprojekt i samarbejde med Georgia Institute of Technology og virksomheden AccelerEyes. Projektet går ud på at gøre det lettere for udviklere, eksempelvis inden for finansverdenen, at udnytte den store regnekraft, der gemmer sig i grafikprocessoren.

»Der findes måder at programmere grafikprocessorer på i dag, men da det er et forholdsvist nyt område, tager det lang tid at gøre det, og det er svært at få til at køre godt,« siger Søren Rasmussen.

Programmering af en GPU kan foregå via CUDA (Compute Unified Device Architecture), som er udviklet af grafikkortproducenten Nvidia. Softwareudviklere kan få adgang til CUDA via interfaces i forskellige programmeringssprog, men det kan være en omstændelig proces, forklarer Mads Berre.

»Vores projekt fokuserer på at udvikle software, som skjuler for udviklerne, at det faktisk er regnekraften i grafikkortet, de udnytter. Vi koder det lag, der ligger mellem et softwareprogram og grafikkortet,« siger han.

Tanken er, at give softwareudviklere adgang til regnekraften i GPU'en uden at skulle sætte sig ind i CUDA, men blot ved at downloade et softwarebibliotek fra nettet, fortæller Søren Rasmussen.

»Så snart udvikleren kalder en funktion i vores softwarebibliotek, så sørger en algoritme for, at grafikkortet bliver kaldt, så GPU'en bliver udnyttet,« siger han.

Dermed er det meningen at gøre det transparent for softwareudvikleren, at det er GPU'en i stedet for CPU'ens regnekraft, der bliver udnyttet.

GPU og CPU regner forskelligt

Når det ikke er sådan helt ligetil at skrive software, der kan udnytte en GPU, skyldes det, at det generelt kan være vanskeligt lave programmer, der uden videre kan drage fordel af parallel regnekraft. Og så fungerer GPU'en grundlæggende forskelligt fra den almindelige processor i en computer, forklarer Søren Rasmussen.

For mens en CPU med fire kerner kan lave fire forskellige opgaver uafhængigt af hinanden, så betyder den måde, GPU'en er konstrueret på, at alle dens kerner kører den samme algoritme, fortæller Søren Rasmussen.

Det vil sige, at en GPU ganske vist kan være i stand til at lave 1.000 samtidige beregninger, men kun én beregningstype ad gangen. Det er netop den form for beregning, der foregår i 3D-skydespil, som har været med til at drive udviklingen inden for GPU-regnekraft.

»Det er det, der sker i spil, hvor man afvikler 3D-grafik. Det er i høj grad parallelle beregninger,« siger Søren Rasmussen.

Men GPU'ens regnekraft egner sig dog også til andet end skydespil. Den parallelle regnekraft kan nemlig til at løse ikke-konveks optimeringsproblemer.

»Når der er mange variable, der kan skrues på i en algoritme, så kan GPU'ens mange kerner bruges til at finde den bedste indstilling forholdsvis hurtigt,« Søren Rasmussen.

Det skyldes, at en GPU med eksempelvis 1.000 kerner kan behandle 1.000 forskellige input samtidig i den samme algoritme, hvilket gør det hurtigere at finde et godt resultat. Til sammenligning vil en CPU med fire kerner kunne behandle fire input på samme tid.

Interessant for aktieanalyse og vejrmodeller

Søren Rasmussen forklarer, at det blandt andet gør GPU-regnekraften interessant for aktieanalytikere, fordi 1.000 samtidige beregninger gør det hurtige at finde ud af, hvornår det bedst kan betale sig at købe eller sælge. Den parallelle regnekraft er også interessant inden for en lang række andre områder, blandt andet i forhold til beregningsmodeller for radiokommunikation.

De studerende har fået kontakt til Georgia Institute of Technology og AccelerEyes via projektet SparSign og deres vejleder professor Torben Larsen fra Institut for Elektroniske Systemer. Mads Berre glæder sig til at komme til USA i forbindelse med det udvidede afgangsprojekt:

»For os er det en mulighed for at komme ud og opleve verden og opleve et førende universitet, hvor vi kan få nogle kompetencer og erfaring inden for vores fagområde.«

Kommentarer (13)

Var det ikke netop meningen med OpenCL?

http://en.wikipedia.org/wiki/OpenCL

Der findes også en side der samler information og nyheder om lignende libs og andet: http://gpgpu.org/

Det er stadigvæk interssant dog - hvis det lykkes at lave noget, der er nemmere at bruge end alt andet eksisterende. Man kunne endda tænke sig at det kunne bygges ind i webkit så webpps får et boost.

  • Lars
  • 0
  • 0

OpenCL er et programmeringssprog, som kan bruges til at programmere GPUer (og andre ting) - ligesom CUDA. Begge sprog er en afart af C++. De indeholder derfor i sig selv ingen funktionalitet til at løse matematiske optimeringsproblemer. Det er der Mads og jeg kommer ind i billedet :)

  • 0
  • 0

Tidepowered ligner bare et mellemlag mellem CUDA eller OpenCL og .net. Så vidt jeg lige kan se er der ikke nogen funktionalitet til at løse optimeringsproblemer. Det vi skal arbejde med er at skrive konkrete algoritmer til at løse specielle typer af matematiske problemer på effektiv vis

  • 0
  • 0

...De indeholder derfor i sig selv ingen funktionalitet til at løse matematiske optimeringsproblemer. Det er der Mads og jeg kommer ind i billedet :)...

Ok - det lyder godt :)

Har I kigget på Blitz++? - måske kunne det virke som inspiration?

http://en.wikipedia.org/wiki/Blitz%2B%2B

  • Lars
  • 0
  • 0

Jeg kan godt bruge en opgradering til matlab i parallel processing.
Held & lykke og god tur:)

  • 0
  • 0

Det ser spændende ud, men AccelerEyes, som vi skal samarbejde med, har allerede et stort matematik library til GPU, som vi kan trække på. Se f.eks. ArrayFire til C(++) og Python og Jacket til Matlab

Jeg har kigget lidt på det - det ser pænt lukket ud. Har I overvejet at lave Jeres del portabel, så man kan lægge noget åbent under bagefter? (e.g. noget med BSD/MIT/LGPL/lign-license?)

Der må være noget her, der kan bruges: http://gpgpu.org/tag/libraries :-)

Kan I fortælle mere om hvad Jeres projekt vil tilføje til de eksisterende hos AccelerEyes?

  • 0
  • 0

Jo du har fuldstændig ret, det er en smule lukket ud ;-) Vi regner bestemt med at vores implementation bliver tilgængelig for masserne, men hvordan er endnu ikke besluttet.

Det vi skal lave er en optimerings algoritme til non-konvekse optimerings problemer (se evt. fakta boks i toppen af artiklen). Målet er at vi skal implementere forskellige algoritmer til at løse sådanne problemer og evaluere deres performance, i forhold til forskellige parametere eksempelvis eksekveringstid. Og så vil vi jo gerne implementere en så generel algoritme som muligt så der bliver også nogle udfordringer der.

Håber det besvarede nogle spørgsmål :-)

  • 0
  • 0

Flere programmer jeg bruger (Finite Element programmer; Abaqus, Ansys osv) kan allerede koerer paa GPU. Vi har ikke tested det endnu fordi vores regne-cluster er headless...

Jeg ved ikke om GPU'er er fremtiden. Intels nye co-processor ser i mine oejne mere interesant ud:

http://blogs.intel.com/technology/2012/06/...

isaer fordi der ikke er brug for et nyt programeringsparadigme. Saa istedet for a investere i ny code til GPU, kan jeg koebe co-processorer og bruge min udviklingstid til at finde flaskehalse i den parallele udfoerelse. Flaskehalse, som efter min erfaring er langt det stoerste problem i forhold til om man koere paa CPU eller GPU.

Jeg vil ikke tage modet fra - performance er altid vigtigt - men ville bare lige give lidt alternativt indspark. Maaske er jeres beregninger fantastisk egende til GPU.

Just my 2 cents...

  • 0
  • 0

Der foregår flere spændende forsøg med at gøre GPU-kodning mere tilgængeligt. Et af dem er ScalaCL som er en compiler-plugin til Scala.

Beregn en bunke vinkler på en CPU-kerne:

[code]
for(v <- 0 to 1000) yield Math.cos(v)
[/code]

Beregn en bunke vinkler på alle CPU-kerner:

[code]
for(v <- (0 to 1000).par) yield Math.cos(v)
[/code]

Beregn en bunke vinkler på alle GPU-kerner:

[code]
for(v <- (0 to 1000).cl) yield Math.cos(v)
[/code]

De to første er standard Scala. ScalaCL tilføjer mulighed for at skrive .cl for at få en GPU-collection.

  • 0
  • 0

Kunne man forestilles sig at biblioteket kunne knytte CUDA til Scilab (www.scilab.org)? Scilab v5 er single-processor, men v6 er møntet på HPC og parallel processing. Her ville et åbent bibliotek med fokus på CUDA passe perfekt ind...

  • 0
  • 0

Det er dejligt at se, at min bedste ven klarer sig så godt.
Nu må i ikke glemme os fysikere, der tit står med sådanne uafhængige/paralleliserbare problemer!

  • 0
  • 0