Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
shipo
Založen: 05. 11. 2007 Příspěvky: 19
|
Zaslal: 8. únor 2008, 12:00:07 Předmět: vícejádrové programování? |
|
|
Neznáte někdo nějaký odkaz, název knihy nebo příklad o problematice rozdělení aplikace(her) na paralelně běžící části?
Stačilo by snad rozumně vytvořit co nejvíce podprocesů a nechat systém ať si je aktuálně rozdělí na jádra CPU podle zátěže? |
|
Návrat nahoru |
|
|
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 8. únor 2008, 12:15:58 Předmět: |
|
|
vysokoskolska skripta o paralelismu - zakladni synchronizacni techniky (mutex, kriticka sekce, ...) - rozdeleni casovych kvant pro jednotliva vlakna/procesy - vzdavani se casoveho kvanta - aktivni/pasivni cekani - ...
netyka se to vice-jadroveho programovani - obecne staci multi-threaded programovani - to ze mas vic jader je dnes jenom takove "IN", ackoliv je to stare a zname protoze vice procesorove stanice jsou tu uz nekolik desitek let, a stejne tak treba gridy/clustery |
|
Návrat nahoru |
|
|
Fila
Založen: 31. 07. 2007 Příspěvky: 853
|
Zaslal: 8. únor 2008, 14:25:20 Předmět: Re: vícejádrové programování? |
|
|
shipo napsal: |
Stačilo by snad rozumně vytvořit co nejvíce podprocesů a nechat systém ať si je aktuálně rozdělí na jádra CPU podle zátěže? |
Co nejvic snad ani neni potreba (staci kdyz jich nebude min nez jader), dulezite je ono "rozumne" -- system neni zpravidla v pridelovani CPU blby, horsi je rozdelit aplikaci tak, aby se jednotlive procesy/vlakna opravdu rovnomerne podelily praci a vyuzily tak co nejvic z CPU v systemu. Pokud bys mel 100 procesu, jeden by delal 99 % prace a zbylych 99 se delilo o 1 %, byl by ti naprd system o libovolnem mnozstvi procesoru .
Jinak nic konkretniho o paralelizaci problemu ve hrach neznam, dulezite je prostudovat si jak funguji synchronizacni nastroje operacniho systemu, jak psal Rezna. Pak je taky dulezite naucit se trosku "myslet paralelne" -- muzes napr. studovat existujici paralelni algoritmy. |
|
Návrat nahoru |
|
|
Ladis
Založen: 18. 09. 2007 Příspěvky: 1536 Bydliště: u Prahy
|
Zaslal: 8. únor 2008, 15:43:39 Předmět: |
|
|
Ve hrach je multithreading relativne stale jeste novinka, takze o tom asi moc clanku nenajdes. Muzes si vygooglit clanky a prezentace Tima Sweeneyho, autora noveho Unreal3 enginu, nicmene po zadani tim sweeney multithreading do Googlu je spousta toho jen nejaky kratky zpravy nebo diskuzni fora .
EDIT: Jo jinak, ja bych problem vyuziti jader CPU zkusil realizovat modelem producer-consumer. Pro predstavu, nejaky prehledny priklad: Mas softwarovou transformaci vertexu modelu ve hre, tak single-threaded model je, ze projde pole vertexu od zacatku do konce a kazdy transformuje. Multi-threaded model producer-consumer je, ze mas objekt, ktery vrati nasledujici kus N vertexu ke zpracovani, a objekty, ktere obdrzeny kus transformuji (a nekam ulozi). Takze pak pro 2 jadra mas 2 consumer-thready, kazdy si vezme treba 1000 vertexu, a kdyz je s jejich zpracovanim hotov, tak si vezme dalsi kus, dokud to neni cele zpracovane (predpokladam vytizeni objektem vracejiciho vertexy minimalni; obe jadra budou naplno vytizena a je jedno, jestli nektera zpracovavana data jsou zpracovana rychleji nebo pomaleji - narozdil od modelu, kdy si zpracovavana data rozdelis na stejne velke dily). _________________ Award-winning game developer |
|
Návrat nahoru |
|
|
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 8. únor 2008, 16:27:26 Předmět: |
|
|
Ladis: to je dobry napad, ale musi se dat pozor na to abys ty pocty vertexu mel opravdu rozumne velke, jinak muze prijit neprijemna rezie prepinani vlaken a prilis velka rezie pridelovani kusu
treba pokud nekdo pracuje s 1M vertexu tak 1k vertexu jako dil je dost malo. spis tak 100k vertexu by bylo optimalni - protoze si predstav ze se bude muset 1000x prepnout vlakno a 1000x pridelit zpracovavany kus.
kdezto i pri kusu 100k vertexu je porad sance na az 2nasob. urychleni a pritom tam nemas rezii prepinani vlaken - prepne se +- 10x
Autor: dalsi moznosti kde je uziti multithreadingu (a tim moznost pripnout vlakna k ruznym procesorum (nerikam schvalne jadrum, protoze proste jsou to procesory) je oddelit grafiku a fyziku a kazde pocitat s jinou frekvenci (ikdyz i toto si kolega z prace osetril do single-threadu). typicky fyzika drzi svuj posledni stav vystaveny 0.1s a az pak se znovu dopocita a vystavi novy stav - to mezi tim se interpoluje (protoze typicky grafika na 60FPS ma tedy delku jednoho "stavu" 0.0166s.
ale je potreba se zamyslet jestli se ti tyto hratky vyplati.
PRO:
-- jednoznacne pro je zprehledneni citelnosti kodu
-- nemyslim ted samotnou synchronizaci vlaken/procesu ale to samotne oprogramovani fyziky napr. proste dany kus kodu je jenom fyzika, v nekonecne smycce se ti nemicha vsechno dohromady
PROTI:
-- problemy s uvaznutim - dead-locky - toto je snad nejhorsi vec nad odladeni, protoze to typicky nastava zcela nahodne
-- problemy se sdilenim dat - musis si dat pozor aby vsechna data ktera sdilis a je mozne do nich i zapisovat byla pocitve uzamykana a tudiz nedoslo k tomu ze jeden druhemu neco prepise
takze prvne by tvoje uvaha hlavne mela smerovat na to co je pro tebe lepsi - jestli obetovat cast vykonu a mit kod ktery se nechova cas od casu znacne nepredpovidatelne a nebo jestli ti stoji jit do nekonecneho debugovani a hlavne do teoretickych uvah a modelovani propojeni sdilenych objektu za nejaky ten vykonnostni narust. |
|
Návrat nahoru |
|
|
Fila
Založen: 31. 07. 2007 Příspěvky: 853
|
Zaslal: 8. únor 2008, 16:48:53 Předmět: |
|
|
Jen poopravim Reznu -- pokud ti bezi na kazdem procesoru jedno vlakno, tak te nemusi trapit prepinani stavu, zadny se neprepina. I tak je ale treba davat bacha, abys vytezil vic z paralelniho spracovani, nez promrhal komunikaci mezi thready a zamykanim. Obecne se hodi paralelizovat vypocty, kdy jsi schopen rozdelit data nad kterymi pracujes na vice skupin a ty pridelit jednotlivym vlaknum, v momente, kdy se o tato data (pri zapisu) vlakna tahaji, to je problematicke. |
|
Návrat nahoru |
|
|
kerekes
Založen: 29. 07. 2007 Příspěvky: 57
|
Zaslal: 8. únor 2008, 17:04:53 Předmět: |
|
|
Pokial by slo o c++, tak nedavno som zacal skumat OpenMP. Ide o kniznicu pre podporu multithreadingu na zaklade zdielanej pamate. Pracuje sa s tym celkom jednoducho (resp. ovela jednoduchsie ako priamo s volanim os-ka (winapi). Musi to vsak podporovat kompilator. Defaultne to podporuje vc++ 2005 pro, myslim ze aj g++ od nejakej verzie 4.2.
Napriklad automaticke rozdelenie spracovania cyklu for sa da definovat:
kód: |
#include <omp.h>
...
#pragma omp parallel for
for(int i......)
{
// toto sa rovnomerne rozlozi do vlakien, ktorych
//pocet je vecsinou rovny poctu procesorov/jadier pocitaca
}
|
Podporuje to viacero konstrukcii pre blizsie info vid dokumentaciu.
Avsak nieje to ziaden zazrak a mysliet "paralelne" a na synchronizaciu je potrebne.
Napriklad jednoduchy cyklus v ktorom som vykonaval nejaky "hardcore" vypocet (seria sqrt,cos,sin,pow a pod) a vysledky ukladal linearne do pola prebehol s povolenym OpenMP zdruba o 90% rychlejsie (na dvojjadrovom cpu). Obe jadra boli vytazene na 100% v task manageri. (vysledok cas 1.17s vs 2.28s).
Ked som to ale aplikoval na SW skinovanie (rozdelenie cyklu skinovania vrcholov), tak pri testoch to nepreukazalo ziaden vykon naviac. Zrejme nejake zavislosti a thready na seba museli cakat....ajked tam ziadne zavislosti nevidim ..... mozno citanie z rovnakeho pola matic a zdrojovych (bind pose) vrcholov.
Mozno by to bolo dobre skusit na urovni postav. (Pri testoch sa skinovalo 100 postav o 3400 vrcholoch....(16fps takze bottleneck bol tam) viem ze gpu to da omnoho rychlejsie....slo mi o skusenie openmp)
Kazdopadne sa s tym este pohram a odporucam to pre jednoduchost pouzivania aj ostatnym.
[/code] |
|
Návrat nahoru |
|
|
shipo
Založen: 05. 11. 2007 Příspěvky: 19
|
Zaslal: 9. únor 2008, 06:52:13 Předmět: |
|
|
Všem moc děkuju za rychlé odpovědi , docela mě nasměrovali(už vím co a kde hledat).
Nejde mi ani tak o pararelní řešení 1 výpočtu(SIMD), ale spíš o zkloubení několika různejch oblastí(AI,Fyzika,příprava,analýza) ve hře, co si můžou krádkodobě žít vlastním životem. Krásně to vystihl rezna:
rezna napsal: |
dalsi moznosti je oddelit grafiku a fyziku a kazde pocitat s jinou frekvenci (ikdyz i toto si kolega z prace osetril do single-threadu). typicky fyzika drzi svuj posledni stav vystaveny 0.1s a az pak se znovu dopocita a vystavi novy stav - to mezi tim se interpoluje (protoze typicky grafika na 60FPS ma tedy delku jednoho "stavu" 0.0166s. |
A ty pak pomocí vláken(thread) a procesů nechat rozdělit na uživatelovi procesory, s ohledem na prepinani stavu(ukladáním stavu procesoru na zásobník).
Škoda že o tom není zrovna moc článků, ale pararelní programování je taky zajímavý. Ještě jednou dík. |
|
Návrat nahoru |
|
|
|