Egy CUDA jó kérdés, mehet ez GPU-n elegánsabban?

 ( emberk | 2012. október 19., péntek - 20:53 )

Sziasztok.

Adott egy kép (gyakorlatilag tetszőleges méretű, de többnyire 3000x3000 alatt), ami fekete alapon fehér foltokat tartalmaz. Minden fehér foltot mint "fémet" azonosítok, aminek adott a feszültsége, a fekete a vákuum. Ezt katyvaszt egy iterációs módszerrel potenciáltérré alakítom, ami a következő. Ha a pixel fémhez tartozik, akkor a feszültsége adott. Ha nem akkor a környékén lévő összes egysorú-oszlopú pixel értékét összeadom, majd elosztom 4-al, és így végigmegy a program az összes pixelen. Ez határértékben kiadja a Poison egyenlet megoldását.
A gond az, hogy globálisan egyben kell látnom az egészet, mert ha átfedő lapokban oldom meg az brutálisan megemeli a szükséges iterációk számát (így is 100k körül van). A videokártyámmal 512x512-es mátrixnál nem tudok nagyobbat megnyitni. Erre azt a megoldást gondoltam, hogy feldarabolom a képet egyedi mátrixokra amiknek a mérete <512. Brutálisan csúnya függvénnyel tudom csak megoldani, ugyanis a határvonalaknál átfedéssel kell feldolgoznom, és piszok gusztustalan így a függvény. Nem vagyok egy GPU-guru, nem készített már valaki ehhez hasonlót?

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

"A videokártyámmal 512x512-es mátrixnál nem tudok nagyobbat megnyitni."

Valami zavart érzek az erőben. Ez 4 bájtos elemekkel számolva nagyon kevés memória (vagy nem értek valamit). Illetve pontosan mit értesz az alatt hogy "megnyitni"? Nem tudod átmásolni device RAM-ba, vagy mi a gond?

---
Science for fun...

Át tudom, de nem fut le a szál, ha ettől nagyobb. de lehet nálam a hiba ugyanis 2-hete programozok GPU-t. :)

------
3 fajta matematikus létezik. Aki tud számolni, és aki nem.

ebben könnyebb lenne segiteni, ha lenne példa program ;)

Így van. Én a tünet alapján azt gyanítom, hogy az algoritmus masszív párhuzamossá alakítása körül lesz valami gond, például elfogynak a regiszterek. Akkor szokott csak úgy szó nélkül megállni.

---
Science for fun...

Presze. Úgyis csak egy mintaprogramot patkoltam át. Ez az alap. Ez csak 1 mátrixot hív meg.

http://pastebin.com/aYDkvCxZ

------
3 fajta matematikus létezik. Aki tud számolni, és aki nem.

A poisson kernel hívása után szúrj be egy cudaThreadSynchronize()-t. A kernelek aszinkron módon futnak, így az utána következő visszamásolás valójában nem várja meg az algoritmus befejeződését. Magában a kernelben se látok semmi szinkront a szálak között, márpedig ha jól értem az algoritmust, akkor ennek lehet jelentősége, nem is kicsi.

Szerk.: Megnéztem újra a kernelt. Biztosan súlyosan véres a torka a szinkronhiány miatt!

---
Science for fun...

Nem kell hogy szinkronban fusson. Annyiszor "szaladnak át egymáson" a szálak, ahányszor akarnak, semmit nem kell megvárniuk ebből a szempontból. A CPU-szálak sem szinkronizáltak, és tökéletes eredményt ad.

------
3 fajta matematikus létezik. Aki tud számolni, és aki nem.

Nem a szálakat szinkronizálja (ezért is nevezték át ezt a függvényt egyébként) hanem a CPU-n futó programot a szálakhoz. Jelen állapotban a programod visszamásolja a GPU-ról az adatot MIELŐTT a GPU befejezte volna a számítást.

Ahhha. Értem. Kipróbálom.

Szerk:
Simán megy :) Köszönöm.

------
3 fajta matematikus létezik. Aki tud számolni, és aki nem.

Én ebben a kódban CPU szálakat egyáltalán nem látok, tehát ha arra gondolsz, hogy ciklusban hívod az itt bemutatott módon a poisson kerneleket anélkül, hogy valaha is szinkronizálnád a CPU-t a GPU-val, akkor az történik, hogy az új kernel indításakor a régi még fut, és ezt a torlódást a GPU legfeljebb 512-es méretig tolerálja.

Azt biztosan tudom állítani, hogy egy ilyen jellegű algoritmusnak ennyi adaton (3000x3000) működnie kell még egy ősöreg GTX8800-on is.

---
Science for fun...

Ha CPU-szálas megvalósítás alatt arra gondolsz, hogy nincs GPU és a szálak párhuzamosan számolgatják a pixel értékeket, és egy szál alkalomadtán olvassa egy másik által írtakat, mindezt mindenféle szinkronizáció nélkül, az szerintem erősen Undefined behavior...

"...handing C++ to the average programmer seems roughly comparable to handing a loaded .45 to a chimpanzee." -- Ted Ts'o

erdemes a block es tile meretekkel is szorakozni, nagyobb matrixoknal megnovelni, sokat dobhat rajta