» »

Desktop aplikacije večinoma niso multithreaded???

Desktop aplikacije večinoma niso multithreaded???

«
1
2

Bistri007 ::

Samo tako se malo razmišljal:
Če imajo res tak problem z 'nitenjem' aplikacij, zakaj ne modificirajo sintakse zank.

For / foreach / while so pogosti ukazi. Ali pa jezikovni konstrukti, kakor želite.
Ko programiram, se mi velikokrat zgodi, da napišem eno prevetritev elementov/številk, pri katerih je postopek za vsak element/vrednost neodvisen od predhodnega (npr. seznam držav, kjer so vsi podatki za vsako državo posebej ločeni)

Ali se samo meni zdi, da bi lahko zlahka naredili forTS, foreachTS, whileTS, kjer TS pomeni thread safe.
Kompajler zgenerira kodo, ki loop control podeli operacijskemu sistemu (s pomočjo absolutnega FAR JUMPa ali local jumpa na OS kodo) in ta skreira toliko TSSjev (task state segmentov), kolikor je fizičnih procesorjev.

Primer 4 procesorski sistem:
'Afghanistan'=> Procesor1
'Albania'=> Procesor2
'Algeria'=> Procesor3
'Andorra'=> Procesor4
'Angola'=> prvi prosti procesor (od Afganistana ali Albanije ali Alžirije ali Andore - kar se prej konča)
'Anguilla'=> prvi prosti procesor
'Antigua and Barbuda'=> prvi prosti procesor
'Argentina'=> prvi prosti procesor
'Armenia'=> prvi prosti procesor
'Australia'=> prvi prosti procesor
'Austria'=> prvi prosti procesor
...


Če zanko tehnično razdelimo na dva dela:
for (int i=0; i>10; i++) { // prirejanje in 'scheduling'
//jedro
}

Prirejanje in 'scheduling' poteka enonitno, jedro zanke (ki porabi veliko več časa kot preprosti INC), pa na več procesorjih.

Ali pa je to že kdo naredil, pa jaz, družboslovec, za to še nisem slišal... ;)
Največja napaka desetletja je bila narejena 4. novembra 2008
Oni so goljufali in Alah je goljufal, Alah je najboljši prevarant. (Koran 3:54)
Citiraj svetega očeta Benedikta XVI. in postani "persona rudis"...

64202 ::

Ravnokar si presegel mindset povprecnega programerja, bravo. Zakaj pa Microsoft in Sun tega ne podprejo v svojih najbolj "sodobnih" toolih? Ker prodajajo vedno najsirsemu moznemu delu kupcev. Oziroma, da ne bom zvenel grobo - najvecji del problemov, ki jih ljudje resuje so povprecni in hkrati povprecne resitve so v povprecju dovolj dobre :D.

Drugace je ta ideja v akademskih krogih pravzaprav ze dolgo znana, recimo razne implementacije, ki imajo lightweight taske:

http://www.sac-home.org/
tocno to kar ti opisujes

http://portal.acm.org/citation.cfm?id=6...
qlisp - lisp z implementacijo t.i. "prihodnosti" za doseganje sinhronizacije paralelnih taskov

http://www.macs.hw.ac.uk/~dsg/gph/
in a nutshell: oznacis kjer se haskell koda izvaja paralelno

http://www.erlang.org/
asinhroni vzporedni objekti, za doseganje ultra robustnosti

http://www.mozart-oz.org/
teh ne razumem cisto, ampak zgleda ultrafensi :)

CCfly ::

Navsezadnje bi se dalo takšne konstrukte v C++ dodati. Skoraj prepričan sem da bi nam google našel kakšno knjižnico.
Morda bi bilo še bolj ugodno narediti več niti, ki jim dodeliš delo na odseku tabele, namesto da scheduling delamo za vsak posamezen element.
Recimo narediš kakšnih 8 niti, kjer vsaka dela na 1/8 tabele, potem pa upamo da bodo procesorji približno dovolj izkoriščeni (naivno poenostavimo scheduling).
"My goodness, we forgot generics!" -- Danny Kalev

Bistri007 ::

Zakaj pa Microsoft in Sun tega ne podprejo v svojih najbolj "sodobnih" toolih? Ker prodajajo vedno najsirsemu moznemu delu kupcev.

Halo! Jutri dobimo večjedrne procesorje v vsako kišto. In velikokrat slišim, kako večina programov deluje samo enonitno. In ne mi rečt, da se s tem problemom ne bodo morali soočiti tudi taveliki.

Jaz sem si pogledal tiste linke, ki jih je dobavil 64202, ampak ti se nanašajo na bolj preproste, doma napisane jezike. Še najbližje je res sac-home, ampak kolikor jaz to razumem ta program naredi zunanjo knjižnico z multithreaded kodo (dll), ki jo lahko vključiš v svoj program.

Jaz bi dopolnil pribljubljen kompajler: npr. gcc. Ne vem koliko ljudi ima voljo, da se ubada z nečim, kar bi na dvoaliveč procesorski platformi teklo hitreje 40%. Ni to takšen pridobitek, da bi se splačalo veliko truditi zanj.

for, foreach, while so najbolj osnovni konstrukti, ki jih zna uporabljati vsak in se tudi pogosto uporabljajo. No, seveda pa mora biti programer toliko pameten, da ve, ali računa Fibonačijevo zaporedje, oziroma ali je to, kar se z elementom naredi neodvisno od tega, kar se naredi s predhodnim.

CCfly (namesto da scheduling delamo za vsak posamezen element): če bi bil 'element dispatching' pravilno narejen, bi bila fiksna razdelitev počasnejša. Recimo, da je ene elemente hitreje izračunati kot drugo - prestavljaj si šprint na 100m z 8 tekači (predstavljaj si procesorje) - ko pride tekač na cilj mora čakati ostale, da opravijo svojo nalogo.

Število niti mora biti na večprocesorkem sistemu od 2 do (število procesorjev-1). In koliko je procesorjev najbolje ve operacijski sistem. Ko so narejeni ti štirje/osem TSSjev, compilerjev loop control ob koncu ene iteracije samo zahteva NovProstiElement. Kar (odvisno od spremenljivke) ne bi smelo zahtevati več kot 20 procesorjevih urnih ciklov.

Edini - in največji problem je dodelitev pomnilnika za spremenljivke, ki se res spreminjajo v tej zanki ter kako določiti OUTPUT spremenljivko.

output spremenljivko bi označil z besedo 'common' npr. - common mycommonvar[100].

Pomnilnik za interloop spremenljivke bi se določil dinamično: vsak nov TSS ima ves pomnilnik označen Read-Only (vsak TSS ima svoj CR3 -address of the page directory), razen onih spremenljivk, ki so označene s COMMON in pomnilnika OS, ki ostane tak kot je.
Prvo pisanje na ReadOnly memory pokliče Exception 0E, ki alocira novih 4K, skopira vanj vsebino originalnega pomnilnika in dovoli spreminjanje tega kosa pomnilnika.

Compiler lahko pri tem pomaga, da pove v katerem kosu pomnilnika so spremenljivke, ki se bodo spreminjale in že vnaprej določi posebej Writable strani za vsak TSS posebej. Compiler lahko tudi alocira tiste spremenljivke, ki se spreminjajo znotraj loopa zaporedno (da niso fragmentirane po več 4K straneh, če so lahko v eni).

No ja, kaj mislite?
:)
Največja napaka desetletja je bila narejena 4. novembra 2008
Oni so goljufali in Alah je goljufal, Alah je najboljši prevarant. (Koran 3:54)
Citiraj svetega očeta Benedikta XVI. in postani "persona rudis"...

Zgodovina sprememb…

  • spremenilo: Bistri007 ()

kopernik ::


Zakaj pa Microsoft in Sun tega ne podprejo v svojih najbolj "sodobnih" toolih? Ker prodajajo vedno najsirsemu moznemu delu kupcev.


Ne vem koliko prodajata, glede na to, da so platforme zastonj :\ JDK s compilerjem je tudi zastonj.

So pa alternative (tudi open-source), kjer je možno z dobrimi predlogi lažje vplivati na razvoj. Npr. Python. Lahko poskusite tam ;)

Bistri007 ::

Tole z Microsoftovimi profiti je brez veze. Oni hočejo imeti razvojna orodja zastonj, samo toliko zaračunajo da se Borland drži nad vodo. Če še niste videli: Join Microsoft Empower for ISVs za 375$.
Šenkajo 5 Desktop Win+Office in 1 WinServer+SQL ter MSDN Universal Subscription za 1 leto (podaljšaš lahko še za 1 leto). Za start-up firmico ni, da ni.
Ampak tole s profiti je offtopic. Mene zanima nitenje.
Največja napaka desetletja je bila narejena 4. novembra 2008
Oni so goljufali in Alah je goljufal, Alah je najboljši prevarant. (Koran 3:54)
Citiraj svetega očeta Benedikta XVI. in postani "persona rudis"...

kopernik ::


Ali se samo meni zdi, da bi lahko zlahka naredili forTS, foreachTS, whileTS, kjer TS pomeni thread safe.


V Javi lahko vsak del kode, ki želiš, da je thread-safe, označiš z rezervirano besedo synchronized.

Glede izvajanja na več procesorjih ... mislim, da to ni stvar prog. jezika, ker ti vnaprej ne veš, kje bo tvoj program tekel. Strinjam pa se, da bi se lahko tako naredilo compajlerje, ki bi znali izkoriščati dejstvo, da je dostopnih več procesorjev. Najbrž taki compajlerji tudi obstajajo ...

BigWhale ::

Take zanke bi bile fina zadeva ampak uporabna samo v tocno dolocenih primerih...

Poskusam se spomniti, kdaj sem nazadnje uporabil for zanko, ki bi jo lahko takole razparceliral... :)

64202 ::

> Jaz sem si pogledal tiste linke, ki jih je dobavil 64202, ampak ti se nanašajo na bolj preproste, doma napisane jezike. Še najbližje je res sac-home, ampak kolikor jaz to razumem ta program naredi zunanjo knjižnico z multithreaded kodo (dll), ki jo lahko vključiš v svoj program.

Tile jeziki niso "doma" napisani in "preprosti", kaj cem rect? To se zdalec ni res, resno, poglej kdo so avtorji in kaj so dosegli s temi projekti. Erlang je pa tudi direktno komercialno uspesen in to kar precej.

In ja, jasno, ko bodo vecjedrni procesorji zunaj, bo tudi MS in Sun to podprl. Verjetno ze razmisljajo zelo resno o tem. The point je v tem, da tega ne podpirajo danes zdaj tukaj!

Glede prodaje jezikov - to je del vecjega big picturea, pa kaj ce so compilerji zastonj?

Drugace library za c++, ki to dela (in se precej vec), sem si napisal sam, ker je glede tega v c++ susa. Pristop je seveda drugacen, ker je lib in ne popravek za compiler. Je pa za $$$, sorry ni open source.

Zgodovina sprememb…

  • spremenilo: 64202 ()

64202 ::

U pa se en projekt:
http://www.research.att.com/projects/cy...
(isti lab. kot c++ bjarne!:)

Sicer stable verzija nima multithreadinga, sem pa nekje glede tega nasel paper, ki opisuje, kako v cyclone memory management "100%" varno vkljuciti threade (precej bolj varno kot v c/c++/java vsaj:). Malo podobno kot tvoja razlaga.

Zgodovina sprememb…

  • spremenilo: 64202 ()

Gundolf ::

Ok, zakaj se tega ne uporablja zelis vedeti? Zato ker to ne bi bilo prakticno nic hitreje. Ne vem koliko se spoznas na racunalnisko arhitekturo, ker se imenujes druzboslovec? Problem je, da ze z navadno zanko trcis v oviro prepustnosti RAMa. Se pravi, tudi navadna zanka je se vedno precej hitrejsa od RAMa. Ce bi znal to pohitriti in bi nasel resitev za se en problem, namrec s recimo stirimi nitmi (in posledicno s stirimi procesorji) hkrati dostopati do stirih razlicnih lokacij v RAMu. No potem bi s temi dodatnimi ter ne prevec enostavnimi konstrukti lahko pohitril priblizno odstotek svojega programa.

To je moje mnenje.

64202 ::

Sicer v splosnem paralelnost ni uporabna samo zaradi raw prepustnosti, ampak tudi zaradi odzivnosti in preprostosti programiranja. Paralelne for zanke so samo (majhna) podmnozica raznih moznih paralelnih konstruktov, ki ti izjemno olajsajo pisanje programov, ki so polni asinhronih eventov. Recimo network programiranje, gui, ...

OwcA ::

Vektorski prevajalniki počno nekaj podobnega, ampak brez presežkov, ki jih prinašajo niti.

Zanke, kot jih ti omenjaš, bo tako ali tako vsak pošten prevajalnik razvil in operacije še malo po paraliziral (lokalno).

Kot je bilo že povedano, je tvoja idej sicer dobra, ampak za večino primerov neuporabna.
Otroška radovednost - gonilo napredka.

Zgodovina sprememb…

  • spremenilo: OwcA ()

Gundolf ::

Sicer v splosnem paralelnost ni uporabna samo zaradi raw prepustnosti, ampak tudi zaradi odzivnosti in preprostosti programiranja.

Cakaj malo, ali ti pravis da je forTS bolj enostavno od for? Aja, BTW bistri, tvoje ime ni najbolj primerno, morda bi bilo namesto ThreadSafe bolje kaj ala Parallel?
Paralelne for zanke so samo (majhna) podmnozica raznih moznih paralelnih konstruktov, ki ti izjemno olajsajo pisanje programov, ki so polni asinhronih eventov. Recimo network programiranje, gui, ...

Morda v prihodnosti, ko bo multithreading res vecinoma deloval na multiplih procesorjih. Poleg tega je za GUI najbolje uporabiti message queue. Nasploh, da bi za obvladovanje asinhronih elementov uporabil tak tip zanke?? :/

64202 ::

Gundolf, spet malo mesas ljudi? :)

Ne, forTS ne poenostavi tega, "prihodnosti" ali pa paralelni objekti iz erlanga (varen superset message quejev) pa ja. Pa tudi ni nujno da paralelna koda res tece zares paralelno na vecih procesorjih, zato da imas neko korist. Light weight taski, ki imajo prakticno nicno ceno preklopa proti heavy weight threadom, so zelo zanimiva alternativa. Iz stalisca preprosti programiranja namrec - lahko si komot privoscis 10000 takih threadov v enem procesu. Da pa to izkoristis, je pa dobro imeti jezik ki to direktno podpira. GNU portable threads je pa recimo IO oriented pristop k temu v c-ju.

Owca: v splosnem je taksne zanke verjetno tezko optimizirat, zato paralelni array jeziki niso kar tako za v staro saro. Sicer se pa ne bavim s highperf. premetavanjem stevilk in me podrocje ne zanima, torej mas mogoce prav.

Gundolf ::

Kje vidis da mesam ljudi? Prejsnji post? Prvi stavek se nanasa nate (avtorja citiranega besedila), v drugem se pa tudi direktno obrnem na cloveka, ki je zacel s to temo in podal ime forTS. Ali si mislil kaksno drugacno mesanje?

No lightweight threadi so ze vredu. Pri velikem stevilu threadov pa tako ali tako ze rabis dokaj pameten scheduler ce zelis imeti korist in ne izgube. Kar se enostavnosti tice imas kar prav. Upam da bo C# kmalu dodal podporo za kaj takega :D. Jaz ponavadi prvo pogledam na hitrost in ucinkovitost in mi zato pristop ni vsec. Pri 1000+ threadih lahko ze kar pozabis na lokalnost podatkov, kakor sem ze omenil pade tudi hitrost preklaplanja in naraste potreba po varovanju podatkov med razlicnimi threadi.

Kje bi ti uporabil na tisoce threadow?

Vesoljc ::

na 1000 procesorjih? 8-)
Abnormal behavior of abnormal brain makes me normal...

64202 ::

> Kje vidis da mesam ljudi? Prejsnji post? Prvi stavek se nanasa nate (avtorja citiranega besedila), v drugem se pa tudi direktno obrnem na cloveka, ki je zacel s to temo in podal ime forTS. Ali si mislil kaksno drugacno mesanje?

Ah ok. Sem naredil context switch med paragrafom, ne med stavkoma :).

> No lightweight threadi so ze vredu. Pri velikem stevilu threadov pa tako ali tako ze rabis dokaj pameten scheduler ce zelis imeti korist in ne izgube.

Ta problem je zelo odvisen od modela paralelnosti, ki ga uporabljas. Ne recem, da obstajajo neke 100% resitve, ampak se da gotovo veliko narediti. Moj pogled na to je, da so threadi, mutexi, message que-ji, condition variables (kaksen je slo izraz za to?), ipd. nekaksen assembler paralelnega programiranja, pa se to tak grd CISC.

> Kje bi ti uporabil na tisoce threadow?

Bom podal primerjavo med javo, in java like jezikom L, ki bi rabil toliko threadov:

Java: objekt (kos rama + metode)
L: asinhron objekt (kos rama + metode + thread)

Java: sinhron klic metode, ki vedno blokira
L: asinhron message z ali brez "prihodnosti" (qlisp style future), ki predstavlja rezultat operacije, klici ne blokirajo, handlajo se v threadu objekta zaporedno (erlang)

Java: kot posledica java (jvm) uporablja stack za temporary lokalne spremenljivke
L: uporablja queue za temporary qlisp prihodnosti, take "heavy weight" spremenljivke

Koristi:
- program se da izvajati prakticno gledano toliko paralelno, kolikor dopusca tvoja resitev problema (v kontrast si predstavljaj rocno hendlanje stotine med sabo odvisnih threadov v javi)
- robustnost, to je posledica neblokiranja na nivoju metod, cel program se obnasa bolj "organizem", kjer odpoved enega dela ne povzroci celotne odpovedi. V javi lahko mimogrede zastrikas komplet program z enim samim deadlockom, starvationom, etc.

Tezave:
- transakcije, v tako hudo paralelnem okolju je tezko videti kaj se res dogaja in v kaksnem vrstnem redu (to se da verjetno v splosnem resiti, ni pa easy)
- niso vsi problem lepo resljivi s takim programiranjem, ekvivalentno z razliko med message passing in shared memory modelom paralelnosti

Vesoljec: exactly :). L je eden izmed moznih jezikov za tak racunalnik.

Zgodovina sprememb…

  • spremenilo: 64202 ()

Gundolf ::

Slisi se zanimivo. Vse kar bi za zacetek rabili je nek CPU, sestavljen iz kaksne 1024 enostavnih RISC procesorckov (po moje povsem izvedljivo iz tehnicnega vidika, verjetno pa ne iz ekonomskega) ter tak L jezik (je ta L ze definiran ali je bilo to popolnoma teoreticno razmisljanje?).

Mhm, morda bi bilo dobro dodati se strojno podporo za critical sectione oz. mutexe in to je to. Seveda bi bilo programiranje tegal sistema smiselno le na ozki mnozici problemov, morda pa bi se izkazalo, da se arhitekturo bolj splaca siriti v tej smeri kot pa v smeri visana frekvence in dodajanja kompliciranih ukazov.

64202 ::

> Slisi se zanimivo. Vse kar bi za zacetek rabili je nek CPU, sestavljen iz kaksne 1024 enostavnih RISC procesorckov (po moje povsem izvedljivo iz tehnicnega vidika, verjetno pa ne iz ekonomskega) ter tak L jezik (je ta L ze definiran ali je bilo to popolnoma teoreticno razmisljanje?).

To je v bistvu erlang, samo da ima L tudi qlisp futures. Pure message passing, kot ga zganja erlang, je tecen za splosno paralelno programiranje.

Drugace RISC procesorcki :), "native" jezik je pa occam
Transputer

> Mhm, morda bi bilo dobro dodati se strojno podporo za critical sectione oz. mutexe in to je to. Seveda bi bilo programiranje tegal sistema smiselno le na ozki mnozici problemov, morda pa bi se izkazalo, da se arhitekturo bolj splaca siriti v tej smeri kot pa v smeri visana frekvence in dodajanja kompliciranih ukazov.

Mutexi in critical sectioni so potrebni samo v shared memory modelu. (Pure) message passing ne rabi explicitne sinhronizacije. Res pa je, da potem moras na visjem nivoju implicitno simulirati "sinhronizacijo". To trenutno se malo raziskujem.

Glede sirine problemov... se mi zdi, da so ljudje do sedaj resevali probleme, ki so bolj "shared memory narave". Sedaj pa vedno bolj postaja popularno mrezno neodvisno programiranje, se celo MS je to zaznal in implementiral web services. Ironicno glede na to, koliko je trajalo v 90s, da je MS "pokopcal" internet.

Se ena zanimivost: internet. To je najvecji message passing sistem na zemlji, zelo zanesljiv - ce en node pade dol, se vedno celota deluje. In guess what, internet nima mutexov, pa cisto fajn deluje :).

Zakaj ne bi tudi jeziki te paradigme direktno podprli?

64202 ::

Aja L je seveda moja izmisljotina :).

Vesoljc ::

tale L, kakšen odzivni čas bi imel? 10-3 sekundna skala zna biti prevelika za nekatere desktop aplikacije na 10n cpu enotah.
Abnormal behavior of abnormal brain makes me normal...

64202 ::

Jasno, kjerkoli bi imel v ms delay, je drek.

Drugace, to je predvsem hardverski problem, kako zvezati toliko procesorjev skupaj in ali to sploh ustreza vecini problemov. Po moje je lazje doseci uspeh z neko srednjo potjo, recimo nekaj (ali nekaj deset) multicore CPU-jev, ce se gremo hardversko podprto paralelnost.

L bi lepo tekel tudi na eno-procesorski kisti. Evo primer:
http://www.sics.se/~joe/apachevsyaws.ht...
(yaws je napisan v erlangu)

Ce bi se operacijski sistemi bolje podprli light weight taske, potem pa sploh.

Zgodovina sprememb…

  • spremenilo: 64202 ()

Gundolf ::

Ce bi se operacijski sistemi bolje podprli light weight taske, potem pa sploh.

Fora pri lightweight taskih ali threadih je v tem, da niso podprti s strani OSja, ker je vsak klic OS funkcij prehud penalty glede performanc.

64202 ::

> Fora pri lightweight taskih ali threadih je v tem, da niso podprti s strani OSja, ker je vsak klic OS funkcij prehud penalty glede performanc.

Sistemski klici so ze dragi, ja, ampak to ni the point. Problem je v tem, ker tvoj scheduler ne sodeluje s sistemskim schedulerjem. Recimo, mas dober staticni/dinamicni analizator kode za svoj jezik (L:) in ves, ali naj thread res tece na drugem procesorju, ali pa na trenutnem. Pa kdaj in na kateri (sistemski) thread naj se naredi preklop. No, nekaj se da narediti s prioritetami threadov, preklopi na blef (yieldi),...

Zgodovina sprememb…

  • spremenilo: 64202 ()

Gundolf ::

Vseeno ne vem, zakaj bi morala biti podpora s strani OSa (najprej se mi je zdelo, da se to nanasa na primer ko imas le en procesor, zdaj pa ne vem vec kaj tocno si mislil:)). Ce imas en proc, potem si sam schedulas lightweight niti (ker ce jih pustis OSu, ne bojo vec lightweight). Ce imas pa dva ali vec, si pa naredis vec niti in OSu nekako poves, da bi rad, da vsaka tece na svojem procu (mislim da je to ze sedaj mozno). Nato si spet sam schedulas svoje lightweight niti znotraj od OSa dobljenih heavyweight:( niti.

Ze to je tezko narediti zadovoljivo hitro, kaj sele, da bi kake message posiljal OSu (se sploh ce so to windowsi;)).

darkolord ::

se sploh ce so to windowsi

:\ :\




:D

64202 ::

> Vseeno ne vem, zakaj bi morala biti podpora s strani OSa (najprej se mi je zdelo, da se to nanasa na primer ko imas le en procesor, zdaj pa ne vem vec kaj tocno si mislil:)). Ce imas en proc, potem si sam schedulas lightweight niti (ker ce jih pustis OSu, ne bojo vec lightweight). Ce imas pa dva ali vec, si pa naredis vec niti in OSu nekako poves, da bi rad, da vsaka tece na svojem procu (mislim da je to ze sedaj mozno). Nato si spet sam schedulas svoje lightweight niti znotraj od OSa dobljenih heavyweight:( niti.

U bistvu mas prav, kaj vec kot to niti ne rabis. Malo sem zabluzil :). Vecino casa nisem ravno prevec razmisljal o konkretni implementaciji schedulerjev, bolj o jezikih, ki bi sploh izkoristili na programmer friendly way paralelnost v resitvi problema.

> Ze to je tezko narediti zadovoljivo hitro, kaj sele, da bi kake message posiljal OSu (se sploh ce so to windowsi;)).

FreeBSD & NetBSD delata tako - M:N threading model.

64202 ::

Konkreten link za NetBSD:
http://web.mit.edu/nathanw/www/usenix/f...

Sicer tile upcalli so bolj take IO narave.

hruske ::

Dejstvo je, da to kar trobite, sploh ne bi tako pomagalo.

1. Računala so danes zato tako hitra, ker že veliko stvari zračuna še preden si mi tega zaželimo in zaradi predpomnilnika, ki je tako hiter kot procesor. Navaden pomnilnik NI. Ko se spraviš dodeljevat posamezne elemente procesorjem, tam zgubiš najmanj toliko časa, kot ga z večimi procesorji pridobiš. Kaki programi pa to že izkoriščajo, npr. gcc, ki kompajla na večih hkrati. Ali pa abcde (CLI cd ripper, ki je sposoben pognat več kodiranj wav v ogg naenkrat). Ampak da pa bi lomil for zanko ... to je polomija, drugače bi to že kdo počel.

2. Pa kaj potem, če ne uporabljaš programa, ki bi ti papal dva procesorja. Bodo pa na enem tekli sistemski procesi in kake malenkosti, recimo winamp, na drugem pa procesorsko zahtevna nit.

3. Ta večjedrna osnova bo podlaga za razvoj prepoznave govora. En procesor ti bo obremenjevala prepoznava govora, drugega pa ostalo. In še kaka druga zadeva v tej smeri, recimo prepoznavanje gledanja oči, da ti potem miškin kazalec ustrezno premika.
Rad imam tole državico. <3

Gundolf ::

se kar strinjam

Vesoljc ::

jest tudi, batch (grupiranje operacij ter podatkov) je tisto kar največ šteje! MT naj nastopi po tem...
Abnormal behavior of abnormal brain makes me normal...

64202 ::

> 1. Računala so danes zato tako hitra, ker že veliko stvari zračuna še preden si mi tega zaželimo in zaradi predpomnilnika, ki je tako hiter kot procesor. Navaden pomnilnik NI. Ko se spraviš dodeljevat posamezne elemente procesorjem, tam zgubiš najmanj toliko časa, kot ga z večimi procesorji pridobiš. Kaki programi pa to že izkoriščajo, npr. gcc, ki kompajla na večih hkrati. Ali pa abcde (CLI cd ripper, ki je sposoben pognat več kodiranj wav v ogg naenkrat).

Jasno je, da s tem kar smo "bluzili" ne resis vseh paralelnih problemov. S tem se verjetno strinjata Gundolf & Vesoljec. Jaz se tudi. Ne strinjam se pa s tem, da to ni v splosnem uporabno (ce si to hotel reci). Oziroma, trdim, da je dovolj problemov, da bi se splacalo to v jezikih direktno podpreti. Vsak dan resujem tocno taksne probleme in me jezi, da moram v c++ programirati samo zaradi popularnosti jezika. Ceprav ne ponuja glede paralelnosti sam po sebi nic cela nicnic. Na sreco je precej mocan jezik in se da to nekako shekati v knjiznici s template-i (kar sem tudi naredil).

> Ampak da pa bi lomil for zanko ... to je polomija, drugače bi to že kdo počel.

To je sicer ideja original posterja, ni pa to nujno vedno slabo. Kaj ce je vsak korak neodvisno mnozenje 2000x2000 matrike? To ljudje delajo v array jezikih. Zakaj bi moral na roke odpirati threade pa crkovat ob sinhronizaciji s semaforji, ce pa lahko reces parallel_for, pa je?

> 2. Pa kaj potem, če ne uporabljaš programa, ki bi ti papal dva procesorja. Bodo pa na enem tekli sistemski procesi in kake malenkosti, recimo winamp, na drugem pa procesorsko zahtevna nit.
> 3. Ta večjedrna osnova bo podlaga za razvoj prepoznave govora. En procesor ti bo obremenjevala prepoznava govora, drugega pa ostalo. In še kaka druga zadeva v tej smeri, recimo prepoznavanje gledanja oči, da ti potem miškin kazalec ustrezno premika.

In zakaj ne bi jezik/runtime ponujal direktne podpore za te ocitno lepo paralelno resljive probleme?

Ce se enkrat razmislim, mi ni cisto jasno, v cem vidis problem :).

64202 ::

Okey, mogoce zdaj vidim kaj hoce hruska reci :)

Glede konkretne implementacije L-ja in problema iz 1., mozni pristopi:
1. "oznacis" kodo, da das compilerju hint, kjer naj se koda zares paralelno izvaja (seli na druc proc.), to je dokaj rokodelsko, ampak se vedno obcutno lazje kot odpiranje threadov etc.
2. static analiza algoritma - ce tukaj kdo kaj zares uporabnega najde, bo to cs breakthrough :)
3. dinamicno analiza - subset tega je runtime profilanje na tipicnih vhodih, pred casom sem zasledil paralelni c compiler, ki je za relativno zapleten problem (ni bil ocitno paralelen) z delno rocno pomocjo izpeljal scheduling, ki je imel na 8-way kisti 7x pospesek, skratka uber :). zal se ne spomnim vec linka, takrat so me te zadeve sele zacele zanimati.

OwcA ::

@64202: poleg Intelovega C++ Compiler je drugi zelo agresiven vekstorski prevajalnik še Vector C.
Otroška radovednost - gonilo napredka.

64202 ::

Kolikor jaz vem, vektorski compilerji delajo mikrooptimizacijo za zanke. Ce opazijo kak lusn for-loop, bodo to prevedli v vektorski strojni ukaz, ja? Se vedno pa rabis en makrooptimizer (sam rocno, ali pa runtime profiler), da ti pozene 10 takih mnozenj vzporedno na svojih procesorjih, ce se to splaca seveda.

OwcA ::

Nekaj je že minilo od kar sem se bolj podrobno spuščal v ICC, ampak se mi zdi, da vsaj do neke mere (malo mu je treba pomagati z "nasveti") zna tudi slednje.
Otroška radovednost - gonilo napredka.

64202 ::

Jap, tudi jaz sem to slisal, nekaj v zvezi z open multi...nekaj.. c extension. Ce te ne zanima splosni paralelizem, ampak v vecji meri premetavanje stevilk, je ta pristop seveda boljsi.

64202 ::

No, ali pa tudi ne. Odvisno kako zapleten je tok podatkov, sploh ce je vmes se kaj IO-ja.

Vesoljc ::

množenje matrike 2k x 2k bi se verjetno dalo razbiti na več cpu enot, ampak jest gledam na to rahlo drugače...
"the program", ki bi laufal na takih mašincah verjetno ne bi računal samo množenje matrik. to je le en sub problem, sicer velik (no ja ;)) ampak vseeno. meni se bolj smisleno zdi računati več parov matrik na večih enotah. če en tak loop ne razbijamo, s tem imho samo pridobimo. work sharing v pravem pomenu. to je tko kot bi poslal dva delavca kopat na isto mesto. zakaj? nej vsak svojo luknjo koplje...

MT sicer ponuja zelo lep ampak tešžak pristop k rešavanju problemov. v idealnem sistemu, bi na eni cpu enoti laufala samo ena nitka, ki jo filamo s streamom podatkov. ni lepžšega ne? zaenkrat to še ne gre, tko, v praktične namene.

kot kaže pa se strinjamo, da ima delinik dela precejšen pomen v takem sistemu. to pa lahko izvedemo v širši sliki na dva načina. prek jezika, ali pa prek "žive" aplikacije, ki poskuša pametno razdeliti delo. kaj je boljše je imo brezveze razglabljat, pač za vsako kuro se svoj žebu najde (ne poznam pregovorov :))).

osebno mi je bolj všečen drugi pristop, ki pa ima določene zahteve... namreč aplikaciji in algoritmu znotraj, je potrebno funkcionalnost programa predstaviti v takem formatu, da jo on/ona zna razporediti.
Abnormal behavior of abnormal brain makes me normal...

OwcA ::

S tem pročasi pridemo tudi do bioloških algoritmov kot je "sledi vodji".
Otroška radovednost - gonilo napredka.

64202 ::

> množenje matrike 2k x 2k bi se verjetno dalo razbiti na več cpu enot, ampak jest gledam na to rahlo drugače...

Mislil sem sicer primer, ko imas 10 takih mnozenj za narediti, ampak pustimo to.

> osebno mi je bolj všečen drugi pristop, ki pa ima določene zahteve... namreč aplikaciji in algoritmu znotraj, je potrebno funkcionalnost programa predstaviti v takem formatu, da jo on/ona zna razporediti.

Tocno tako je deloval tisti pristop s profilerjem. Sekljali so originalno zaporedni algoritem v c-ju, dokler ni stvar delovala ucinkovito paralelno - profiler je pa sam nasel pot, kako izkoristiti paralelnost. Ciljni rezultat je bil paralelni algoritem, ki ga clovek se ni izumil.

Zgodovina sprememb…

  • spremenilo: 64202 ()

Spodletela ::

nisem vsega bral samo... Bistri007... bog nas obvaruj (pa nisem veren) nitk vsepovsod, ce je programer ne zna na roko spisat in jih sinhronizirat med sabo (in to z apiji, ne m$jevimi berglami >:D) je bolje da sploh ne ve za njih, kaj šele, da bi bila uporaba otročje lahka... bi rad z interneta downloadal programe, ki ti bodo vsak gumb na dialogu risali v drugem threadu? :D

Vesoljc ::

:))

kar bi "mi" radi je prednost nitk, ampak brez njih samih 8-)
Abnormal behavior of abnormal brain makes me normal...

BigWhale ::

Ma, strikce tja kjer se jih nuca! Ne pa kar povsod... :P

64202 ::

Kaj cem rect na ta z argumenti podprt post... strikci so za to, da si zenske najlonke obesijo gor. :))

BigWhale ::

Kaj bi pa podpiral z argumenti, tukaj gre za logiko... Hello world aplikacije pac ne bos sel delat multithreaded..

64202 ::

Zato ker se cela tema ni sla o takih threadih, kot verjetno ti mislis (heavy weight & semaforji & other crap).

stdout stream(i) lahko tecejo v svojem threadu (light weight tasku?). Izpis dosezes tako, da posljes "output" message temu threadu. Recimo:

int main() {
output("Hello world\n") -> stdout;
return 0;
}

Zgodovina sprememb…

  • spremenilo: 64202 ()

Gundolf ::

In zakaj mislis da v tvojem primeru ne rabis sinhronizacije?

64202 ::

Objekti z lightweight taski so obicajno zaporedni (sami za sebe). Nekje se moras ustaviti :).

Zgodovina sprememb…

  • spremenilo: 64202 ()
«
1
2


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Asinhronost

Oddelek: Programiranje
122346 (2115) mihies
»

Kateri programski jezik?

Oddelek: Programiranje
494413 (3026) kopernik
»

niti (threads) (strani: 1 2 )

Oddelek: Programiranje
774895 (3349) noraguta
»

Intel bo predstavil osemjedrnike (strani: 1 2 )

Oddelek: Novice / Procesorji
649627 (5993) MrStein
»

AMD raziskuje obrnjeno večnitenje

Oddelek: Novice / Procesorji
344103 (2561) BigWhale

Več podobnih tem