» »

Matrix multiplication program Pycuda in Mathlab

Matrix multiplication program Pycuda in Mathlab

Bavec87 ::

Najprej en lep pozdrav vsem skupaj! :)

Na razpolago imam 2 super računalnika Supermicro, na enem je naložen Win Server 2008, na drugem pa Ubuntu 10.10 Server. CUDA deluje na obeh mašinah, na Win mašini uporabljamo Mathlab Jacket, na Ubuntu pa Pycuda, vse je nameščeno in lepo deluje. :)

Sedaj imam nalogo, da primerjam izvajanje teh dveh programov na različnih operacijskih sistemih s procesiranjem na GPU, ideja pa je, da naj bi se izvedla enaka zadeva, primerjal pa bi se čas delovanja.

Nekak računam zakodirat dva zelo enostavna programčka, ki bi z random funkcijo napolnila zelo veliko matriko in jo naprimer kvadrirala (zmnožila sama s sabo). Lepo bi bilo, da bi program še izračunal čas izvajanja programa, vendar ni nujno, čas načeloma lahko izmerim tudi ročno.
Naj še omenim, da z nobenim od omenjenih programskih jezikov nimam predhodnih izkušenj, zato me zanima ali ima kdo od vas kakšen tak program ali vsaj del kode na lagerju ali pa ve za kakšno uporabno povezavo, me usmeri v pravo smer. :)

Upam, da sem bil pri opisu problema jasen, zahvaljujem se vam že v naprej. ;)

Lp Blaž

popster ::

za matriko napolnit uporabiš dve for zanki(ki se sprehodita po vseh pozicijah v matriki) in generator random števil. Preveri spodnja linka za pomoč:

http://answers.yahoo.com/question/index...
http://www.brown.edu/Courses/PY0107/Mat...

Bavec87 ::

Bo uporabno, najlepša hvala. ;) Saj samo generiranje naključnih števil v matriki ni tista kompleksna stvar, bolj me zanima kako se izvajanje prenese na GPU, ima kdo kakšen primer? Rabim tako v Matlabu kakor v Pythonu, če ima kdo bi bil res vesel. :)

Lp Blaž

kihc ::

Kolikor sem preletel tolo čudo od pycude, moraš kernel (funkcijo, ki se izvaja na GPU) še vedno spisati Cju. Tako da googlaj za CUDA Programming guide.pdf, je množenje matrik noter lepo razloženo.
x

Isotropic ::

je kaksna skrivnost, kaj bos delal?

Bavec87 ::

@kihc: Najlepša hvala! :)
@loki3000: Mašine imamo na fakulteti v laboratoriju, uporabljale se bodo za potrebe simulacije. Zaenkrat je moja naloga le, da primerjam delovanje na obeh, to rabim narest pa čimprej, saj mi ena seminarska naloga visi na tej zadevi. ;)

Zgodovina sprememb…

  • spremenil: Bavec87 ()

Bavec87 ::

@kihc: Na pycudi sem že poganjal razne example, ubistvu kodo samo skopiraš v file in jo z python ukazom poženeš. Tukaj je en primer:
http://wiki.tiker.net/PyCuda/Examples/H...

Zdej kolikor se spoznam vidim, da jo to čista python koda, se pravi, da cuda deluje brez kakšne c-jevske kode, ne razvidim pa kako ukazi pridejo na GPU. Ima kdo kakšno idejo kako to izvajanje poteka?

zaj_tam ::

Bavec87 je izjavil:


Zdej kolikor se spoznam vidim, da jo to čista python koda, se pravi, da cuda deluje brez kakšne c-jevske kode ...


Jaz vmes vidim c++.

MrBrdo ::

mod = SourceModule("""
__global__ void multiply_them(float *dest, float *a, float *b)
{
   const int i = threadIdx.x;
   dest[i] = a[i] * b[i];
 }
""")

Čista Python koda, ja...
Nočem bit nesramen ampak ta primerjava je malo nesmiselna, izvajanje na CUDI bo popolnoma enako hitro, dokler sta grafični kartici enakovredni na obeh računalnikih. To ne rabiš nič testirat da to ugotoviš, glede na to da boš izvajal isto kodo, saj CUDA ni odvisna od OS gostiteljskega računalnika.
MrBrdo

Bavec87 ::

To se pravi, da bo izvajanje kode, ki rečmo dela enake stvari enako hitro, ne glede na to, da je en računalnik na Win, drugi na Ubuntu, prva koda spisana v Matlabu, druga v Pythonu? Obstaja kakšen dokaz, test od prej narejen za potrditev tega ali je to samo domneva? :)

kihc ::

Tukaj pri PyCudi sam spišeš kodo, katera gre na kartico. Kako dobro boš optimiziral zadeve, zavisi od tebe.

Pri Matlabu mislim da je že vgrajena neka podpora (knjižnice, toolboxi), tako da se ti ni treba posebej zajebavat s CUDO v Cju. Poleg tega tisti ki so knjižnico spisali, precej bolje obvladajo zadeve od tebe, tako da bi moral biti performance boljši.

Na katermu faksu si to?
x

Zgodovina sprememb…

  • spremenil: kihc ()

MrBrdo ::

Ja dokler ti Matlab sam zgenerira CUDA kodo, če jo bo boljše optimiziral kot jo boš ti sam napisal, potem bo tam hitreje. Če pa v obeh primerih sam napišeš CUDA kodo je pa vse odvisno samo od tega katera grafična kartica je boljša. OS pa tukaj ne bo imel nobenega vpliva.
Torej edino kar lahko s tem testom dokažeš je, da Matlab zgenerira boljšo/slabšo CUDA kodo kot si jo sam sposoben napisat. S tem da če boš vzel primer iz CUDA dokumentacije za množenje matrik, potem bo verjetno v najboljšem primeru isto hitro, ali pa bo Matlab slabši, razen če so Nvidievci slabo napisali.
Da te popravim - druga koda ne bo spisana "v Pythonu", ampak bo spisana še vedno v Cju. Python je samo wrapper okrog tega, kot si sam pokazal na tistem linku. Torej Python tukaj nima dosti veze, razen če boš izven GPUja še kaj posebnega počel. Tudi matlab ne more delat neke čarovnije, generirat mora pač ukaze za GPU, enako kot to dela nvcc za jezik C. Torej tukaj bi dejansko ti lahko primerjal recimo matlabov prevajalnik in nvidiin nvcc prevajalnik. Kaj drugega nima smisla. Windows/Linux samo kliče funkcije, ki jih ponuja grafična kartica, in nima tukaj kakšnega pomena.
MrBrdo

Zgodovina sprememb…

  • spremenilo: MrBrdo ()

user4683 ::

Za gonilnike in njihovo vlogo pri vsem skupaj verjetno ni slišal še nihče. Identična koda se lahko na isti grafični kartici in z drugačnimi gonilniki ( = drug OS) izvaja različno (hitro).

Senitel ::

Gonilniki igrajo hudo pomembno vlogo v "bloated" API-jih kot sta recimo OpenGL in Direct3D. Za CUDA, po drugi strani, pa je API zelo zelo tanek in praktično ne more it nič narobe. Je nekaj runtime funkcij (cudaMalloc, cudaMemcpy, cudaFree,...) po tistem je pa samo še executable koda (PTX), ki se jo prevede compile time, in uploada na GPU.

So pa razlike jasno precejšnje med različnimi verzijami. CUDA 4.0 recimo podpira cel kup zanimivih featurejev. Recimo peer to peer copy iz enega device-a na drugega...

MrBrdo ::

Točno tako, driver nima veze, ker se izvaja to na grafični. Driver ima vlogo samo pri prenosu podatkov, kar je pa res tako malo, da bi težko bile kakšne večje performančne razlike.
PS snake: ponavadi se splača, preden prideš na plano s super pametnimi komentarji, malo pozanimati, o čem govoriš ;)
MrBrdo

Zgodovina sprememb…

  • spremenilo: MrBrdo ()

overlord_tm ::

Sicer da se ne bos prevec hecal, nek wannabe "benchmark" (tudi mnozenje matrik) je ze prilozen CUDA SDKju. Tako da se lahko takoj prepricas da sta enako hitra. Kolikor sem razumel, ta Jacket for Matlab prevaja stvar v CUDA C in potem poganja nvcc, tako da niti ni direkten prevajalnik v PTX.

user4683 ::

Očitno se nisem najbolje izrazil in sem nekomu stopil na žulj...

Razlike zaradi gonilnikov naj ne bi bile velike (zaradi dejstev, ki jih je izpostavil Senitel), ampak se lahko pojavijo (recimo kakšen bug, čudne nastavitve in podobno). In že samo padec pri memcpy se lahko pri določenih algoritmih precej pozna.

[Edit] Pa še... a ni tako, da nvcc prevaja v PTX, iz PTX v strojno kodo pa prevaja gonilnik?

PTX defines a virtual machine and ISA for general purpose parallel thread execution. PTX programs are translated at install time to the target hardware instruction set. The PTX-toGPU translator and driver enable NVIDIA GPUs to be used as programmable parallel
computers.


Verjetnosti za kakšne napake so verjetno zelo majhne, ampak kar tako na blef izločiti neko stvar in reči, da gonilnik pa sigurno nima vpliva, je precej pogumna trditev.

Zgodovina sprememb…

  • spremenil: user4683 ()

Senitel ::

PTX je ZELO blizu hardware naboru. Bližje kot kakšen x86 assembly dejanskemu naboru na recimo i7. Trenutno se v teh primerih hendla situacije kot naprimer __mul24 (množenje 24bit integerjev), ki je bil hardwareski v Tesla generaciji in ga ni več v Fermi.

Ja v principu je lahko razlika pri cudaMemcpy. V principu je lahko že standarden c memcpy na enem OS-u z enim specifičnim c runtime-om 10x počasnejši od normale.

user4683 ::

Aha.. se mi je zdelo, da je verjetno precej 1:1 preslikava.

Sej dejansko sem s celim svojim bluzenjem hotel izpostavit to, da če se gre neko takšno testiranje, je potrebno upoštevati cel kup na prvi pogled nepomembnih stvari. Takšna konkretna analiza bi bla verjetno precej zanimiva.

MrBrdo ::

snake ja sam hitrost prevajanja ni preveč pomembna... pomembna je hitrost izvajanja, ki bi pa bila tukaj v obeh primerih enaka, razen če matlab kakšne dobre optimizacije naredi.
Samo ta test bi imel potem več smisla če bi se izvajal na popolnoma identični strojni opremi, in bi bilj cilj testa pač določit, kako dobro matlab generira CUDA kodo.
MrBrdo

Bavec87 ::

@kihc: FOV Kranj. :)

Oba računalnika sta popolnoma enaka, razlikujeta se le v grafični kartici za prikaz grafike, saj sem mogel dodati dodatno na PCI-e slot, za delovanje CUDA morajo biti vse kartice Nvidia, obstoječa, ki je na plati pa ni bila.
Specifikacije imate tukaj:
http://www.supermicro.com/products/syst...
Kot sem omenil se bo zadeva uporabljala za izvajanje simulacije, kode z veliko ponovitvami, zato se čas vsakega cikle zelo pozna. Problem pri testitanju je bil, da nisem uspel najti dveh primerljivih programov med exampli, zato bi bilo treba kodo napisati od začetka.

V planu imam še veliko stvari, tako da, če je taka primerjava nesmiselna se je ne bom posluževal, bom raje porabil ta čas za kaj bolj nujnega. Ne vem, kaj vi mislite? :)

Lp Blaž

MrBrdo ::

Jaz bi v tvojem primeru primerjal razliko med obema grafičnima karticama za isti program (torej npr. v obeh primeru v pythonu/C), pa napiši še kaj o obeh grafičnih (število možnih blokov, niti itd.) in pa performančno razliko med programom ki ga napišeš sam (python/C) in programom ki ga zgenerira matlab (če je to res, da ga zgenerira - to je nekdo drug napisal). Pri merjenju časa pazi, da v čim manjši meri zajameš hitrost izvajanja jezikov (matlab, python), torej idealno bi imel tako:
// beleženje časa
// koda ki se v celoti izvaja na CUDI
// beleženje časa - izračun časa izvajanja kode na CUDI

Kodo na CUDI poženi v zanki npr. 100x, ker boš tako dobil bolj resnične rezultate. Izgleda namreč da kartica malo počiva če nič pametnega ne dela, in ko nekaj prvič poženeš je malo latence, potem pa šele zares zalaufa.
MrBrdo

Bavec87 ::

Test nameravam opisati v seminarski nalogi za predmet Kakovost programske opreme, tako da me v prvi fazi zanima le katera programska oprema je časovno optimalnejša, seveda bom v seminarski primerjal tudi uporabniško izkušnjo, zahtevnost namestitve, opisal komplet realizacijo, da zadeva sploh deluje, mogoče kakšna beseda o ceni Jacketa, saj Pycuda je itak open-source. Nekak me ne zanima preveč kako optimalno so programi zapisani, saj to bi itak naredil sam, zato pa je bil plan napisati čim enostavnejša programčka, da je kode malo, pa je tista optimalna. Grafične kartice so drugače 4 v vsaki mašini, to lahko vidite tudi s specifikacije (Tesla C1060), različne pa so grafične za prikaz slike, ki po mojem mnenju ne vplivajo na hitrost obdelave velikega števila numeričnih podatkov, so pa zelo nizkega cenovnega razreda (ena je Geforce 7600GS, druga mislim da GT220).

MrBrdo: Nekak nisem najbolje razumel kaj mi predlagaš in ali je to nekje v okvirih zgoraj napisanega...mi lahko mogoče malo bolj razložiš kaj si mel v mislih? :) Drugače pa najlepša hvala za pomoč in ideje, mi veliko pomeni. ;)

Lp Blaž

Senitel ::

Da boš vse 4 Tesla karte v mašini zakuril se boš moral igrat malo s threadingom in malo več contexti. Oziroma uporabit CUDA 4.0.

Isotropic ::

je kaksna skrivnost, kaksne simulacije to delate?

Bavec87 ::

Če ti po pravici povem na cudi nimamo narejenega še čisto nič. Drugače pa imamo razvita simulacijska orodja za kakšna logistična podjetja, za klinični center (optimiziranje poti reševalnih vozil), slovenska vojska. Recimo lani sem za diplomsko nalogo sprogramiral program v Javi, ki pobere vhodne parametre, zračuna optimum glede na verigo stanj v odvisnosti od časa in vrne dva parametra. Da ne bom predolg lahko priložim link do spletne knjižnjice, če slučajno koga zanima: :)
http://dkum.uni-mb.si/Iskanje.php?type=...

Drugače pa gre v tem primeru samo za seminarsko nalogo. V praksi me zanima ali so časi vsaj približno podobni na Pycudi, ki je odprtokodna rešitev in Mathlabu, ki ni ravno poceni. Fora je, da sredstva postajajo vedno bolj omejena in nas zanima, če se bo v prihodnosti sploh splačalo kupovati licenco, je pa res, da je matlab za take potrebe top of the top, vsaj kolikor sem jaz slišal.
Torej gre za dokaj enostavno primerjavo, če se izkaže, da zadevo ni smiselno testirati se bom lotil česa drugega, saj je dela veliko, če bi pa dejansko bilo smiselno narediti tako primerjavo, ker rezultatov testa ni mogoče na nek realen približek določiti pa mi ni škoda tega časa. Seveda pa je treba vzeti v račun, da moram s tem zaključiti najkasneje do septembra in opraviti šolske obveznosti (še ta seminarska mi manjka do pogoja ;)).

Kaj pravite, je smiselno, ni smiselno, bom s tem lahko kaj pametnega dokazal, ali je logično, da med rezultati ne bo razlik (kot je bilo omenjeno že v prejšnjih postih? :)

Lp Blaž

Isotropic ::

ce prav razumem, moras pri pycuda sam napisati kodo, matlab ti jo pa sam generira. tko da najdi ene par klasicnih examplov (iz tega podrocja, kjer delas - optimizacija recimo) v kateremkoli od njiju in ga prepisi v drugega. pri py je itak vazno, kako dober programer si oz. kako dobro poznas cuda platformo.

Bavec87 ::

Za pycudo je kle exaplov malo morje:
http://wiki.tiker.net/PyCuda/Examples
Ta mi je še posebej ušeč, sam je mal kompliciran za začetnika:
http://wiki.tiker.net/PyCuda/Examples/M...
Kako bi se pol to dalo prevest v Matlab?

kihc ::

S tistim examplom ne boš naredil nič, ker je omejen na matriko velikosti 512 elementov.
x

Senitel ::

Matlab sam po sebi ne generira CUDA kode. Matlab je en interpretiran jezik, ki pa zna naredit z eno komando sin(x), kjer je x en velik array vrednosti. V splošnem se tak sin(x), v primeru, da je x na GPU, požene kot CUDA kernel z enim samim ukazom (sin(x), kjer je x eden izmed elementov v arrayu). Kolikor razumem zgodbo okrog Matlaba imaš tudi funkcijo "arrayfun", ki vzame tvojo custom Matlab funkcijo in jo spravi v en CUDA kernel.

Kolikor gledam pa se bolj napredne rabe tudi v Matlabu zatekajo k direktnemu pisanju CUDA kernelov isto kot povsod drugod.

Množenje matrik v Matlabu na GPU, bi moralo bit "simpl". Sestaviš matriko A in B. Rečeš gA = gpuArray(A); gB = gpuArray(B);
Ter potem: gC = gA * gB;

Vprašanje, na katerega moraš po mojem odgovorit, je ali pričakuješ, da bo funkcionalnost Matlaba sama dovolj za to kar počnete ali ne. Ker če se zapodiš v detajle je velik del poante CUDA to, da se lahko threadi v thread grupi med seboj pogovarjajo preko skupnega pomnilnika. Že malo boljša implementacija množenja matrik (kot je ta, ki si jo linkal v pycuda examplih) uporablja shared memory.

In čeprav Matlab za množenje matrik skoraj zagotovo zadaj uporablja shared memory imaš še vedno cel kup problemov, ki jih boš direktno lahko rešil elegantneje.

Če misliš primerjat hitrost izvajanja enega lastenega CUDA kernela v PyCuda in Matlabu potem je to čisto brezveze. Če misliš primerjat lasten OPTIMIZIRAN CUDA kernel proti tistemu kar Matlab nardi sam, boš moral pa najti kaj bolj "zanimivega" od množenja matrik in odgovoriti na vprašanje ali je Matlab dovolj fleksibilen oziroma ali se imate čas poglobit tolk v detajle Tesla arhitekture, da boste iztisnli ven tisto ekstra.

P.S.: Kot rečeno, ker imate mašine z več Tesla boardi najprej preveri ali Matlab zna raztegnit svojo funkcionalnost čez vse štiri karte, sicer je odgovor takoj na dlani.

P.S.2: Poganjate Linux ali Windows? Ker na Windowsih imaš tudi omejitev, da se kernel ne sme izvajat več kot ene 30 sekund sicer OS začne težit, da ga hočeš umorit. :)

Zgodovina sprememb…

  • spremenil: Senitel ()


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

CUDA na splošno in zmogljivost

Oddelek: Programiranje
234411 (3463) pegasus
»

Matlab

Oddelek: Programiranje
71672 (1433) Senitel
»

Napovedan prevajalnik CUDA C za x86

Oddelek: Novice / Procesorji
154725 (3646) noraguta
»

Nvidia izdala CUDA 2.2

Oddelek: Novice / Ostala programska oprema
265133 (2777) root987
»

Evolucijski algoritmi

Oddelek: Programiranje
312896 (1935) nevone

Več podobnih tem