Avaleht
uus teema   vasta Raud »  Protsessorid »  CPU vahemälu märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale. Teata moderaatorile
otsing:  
matih22
HV veteran
matih22

liitunud: 01.12.2008




sõnum 25.02.2019 09:29:23 CPU vahemälu vasta tsitaadiga

Tere,

Selline teoreetilisem küsimus. Neti avarustest sellist konkreetset vastust ei suutnud leida. Kui olemas võib ka linkida.
Küsimus siis vahemälu tasemete kohta. L1, L2 ja L3. Kes ja mille alusel otsustab, mis andmed mis tasandile lähevad? Ning teine küsimus, mis määrab taseme suuruse ära ning miks ei ehitata seda kohe piisavalt suurt?
Tänud kaasamõtlejatele.
Kommentaarid: 226 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 193
tagasi üles
vaata kasutaja infot saada privaatsõnum
kuccu
HV kasutaja

liitunud: 11.09.2006



Autoriseeritud ID-kaardiga

sõnum 25.02.2019 16:31:19 vasta tsitaadiga

Mina sain siit päris palju uut teada ja hästi seletatud:


Link
Kommentaarid: 5 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 5
tagasi üles
vaata kasutaja infot saada privaatsõnum
kalvis
Kreisi kasutaja

liitunud: 20.10.2009




sõnum 30.03.2019 11:06:51 vasta tsitaadiga

Pole selle ala teoreetik aga võibolla on asjast abi:
Prose arhitektuuri projekteerijad otsustavad kui palju cashet on vaja, kuidas see töötab jne.

Üldiselt koosnevad tänapäeva prosed RISC protsessoritest, nende käsustikuks ongi mikrokoodid. Prose sees tööd tegevad protsessorid välismälu ei näegi, sellega tegeleb TLB ja nad kasutavad ainult L1 ja L3 (erinevus on tinglik).
Lihtsustatult töötab nii - kood laetakse 4 kB plokkidena L2 ja sealt jooksvalt L1. Nüüd L1 käsu dekodeerimise käigus loetakse ka andmed kõigepealt L2 (omaette blokki) ja siis sealt omakorda L1. Käsu dekodeerimise käigus luuakse ka uued prose tuumadele toimivad mikrokoodid otse L1 ja see kõik toimub konveieri erinevates astmetes. Iga konveieri tsükkel pole muud kui RISC protsessor (või mingi tumbim andmetöötluse element) mis loeb L1 ja kirjutab L3.

Iga prose loeb L1 üks või mitu operandi ja kirjutab L3 või L1 oma tulemuse. Nii töötab kogu konveier, kuni lõpliku tulemuse saabumiseni.
Tegelikult L3 ja L1 on ka seesama aga siiski et ühe taktiga töö tehtud saaks siis tuleb tulemus kuhugi teise kohta panna mida siis L3 nimetatakse. Järgmine konveieri tsüklis on see L3 eelmise käsu operand siiski kenasti kätte saadav ja vana L1 vabastatakse.

Prose (õigemini RISC tuumad) ise L2 ei näe, kuid L2 -> L1 laadimine võtab vaid 1 takti aega, seest on L2 juba piisavalt suur et koodi ja argumente seal hoida.

Põhjus miks vahemälu kasutataksgi on lihtne - mälusiinid on piiratud läbilaskevõimega ning programm jookseb palju kohapeal ringiratast, kasutades piisavalt palju lokaalset koodi ja andmeid mis jookseb ringiratast. Tegemaks kogu mälu prose kiirusele on kallis ja põhjustaks ka soojenemist (niigi on prosed liiga kuumad), et selline lõpptulemus on piisav jõudlus ja samas optimaalne. Üthtlasi võimaldab selline lahendus kasutada RISC tuumasid, mis näevad vaid oma kitsast tööpiirkonda L1 (L3) mälus ja töötavad kui konveierid.

Kuidas TLB ja mis algoritmiga vahemälusse andmeid laetakse, otsustatakse seal hoidmine ja väljalaadimine, ma ei käsitleks, suuresti prose tootjad ei taha neid avaldada ja tegu on vägagi keerukate lahendustega.
tagasi üles
vaata kasutaja infot saada privaatsõnum
matih22
HV veteran
matih22

liitunud: 01.12.2008




sõnum 03.04.2019 15:35:23 vasta tsitaadiga

Tänud!
Kommentaarid: 226 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 193
tagasi üles
vaata kasutaja infot saada privaatsõnum
londiste
HV Guru
londiste

liitunud: 22.04.2003




sõnum 10.04.2019 13:18:26 Re: CPU vahemälu vasta tsitaadiga

matih22 kirjutas:
Küsimus siis vahemälu tasemete kohta. L1, L2 ja L3. Kes ja mille alusel otsustab, mis andmed mis tasandile lähevad? Ning teine küsimus, mis määrab taseme suuruse ära ning miks ei ehitata seda kohe piisavalt suurt?
kaugus protsessorist ja vastavalt ka kiirus. l1 (täna praktiliselt alati jagatud kaheks - eraldi instruktsioonide ja andmete jaoks) ja l2 on reeglina tuumas sees, l3 sealt väljaspool, vahel juba ka l4, mis kipub juba kuskile prosest eemale jääma.
andmete liikumise otsustab prose arhitektuuris kasutatav vahemälu kasutamise algoritm, seda nii igal vahemälu tasemel eraldi kui ka vahemälude vahel.
rusikareeglina liiguvad andmed läbi vahemälu tasemete mälust kõrgema taseme vahemälust madala taseme vahemäluni kuid olenevalt kasutatavast lahendusest jäetakse neid tasemeid ka vahele.
suurused, assotsiatiivsus, inclusive/exclusive ja kasutatavad algoritmid varieeruvad omajagu.
see kõik ei ole tegelikult mingi kindla reegli järgi vaid on lihtsalt välja kujunenud mingid optimaalsed lahendused.

vahemälu suurusega on see häda, et see kipub olema pöördvõrdeline viitega, ehk madalama taseme cache väike maht tagab väiksema viite. eriti l1 puhul on see väga oluline.

kalvis, prose operandid on operatsioonide teostamise ajaks ikkagi juba registrites ja prose kui arvutusüksus ise vahemäluga suurt ei tegele. piltlikult öeldes prose ei tea ega seda ei huvita, kas nõutav operand on mälus, vahemälus või millises vahemälu tasemes. operand küsitakse mäluaadressi järgi ja edasi (või tänapäeval tihti ennetavalt) toimetatakse mäluhaldusüksus(t)e, eelkõige tlb abil andmed läbi vahemälu proseni.

_________________
- londiste
...aga mina ei saa kunagi suureks!
Kommentaarid: 237 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 212
tagasi üles
vaata kasutaja infot saada privaatsõnum
kalvis
Kreisi kasutaja

liitunud: 20.10.2009




sõnum 11.04.2019 10:13:58 vasta tsitaadiga

On olemas ka mälu operandid ja need taanduvad vahemällu jõudes samale tasemele registriga. Vahemälu L1,L3 tasandil ei ole registril ja mäluoperandil enam vahet, mõlemad on üks ja seesama vahemälu kirje. Küll aga ei asu register mitte kunagi L2-s, mälu operand aga võib ka seal asuda.
Register kui selline ei ole enam ammu vahemälus jäik, vaid sõltuvalt mikrokoodist "ujub" vahemälus ringi.
tagasi üles
vaata kasutaja infot saada privaatsõnum
londiste
HV Guru
londiste

liitunud: 22.04.2003




sõnum 11.04.2019 10:30:59 vasta tsitaadiga

register on füüsiline koht andmete jaoks protsessori arvutusüksuse sees, see ei asu vahemälus ega mälus. registrisse peab operand operatsiooni jaoks välja jõudma.
protsessori arvutusüksuse jaoks on kõik sealt eemal asuv mäluoperand ja sellele ligipääs käib mäluaadressi läbi. nagu öeldud, kas see asub füüsiliselt mõne taseme vahemälus või mälus ei oma protsessori arvutusüksuse jaoks tähtsust, sellega tegeleb vahemälu- ja mäluhaldus.

edit:
piltlikult öeldes näeb protsessori arvutusüksuse poolt asi välja umbes nii:
ütleme, et tahad arvutada x+1 kus x on mäluaadress(i sisu).
selle arvutuse tegemiseks on vaja mäluaadressi x sisu kopeerida registrisse.
arvutusüksus küsib selle mäluaadressi sisu, see kopeeritakse ette nähtud registrisse ja tehakse vastav operatsioon. edasi kirjutatakse tulemus näiteks tagasi mällu, samale aadressile x.
sellega lõpeb arvutusüksuse tegevus ja ettekujutus asjast.

küll aga käib mäluaadressi sisu kopeerimise juurde mäluhaldus. seal tulevad mängu nii mälukontroller kui vahemälud ja nende haldus.
kui mäluaadressi sisu x on hiljuti kasutatud, siis leidub see tõenäoliselt mingi taseme vahemälus, kust see kiiremini registrini toimetatakse.
täpne toimemehanism sõltub juba kasutatavatest lahendustest, kui palju vahemäludes asju on, kui hiljuti selle mäluaadressi sisu on kasutatud jne.

_________________
- londiste
...aga mina ei saa kunagi suureks!
Kommentaarid: 237 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 212
tagasi üles
vaata kasutaja infot saada privaatsõnum
kalvis
Kreisi kasutaja

liitunud: 20.10.2009




sõnum 13.04.2019 11:17:09 vasta tsitaadiga

Registri jutt kehtis viimati (CISC prosedele) 386 aegu. Siis oli register fikseeritud, kõik moodulid jäigalt registris paigas ja iga taktiga tehti jäikade moodulite vahel tehteid. Asi muutus kui oli vaja tegeleda paraleelselt koodis käskude töötlusega. Kui veidi koodi vaadata siis paljudel juhtudel paraleeltöötluses on võimalik käske paraleelselt kasutada isegi siis kui nad kirjutavad mõlemad ühte ja samasse registrisse.
Tänapäevastes prosedest asub register "vahemälus" ja ujub seal ringi. Ta teeb seda seepärast et on paraleelkäsud või püütakse käske paraleelselt töödelda ja vältimaks sama registri paraleeltöötlemise konflikti siis teda paljundatakse (mikrokoodid seda teevadki). kui kaks käsku mõlemad muudavad registri sisu kuid erinevalt siis ennetavalt tehakse mõlemad käsud registrisse ette ära (tulemus on erinev, seepärast peavad mõlemad asuma erinevas kohas!) ning alles pärast lõpptingimuse leidmist kumb on tõene, jääb üks neist alles (tüüpiline If käsk). Valiku käsugat õige viit tõesele registri väärtusele, st. vahemälus pesitsevale registri aadressile. Eriala kirjanduses nimetatakse seda "registri" ümbernimetamiseks. See ei ole ainult tingimuslike käskudega nii, igasugused swap tüüpi käsud jne. tehakse samamoodi. Hypertreading samamoodi.
RISC prosedes on asi natukene erinev, seal on tõesti prose tasandil kõik jäik ja pole võimalik hookuspookustega tegeleda. Kuid seepärast teeb RISC ka tinglikult ühe taktiga kõik prodseduurid ära mida tema käsustik võimaldab. Kuid jutt käis CISC prosedest.
Ah soo, juba P4 arhitektuuri kirjelduses oli öeldud, et iga käsu konveieril täitmine kuni lõpptulemuseni toimub ainult vahemälus. St. konveieri töötlusüksus loeb kõik oma data vahemälust ja kirjutab sinna tagasi. P4 oli kokku siis 20 konveieri astet ja igale astmele oli resrveeritud 3+16 B vahemälu., st 2 sisendiks ja üks väljundiks. See põhjustaski väga väikese vahemälu allesjäämise muudele operandidele (mälumuutujad ja konveierist allesjäänud käsukoodidele), mis lõpptulemusena avaldus kehvas soorituses.
tagasi üles
vaata kasutaja infot saada privaatsõnum
klf
HV vaatleja

liitunud: 08.03.2005




sõnum 13.04.2019 15:42:13 vasta tsitaadiga

Kui Inglise keelt valdad, loe parem wikipediat või esita oma päring nt stackoverflow saidil.

Üldjuhul käib mälu liigutamine paraja suurusega portsjonite kaupa; x86 puhul on cache line suuruseks 64 baiti. Iga selline plokk tuleb vahemälus konkreetsesse pesasse talletada. Ehk teisisõnu, kui vahemälu on nt organiseeritud 8-way assotsiatiivsena, siis on ainult 8 erinevat lohku kuhu üht mäluliini saab paigutada. Suurem vahemälu tahab üldjoontes ka suuremat assotsiatiivsust. Mida suurem vahemälu on ja mida keerulisem ta on (aadressi räsi, assotsiatiivne loogika jne), seda suurem on tema poole pöördumise latents.

Protsessori töös esineb regulaarselt väikesi pidurdusi ehk mulle. Need mullid võivad kattuda omavahel ja võivad kattuda kasuliku tööga (amortiseeruda täielikult). Tüüpilisi näiteid mida tuua: L1 latents 4-5 takti, L2 latents 12-15 takti, branch mispredict 12-15 takti, L3 latents 40 takti, protsessori ressurss out-of-order käske puhverdada ja täita - kah sinna 40+ kanti. Ideaaltingimustel võib seega isegi L3 tasemele suunduv päring (L2 miss/L3 hit) amortiseeruda ilma protsessorit aeglustamata. (Praktikas on nii, et kui 50% teoreetilisest IPC läbilaskevõimest realiseerub, on isegi hästi.)

Tavaline L1D suurus on 32 KB, mis tähendab 512 erinevat 64 baidist cache line'i. Suuremaks teha seda hästi ei anna - 5 taktine latents on niigi valus. Väiksemaks seda teha ka ei saa. Mitmed täiesti tavalised algoritmid, no näiteks radix sort, toimetavad 8-bitise indeksi ehk ühe baidi kaupa ja nõuavad juhupöördumist vähemalt 256 (2^8) korraga aktiivse mäluliini poole, pluss muud tabelid/muutujad. HT puhul on vahemälu ressurss jagatud veel kahe lõime vahel.

L3 saaks vast teha tublisti suuremaks, aga see ei annaks jõudluses eriti juurde. (Intelil oli miski 5gen Broadwell protsessor suure L3-ga, 128 MB kui ma ei eksi. Benchmarkides saavutas see suurema kiiruse andmete pakkimisel, aga muud suurt midagi.) Võib öelda, et L3 teenindab pigem RAM'i, tuues seda protsessorile lähemale. RAM latents on muidu 200+ takti.

Mis puudutab seda, millise tasandi vahemälusse miskid andmed satuvad, siis nii Inteli kui ka viimase aja AMD protsessorid on inklusiivse vahemälu disainiga. S.t. kõik see mälu, mis on kusagil tasandil (L1), on ühtlasi ka kõrgematel tasanditel (L2, L3) olemas. Esmapilgul tundub kasutu, aga see on jällegi tingitud vahemälu töökorraldusest. (Ja sellest, et x86 platvorm annab mälule tugeva koherentsuse garantii.) Samad andmed võivad olla lugemiseks jagatud mitme protsessori vahel. Ennem, kui protsessor mingit mälupesa muuta tohib, peab ta aga vastava cache line omanikuks saama. Selle tarvis peetakse vahemäludes iga ploki kohta arvestust, et kas too on muudetud/eksklusiivne/sheeritud/invalid. Tee otsing "MESI protocol".
Kommentaarid: 10 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 10
tagasi üles
vaata kasutaja infot saada privaatsõnum
londiste
HV Guru
londiste

liitunud: 22.04.2003




sõnum 13.04.2019 16:47:21 vasta tsitaadiga

kalvis, registrid ei ole vahemälus.

registrid on protsessoris sõna otseses mõttes füüsilised asjad.
jah, neid saab ümber nimetada, sella jaoks on eraldi tabel aga need on protsessoris endas, mitte vahemälus.
sinna talletatakse vahetult kasutuses olevad operandid, seda ka spekulatiivsel juhul kus registrite nimetamisega mängida vaja on.

_________________
- londiste
...aga mina ei saa kunagi suureks!
Kommentaarid: 237 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 212
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Raud »  Protsessorid »  CPU vahemälu
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.