Vieläkin taitaa olla niin, että monet populaarisovellukset ovat lähinnä yksisäikeistettyjä.
Mitä mielenkiintoisia sovelluksia on multi-core -prosessoreille?
Itse taas olen siinä käsityksessä, että useimmat nykyversiot sellaisista sovelluksista, jotka ovat CPU-intesiivisiä ja joiden tekemä asia on mahdollista monisäikeistää, osaavat nykyään hyödyntää useampia ytimiä. Otetaan esimerkiksi vaikka Photoshop ja sen filtterit.
Sitten jos softa tekee jotain sellaista missä se käyttää luokkaa 1% yhdestä ytimestä, niin turhaahan siitä olisi tehdä monisäikeistä.
Olin ajatellut, että ehkä kaikkea ei vain tiedetä monisäikeistyksestä vielä.
On nimittäin muuten paradoksaalista, että prosessorit ovat kasvattaneet coreja single-core -suorituskyvyn sijaan. Vai onko tämä vain näiden filterien yms. takia?
Yleensä nimittäin olen katsonut, että hyvää single-core -suorituskykyä ja hyvää multi-core -suorituskykyä ei saa samasta prosessorista, vaan ne ovat eri prosessoreiden vahvuuksia.
Yhden ytimen kehityksessä on tullut raja vastaan fysiikasta johtuen. Kellotaajuudet eivät ole nousseet paljonkaan 20 vuoteen. Ollaan tasolla, jossa suunnittelussa pitää huomioida, miten nopeasti "sähkö kulkee" ja miten kapeassa tilassa elektronit pysyvät kiltisti, näin yksinkertaistetusti sanoen.
Yhden ytimen suorituskykyä on parannettu viime vuodet lähinnä leventämällä rekistereitä (vektorisaatio, eräänlainen rinnakkaislaskennan muoto) ja keksimällä monimutkaisempia käskyjä (ja suunnittelukikoilla kuten branch prediction, joista on aiheutunut kohuttuja tietoturvaongelmia). Vektorisaation tuoma rinnakkaisuus auttaa multimediassa ja neuroverkoissa, mutta yksisäikeisen logiikan suoritus ei siitä samalla tavalla hyödy.
Monisäikeisyys vaatii suunnittelua siitä, mikä on järkevää tai edes mahdollista tehokkaasti paloitella. Monessa asiassa prosessorin nopeus ei ole ratkaiseva ja karkea rinnakkaisuus riittää. Esimerkiksi miksi nettisivun pitäisi muodostua 0,01 sekunnin sijaan 0,001 sekunnissa, jos näitä 0,01 sekunnin sivuja voidaan tuottaa rinnakkain helpommin ja tehokkaammin kuin sama määrä 0,001 sekunnin sivuja peräkkäin?
Niin itse huvikseni katselin ihan perus tietokoneen käytössä (nettiselailua yms) että paljonko noi 12 loogista prosessoria (eli 6 ytimen eri säikeet) kuormittuu, niin välillä oli piikkejä joissa kaikki 12 loogista prosessoria oli >80% kuormalla.
Eli tämä osaltaan vahvistaa aiemmin mainitsemaani käsitystä siitä, että nykysoftat osaa ihan hyvin hyödyntää useamman ytimen.
mavavilj kirjoitti:
Yleensä nimittäin olen katsonut, että hyvää single-core -suorituskykyä ja hyvää multi-core -suorituskykyä ei saa samasta prosessorista, vaan ne ovat eri prosessoreiden vahvuuksia.
Varmaan sitten jos sattuu tekemään koneella jotain raskasta, joka ei rinnakkaistu, niin kannattaa ostaa single-core -suorituskykyä painottaen.
Joo itsekin katsoin, että Firefox näytti monisäikeistetyltä. Ehkä ihmiset ovat oppineet uusia asioita monisäikeistämisestä.
mavavilj kirjoitti:
Joo itsekin katsoin, että Firefox näytti monisäikeistetyltä. Ehkä ihmiset ovat oppineet uusia asioita monisäikeistämisestä.
Monisäikeistäminen on ollut arkipäivää jo vuosia. Alla 8th ohjelma mikä laskee käyttäen kompleksilukuja ja piirtää Mandelbrot fraktaalin 8 työsäikeen avulla. Suojasin kuvan lukolla, jotta graafinen käyttöliittymä pysyy responsiivisena korkealla prosessori kuormalla. Tämä tietysti vähän hidastaa kuvan muodostamista.
Seuraavasssa 8th:n versiossa on mukana optimoitu versio kompleksilukujen potenssi funktiosta mikä on itse kirjoittamaani ohjelmassa mukana olevaa versiota ainakin 100 kertaa nopeampi.
needs nk/gui libbin font/Roboto-Regular.ttf font/Roboto-Regular.ttf font:new "font1" font:atlas! drop 600 constant WIDTH 600 constant HEIGHT 8 constant NUMTASKS WIDTH HEIGHT img:new constant buffer WIDTH 1.5 n:/ 40 n:+ constant x-axis HEIGHT 2 n:/ constant y-axis 300 constant scale 50 constant iterations : c:^ \ c n -- c >r dup c:abs r@ n:^ swap c:arg dup 2 a:close 0 ( r@ n:* n:cos ) a:op! 1 ( r> n:* n:sin ) a:op! swap >r ( r@ n:* ) a:map c:new rdrop ; nullvar mand-task-ids : mand-task \ start-row end-row -- ( drop ( drop 0 0 c:new "z" t:! I x-axis n:- scale n:/ J y-axis n:- scale n:/ c:new dup "c" t:! c:>ri "y" t:! "x" t:! "y" t:@ 2 n:^ "y2" t:! "x" t:@ 0.25 n:- 2 n:^ "y2" t:@ n:+ dup "x" t:@ 0.25 n:- n:+ n:* "y2" t:@ 4 n:/ n:< "x" t:@ n:1+ 2 n:^ "y2" t:@ n:+ 0.0625 n:< or !if ( "z" t:@ 2 c:^ "c" t:@ c:+ dup "z" t:! c:abs 2 n:> if 765 n:* iterations n:/ dup>r 510 n:> if 255 255 r> 255 n:mod n:int 255 4 a:close "color" t:! break else r@ 255 n:> if 255 r> 255 n:mod n:int 0 255 4 a:close "color" t:! break else r> 255 n:mod n:int 0 0 255 4 a:close "color" t:! break then then else drop 0 0 0 255 4 a:close "color" t:! then ) 0 iterations n:1- loop buffer lock J I "color" t:@ img:pix! HEIGHT J n:- I "color" t:@ img:pix! unlock drop then ) 0 WIDTH n:1- loop null nk:do ) -rot loop ; : start-tasks HEIGHT 2 n:/ NUMTASKS n:/mod 0 >r a:new ( r@ third n:r+ r@ n:1- 2 ' mand-task t:task-n a:push ) NUMTASKS n:1- times -rot n:+ r> tuck n:+ 2 ' mand-task t:task-n a:push mand-task-ids ! ; : new-win { name: "main", wide: @WIDTH, high: @HEIGHT, resizable: true, title: "Mandelbrot" } nk:win ; : main-render { title: "mandel", bg: "black", padding: [0,0], flags: [ @nk:WINDOW_NO_SCROLLBAR ] } nk:begin null 1 1 nk:layout-grid-begin 0 1 0 1 nk:grid nk:rect>local nk:grid-push buffer lock nk:image buffer unlock drop nk:layout-grid-end nk:end ; : app:main ' start-tasks w:is nk:rendering new-win ' main-render -1 nk:render-loop ;
Aihe on jo aika vanha, joten et voi enää vastata siihen.