Sziasztok!
Van valakinek a címben emlitett dolgokkal: GPGPU, Nvidia CUDA, Brook, stb. kapcsolatban tapasztalata?
Egy mátrix-mátrix szorzást szeretnék megcsinálni sűrű mátrixokra.
(BLAS: dgemm). Cuda nemnagyon jön szóba, mert egy Geforce 6800-asom
van.
Ha van bátor jelentkező, akkor majd kérdezek ... :)
UDv:axt
- 6834 megtekintés
Hozzászólások
Már amikor irtam, gondoltam, hogy nem lesz egy siker-topic ... :)
- A hozzászóláshoz be kell jelentkezni
a 6800asnal IMHO nincs lehetoseged erre, igazabol csak a 8as sorozattol.
- A hozzászóláshoz be kell jelentkezni
Lehetőségem van rá, az egésznek annyi a feltétele, hogy tudjon a videokártya float típusú textúrákat,
amit a 6800 tud.
Amire te gondolsz, az az, hogy az Nvidia CUDA, cuBLAS, stb korlátozódik a 8x szériára.
Egyébként a CUDA nagyon tetszetős keretrendszer, de nem szeretnék új videókártyát és
emiatt új alaplapot (PCI-Express miatt), stb venni.
- A hozzászóláshoz be kell jelentkezni
Ha a dgemm-et akarod kivaltani, akkor cserelned kell, mert csak az iden megjeleno kartyak fognak tudni dupla lebegopontos szamitasokat. Amennyiben az SGEMM is jo, akkor meg mindig kerdeses a vegeredmeny. Amennyire en emlekszem, n=1000 kornyeken kezd el gyorsabb lenni a videokartya, addig az adatok fel- es letoltese miatti kesleltetes elfedi teljesitmeny javulasat.
- A hozzászóláshoz be kell jelentkezni
A dgemm végülis typo volt, jó lenne simán floatra is az eredmény. Gondolom amit írsz, hogy n=1000 az négyzetes mátrixra vonatkozik ...
Nekem elvben 100.000x100-as matrixokat kene szoroztassak 100x100-as matrixokkal. Ha jol vettem ki a doksikból a videókártyám max 4096x4096-os float texturákat tud, azaz vsz 4096x100-as matrixot kene 100x100-assal szoroznom, (100.000/4096)-szor egy adott lepeshez. Csak felek tole, hogy nem tudok belole jobbat kihozni a CPU-GPU transferek költsége miatt.
- A hozzászóláshoz be kell jelentkezni
Ez izgalmasan hangzik. Mi a célja a programodnak? Ha esetleg nem titok :-)
- A hozzászóláshoz be kell jelentkezni
Dimenzióredukció (ami SVD-vel (singular value decomposition) van megoldva )gyorsitása a cél. A bemenő mátrix úgy áll össze, hogy:
[video_frame:t ][video_frame_t+1] ... [video_frame_t+n ]
[video_frame:t+1][video_frame_t+1] ... [video_frame_t+n+1]
...
vagy
[video_frame:t ]
[video_frame:t+1]
[video_frame:t+2]
...
ahol a video_frame egy videó vagy annak egy tartományának reprezentációja egy vektorral :-)
- A hozzászóláshoz be kell jelentkezni
egy kis teszt:
100000,100 x 100,100 float matrixszorzas
GeForce 8800 GTS (CUBLAS): 120 msec
Intel Core2 Q6600 (ATLAS): 220 msec
Az idoben benne van a host - device transzfer is.
Az ATLAS hasznalja mind a negy CPU magot.
(http://math-atlas.sf.net)
- A hozzászóláshoz be kell jelentkezni
koszi az infokat, igazából ilyen benchmark eredményekre volnék kivancsi ...
jó lenne, ha lenne egy oldal, ahol ezek le vannak irva, de sajnos még nem találtam
gondolom te is kimérted. arra megkérhetnélek, hogy ugyanekkora mátrixra, megmérnéd
nekem az atlas dgemm mennyi idő alatt fut le. csak viszonyításképp ...
- A hozzászóláshoz be kell jelentkezni
Meglepo modon csak kb. 10%-kal lett lassabb. Lehet, hogy ez a 8 MByte L2 cache jotekony hatasa.
- A hozzászóláshoz be kell jelentkezni
A dgemm-nek nem tulzottan szamit a cache merete leven, hogy nagyon magas a cache reuse egeszen kis cache meretekre is. A dgemm tipikusan vegrehajtoegyseg korlatos. Gondolom nincs nagy kulonbseg abban hogy float-ot vagy double-t szorozgatsz.
- A hozzászóláshoz be kell jelentkezni
Amivel szamolnod kell az ugye a matrix meretenek es az elvegzendo muveleteknek az aranya.
Mivel a matrix meret (es ezzel a GPU-ba toltes koltsege) negyzetesen novekszik, a muveletek (tipikusan szorzasok) szama pedig kobosen ezert valami durva okolszabalyt fel lehet allitani.
n=1000 eseten a matrix merete (32 bit float): 8000000 byte (ket operandussal szamolva)
a szukseges muveletek szama: 1000000000 op
Szoval, ha az algoritmusod 125-nel jobb op/byte mutatoval rendelkezik, akkor nem vagy rossz. Persze ez a 125 adott CPU-GPU parositastol fuggoen valtozhat. Igy neked kell a sajat konfigodra kimerni....
- A hozzászóláshoz be kell jelentkezni
köszi az infót. elsőkörben úgy gondoltam, hogy csak akkor állok neki az egész GPU dolognak, ha biztos vagyok benne, hogy megéri. sajnos elég zöldfülű vagyok a GPU programozásához, és nem akarnék most sok energiát belefektetni. ez a 125 milyen hardware-en jött ki neked? hátha közel van ahhoz amit én akarok használni :)
- A hozzászóláshoz be kell jelentkezni
Egy cikkben olvastam. Emlekeim szerint valami decensebb Northwood volt (2.5-3GHz) es ha jol emlekszem akkor Geforce7xxx-es sorozatu videokari.
- A hozzászóláshoz be kell jelentkezni
Egyebkent meg orulhetsz, ha a CPU hatekonyabb, mert akkor nem kell szenvedned a GPU programozassal. Es akkor meg mindig cutting edge a programod :)
- A hozzászóláshoz be kell jelentkezni
:) igen, csak arra gondoltam, hogy a szamolasok egy reszet a CPU-n a masikat a GPU-n végeztetem, és ha a GPU nem is gyorsabb mint a CPU akkor is parhuzamositottam, es nagyobb frame/sec-et tudok kihozni a progtamból.
- A hozzászóláshoz be kell jelentkezni
Veszelyes lehet, mert eleg sok adatot kell majd megmozgatnod, igy lehet, hogy savszelesseg korlatos lesz a progid. Ritkan a CPU a szuk keresztmetszet.
- A hozzászóláshoz be kell jelentkezni
mhmmm...
kíváncsi vagyok, ritka/n-reguláris mátrixokon történő pivotálást hogyan tudná egy GPU jól és hatékonyan kezelni, b&b-t parallel módon...
ami át van húzva, azt teljesen fölösleges elolvasni. az olyan, mintha ott sem lenne
- A hozzászóláshoz be kell jelentkezni
Hatekonyan valszeg sehogy... Valamennyit supernode-ok bevezetesevel lehet rajta gyogyitani. A ritka matrix algoritmusok eleg sok indirekciot es elagazast tartalmaznak, a GPU ezekben nagyon rossz. Nem kizart, hogy sikerul javitani rajta, de nagysagrendi speedupot nem erdemes varni.
- A hozzászóláshoz be kell jelentkezni
Koszonom mindenkinek a valaszokat! Annyi lenne még a kérdésem, hogy amennyiben mégis GPU programozásra adnám a fejem, milyen keretrendszert használjak, ha az nvidia cuda (ami tetszik:)) nem jöhet szóba, mert nem 8xxx-es a kártyám. Egyaltalan erdemes e keretrendszert használni?
- A hozzászóláshoz be kell jelentkezni
nvdia 8xxx -hez van egy ujfajta FEED BACK lehetoseg opengl -el. elfelejtettem a nevet :( ,azzal lehet szamitasi adatokat jol kicsalni.
Regebinel marad a sima feedback buffer -es megoldas.
- A hozzászóláshoz be kell jelentkezni
sajnos egyelőre nvidia 8xxx nincs a képben ... pedig jó lenne ... :)
- A hozzászóláshoz be kell jelentkezni
http://libsh.org/
Sajnos már nem fejlesztik, de ettől még lehet jó...
http://graphics.stanford.edu/projects/brookgpu/index.html
Az még élő project elvileg...
"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o
- A hozzászóláshoz be kell jelentkezni
Ismerem mind a kettőt. Csak igy elsőre nehéz letenni az egyik mellett a voksomat ...
- A hozzászóláshoz be kell jelentkezni
Az sh-t már nem fejlesztik...
RapidMind Development Platform lett belőle, de az meg már kicsit más (GPU, CELL, multicore támogatás egyben).
A Brook-ot meg az ati/amd pénzeli újabban, CTM támogatás stb.
Hosszú távon neked csak a CUDA marad...
Rövidtávon meg amelyik kényelmesebb a tutorialok alapján...
"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o
- A hozzászóláshoz be kell jelentkezni
Nem akartam új topicot nyitni!
Azóta hozzájutottam egy géphez amiben CUDA kompatibilis videókártya van, és át is írtam az inkrementális SVD algoritmust GPU+CPU párosra [bár már nincs rá szükségem :-)].
A kérdésem most az lenne, hogy tudtok-e esetleg valami teljesítmény összehasonlítást a videókártyák közt. Perpill egy nvidia 9400M -em van ami, amint a nevéből is fakad mobil verzió. Az érdekelne, hogy ehhez képest hogyan teljesít valami komolyabb (9800 GTX, vagy G280) darab kártya.
[Egyébként a jelenlegi eredmény az az, hogy egy Core2 Duo P7350 (2.00GHz) procinál 2-3x gyorsabb a videókártyás implementáció (a transzfer időkkel együtt). A procin futó gsl+BLAS-t használ.]
- A hozzászóláshoz be kell jelentkezni
NVidia fórumain már láttam, hogy többen lefuttattak egy-egy demót az sdk-ból, és a benchmark eredményeket leközölték a kártyáik paramétereivel együtt.
Ez persze nem feltétlenül ad neked információt arról, hogy a te programod hogyan futna egy jobb kártyán.
Ha rájössz, hogy az algoritmusod szűk keresztmetszete micsoda (memóriasebesség vagy számítási egység) akkor a kártyák hw specifikációjából elég jól lehet következtetni a várható sebességre, mert ált. elég jól (közel lineárisan) skálázódik.
Másik megoldás, hogy megkérsz másokat (pl az nvidia fórumon), hogy fordítsák le, és futtassák a kódodat. Egy svd elég veszélytelennek tűnik ahhoz, hogy megtegyék. :)
"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee."
-- Ted Ts'o
- A hozzászóláshoz be kell jelentkezni
(pontosan;
de annak aki csak *kb* szeretné, tehát ha pl az említett lineáris/ideális eset áll fenn, tudni:
- a 9400 csak a 2. legrosszabb, de ettől is a leggyorsabb csak 15x gyorsabb, tartalmaz több procit ([98]300 és attól lefele már csak 1db multiprocesszor (8db proc) van, 9400:2db, gtx280:30db )
- ezen kívül még 2x-est rátesz amelyikben 2 gpu van, ugyanígy kártyaszám :)
- ill. még egy hangyányit rátesz a mhz-beli különbség (pl hogy mobil nem sokat sokat számít az 1. ponthoz képest)
ha pedig nem ugyanazt a kódot nézzük, a legújabbakban már 1.3-as (nem 1.1-es) cuda-beli compute capability van, ez hozhat lényeges gyorsulást
)
- A hozzászóláshoz be kell jelentkezni