Useamman threadin käyttöongelma

Seuraa 
Viestejä26835
Liittynyt16.3.2005

Yritän viritellä Windowsille koodia, joka hyödyntää kolmea prosessoria. Muuten homma toimii jokeenkin hyvin, mutta työn jako luotettavasti edellyttäisi, että voisin estää threadin suorituksen vaihdon siksi aikaa, kun thread ottaa suoritettavien listalta alkion ja asettaa listan osoittimen seuraavaan alkioon seuraavaa threadia varten. Miten sen voi tehdä, vai pitääkö vain hyväksyä käyttöjärjestelmän valmistajan perinteinen filosofia, että silloin tällöin hommien vain kuuluu mennä pieleen?

Sivut

Kommentit (21)

Remonttimies
Seuraa 
Viestejä477
Liittynyt9.7.2008
Neutroni
Yritän viritellä Windowsille koodia, joka hyödyntää kolmea prosessoria. Muuten homma toimii jokeenkin hyvin, mutta työn jako luotettavasti edellyttäisi, että voisin estää threadin suorituksen vaihdon siksi aikaa, kun thread ottaa suoritettavien listalta alkion ja asettaa listan osoittimen seuraavaan alkioon seuraavaa threadia varten. Miten sen voi tehdä, vai pitääkö vain hyväksyä käyttöjärjestelmän valmistajan perinteinen filosofia, että silloin tällöin hommien vain kuuluu mennä pieleen?



Haluatko, että kaikki threadit pysähtyy siksi aikaa kun seuraava tehtävä haetaan ja päivitetään haetuksi? Vai onko ongelma se, että threadit ovat samaan aikaan hakemassa listalta seuraavaa taskiä?

Ensimmäiseen en keksi oikein muuta kuin joku flagi asetus, jolla laitat timerilla muihin threadeihin keskeytyksen päälle niin, että threadi sitten esim kerran sekunnissa käy tsekkaan voiko jatkaa. Jos listalta haku on nopea, niin muutama millisekunti riittä. Toiseen laittaisin myös timerilla pienen hidastelun ja flagi myös käyttöön. Esim kun yksi thread valmistuu ja lähtee hakeen uutta taskia niin sitä ennen laitat threadin ready-tilaan, timerilla odotat ajan t, jos mikään muu timer ei ole tullut ready tilaan, pitäisi olla aikaa päivittää listat. Jos muitakin ready tiloja on, niin siihen sitten sopiva koodi ratkomaan järjestys. Jokin pää threadi siis kannattaa pitää. Jos threadit suoriutuu tehtävistään nopeasti suhteessa tarvittaan t:hen, niin sitten joku muu ratkaisu.

Todennäköisesti yllä oleva ei toimi kuitenkaan, mutta ideana. Mä oon hoitanu threadittämistä sillä, että oon väsännyt exen joka tekee jotain ja sitten vaan lauchaan ytimien määrä x2 exeä käyntiin. Taskin ne hakee tuolla timerilla "pää" threadista. Hyvin toimii, kun yhden taskin suorittaminen vie ainakin 10 min, joten sekunnin optimoinneilla ei väliä.

Remonttimies
Seuraa 
Viestejä477
Liittynyt9.7.2008
Remonttimies

Jos muitakin ready tiloja on, niin siihen sitten sopiva koodi ratkomaan järjestys. Jokin pää threadi siis kannattaa pitää..



Eka ready tila timer t, toka ready tila timer 2*t, n:s ready tila timer n*t... ehkä toimii.

Remonttimies
Seuraa 
Viestejä477
Liittynyt9.7.2008
Neutroni
Miten sen voi tehdä, vai pitääkö vain hyväksyä käyttöjärjestelmän valmistajan perinteinen filosofia, että silloin tällöin hommien vain kuuluu mennä pieleen?



Tzorry tää spämmi, mutta aivot on narikassa. Jaa listasi alun perinkin kolmeenosaan ja annat näillä threadeille vain niiden omalta listalta taskejä?

teme
Seuraa 
Viestejä191
Liittynyt24.9.2005
Neutroni
Yritän viritellä Windowsille koodia, joka hyödyntää kolmea prosessoria. Muuten homma toimii jokeenkin hyvin, mutta työn jako luotettavasti edellyttäisi, että voisin estää threadin suorituksen vaihdon siksi aikaa, kun thread ottaa suoritettavien listalta alkion ja asettaa listan osoittimen seuraavaan alkioon seuraavaa threadia varten. Miten sen voi tehdä, vai pitääkö vain hyväksyä käyttöjärjestelmän valmistajan perinteinen filosofia, että silloin tällöin hommien vain kuuluu mennä pieleen?



Suojaat resurssin semaforilla. Alustat sen niin että se on auki alussa. Aina kun thread haluaa työtä, se yrittää varata semaforin ja jos semafori on jo varattu, threadi jää odottamaan sen vapautumista. Kun semafori on vapaa, threadi jatkaa suorittamista, varaa semaforin ja ottaa työn. Sitten semafori vapautetaan ja thread voi alkaa tekemään työtä jolloin mahdollisesti toinen semaforia odottava thread pääsee ajoon.

Tuo on perus synkronointitapa käyttöjärjestelmissä ja wintoosastakin pitäisi löytyä sille tuki.

http://en.wikipedia.org/wiki/Semaphore_%28programming%29

Vierailija

"työn jako luotettavasti" tarkoittaa aina reaaliaikakäyttistä.

Windows CE on reaaliaikakäyttis. Ei sitä olis olemassa jos tavallisella onnistuis.

Nykyinen nimi taitaa olla Windows mobile.

Seppo_Pietikainen
Seuraa 
Viestejä7615
Liittynyt18.10.2007
Lektu-Elli
"työn jako luotettavasti" tarkoittaa aina reaaliaikakäyttistä.

Windows CE on reaaliaikakäyttis. Ei sitä olis olemassa jos tavallisella onnistuis.

Nykyinen nimi taitaa olla Windows mobile.




Eikä tarkoita. Kunnon thread-työkalut (pthreads, ehtomuuttujat ja mutexit, ja Javalla Thread , sekä "synchronized" ) riittävät vallan mainiosti.

--
Seppo P.
Kreationismi perustuu tietämättömyyteen, se sikiää tietämättömyydestä ja siitä sikiää tietämättömyyttä. Tietämättömyyden levittäminen on kreationismin elinehto ja tietämättömyydessä rypeminen on kreationistin luonnollinen elämisenmuoto

Vierailija
Lektu-Elli
"työn jako luotettavasti" tarkoittaa aina reaaliaikakäyttistä.

Windows CE on reaaliaikakäyttis. Ei sitä olis olemassa jos tavallisella onnistuis.

Nykyinen nimi taitaa olla Windows mobile.


Väität ihan höpöjä. CE ja mobile ovat kevytversioita, jotka toimivat pienissä koneissa, joissa ei ole paljon resursseja.

Neutroni
Seuraa 
Viestejä26835
Liittynyt16.3.2005

Semafori näköjään toimii armottoman väännön jälkeen. Suorituskykykin melkein tuplaantui. Kahden ja kolmen threadin välinen ero on kyllä aika pieni. Liekö muistin suorituskyvyn rajat tulleet vastaan. Kiitoksia avusta.

Vielä kun saisi laskentatehoa lisää kertoimella 1E100 ja muistia 1E50.

Näköjään kun jättää piirtämisen pois, ohjelma kuormittaa jopa 80 %:lla konetta ja käyttää kaikkia ytimiä.

Ohjelma laskee keskenään vuorovaikuttavien pallojen liikettä kolmioiden rajoittamassa monitahokasmaailmassa. Jaan pallot kuutioihin ja lasken vuorovaikutukset vain naapurikuutioiden välillä. Koska kuution pallojen käsittely vaikuttaa myös naapureihin ympäristöön, työn jako siten, että eri threadit eivät osoita samaan aikaan samoja alueita on haastavaa (no ei kovin, mutta suora jako ennalta kolmeen yhtä kauan aikaa vievään tehtävään on mahdoton. Kuution suoritusaikakin voi vaihdella kertaluokkia sen mukaan paljonko palloja alueella on.

Neutroni
Seuraa 
Viestejä26835
Liittynyt16.3.2005

Ai niin, sellainen juttu vielä, että millä komennolla sai Windowsissa ohjelman suorituksen keskeytettyä siksi aikaa, että se tarkastaa onko nappuloita paineltu tai haluaako joku muu ohjelma välillä aikaa? Vastaten siis Visual Basicin DoEvents -käskyä. Koodaan VIsual C:llä. Muistaakseni tuo vaati pari funktiokutsua, mutta en muista niitä enkä löydä sorsaakaan, jossa ne olisivat.

Vierailija

Asiahan ei minulle kuulu, mutta itse ajattelin jonkinlaista työnjohtaja-mallia. Sain sellaisen käsityksen että eri säikeet hakevat itsekseen listalta tehtäviä.

Miksi ei voisi tehdä yhtä säiettä jolle kirjoitetaan API, jolta suorittava säie pyytää uutta tehtävää. Näin se yksi työnjohtaja aina suoritusvuoron saatuaan antaa seuraavan tehtävän listalta sille säikeelle joka sitä ensiksi ehti kysyä, ja toisen seuraavalle jne.

Ei tule päälekkäisyyksiä. Suorittavat säikeet ovat hattu kädessä jonossa odottamassa ja työnjohtaja antaa tehtäviä sitä mukaa kun ehtii.

Stratonovich
Seuraa 
Viestejä358
Liittynyt14.6.2009
Veikko
Asiahan ei minulle kuulu, mutta itse ajattelin jonkinlaista työnjohtaja-mallia. Sain sellaisen käsityksen että eri säikeet hakevat itsekseen listalta tehtäviä.

Miksi ei voisi tehdä yhtä säiettä jolle kirjoitetaan API, jolta suorittava säie pyytää uutta tehtävää. Näin se yksi työnjohtaja aina suoritusvuoron saatuaan antaa seuraavan tehtävän listalta sille säikeelle joka sitä ensiksi ehti kysyä, ja toisen seuraavalle jne.

Ei tule päälekkäisyyksiä. Suorittavat säikeet ovat hattu kädessä jonossa odottamassa ja työnjohtaja antaa tehtäviä sitä mukaa kun ehtii.


Tarkoitatko tätä patternia:

http://en.wikipedia.org/wiki/Thread_pool_pattern

Alkuperäiseen kysymykseen voisi vastaus löytyä rinnakkaisohjelmoinnin perustyökaluista, joita on lueteltu mm. tuolla:

http://en.wikipedia.org/wiki/Mutual_exclusion

Joku lukko, kriittinen alue tai semaforikin käy. Ihan sama mikä, riippuu lähinnä siitä että mitä käytetyssä säikeistyskirjastossa/kääntäjässä on valmiina tarjolla.

totinen
Seuraa 
Viestejä4876
Liittynyt16.3.2005
Remonttimies
Remonttimies

Jos muitakin ready tiloja on, niin siihen sitten sopiva koodi ratkomaan järjestys. Jokin pää threadi siis kannattaa pitää..



Eka ready tila timer t, toka ready tila timer 2*t, n:s ready tila timer n*t... ehkä toimii.

Eikö joku hash-funktio olisi parempi?

Neutroni
Seuraa 
Viestejä26835
Liittynyt16.3.2005

Se, että muut threadit odottavat semaforin vapautumista sen aikaa kun yksi ottaa listalta työn, tuntuu toimivan. En sitten tiedä, kuinka kauan tuollaisen semaforin ihmettely käytännössä vie, mutta kolmella prosessorilla ja kolmella threadilla koodi on suunnilleen kaksi kertaa nopeampi kuin yhtä threadia käyttävänä. Parhaimmillaan se saavuttaa noin 80 %:n prosessorinkäyttöasteen, kun tein threadit kahteen aikaavievimpään vaiheeseen. Joku pieni vikakin siinä on, koska satunnaiset partikkelit saavat suuria energioita, mutta se ei liene threadisysteemin vika.

Sivut

Uusimmat

Suosituimmat