"Liian monta corea" on myös oikeasti asia jolla voi olla merkitystä. On paljon softaa joka on koodattu periaatteella "jaetaan duuni kaikille käytettävissä oleville coreille" ja niin kauan kun coreja oli se 2-8kpl (oikeita tai loogisia) kaikki oli hyvin. Nyt näitä voi olla helposti jopa sen 128 threadia (3990X). Jokainen thread tuo aina hieman overheadia ja syö myös oman palansa muistia. Duunin jako 8 erään on vielä ihan jees, mutta jos sama koodi "tyhmästi" jakaa sen 128 erään niin voidaan saada reippaasti huonompaa perffiä kun tehoa kuluu 128 "duunarin" kommunikointiin toistensa kanssa ja hirveän threadimäärän overheadeihin...
Windowsissa ei taatusti mikään rinnakkaistu "vahingossa" 128 säikeelle, kun yhteen "prosessoriryhmään" mahtuu vaan 64 säiettä. Yli 64 säikeen käyttäminen windowsissa samalle softalle vaatii purkkaa jota ohjelmoija joutuu erikseen vääntämään.
www.anandtech.com
Ja tuollainen "ääretön rinnakkaistuminen" on mahdollista käytännössä vain jossain yksinkertaisissa "embarrassingly parallel" loopeissa, joissa sitä synkronointia ei tarvita ollenkaan, jolloin säikeiden ei myöskään tarvi kommunikoisda keskenään. Ja se määrä muistia mikä kuluu niiden tällaista looppia ajavien säikeiden pinoihin on myös todella pieni, puhutaan usein maksimissaan kymmenistä kilotavuista.
Lisäksi kun threadien määrä paisuu kuin pullataikina, muistikaista alkaa ottaa kiinni joissain tilanteissa. Kaistaa X, threadeja hakemassa kamaa 8kpl, kaistaa per threadi X/8.
Kaistaa per tehty työ ei tarvita yhtään sen enempää,
ellei välimuistien osumatarkkuus huonone.
Lisäksi useamman aktiivisen ytimen kanssa ytimien kellotaajuudet on usein alhaisemmat.
Ja muistikaistan kanssa ei tule mitään liikenneruuhkaan verattavaa tilannetta, jossa suuri kuormitus johtaisi kokonaisuuden hidastumiseen, päin vastoin.
Jotta se kaista saadaan tehokkaasti hyödynnettyä, niitä requesteja pitää tulla todella paljon, monelta eri ytimeltä.
No, tuplataan kanavat koska HEDT. Kaistaa X*2, threadeja hakemassa kamaa 128kpl... kaistaa per threadi murto-osa 8 threadin tilanteesta, vaikka muistiväyliä onkin tuplat.
Edelleenkään niitä säikeitä ei ole 128 vaan 64. Ja kokonaiskaista silti suurempi.
"kaistaa per säie" on irrelevantti mittayksikkö. Millä on väliä on, että kokonaiskaistaa on enemmän ja eirtyisesti että
sitä saadaan hyödynnettyä enemmän.
Tämän ongelman vuoksi loputon corejen ja threadien pinoaminen ilman järkevää schedulointia ja jopa ihan tarkoituksella tapahtuvaa thread countin rajoittamista voi syödä tehoja, joskus jopa melkoisesti...
Tämä myös tuo haasteita tehdä realistinen relevantti CPU benchmarkki joka skaalaa "loputtomasti coreja"-tilanteessa järkevästi ilman että pullonkaula siirtyy muualle.
Koko viesti on jälleen malliesimerkki siitä, kuinka verrataan aivan vääriä asioita keskenään ja keksitään tämän takia olematon ongelma.
Vaikka kaista muodostuu useammalla säikeellä pahemmaksi pullonkaulaksi, ei se kuitenkaan
hidasta ellei
L3-välimuistien kapasiteetti muodostu pahaksi pullonkaulaksi, että niitä accesseja tulee kokonaisuudessaan enemmän
Mitään ongelmaa on
ainoastaan siinä tilanteessa, että (L3-)välimuistin osumatarkkuus huononee siten että muistiaccessien kokonaismäärä kasvaa.
Siihen käykö näin sitten vaikuttaa oleellsiesti se, millainen muistiaccesspatterni sillä koodilla on. Jos siellä on jotain valtavia taulukoita, ja kaikki käsittelee aivan eri kohtia niistä, se voi kärsiä. Jos taas siellä on jotain vakiotaulukkoja, joita kaikki säikeet lukee, tulee L3-välimuistin osalta suuria synergiaetuja ja välimuistin osumatarkkuus voi jopa kasvaa.