Se, että valitaan prosessori, jossa on enemmän ytimiä ei useinkaan tarkoita suorituskyvyn kasvua samassa määrin tiettyjä ohjelmia käytettäessä. Miksi tämä ilmiö ilmenee ja mitkä ovat sen syyt? Selitämme sen sinulle yksityiskohtaisesti.
Yksi syistä käyttää uudempia ohjelmistoversioita ajan myötä on se, että ne on suunniteltu hyödyntämään paremmin prosessoreita, joilla on suurempi ydinmäärä. Älkäämme unohtako, että ajan myötä näiden määrä prosessoreissa kasvaa. Miksi ohjelmien suorituskyky ei kuitenkaan paranna parissa?
Ohjelmat eivät koskaan skaalaudu ytimien määrän mukaan
On tärkeää ottaa huomioon, että suoritettavat ohjelmat eivät pysty jakamaan aktiivisia prosessejaan tai tehtäviään kulloinkin sen mukaan, kuinka monta suoritussäiettä meillä on. prosessori. Enemmän kuin mikään muu johtuu siitä, että tämä jako on selkeästi ohjelmakoodissa, eli se on ohjelmoijan taidon ja sovelluksen suunnittelun tulos.
Itse asiassa ohjelmaa koodattaessa oleellista ei ole sen optimointi mahdollisimman suuren ytimien määrän käyttämiseksi, vaan pikemminkin latenssin vuoksi. Jälkimmäisen ymmärtäminen ajassa, joka prosessorilta kuluu tehtävän suorittamiseen aikayksiköissä mitattuna. Ja se on, että suorittimen suorituskyky koostuu useimpien tehtävien suorittamisesta mahdollisimman lyhyessä ajassa. Mikä riippuu ensin arkkitehtuuristasi ja toiseksi kellotaajuudestasi.
Viiveen suhteen meitä kiinnostaa kuitenkin tietää kuinka monta tehtävää se voi suorittaa tietyllä ajanjaksolla, mikä on työmäärä ja tämä riippuu tilanteesta ja ohjelmien kirjoitustavasta. Toisin sanoen suorituskyky ei riipu pelkästään laitteistosta, vaan siitä, kuinka hyvin tai huonosti ohjelmisto on kirjoitettu.
Työnjako useissa ytimissä
Jos nyt lisäämme ytimien määrää järjestelmässä, on mahdollista jakaa työ osiin ja saada se valmiiksi paljon helpommin. Tässä tulee esiin T/N-kaava, jossa T on suoritettavien tehtävien määrä ja N on niiden suoritussäikeiden määrä, jotka järjestelmä voi suorittaa. Voisimme tietysti ladata maksimimäärän töitä muutamalle ytimelle ja pakottaa ne korjaamaan ne. Ongelmana on, että tämä toimenpide on haitallinen, koska se hyödyttää nykyaikaisimpia suorittimia, joiden suorituskyky on korkeampi erikseen jokaisessa ytimessä.
Työn jakaminen eri ytimien kesken on kuitenkin lisätyötä, joka yleensä annetaan johtimeksi toimivalle ytimelle, joka joutuu suorittamaan seuraavat tehtävät:
- Sinun täytyy luoda prosesseja ja tehtäväluetteloita ja hallita niitä jatkuvasti.
- Heidän on osattava ennustaa aina, milloin tehtävä alkaa ja päättyy, mukaan lukien aika, joka kuluu yhden suorittamiseen ja toisen aloittamiseen.
- Eri ytimillä on oltava kyky lähettää signaali pääytimelle tietääkseen, milloin prosessi alkaa ja päättyy.
SONY, Toshiba ja IBM ottivat tämän ratkaisun käyttöön Cell Broadband Enginessä, PS3:n keskusprosessorissa, jossa pääydin vastasi muun ohjaamisesta. Vaikka Atari Jaguar otti sen käyttöön paljon kauempana. PS4:lle SONY ei toistanut tätä mallia uudelleen, eikä kukaan ole ottanut sitä käyttöön PC:llä, koska se on painajainen, mutta se on kuitenkin tehokkain tapa jakaa työtä.
Kaikki ei voi toimia usealla ytimellä
Jos kysymme itseltämme, voimmeko jakaa minkä tahansa tehtävän osatehtäviksi jakaaksemme useampaan määrään ytimiä loputtomiin, vastaus on ei. Erityisesti meidän on luokiteltava tehtävät kolmeen eri tyyppiin:
- Ne, jotka voidaan rinnastaa täysin ja jakaa siten keskusprosessorin eri ytimien kesken.
- Tehtävät, jotka voidaan suorittaa osittain rinnakkain.
- Koodin osat, joita ei voida suorittaa rinnakkain.
Ensimmäisessä tapauksessa T/N sovelletaan 100 %:iin, toisessa tapauksessa mennään jo niin sanottuun Amdahlin lakiin, jossa ytimien lukumäärän lisäämisestä johtuva kiihtyvyys on osittainen ja kolmannessa tapauksessa tarvitsemme yksinkertaisesti kaikki yhden ytimen teho tähän tehtävään,
Mikä erottaa CPU:n GPU:sta monisäikeisessä?
Tässä tulemme eropisteeseen, jokainen GPU tai grafiikkapiirissä on ohjausyksikkö, joka vastaa komentoluetteloiden lukemisesta ja niiden jakamisesta eri GPU-ytimien ja jopa eri yksiköiden kesken. Tämä on edellisen tapauksen laitteistotason toteutus ja toimii täydellisesti kaikissa kokoonpanoissa, joissa haluat kyllästää, niin kauan kuin työtä on, ja siksi pidä mahdollisimman monta ydintä kiireisenä. Meidän on kuitenkin ymmärrettävä, että GPU:n suorituksen käsitelanka vastaa aina vastaavaa dataa ja sen ohjeluetteloa. Eli pikseli, kärkipiste tai mikä tahansa data.
Tämä tekee niistä helpon rinnastettavan. Eli jos halusimme paistaa kananmunan, prosessorin prosessi olisi munan paistaminen, mikä olisi täysin peräkkäistä. Toisaalta grafiikkasirussa tehtävänä olisi yksinkertaisesti lämmittää öljyä tai lisätä pannulle muna. Kaikki tämä ei nopeuttaisi yhden munan paistamista, vaan useiden, minkä vuoksi GPU:t sopivat paremmin esimerkiksi miljoonien polygonien tai pikselien laskemiseen samanaikaisesti, mutta eivät peräkkäisiin tehtäviin.