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

Fórumok

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ások

"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...

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...

É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