- Liittynyt
- 22.10.2016
- Viestejä
- 11 809
Koko L1-luku voi olla peräisin spekulatiiviselta käskyltä joka pitää nukettaa
Kyllä, niin VOI. Mutta n. 95% tapauksista se ei ole sitä. Se, että n. 5% prosentissa tapauksissa ongelmaa ei ole , ei poista ongelmaa niiltä 95%lta.
- mitään bränch predictoria ei ole kehitetty tarjoamaan lähellekään sitä osumatarkkuutta jonka järkevän, ei kokonaisen osoiteavaruuden tarjoaminen L1-datalle mahdollistaa.
Nyt menee kyllä taas logiikka ihan käänteiseksi.
Se, että TAGit täysin turhaan jätettäisiin tai tarkastettaisiin myöhässä pois ei mahdollista yhtään mitään.
Se ainoastaan hidastaisi ja monimutkaistaisi L1-hutia aivan turhaan
Miksi muistihaun osumatarkkuus pitäisi olla jotain muuta kuin muun koodinsuorituksen?
Kaiken osumatarkuuden pitää olla niin hyviä kuin helposti mahdollisia ja kaikkien viiveiden pitää olla niin lyhyitä kuin helposti mahdollisia ilman että muualla joudutaan mistään pahasti tinkimään.
Ei vaan ole mitään järkevää keinoa tehdä haarautumisennustushudista nopeampaa.
Sen sijaan L1D-hudin tarkastaminen on mahdollista hyvin aikaisin, jolloin L1D-hudin viive on pieni, sen tekeminen turhaan myöhään olisi täysin turhaa sen hidastamista.
Kun L1-datasta luetaan osittaisilla osoitteilla vain sitä dataa jonka ko-threadi on jo itse sinne hakenut ei kovin kummoista lisäinformaatiota saada sivukanavahyökkäyksillä kaivettua.
Jälleen hieno esimerkki siitä kuinka amatööri on totaalisen pihalla kuin ei tiedä perusasioita.
Käyttöjärjestelmässä jonka designissa on yhtään kiinnotetty huomiota suorituskykyyn(eikä menty mikrokernel-uskonnon perässä), samat säikeet pyörivät sekä käyttäjän prosesseissa että kernelinkoodissa, softa tekee kutsun kernelin rutiiniin ja sama säie vaihtaa kernelin puolelle ja sitten palaa sieltä.
Eli se säie on kernelin puolella voinut juuri käsitellä vaikka mitä sellaista dataa johon käyttäjän prosessilla ei ole lukuoikeuksia. Sitten vaan accessoidaan sallittua osoitetta jolla on sama hash-arvo kuin välimuistissa olevalla kernelin privaattidatalla.
Intelin prossuissa oli idiottimaisia ratkaisuja ja suoranaisia bugeja pilvin pimein.
Vähemmän ja vaikeammin hyödynnettäviä kuin sinun kuvittelemissasi ratkaisuissa. Mutta paljon helpompi huudella sivusta ja haukkua niitä jotka tekee kuin yrittää tehdä itse.
L1-datan pitäminen threadikohtaisena ja sen lukeminen osittaisella lineaarisella osoitteella ei ole yhtään sen vaarallisempaa kuin tuon store-forwardinkaan tapauksessa.
Vaikka Zenillä tehdään store-load-forwarding verraten latauksesta ja tallennuksesta vain alimpia 12 bittiä, sille latauksen osoitteelle kyllä tehdään ihan täydellinen osoitteenmuunnos ja jos yritään ladata laittomasta osoitteesta, lentää HETI page faultti ennenkuin data pääsee milekään seuraavalle käskylle.
Se "vain" 12 bittiä on siellä sitä varten että
1) ei tarvi verrata kaikkia n. 44*48 bittiä
2) se vertailu voidaan alottaa aiemmin kun se voidaan tehdä rinnakkain sen TLB-haun kanssa sen sijaan että se tehtäisiin sen jälkeen.
Mutta hieno esimerkki kehäpäätelmästä, käytät omaa harhakuvitelmaasi perusteluna sen harhakuvitelmasi järkevyydelle että "muualla täytyy olla sama ongelma" vaikkei tosiasiassa ole.
Että ei, Zenin 12-bittisissä STLF-vertailujoissa ei ole mitään merkittävää helposti hyödynnettävää sivukanava tietoturva-aukkoa mutta sinun "ideassasi" on L1D-kakun kokoinen massiivinen ja helposti hyödynnettävä sivukanava-aukko
Kova olet aina pätemään joo,
Minä olen se, joka oikeasti tiedän nämä asiat, sinä ole itse, joka yrität päteä vaikket oikeasti ole yhtään pätevä siihen pätemiseen.
Osaat ulkoa paljon pikkuyksityiskohtia, muttet ymmärrä kokonaiskuvaa ja toimintaperiaatteita siitä, miten asiat oikeasti toimii, ja sitten tulkitset niiden ulkoa muistamiesi yksityiskohtien merkityksiä aivan väärin.
mutta tosiaan mietihän vielä vaikka kerran paljonko cacheista tarvii dataa lukea ja vertailla suhteessa varsinaiseen luettuun dataan L1-haun yhteydessä jos tagit on täydellä fyysisellä tagilla. Ja jos vielä käytät hetken aikaa niin ehkä keksit keinoja kuinka tuota overheadia voidaan pienentää.
Mitään muuta keinoa siihen osuman varmistamiseen 100% varmuudella ei ole kuin sen täyden tagin lukeminen. Se, että 99% muistiaccesseista menee oiekaan paikkaan mutta 1% meneekin väärän paikkaan ei paljoa lohduta.
Kaikkien musitiaccessien nyt vaan täytyy mennä oikeisiin osoitteisiin, tälle ei vaan voi mitään. Ja joskus se tarkastus kuitenkin pitää tehdä. Ja sen myöhästämiseen ei vaan ole mitään järkevää syytä, siinä ei säästetä yhtään mitään.
Jos fyysinen muistiavaruus on luokkaa 44 bittiä ja wayn koko on 12 bittiä niin TAGia tarvii lukea 32 bittiä. Tämä nyt vaan täytyy lukea eikä siitä pääse millään yli eikä ympäri. Se on sitä overheadia joka tulee siitä, että ylipäätään käytetään välimuistia.
No mitkä olisivat ne ongelmat?
Selitetty yllä. Access sopivaan toiseen osoitteeseen (jota ei ole L1d-kakussa) sisältää saman hashin kuin eri osoite (jonka data löytyy L1D-kakusta). Alempana vielä esimerkki
Joka cachelinjalla on kuitenkin fyysiset tagit ja ne tarkistetaan dataa siirrettäessä L1:een joten mitään ongelmia pelkän virtualisen tagin käytöstä ei tule
Tagit tarkastetaan silloin kun tehdään muistihakua, sen takia, että niistä selviää, että onko halutun osoitteen dataa välimuistissa
Väännetään nyt vielä rautalangasta esimerkki, oletetaan vaikka että hashi muodostetaan käytettämällä siihen vain osoitteen bittejä 31:12, tässä esimerkissä ei ole edes väliä sillä, käytetäänkö fyysisiä vai virtuaalisia osoitteita.
1) Suoritetaan lataus osoitteesta
0x0000 0000 0000 1000 (luku paloiteltu 16-bittisiin osiin luettavuuden parantamiseksi)
Tämän osoitteen sisältämä data ladataan välimuistiin.
Tällöin muodostetaan hash biteistä 00001. Saadaan sille joku arvo, kutsutaan tätä vain nimellä X.
2) Suositetaan lataus osoittesta
0x0000 0001 0000 1000
Tällä osoitteella on tismalleen samat bitit välillä 31:12, eli se saa tismalleen saman hashin (x)
Zenin way prediction mikrotagin perusteella ennustaa osumaa siihen wayhin missä tuo aiemmin ladattu eri osoitteen data on.
Jos välimuistin osumantarkastus tehtäisiin pelkän microtagin perusteella, tämä jälkimmäionen lataus saisi tuon datan , eli lataus lataisi väärän arvon
(Mutta sitten siellä tehdään myös se oikean täyden TAGin tarkastus, joka kertoo, että yläbiteissä on eroa, ei ollutkaan osuma, eikä ladata mitään väärää dataa.)
. Ja se datan luenta tehdään predictionina eli se ei ole 100% varma tulos luettaessa ja käytettäessä, vain 99.999% tai sinnepäin. Loputkin osoitteesta tarkistetaan mutta sitä ei tarvitse tehdä turhaa energiaa polttaen ennen datan saamista käyttöön.
99.999% on täysin väärää kertaluokkaa oleva heitto. Todellinen on lähempänä luokkaa 99%.
Ja sen tarkastuksen viivästäminen ei säästäisi käytännössä yhtään mitään. Ihan saman määrä bittejä sieltä TAGeista pitää lukea vaikka sen luvun tekisi myöhemin.
Päin vastoin, se, että aletaan raahaaman niitä liukuhihnalla perässä seuraaville vaiheille ja träckäämään myöhempiä käskyjä joiden arvo riippuu siitä datasta että mitkä kaikki pitäisi perua ja uudelleenkäynnistää. se sitä energiaa haaskaisi ziljoona kertaa enemmmän.
Nykyprossuissa taitaa olla useamman kellojakson pituinen fetch-stage käskypuskurin ajovaiheessa. Ja rekisterifile - lukukäsky liukuhihnan vaiheessa x ja data tulee x+y kellojaksolle.
Hienoa korkean tason käsienheiluttelua, kun ei oikeasti ymmärretä niitä yksityiskohtia asioista, mistä pädetään.
Ei mikään voi kestää montaa kellojaksoa ellei siellä ole välissä rekistereitä.
Mihin väliin olisit ne rekisterit näissä tunkevasi?
Se, että se välimuisti voidaan jakaa pienempiin lohkoihin nimenomaan MAHDOLLISTAA sen, että sen käyttö voidaan liukuhihnoittaa useammalle kuin kahdelle kellojaksolle, kun varsinainen access jokaiseen lohkoon tehdään kahden kellojakson aikana (ekalla osoite sisään, toisella data ulos) ja muut vaiheet sitten reitittää dataa ja osoitetta oikealle lohkolle.
Mutta prosessorin voi kyllä backportata vanhemmalle prosessille ilman ongelmia vaikka siinä cachen lisäksi kaikki muukin siirtyy kauemmaksi...... eikö nämä ongelmat kuitenkin liity aika pitkälti toisiinsa?
Sotket nyt keskenään aivan eri tavalla skaalautuvia asioita, sekä sitä, mikä on ongelma ja mikä on muuttuja joka vaikuttaa suorituskykyyn.
Sami Riitaoja sanoi:Niin muistuuko mieleen Heikki jonka suunnittelemissa prosessoreissa lienee hyvin suuria koherenssiongelmia muistinkäsittelyn suhteen
Eipä tule mieleen ketään sellaista.
Yksikään suunnittelemani prosessoriydin ei ole edes yrittänyt olla välimuistikoherentti. Koska niissä käyttötarkoituksissa mihin ne on suunniteltu se olisi ollut täysin turhaa, ja vaan monimutkaistani designia ja lisäisi virrankulutusta.
Ja oikein hienoa yrittää päteä sillä, että vaikka itseltäsi on aivan alkeetkin hukassa niin sitten olet kerran onnistunut muistamaan jonkun välimuistikoherenttiusprotokollan pikkuyksityiskohdan minua paremmin niin pidät tätä suurena saavutuksena ja todisteena pätevyydestäsi.
Ja ne lähteet niihin väittämiisi Applen liukuhihnanpituuksiin/haarautumishutiviiveisiin uupuu yhä.
Viimeksi muokattu: