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?
- 5967 megtekintés
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?
- A hozzászóláshoz be kell jelentkezni
Á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.
- A hozzászóláshoz be kell jelentkezni
ebben könnyebb lenne segiteni, ha lenne példa program ;)
- A hozzászóláshoz be kell jelentkezni
Í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.
- A hozzászóláshoz be kell jelentkezni
Presze. Úgyis csak egy mintaprogramot patkoltam át. Ez az alap. Ez csak 1 mátrixot hív meg.
------
3 fajta matematikus létezik. Aki tud számolni, és aki nem.
- A hozzászóláshoz be kell jelentkezni
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!
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
É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.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
erdemes a block es tile meretekkel is szorakozni, nagyobb matrixoknal megnovelni, sokat dobhat rajta
- A hozzászóláshoz be kell jelentkezni