Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Mielenkiintoisia sovelluksia multi-core -prosessoreille?

mavavilj [23.04.2024 15:24:25]

#

Vieläkin taitaa olla niin, että monet populaarisovellukset ovat lähinnä yksisäikeistettyjä.

Mitä mielenkiintoisia sovelluksia on multi-core -prosessoreille?

Grez [23.04.2024 20:25:51]

#

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ä.

mavavilj [24.04.2024 10:31:01]

#

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.

Metabolix [24.04.2024 15:19:32]

#

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?

Grez [24.04.2024 16:57:07]

#

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.

mavavilj [24.04.2024 17:13:09]

#

Joo itsekin katsoin, että Firefox näytti monisäikeistetyltä. Ehkä ihmiset ovat oppineet uusia asioita monisäikeistämisestä.

jalski [04.05.2024 09:22:25]

#

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.

Video toiminnasta

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 ;

Vastaus

Muista lukea kirjoitusohjeet.
Tietoa sivustosta