Koliko keš memorije. Novi pristup predmemoriranju procesora. Pakiranje i raspakiranje

Prilikom obavljanja različitih zadataka, potrebne blokove informacija iz RAM-a prima procesor vašeg računala. Nakon što ih je obradio, CPU zapisuje rezultate izračuna u memoriju i prima sljedeće blokove podataka za obradu. To se nastavlja dok se zadatak ne završi.

Gore navedeni procesi provode se vrlo velikom brzinom. Međutim, brzina čak i najbržeg RAM-a znatno je manja od brzine bilo kojeg slabog procesora. Svaka radnja, bilo da se radi o upisivanju informacija u njega ili čitanju s njega, oduzima puno vremena. Brzina RAM-a je deset puta manja od brzine procesora.

Unatoč takvoj razlici u brzini obrade informacija, PC procesor ne miruje i ne čeka da RAM izda i primi podatke. Procesor uvijek radi i sve zahvaljujući prisutnosti predmemorije u njemu.

Cache je posebna vrsta RAM-a. Procesor koristi predmemoriju za pohranu onih kopija informacija iz glavnog RAM-a računala kojima će se vjerojatno pristupiti u bliskoj budućnosti.

U biti, predmemorija djeluje kao međuspremnik velike brzine koji pohranjuje informacije koje bi procesoru mogle trebati. Dakle, procesor prima potrebne podatke deset puta brže nego kada ih čita iz RAM-a.

Glavna razlika između cache memorije i običnog međuspremnika su ugrađene logičke funkcije. Međuspremnik pohranjuje slučajne podatke, koji se obično obrađuju prema shemi "prvi primljen, prvi izdan" ili "prvi primljen, zadnji izdan". Predmemorija sadrži podatke kojima će se vjerojatno pristupiti u bliskoj budućnosti. Stoga, zahvaljujući "pametnom cacheu", procesor može raditi punom brzinom i ne čekati da se podaci dohvate iz sporijeg RAM-a.

Glavni tipovi i razine L1 L2 L3 predmemorije

Predmemorska memorija izrađena je u obliku čipova statične memorije s izravnim pristupom (SRAM) koji su instalirani na matičnoj ploči ili ugrađeni u procesor. U usporedbi s drugim vrstama memorije, statička memorija može raditi vrlo velikim brzinama.

Brzina predmemorije ovisi o veličini pojedinog čipa.Što je čip veći, to je teže postići veliku brzinu za njegov rad. S obzirom na ovu značajku, tijekom proizvodnje procesora predmemorija se izvodi u obliku nekoliko malih blokova, koji se nazivaju razinama. Danas je najčešći sustav predmemorije s tri razine L1, L2, L3:

Cache memorija prve razine L1 - najmanji po volumenu (samo nekoliko desetaka kilobajta), ali najbrži po brzini i najvažniji. Sadrži podatke koje procesor najčešće koristi i radi bez odgode. Obično je broj L1 memorijskih čipova jednak broju procesorskih jezgri, pri čemu svaka jezgra pristupa samo svom vlastitom L1 čipu.

L2 predmemorija inferiorna je L1 memoriji u brzini, ali pobjeđuje u volumenu koji se već mjeri u nekoliko stotina kilobajta. Dizajniran je za privremeno pohranjivanje važnih informacija za koje je manje vjerojatno da će im se pristupiti od informacija pohranjenih u L1 predmemoriju.

Treća razina L3 predmemorije - ima najveći volumen od tri razine (može doseći desetke megabajta), ali ima i najsporiju brzinu, koja je još uvijek znatno veća od brzine RAM-a. L3 predmemorija se dijeli na sve jezgre procesora. Razina memorije L3 namijenjena je privremenoj pohrani onih važnih podataka, čija je vjerojatnost pristupa nešto niža od one informacija pohranjenih u prve dvije razine L1, L2. Također osigurava međusobnu interakciju procesorskih jezgri.

Neki modeli procesora izrađeni su s dvije razine predmemorije, u kojoj L2 kombinira sve funkcije L2 i L3.

Kada je velika količina predmemorije korisna.

Osjetit ćete značajan učinak velike količine predmemorije pri korištenju programa za arhiviranje, u 3D igrama, tijekom video obrade i kodiranja. U relativno "laganim" programima i aplikacijama razlika se praktički ne primjećuje (uredski programi, igrači itd.).

Koje je najprljavije mjesto na računalu? Mislite na košaricu? Korisničke mape? Sustav hlađenja? Nisam pogodio! Najprljavije mjesto je spremište! Uostalom, stalno se mora čistiti!

U stvari, postoji mnogo predmemorija na računalu, a one ne služe kao odlagalište otpada, već kao akceleratori za opremu i aplikacije. Odakle im reputacija "sistemskog smetlara"? Pogledajmo što je predmemorija, kako nastaje, kako radi i zašto s vremena na vrijeme.

Pojam i vrste cache memorije

Esh ili cache memorija posebna je pohrana često korištenih podataka, kojoj se pristupa desetke, stotine i tisuće puta brže od RAM-a ili drugih medija za pohranu.

Aplikacije (web preglednici, audio i video playeri, uređivači baze podataka, itd.), komponente operacijskog sustava (memorija sličica, DNS memorija) i hardver (CPU L1-L3 predmemorija, grafički framebuffer) imaju vlastitu predmemoriju. čip, međuspremnici pogona) . Implementira se na različite načine - softverski i hardverski.

  • Programska predmemorija samo je zasebna mapa ili datoteka u koju se preuzimaju, primjerice, slike, izbornici, skripte, multimedijski sadržaji i ostali sadržaji posjećenih stranica. Ovo je mapa u koju preglednik prvo zaroni kada ponovno otvorite web stranicu. Zamjena dijela sadržaja iz lokalne pohrane ubrzava njegovo učitavanje i .

  • U tvrdim diskovima, posebno, predmemorija je zaseban RAM čip kapaciteta 1-256 Mb, koji se nalazi na elektroničkoj ploči. Prima informacije očitane s magnetskog sloja, a još nisu učitane u RAM, kao i podatke koje operativni sustav najčešće traži.

  • Moderni središnji procesor sadrži 2-3 glavne razine predmemorije (također se naziva i scratch memorija), smještene u obliku hardverskih modula na istom čipu. Najbrži i najmanji po volumenu (32-64 Kb) je predmemorija razine 1 (L1) - radi na istoj frekvenciji kao i procesor. L2 je u srednjem položaju po brzini i kapacitetu (od 128 Kb do 12 Mb). A L3 je najsporiji i najobimniji (do 40 Mb), nema ga na nekim modelima. Brzina L3 niska je u usporedbi s bržim RAM-om, ali je i stotinama puta brži od najproduktivnijeg RAM-a.

Scratchpad memorija procesora koristi se za pohranu stalno korištenih podataka, pumpanih iz RAM-a, i instrukcija strojnog koda. Što je veći, to je procesor brži.

Danas tri razine predmemoriranja više nisu ograničenje. Pojavom Sandy Bridge arhitekture, Intel je u svoje proizvode implementirao dodatnu predmemoriju L0 (namijenjenu pohranjivanju dekriptiranih mikroinstrukcija). A najučinkovitiji procesori također imaju predmemoriju četvrte razine, izrađenu u obliku zasebnog mikro kruga.

Shematski, interakcija razina predmemorije L0-L3 izgleda ovako (na primjer, Intel Xeon):

Ljudski jezik o tome kako sve to funkcionira

Da biste razumjeli kako radi predmemorija, zamislite osobu koja radi za stolom. Na stolu su mape i dokumenti koje stalno koristi ( u predmemoriji). Da biste im pristupili, samo ispružite ruku.

Papire koji su mu rjeđe potrebni odlaže u blizini na police ( u RAM-u). Da biste ih dobili, morate ustati i hodati nekoliko metara. A ono s čime osoba trenutno ne radi je arhivirano ( snimljen na tvrdi disk).

Što je stol širi, to više dokumenata stane na njega, što znači da će zaposlenik moći brzo doći do više informacija ( što je veći kapacitet predmemorije, to teoretski program ili uređaj brže rade).

Ponekad pogriješi - na stolu drži papire koji sadrže netočne podatke i koristi ih u svom radu. Kao rezultat toga, kvaliteta njegovog rada je smanjena ( pogreške predmemorije dovode do kvarova softvera i hardvera). Da bi ispravio situaciju, zaposlenik mora baciti dokumente s pogreškama i na njihovo mjesto staviti ispravne ( očistiti predmemoriju).

Stol ima ograničenu površinu ( cache memorija je ograničena). Ponekad se može proširiti, na primjer, pomicanjem druge tablice, a ponekad ne (veličina predmemorije se može povećati ako program pruža takvu mogućnost; hardverska predmemorija se ne može promijeniti, jer je ugrađena u hardver) .

Drugi način da se ubrza pristup većem broju dokumenata nego što stol može primiti je pronaći pomoćnika koji će poslužiti papir radniku s police (operacijski sustav može dodijeliti dio neiskorištenog RAM-a za predmemoriju podataka uređaja). Ali to je ipak sporije nego da ih skinemo sa stola.

Dokumenti koji su pri ruci trebaju biti relevantni za trenutne zadatke. To je odgovornost samog zaposlenika. Papire morate redovito čistiti (istiskivanje nebitnih podataka iz cache memorije pada "na teret" aplikacija koje to koriste; neki programi imaju funkciju automatskog čišćenja cache memorije).

Ako zaposlenik zaboravi održavati red na radnom mjestu i ažurirati dokumentaciju, može si nacrtati raspored čišćenja stola i koristiti ga kao podsjetnik. U krajnjem slučaju, povjerite to pomoćniku (ako je aplikacija ovisna o predmemorijskoj memoriji postala sporija ili često učitava zastarjele podatke, upotrijebite alate za planirano čišćenje predmemorije ili to učinite ručno svakih nekoliko dana).

Zapravo posvuda nailazimo na "funkcije predmemoriranja". To je i kupnja proizvoda za budućnost, i razne radnje koje obavljamo usput, u isto vrijeme itd. Zapravo, to je sve ono što nas spašava od nepotrebne strke i nepotrebnih pokreta tijela, usmjerava život i olakšava rad. Računalo čini isto. Jednom riječju, da nema predmemorije, radilo bi stotine i tisuće puta sporije. A ne bi nam se svidjelo.

Što je predmemorija, zašto je potrebna i kako radi ažurirano: 25. veljače 2017. od strane: Johnny Mnemonik

Gotovo svi programeri znaju da je predmemorija procesora mala, ali brza memorija koja pohranjuje podatke iz nedavno posjećenih područja memorije - definicija je kratka i prilično točna. Unatoč tome, poznavanje "dosadnih" detalja o mehanizmima predmemorije je neophodno za razumijevanje čimbenika koji utječu na performanse koda.

U ovom ćemo članku pogledati niz primjera koji ilustriraju različite značajke predmemorija i njihov utjecaj na performanse. Primjeri će biti u C#, izbor jezika i platforme ne utječe toliko na ocjenu izvedbe i konačne zaključke. Naravno, u razumnim granicama, ako odaberete jezik u kojem je čitanje vrijednosti iz niza jednako pristupu hash tablici, nećete dobiti rezultate prikladne za tumačenje. Bilješke prevoditelja ispisane su kurzivom.

Habracut - - -

Primjer 1: pristup memoriji i performanse

Što mislite koliko je brža druga petlja od prve?
int arr = novo int;

// prvo
za (int i = 0; i< arr.Length; i++) arr[i] *= 3;

// drugi
za (int i = 0; i< arr.Length; i += 16) arr[i] *= 3;


Prva petlja množi sve vrijednosti niza s 3, druga petlja samo svaku šesnaestu vrijednost. Drugi ciklus čini samo 6% radi prvi ciklus, ali na modernim strojevima oba ciklusa traju približno isto vrijeme: 80 ms I 78 ms odnosno (na mom stroju).

Odgovor je jednostavan - pristup memoriji. Brzina ovih petlji prvenstveno je određena brzinom memorijskog podsustava, a ne brzinom cjelobrojnog množenja. Kao što ćemo vidjeti u sljedećem primjeru, broj pristupa RAM-u je isti iu prvom i u drugom slučaju.

Primjer 2: Utjecaj redova predmemorije

Kopajmo dublje - isprobajmo druge vrijednosti koraka, ne samo 1 i 16:
za (int i = 0; i< arr.Length; i += K /* шаг */ ) arr[i] *= 3;

Ovdje je vrijeme rada ovog ciklusa za različite vrijednosti koraka K:

Imajte na umu da se s vrijednostima koraka od 1 do 16 vrijeme rada praktički ne mijenja. Ali s vrijednostima većim od 16, vrijeme rada se otprilike prepolovi svaki put kada udvostručimo korak. To ne znači da petlja nekako magično počinje raditi brže, samo da se smanjuje i broj ponavljanja. Ključna točka je isto vrijeme rada s vrijednostima koraka od 1 do 16.

Razlog tome je što moderni procesori pristupaju memoriji ne bajtovima, već malim blokovima koji se nazivaju redovi predmemorije. Obično je veličina niza 64 bajta. Kada čitate bilo koju vrijednost iz memorije, barem jedan redak predmemorije ulazi u predmemoriju. Naknadni pristup bilo kojoj vrijednosti iz ovog niza je vrlo brz.

Budući da 16 int vrijednosti zauzima 64 bajta, petlje s koracima od 1 do 16 pristupaju istom broju redaka predmemorije, točnije, svim linijama predmemorije niza. U koraku 32 pristupa se svakom drugom redu, u koraku 64 svakom četvrtom.

Razumijevanje ovoga vrlo je važno za neke metode optimizacije. Broj pristupa njemu ovisi o lokaciji podataka u memoriji. Na primjer, neusklađeni podaci mogu zahtijevati dva pristupa RAM-u umjesto jednog. Kao što smo gore saznali, brzina rada bit će dva puta manja.

Primjer 3: Veličine predmemorija prve i druge razine (L1 i L2).

Moderni procesori obično imaju dvije ili tri razine predmemorije, koje se obično nazivaju L1, L2 i L3. Možete koristiti uslužni program CoreInfo ili GetLogicalProcessorInfo Windows API funkciju da saznate veličine predmemorija na različitim razinama. Obje metode također pružaju informacije o veličini retka predmemorije za svaku razinu.

Na mom računalu CoreInfo prijavljuje 32 KB L1 predmemorije podataka, 32 KB L1 predmemorije instrukcija i 4 MB L2 predmemorije podataka. Svaka jezgra ima svoje osobne L1 predmemorije, L2 predmemorije su zajedničke za svaki par jezgri:

Karta logičkog procesora u predmemoriju: *--- Predmemorija podataka 0, razina 1, 32 KB, Assoc 8, veličina retka 64 *--- predmemorija instrukcija 0, razina 1, 32 KB, Assoc 8, veličina retka 64 -*-- predmemorija podataka 1, Razina 1, 32 KB, Assoc 8, LineSize 64 -*-- Instruction Cache 1, Level 1, 32 KB, Assoc 8, LineSize 64 **-- Unified Cache 0, Level 2, 4 MB, Assoc 16, LineSize 64 --*- Data Cache 2, Level 1, 32 KB, Assoc 8, LineSize 64 --*- Instruction Cache 2, Level 1, 32 KB, Assoc 8, LineSize 64 ---* Data Cache 3, Level 1, 32 KB, Assoc 8, LineSize 64 ---* Instruction Cache 3, Level 1, 32 KB, Assoc 8, LineSize 64 --** Unified Cache 1, Level 2, 4 MB, Assoc 16, LineSize 64
Provjerimo ovu informaciju eksperimentalno. Da bismo to učinili, idemo iterirati kroz naš niz povećavajući svaku 16. vrijednost - jednostavan način za promjenu podataka u svakom retku predmemorije. Kada dođemo do kraja, vraćamo se na početak. Provjerimo različite veličine niza, trebali bismo vidjeti pad performansi kada niz više ne stane u predmemorije različitih razina.

Kod je ovakav:

int koraci = 64 * 1024 * 1024; // broj ponavljanja
int lengthMod = arr.Length - 1; // veličina niza -- potencija dva

za (int i = 0; i< steps; i++)
{
// x & lengthMod = x % arr.Duljina jer potencije dvojke
arr[(i * 16) & lengthMod]++;
}


Rezultati testa:

Na mom računalu primjetan je pad performansi nakon 32 KB i 4 MB - to su veličine L1 i L2 predmemorije.

Primjer 4: Paralelizam instrukcija

Sada pogledajmo nešto drugo. Što mislite koja će od dvije petlje biti brža?
int koraci = 256 * 1024 * 1024;
int a = novo int;

// prvo
za (int i = 0; i< steps; i++) { a++; a++; }

// drugi
za (int i = 0; i< steps; i++) { a++; a++; }


Ispostavilo se da druga petlja radi gotovo dvostruko brže, barem na svim strojevima koje sam testirao. Zašto? Budući da naredbe unutar petlji imaju različite ovisnosti o podacima. Naredbe prvog imaju sljedeći lanac ovisnosti:

U drugom ciklusu, ovisnosti su:

Funkcionalni dijelovi modernih procesora sposobni su za izvođenje određenog broja određenih operacija istovremeno, obično ne jako velikog broja. Primjerice, moguć je paralelni pristup podacima iz L1 predmemorije na dvije adrese, kao i istovremeno izvršavanje dviju jednostavnih aritmetičkih instrukcija. U prvom ciklusu procesor ne može koristiti ove značajke, ali može u drugom.

Primjer 5: Asocijativnost predmemorije

Jedno od ključnih pitanja na koje treba odgovoriti pri projektiranju predmemorije jest mogu li se podaci iz određenog memorijskog područja pohraniti u bilo koje ćelije predmemorije ili samo u neke od njih. Tri moguća rješenja:
  1. Predmemorija izravnog mapiranja, podaci svake retke predmemorije u RAM-u pohranjuju se u samo jednu unaprijed definiranu ćeliju predmemorije. Najjednostavniji način za izračunavanje mapiranja je: row_in_index % number_of_cache_cells. Dva retka preslikana u istu ćeliju ne mogu se istovremeno predmemorirati.
  2. N-entry djelomično asocijativna predmemorija, svaki redak može biti pohranjen na N različitih lokacija predmemorije. Na primjer, u 16-way cacheu, red se može pohraniti u jednu od 16 ćelija koje čine grupu. Obično nizovi s jednakim malim bitovima indeksa dijele jednu grupu.
  3. Potpuno asocijativna predmemorija, bilo koji niz može biti pohranjen na bilo kojoj lokaciji predmemorije. Rješenje je po svom ponašanju ekvivalentno hash tablici.
Izravno mapirane predmemorije sklone su sukobima, na primjer, kada se dva reda natječu za jednu ćeliju, naizmjenično gurajući jedan drugog iz predmemorije, učinkovitost je vrlo niska. S druge strane, potpuno asocijativne predmemorije, iako nemaju ovaj nedostatak, vrlo su složene i skupe za implementaciju. Djelomično asocijativne predmemorije tipičan su kompromis između složenosti implementacije i učinkovitosti.

Na primjer, na mom računalu, 4MB L2 predmemorija je 16-smjerna poluasocijativna predmemorija. Sav RAM je podijeljen u skupove linija prema najmanje značajnim bitovima njihovih indeksa, linije iz svakog skupa natječu se za jednu grupu od 16 ćelija L2 predmemorije.

Budući da L2 predmemorija ima 65.536 ćelija (4 * 2 20 / 64), a svaka grupa se sastoji od 16 ćelija, imamo ukupno 4.096 grupa. Dakle, nižih 12 bitova indeksa reda određuje kojoj skupini ovaj red pripada (2 12 = 4 096). Kao rezultat toga, redovi s adresama djeljivim s 262.144 (4.096 * 64) dijele istu grupu od 16 ćelija i natječu se za mjesto u njoj.

Da bi učinci asocijativnosti djelovali, moramo stalno pristupati velikom broju redaka iz iste grupe, na primjer, pomoću sljedećeg koda:

public static long UpdateEveryKthByte(byte arr, int K)
{
const int rep = 1024 * 1024; // broj ponavljanja

Štoperica sw = Štoperica.StartNew();

int p = 0;
za (int i = 0; i< rep; i++)
{
arr[p]++;

P+=K; if (p >= arr.Length) p = 0;
}

Sw.Stop();
return sw.ElapsedMilliseconds;
}


Metoda povećava svaki K-ti element niza. Kad dođemo do kraja, krećemo ispočetka. Nakon prilično velikog broja ponavljanja (2 20), zaustavljamo se. Napravio sam serije za različite veličine niza i vrijednosti koraka K. Rezultati (plavo - dugo vrijeme rada, bijelo - malo):

Plava područja odgovaraju onim slučajevima kada, uz stalnu promjenu podataka, predmemorija ne može primiti sve potrebne podatke u isto vrijeme. Svijetlo plava boja označava vrijeme rada od oko 80 ms, gotovo bijela - 10 ms.

Pozabavimo se plavim područjima:

  1. Zašto se pojavljuju okomite linije? Okomite crte odgovaraju vrijednostima koraka pri kojima se pristupa previše redaka (više od 16) iz jedne grupe. Za ove vrijednosti, 16-smjerna predmemorija mog stroja ne može držati sve podatke koji su joj potrebni.

    Neke od loših vrijednosti koraka su potencije dvojke: 256 i 512. Na primjer, uzmite u obzir korak 512 i niz od 8 MB. U ovom koraku postoje 32 odjeljka u nizu (8 * 2 20 / 262 144), koji se međusobno natječu za ćelije u 512 grupa predmemorije (262 144 / 512). Postoje 32 parcele, a postoji samo 16 ćelija u cache-u za svaku grupu, tako da nema dovoljno mjesta za sve.

    Ostale vrijednosti koraka koje nisu potencije broja 2 jednostavno su nesretne, uzrokuju puno pristupa istim grupama predmemorije, a također uzrokuju pojavu okomitih plavih linija na slici. Na ovom mjestu ljubitelji teorije brojeva pozvani su na razmišljanje.

  2. Zašto se okomite linije prekidaju na granici od 4 MB? S veličinom niza od 4 MB ili manje, 16-smjerna predmemorija ponaša se isto kao potpuno asocijativna predmemorija, to jest, može smjestiti sve podatke u polje bez sukoba. Ne postoji više od 16 područja koja se bore za jednu grupu predmemorije (262 144 * 16 = 4 * 2 20 = 4 MB).
  3. Zašto je gore lijevo veliki plavi trokut? Jer s malim korakom i velikim nizom, predmemorija ne može stati sve potrebne podatke. Stupanj asocijativnosti predmemorije ovdje igra sekundarnu ulogu, ograničenje je povezano s veličinom L2 predmemorije.

    Na primjer, s veličinom niza od 16 MB i korakom od 128, pristupamo svakom 128. bajtu, ažurirajući tako svaki drugi red predmemorije niza. Za pohranjivanje svake druge linije u predmemoriju potrebno je 8 MB, ali moj stroj ima samo 4 MB.

    Čak i kad bi predmemorija bila potpuno asocijativna, to ne bi dopuštalo pohranjivanje 8 MB podataka u njoj. Imajte na umu da u gornjem primjeru s korakom 512 i veličinom polja od 8 MB trebamo samo 1 MB predmemorije za pohranu svih podataka koji su nam potrebni, ali to nije moguće zbog nedovoljne asocijativnosti predmemorije.

  4. Zašto lijeva strana trokuta postupno dobiva na intenzitetu? Maksimalni intenzitet pada na vrijednost koraka od 64 bajta, što je jednako veličini reda predmemorije. Kao što smo vidjeli u prvom i drugom primjeru, sekvencijalni pristup istom nizu košta gotovo ništa. Recimo, s korakom od 16 bajtova, imamo četiri pristupa memoriji po cijeni jednog.

    Budući da je broj ponavljanja isti u našem testu za bilo koju vrijednost koraka, jeftiniji korak rezultira kraćim vremenom izvođenja.

Otkriveni učinci također se čuvaju pri velikim vrijednostima parametara:

Asocijativnost predmemorije je zanimljiva stvar koja se može pojaviti pod određenim uvjetima. Za razliku od drugih problema o kojima se raspravlja u ovom članku, nije toliko ozbiljan. Svakako, to nije nešto što zahtijeva stalnu pažnju pri pisanju programa.

Primjer 6: Lažno dijeljenje predmemorije

Na višejezgrenim strojevima možete naići na još jedan problem - podudaranje predmemorije. Procesorske jezgre imaju djelomično ili potpuno odvojene predmemorije. Na mom računalu, L1 predmemorija je odvojena (kao i obično) i postoje dvije L2 predmemorije koje dijeli svaki par jezgri. Pojedinosti mogu varirati, ali općenito, moderni višejezgreni procesori imaju hijerarhijske predmemorije na više razina. Štoviše, najbrže, ali i najmanje predmemorije pripadaju pojedinačnim jezgrama.

Kada jedna od jezgri izmijeni vrijednost u svom cacheu, druge jezgre više ne mogu koristiti staru vrijednost. Vrijednost u predmemoriji drugih jezgri mora se ažurirati. Štoviše, trebalo bi ga ažurirati cijeli red predmemorije jer predmemorije rade na podacima na razini retka.

Pokažimo ovaj problem sa sljedećim kodom:

privatni statički int s_brojač = novi int;

privatni void UpdateCounter(int pozicija)
{
za (int j = 0; j< 100000000; j++)
{
s_brojač = s_brojač + 3;
}
}


Ako na svom četverojezgrenom stroju pozovem ovu metodu s parametrima 0, 1, 2, 3 istovremeno iz četiri niti, tada će vrijeme izvođenja biti 4,3 sekunde. Ali ako pozovem metodu s parametrima 16, 32, 48, 64, tada će vrijeme izvođenja biti samo 0,28 sekundi.

Zašto? U prvom slučaju, vrlo je vjerojatno da će sve četiri vrijednosti koje su obradile niti u bilo kojem trenutku završiti u istoj liniji predmemorije. Svaki put kada jedna jezgra poveća vrijednost, označava lokacije predmemorije koje sadrže tu vrijednost u drugim jezgrama kao nevažeće. Nakon ove operacije, sve druge jezgre morat će ponovno spremiti liniju u predmemoriju. To čini mehanizam predmemoriranja neoperativnim, ubijajući performanse.

Primjer 7: složenost hardvera

Čak i sada, kada principi rada predmemorije za vas nisu tajna, hardver će vas i dalje iznenaditi. Procesori se međusobno razlikuju po metodama optimizacije, heuristici i drugim suptilnostima implementacije.

L1 predmemorija nekih procesora može paralelno pristupiti dvjema ćelijama ako pripadaju različitim grupama, ali ako pripadaju istoj grupi, samo sekvencijalno. Koliko ja znam, neki čak mogu paralelno pristupiti različitim četvrtima iste ćelije.

Procesori vas mogu iznenaditi pametnim optimizacijama. Na primjer, kod iz prethodnog primjera o lažnom dijeljenju predmemorije ne radi kako je predviđeno na mom kućnom računalu - u najjednostavnijim slučajevima procesor može optimizirati rad i smanjiti negativne učinke. Ako se kod malo modificira, sve dolazi na svoje mjesto.

Evo još jednog primjera čudnih željeznih hirova:

privatni statički int A, B, C, D, E, F, G;

privatna statična praznina Weirdness()
{
za (int i = 0; i< 200000000; i++)
{
<какой-то код>
}
}


Ako umjesto toga<какой-то код>zamijenite tri različite opcije, možete dobiti sljedeće rezultate:

Povećanje polja A, B, C, D traje dulje od povećanja polja A, C, E, G. Još čudnije, povećanje polja A i C traje više vremena nego polja A, C I E, G. Ne znam točno koji su razlozi tome, ali možda su povezani s memorijskim bankama ( da, da, s uobičajenim memorijskim štedionicama od tri litre, a ne ono što ste mislili). Ako imate bilo kakva mišljenja o ovome, slobodno komentirajte.

Na mom stroju gore navedeno nije uočeno, međutim, ponekad postoje nenormalno loši rezultati - najvjerojatnije, planer zadataka radi vlastite "ispravke".

Lekcija koju treba naučiti iz ovog primjera je da je vrlo teško u potpunosti predvidjeti ponašanje hardvera. Da, Limenka predviđati puno, ali svoja predviđanja morate stalno potvrđivati ​​mjerenjima i testiranjima.

Zaključak

Nadam se da vam je sve o čemu smo razgovarali pomoglo da razumijete strukturu predmemorije procesora. Sada možete primijeniti ono što ste naučili u praksi kako biste optimizirali svoj kod.

Čipovi na većini modernih stolnih računala imaju četiri jezgre, ali proizvođači čipova već su najavili planove za prelazak na šest jezgri, a procesori sa 16 jezgri danas su daleko od neuobičajenog za vrhunske poslužitelje.

Što je više jezgri, veći je problem raspodjele memorije između svih jezgri dok rade zajedno. S povećanjem broja jezgri sve je isplativije minimizirati gubitak vremena na upravljanje jezgrama tijekom obrade podataka - jer brzina razmjene podataka zaostaje za brzinom procesora i obrade podataka u memoriji. Možete fizički pristupiti tuđoj brzoj predmemoriji ili možete koristiti svoju sporu, ali uštedjeti na vremenu prijenosa podataka. Zadatak je kompliciran činjenicom da količina memorije koju traže programi ne odgovara jasno količini predmemorije svake vrste.

Fizički, samo vrlo ograničena količina memorije može se smjestiti što bliže procesoru - predmemorija procesora razine L1, čiji je volumen krajnje beznačajan. Daniel Sanchez, Po-An Tsai i Nathan Beckmann, istraživači na MIT-ovom Laboratoriju za računalne znanosti i umjetnu inteligenciju, naučili su računalo da konfigurira svoje različite vrste memorije na fleksibilnu hijerarhiju programa u stvarnom vremenu. Novi sustav, nazvan Jenga, analizira potrebe za volumenom i učestalost pristupa programskoj memoriji i preraspoređuje snagu svake od 3 vrste predmemorije procesora u kombinacijama koje pružaju povećanu učinkovitost i uštedu energije.


Za početak, istraživači su testirali povećanje performansi kombinacijom statičke i dinamičke memorije pri radu na programima za jednojezgreni procesor i dobili primarnu hijerarhiju – kada je koju kombinaciju bolje koristiti. Iz 2 vrste memorije ili iz jedne. Procijenjena su dva parametra - kašnjenje signala (latencija) i potrošena energija tijekom rada svakog od programa. Otprilike 40% programa počelo je raditi lošije s kombinacijom vrsta memorije, ostatak - bolje. Nakon što su utvrdili koji programi "vole" mješovitu izvedbu, a koji vole veličinu memorije, istraživači su izgradili svoj sustav Jenga.

Virtualno su testirali 4 vrste programa na virtualnom stroju s 36 jezgri. Testirani programi:

  • omnet - Objective Modular Network Testbed, C biblioteka za simulaciju i platforma mrežnog simulatora (plavo na slici)
  • mcf - Meta Content Framework (crvena boja)
  • astar - softver za prikaz virtualne stvarnosti (zeleno)
  • bzip2 - arhiver (ljubičasta)


Na slici je prikazano gdje i kako su obrađeni podaci svakog od programa. Slova pokazuju gdje se pokreće svaka aplikacija (jedna po kvadrantu), boje pokazuju gdje se njeni podaci nalaze, a sjenčanje označava drugu razinu virtualne hijerarhije kada je prisutna.

Razine predmemorije

CPU predmemorija podijeljena je na nekoliko razina. Za univerzalne procesore - do 3. Najbrža memorija je predmemorija prve razine - L1-cache, budući da se nalazi na istom čipu kao i procesor. Sastoji se od predmemorije instrukcija i predmemorije podataka. Neki procesori bez L1 predmemorije ne mogu raditi. L1 predmemorija radi na frekvenciji procesora i može joj se pristupiti u svakom taktu. Često je moguće izvesti više operacija čitanja/pisanja u isto vrijeme. Volumen je obično mali - ne više od 128 KB.

L1 predmemorija komunicira s predmemorijom druge razine - L2. Drugi je najbrži. Obično se nalazi ili na čipu, kao L1, ili u neposrednoj blizini jezgre, kao što je procesorski uložak. U starijim procesorima, čipset na matičnoj ploči. Volumen L2 predmemorije je od 128 KB do 12 MB. U modernim višejezgrenim procesorima, predmemorija druge razine, smještena na istom čipu, zasebna je memorija - s ukupnom veličinom predmemorije od 8 MB, svaka jezgra ima 2 MB. Obično je latencija L2 predmemorije koja se nalazi na jezgrenom čipu od 8 do 20 jezgrenih ciklusa. U zadacima koji uključuju brojne pristupe ograničenom području memorije, na primjer, DBMS, njegova puna uporaba daje deseterostruko povećanje performansi.

L3 predmemorija je obično čak i veća, iako nešto sporija od L2 (zbog činjenice da je sabirnica između L2 i L3 uža od sabirnice između L1 i L2). L3 se obično nalazi odvojeno od CPU jezgre, ali može biti velik - više od 32 MB. L3 predmemorija je sporija od prethodnih predmemorija, ali još uvijek brža od RAM-a. U višeprocesorskim sustavima je u uobičajenoj uporabi. Korištenje predmemorije treće razine opravdano je u vrlo uskom rasponu zadataka i ne samo da ne može pružiti povećanje performansi, već obrnuto i dovesti do općeg smanjenja performansi sustava.

Onemogućavanje predmemorije druge i treće razine najkorisnije je u matematičkim problemima kada je količina podataka manja od veličine predmemorije. U tom slučaju možete učitati sve podatke odjednom u L1 predmemoriju, a zatim ih obraditi.


S vremena na vrijeme Jenga ponovno konfigurira virtualne hijerarhije na razini OS-a kako bi smanjio količinu razmjene podataka, uzimajući u obzir ograničenja resursa i ponašanje aplikacije. Svaka rekonfiguracija sastoji se od četiri koraka.

Jenga distribuira podatke ne samo ovisno o tome koji se programi šalju - oni koji vole veliku jednobrzinsku memoriju ili oni koji vole brzinu mješovitih predmemorija, već i ovisno o fizičkoj blizini memorijskih ćelija podacima koji se obrađuju. Bez obzira koju vrstu predmemorije program zahtijeva prema zadanim postavkama ili prema hijerarhiji. Glavna stvar je minimizirati kašnjenje signala i potrošnju energije. Ovisno o tome koliko vrsta memorije program "voli", Jenga modelira latenciju svake virtualne hijerarhije s jednom ili dvije razine. Dvorazinske hijerarhije tvore površinu, jednorazinske hijerarhije tvore krivulju. Jenga zatim projicira minimalno kašnjenje u dimenzijama VL1, što rezultira dvjema krivuljama. Konačno, Jenga koristi ove krivulje za odabir najbolje hijerarhije (tj. veličine VL1).

Korištenje Jenge dalo je opipljiv učinak. 36-jezgreni virtualni čip je 30 posto brži i koristi 85 posto manje energije. Naravno, za sada je Jenga samo simulacija računala koje radi i proći će neko vrijeme prije nego što vidite prave primjere ove predmemorije, pa čak i prije nego što je proizvođači čipova usvoje ako im se sviđa tehnologija.

Konfiguracija uvjetnog 36 nuklearnog stroja

  • Procesori. 36 jezgri, x86-64 ISA, 2,4 GHz, Silvermont-like LLC: 8B-wide
    ifetch; 2-razinski bpred s 512x10-bitnim BHSR-ovima + 1024x2-bitnim PHT-om, 2-smjerno dekodiranje/izdavanje/preimenovanje/predavanje, 32-unos IQ i ROB, 10-unos LQ, 16-unos SQ; 371pJ/uputa, 163mW/statička snaga jezgre
  • L1 predmemorije. 32 KB, 8-smjerni set-asocijativni, podijeljeni predmemorije podataka i uputa,
    3-ciklus kašnjenja; 15/33 pJ po pogotku/promašaju
  • Prefetchers usluga. 16-entry stream prefetchers modelirani prema i provjereni prema
    Nehalem
  • L2 predmemorije. 128 KB privatno po jezgri, 8-smjerni set-asocijativni, uključivo, 6-ciklusna latencija; 46/93 pJ po pogotku/promašaju
  • Koherentni način rada (Coherence). 16-smjerne banke direktorija sa 6 ciklusa kašnjenja za Jengu; in-cache L3 direktorije za druge
  • Globalni NOC. 6×6 mesh, 128-bitni pokreti i veze, X-Y usmjeravanje, 2-ciklusni cjevovodni usmjerivači, 1-ciklusne veze; 63/71pJ po prelasku usmjerivača/veze, 12/4mW statičke snage usmjerivača/veze
  • Blokovi statičke memorije SRAM. 18 MB, jedna banka od 512 KB po pločici, 4-smjerni zcache s 52 kandidata, kašnjenje banke od 9 ciklusa, Vantage particioniranje; 240/500 pJ po pogotku/promašaju, 28 mW/bank statičke snage
  • Višeslojna dinamička memorija složena DRAM. 1152MB, jedan trezor od 128MB po 4 pločice, Alloy s MAP-I DDR3-3200 (1600MHz), 128-bitna sabirnica, 16 rangova, 8 banaka/rangu, međuspremnik redova od 2 KB; 4,4/6,2 nJ po pogotku/promašaju, 88 mW/statička snaga u trezoru
  • glavna memorija. 4 DDR3-1600 kanala, 64-bitna sabirnica, 2 ranga/kanalu, 8 banaka/rangu, 8 KB međuspremnik redova; 20 nJ/pristupu, 4W statičke snage
  • DRAM vremena. tCAS=8, tRCD=8, tRTP=4, tRAS=24, tRP=8, tRRD=4, tWTR=4, tWR=8, tFAW=18 (sva vremena u tCK; naslagani DRAM ima pola tCK kao glavna memorija )

Cache je memorija ugrađena u procesor, u koju se upisuju najčešće korišteni podaci (naredbe) RAM-a, što značajno ubrzava rad.

Veličina L1 predmemorije (od 8 do 128 KB)
Količina predmemorije u prvoj razini.
L1 predmemorija je blok memorije velike brzine koji se nalazi izravno na jezgri procesora.
Kopira podatke preuzete iz RAM-a.

Spremanje osnovnih naredbi omogućuje vam povećanje performansi procesora zbog veće brzine obrade podataka (obrada iz predmemorije je brža nego iz RAM-a).

Kapacitet cache memorije prve razine je mali i izračunava se u kilobajtima.
Tipično, "stariji" modeli procesora imaju veliku L1 predmemoriju.
Za modele s više jezgri navedena je količina L1 predmemorije za jednu jezgru.

Veličina L2 predmemorije (od 128 do 12288 KB)
Količina predmemorije u drugoj razini.
L2 predmemorija je blok memorije velike brzine koji obavlja iste funkcije kao i L1 predmemorija (pogledajte "Veličina L1 predmemorije"), ali s manjom brzinom i većim volumenom.

Ako odaberete procesor za zadatke koji zahtijevaju velike resurse, tada će model s velikom količinom L2 predmemorije biti poželjniji.
Za višejezgrene procesore navedena je ukupna količina L2 predmemorije.

Veličina L3 predmemorije (od 0 do 16384 KB)
Količina predmemorije u trećoj razini.
Integrirana L3 predmemorija, u kombinaciji s brzom sistemskom sabirnicom, čini podatkovnu vezu velike brzine s memorijom sustava.

U pravilu, samo procesori za poslužiteljska rješenja ili posebna izdanja "stolnih" procesora opremljeni su predmemorijom treće razine.

L3 predmemorija dostupna je, na primjer, u linijama procesora kao što su Intel Pentium 4 Extreme Edition, Xeon DP, Itanium 2, Xeon MP i drugi.

Twin BiCS FLASH - nova tehnologija 3D flash memorije

Dana 11. prosinca 2019., na IEEE International Electronic Devices Meeting (IEDM), TOKYO-Kioxia Corporation najavila je tehnologiju 3D flash memorije - Twin BiCS FLASH.

Upravljački program AMD Radeon Software Adrenalin Edition 2020 19.12.2 WHQL (dodan)

AMD je 10. prosinca predstavio Radeon Software Adrenalin 2020 Edition mega driver 19.12.2 WHQL.

Kumulativno ažuriranje sustava Windows 10 1909 KB4530684

Microsoft je 10. prosinca 2019. izdao kumulativno ažuriranje KB4530684 (Build 18363.535) za ažuriranje Windows 10. studenog 2019. (verzija 1909) na x86, x64 (amd64), ARM64 i Windows Server 2019 (1909) sustavima temeljenim na procesorima za sustave temeljene na x64 .

NVIDIA GeForce Driver spreman za igre 441.66 WHQL

NVIDIA GeForce Game Ready 441.66 WHQL drajver uključuje podršku za MechWarrior 5: Mercenaries i Detroit: Become Human te dodaje G-SYNC podršku za MSI MAG251RX i ViewSonic XG270 monitore.