Suuri pii-pinta-ala tulee AINA kalliiksi, eikä monen piilastun tekeminen yhden sijasta ole merkittävästi halvempaa , mikäli piiristä suurin osa on redundanttia kamaa (kuten moniytimisessä piirissä on, kun yksittäisiä rikkinäisiä ytimiä voidaan kytkeä pois päältä).
Kehitys on tähän asti kulkenut jatkuvasti siihen suuntaan, että yhdelle piilastulle ängetään yhä
enemmän erilaista toiminnalliisuutta, ja ytimien osuus piilastusta on yhä pienempi, koska ytimet ovat jatkuvasti pienentyneet. Tämä on juuri päinvastainen kehityssuunta.
386ssa prosessoripiirillä ei ollut välimuistia eikä liukulukuyksikköä, välimuistia saattoi olla emolevyllä(oli emolevykohtaista, oliko ollenkaan). Kaikissa 486ssa prosessoripiirille tuli L1-välimuisti ja 486DXssä liukulukuyksikkö.
K6-3ssa, ja Mendocino-Celeronissa prosessoripiirin kanssa integroitiin samalle piirille L2-välimuisti. K8ssa ja Nehalemissa DRAM-ohjain, Phenomissa ja Nehalemissa myös L3-välimuisti.
Sandy bridgessä ja Llanossa samalle piirille tuli vielä näyttiskin.
Ja suuressa määrässä normaaleita CPU-ytimiä vaan ei ole kovin paljoa järkeä, paitsi palvelinkäytössä. Ei ole paljoa sellaisia (yhden käyttäjän) workloadeja, joiden rinnakkaistamiseen tällainen arkkitehtuuri on tehokasta.
Softissa on tyypillisesti luonnollisesti A) melko pieni määrä rinnakkaisia taskeja, jotka rinnakkaistuvat pienelle määrällä säikeitä, ja B) Tietyissä kohdissa
hyvin suuri määrä datatason rinnakkaisuutta, sama koodi ajetaan hyvin isolle taulukolle.
Sen massiivisen datatason hyödyntäminen monella säikeellä CPUlla on toimiva, mutta epätehokas tapa sen hyödyntämiseen. Sen CPUn SIMD-leveyden lisääminen on jo heti paljon parempi tapa sen hyödyntämiseen kuin ytimien lisääminen (ja Intel on nyt siirtymässä AVX-512een).
Tehokkainta on sen siirtäminen kokonaan näyttikselle laskettavaksi (onnistuu melko helposti, mikäli näyttis käyttää samaa muistia välimuistikoherentisti, vaikeampaa ja epätehokkaampaa erillisnäyttiksellä PCIE-väylän takana; Datansiirto-overhead voi usein tehdä käytännössä kannattamattomaksi). Eli sen sijaan, että on järkeä tehdä 16- ja 32-ytimisiä työpöytä-CPUita, kannattaa tehdä piirejä, joissa vaikka 8 CPU-ydintä ja 32 GPU-ydintä.
Tai sen sijaan, että ydinmäärä tuplataan, tuplataan vaan SIMD-leveys. Tosin SIMDin leventämisessä on se huono puoli, että softat pitää kääntää (ja joskus jopa osittain kirjoittaa) uudestaan sen SIMDin hyödyntämiseksi, siinä missä joku OpenMP rinnakkaistaa yksinkertaisen loopin ihan yhtä lailla kahdelle kuin 128 ytimelle, eikä sitä tarvi kääntää uudestaan että se tukee vaikka 128 ydintä.
Toki softankehitystyökalut ja rajapinnat ovat selvästi laahanneet perässä sen suhteen, että miten kamaa laitetaan sinne GPUlle ajettavaksi, kun joskus 6 vuotta sitten jostain HSAsta hypetettiin eikä mitään konkreettista silloin tullut ulos, mutta nyt se silloin luvattu hype alkaa vihdoin pikkuhiljaa materialisoituam, kun koko HSA alkaaa unohtua. Esimerkiksi OpenMP:n 4nelosversiossa voi yhdellä pragma-rivillä saada kamaa GPUlle ajoon geneerisessä C/C++-ohjelmassa. (
OpenMP Accelerator Support for GPUs - OpenMP)
Toki välillä tulee vastaan koodia, jossa niitä luonnollisia taskeja on paljon enemmän, tai niiden rinnakkaisten looppien sisällä on niin hankalaa musitiaccessia ja haarautumista, että niitä ei ole tehokasta suorittaa SIMDillä tai näyttiksellä, mutta nämä on kuitenkin harvinaisempia tilanteita.
CPU-ydinten jakaminen monelle "chipletille" työpöytäprossussa ei vaan olisi järkevää, ellei sillä vähennettäisi tarvittavien erillisten piirien määrää. Jos montaa "chiplettiä" tarvittaisiin, piiri olisi joka tapauksessa jo liian iso ja kallis työpöydälle ihan suuren pinta-alansa takia muutenkin, eikä työpöytäsoftat kuitenkaan niistä ytimistä hirveästi hyötyisi.
AMDllä ei ole resursseja kehittää nopeasti montaa erillistä prosessoripiilastua, niin tekemällä yhden 8-ytimisen chiletin se voi palvella kaikkia markkinasegmenttejä suunnittelemalla yhden "7nm" piilastun.
Intel voi aivan hyvin tehdä isompia eri kokoisia piilastuja.
Se, että muistiohjain ja muu pitkän matkan IO siirretään omalle vanhemmalla valmsitustekniikalla tehdylle piilastulle on sitten täysin eri asia. Siinä on ihan eri tavalla järkeä, koska ne PHYiden IO-transistorit eivät hyödy mitään niistä uudemmista valmistusprosesseista.
Optimaalinen chiplet-malli on kuitenkin työpöydällä pikemminkuin yksi pienellä valmistustekniikalla tehty ydin-chiplet + yksi pohjoissilta-chiplet, tai sitten yksi cpu-ydin-chiplet + yksi gpu-chiplet + pohjoissilta-chiplet. Ei montaa ydin-chiplettiä.
AMDltä kahden CPU-chipletin ryzen on toki todennäköisesti joskus tulossa, mutta tässä pointtina on paljon enemmän tuotekehityksen nopeuttaminen, ja sen kustannuksissa säästäminen kuin valmistuskustannuksissa säästäminen. Toki AMD varmasti tulee hypettämään jotain valmistuskustannussäästöä, koska se kuulostaa paljon paremmalta kuin sanoa "teimme tämän, koska resurssimme eivät riittäneet muuhun, ja lisäksi tällä säästimme tuotekehityskustannuksissa".
Kellotaajuuden nosto
huonontaa IPCtä, koska muistiviiveet kasvaa kellotaajuutta kasvattaessa. Samoin mitkään käskykantalaajennokset eivät tyypillisesti auta IPChen, vaan huonontavat sitä; Jos vaikka 16 yhdessä kellojaksossa ajettavaa käskyä korvataan yhdellä, joka ajautuu vaikka parissa kellojaksossa, IPC laskee.
Tarkoittanet "säiekohtaista suorituskykyä".
Juu, tosin parempien haarautumisennustusten kehittäminen ei millään tavalla tee prosessoreita yhtään nykyistä enemmän haavoittuvaisia spectrelle. Jos halutaan specrelle immuuneita prossuja, pitää koko spekulatiivinen suoritus kieltää ja hidastua yli kaksinkertaisesti.
Mutta, niissä haarautumisenennustuksissakaan ei yksinkertaisesti ole kovin paljoa sitä varaa parantaa. Osa haarautumisista vaan on mahdottomia ennustaa, ja niissäkin, jotka voi ennustaa, vaadittavan kirjanpidon määrä alkaa räjähtää käsille, jos sitä yritetään vielä parantaa. Zenissä haarautumisennustusyksikkö on jo isompi kuin ytimen kaikki kokonaislukulaskentayksiköt yhteensä.
Haarautumisenennustuksen parannuksista tullaan saamaan sellaista muutaman prosentin parannusta vuosittain. Osa algoritmiparannuksista, osa siitä, että niiden tietorakenteiden kokoa kasvatetaan.
@hkultala varmaan osaa kertoa tarkemmin mitä merkittäviä nopeutuskikkoja on vielä nähtävissä (AVX tms), mutta tuo ydinten määrän lisääminen lienee kumminkin se varmin asia mitä tullaan näkemään lähitulevaisuudessa. Toki sovelluspuolella niiden ydinten hyödyntäminen onkin sitten usein aika perhananmoinen haaste, eikä aina ole edes (järkevällä työmäärällä) mahdollista.
Se, mitä tullaan näkemään on entistä enemmän ihan tiettyyn käyttöön tulevia erikoiskäskyjä. Viime aikoina on tainnut tulla bitcount ja leading/trailing zero count-käskyjä. Zenin CLZERO oli myös näppärä optimointi muistinvaraukseen.
Sunny coveen luvataan datanpakkausta ja enkryptausta nopeuttavia erikoiskäskyjä.
Mutta nämäkin on juttuja, että jokainen uusi erikoiskäsky nopeuttaa hyvin pientä osaa ohjelmista, ja niitäkin vasta, kun ohjelma on käännetty käyttämään uutta käskyä (ja joskus kääntäminen ei riitä, vaan pitää erikseen käyttää jotain intrinsicciä sen käyttämiseen). Tai no, zenin CLZERO menee kirjastoissa olevien muistinhallintarutiinien sisälle, joten kaikki softat kyllä nopeutuu, kun vaan kirjastot käännetään uusiksi ja päivitetään.
Muistaakseni ARMiin taisi tulla jo joitain käskyjä, joiden idea on nopeuttaa javascriptin JIT-kääntämistä sille, koska nykyään melkein kaikki "appit" on vain javascriptiä sisältäviä html-sivuja. Sama javascript-kiihdytys varmaan tulossa x86-puolellekin jossain vaiheessa.
Ei todellakaan haluta ajaa saman softan eri säkeitä eri soketeissa. Kommunikaatioviiveet olisi hirveät, ja joku muistin (vähiten pessimaali) jakaminen eri sokettien välillä olisi aivan hirveä suo. (threadripperin erilliset game modet jne on esimerkkiä tästä suosta). AMD on hyvin onnellinen kun zen2-sukupolvessa pääsee tuosta eroon.
ARMin big.LITTLEn idea ei ole se, että saman (raskaan) softan eri määrän aikaa tarvitsevia säikeitä jaetaan eri ytimille, vaan se, että niille hitaille ytimille laitetaan ne taustaprosessit, joita siellä kuitenkin on koko ajan ajossa. Ja että silloin, in tehoa ei tarvita paljon, voidaan käyttää niitä heikompia ytimiä myös edustalla oleville kevyille prosesseille.
Ja Intel on jo myös kertonut olevansa menossa tähän suuntaan, on sanonut että tulee tekemään piirejä joissa on sekä isoja että pieniä ytimiä.
Mutta tämä ei tosiaankaan ole keino saada lisää suorituskykyä, vaan keino vähentää sähkönkulutusta.
Ja ne "pienet" ytimet on joka tapauksessa niin pieniä, että niitä mahtuu iso kasa vaikka mihin, olisi hirveää tuhlausta tehdä niille omaa "chiplettiä", ainakin ellei niitä sitten optimoitaisi toimimaan myös datarinnakkaisen koodin erikoisytimiä (intelillähän on ollut noita tämän tyyppisiä xeon phi-ytimiä...)
Ja AVXllä ei tämän kanssa ole oikeastaan mitään tekemistä. Jos toiset ytimet tukisi jotain käskykantalaajennosta, toiset ei, sitten meillä ei olisi enää homogeeninen moniprosessorijärjestelmä jolle koodi käännetään yhdellä kääntäjällä ja ajetaan millä tahansa ytimellä ja kaikilla on kivaa, vaan tämä vaatisi paljon monimutkaisemman ajoympäristön, jossa pitäisi olla eriksen koodi molemmille tai sitten pitäisi tietää, mitkä koodia saa ajaa pikkuytimillä, ja mitä ei, ja herätellä niitä isoja ytimiä turhaan kun kevyt taustasofta käyttääkin hyvin pienessä memcpy:ssään AVX-512sta. Sitten on jo melko sama laittaa sinne täysin eri käskykannan ytimiä (GPU-ytimiä)
(ARMin SVE on tämän suhteen nerokas, kun se on SIMD-käskykanta, joka ei ota kantaa vektorien pituuteen; Sama koodi toimii sellaisenaan vaikka 2 tai 16 elementin vektoreilla, pienemmät vektorit sisältävä ydin vaan looppaa loppia useamman kierroksen. Toki tässäkin context switchien kanssa tulee pientä säätöä)