If-Koubou

Kada se CPU Cache Flushed natrag na glavnu memoriju?

Kada se CPU Cache Flushed natrag na glavnu memoriju? (Kako da)

Ako tek počinjete naučiti kako multi-core procesori, predmemoriranje, usklađivanje predmemorije i memorija funkcioniraju, na početku se može činiti pomalo zbunjujućim. Imajući to na umu, današnji SuperUser Q & A post ima odgovore na pitanje čudnog čitatelja.

Današnja pitanja i odgovori nam se javljaju zahvaljujući SuperUseru - podjele Stack Exchange-a, zajednice-driven grupiranja Q & A web stranica.

Pitanje

SuperUser čitač CarmeloS želi znati kada se CPU predmemorija ispere natrag u glavnu memoriju:

Ako imam CPU s dvije jezgre i svaka jezgra ima svoju L1 cache, je li moguće da Core1 i Core2 istodobno skladište isti dio memorije? Ako je moguće, koja će vrijednost glavne memorije biti ako Core1 i Core2 uređuju svoje vrijednosti u predmemoriji?

Kada je CPU predmemorija flushed natrag u glavnu memoriju?

Odgovor

David Schwartz, sleske i Kimberly W dobili su odgovor za nas. Prvo, David Schwartz:

Ako imam CPU s dvije jezgre i svaka jezgra ima svoju L1 cache, je li moguće da Core1 i Core2 istodobno skladište isti dio memorije?

Da, izvedba bi bila strašna ako to nije bio slučaj. Razmotrite dvije niti s istim kodom. Vi želite taj kod u oba L1 sprema.

Ako je moguće, koja će vrijednost glavne memorije biti ako Core1 i Core2 uređuju svoje vrijednosti u predmemoriji?

Stara vrijednost će biti u glavnoj memoriji, što neće biti bitno jer ga ni jezgra neće čitati. Prije izbacivanja modificirane vrijednosti iz predmemorije, ona mora biti zapisana u memoriju. Obično se koristi neka varijanta MESI protokola. U tradicionalnoj implementaciji MESI, ako se vrijednost izmijeni u jednoj predmemoriji, uopće ne može biti prisutna ni u jednoj drugoj predmemoriji na istoj razini.

Slijedi odgovor sleske:

Da, imaju dvije predmemorije u predmemoriji iste memorije regije može se dogoditi i zapravo je problem koji se pojavljuje puno u praksi. Postoje razna rješenja, na primjer:

  • Dva spremnika mogu komunicirati kako bi bili sigurni da se ne slažu
  • Možete imati neku vrstu nadzornika koji prati sve spremišta i ažurira ih u skladu s tim
  • Svaki procesor prati memorijske predmete koji su pohranili u memoriju, a kad otkrije pisanje, baca svoju (sada nevažeću) predmemoriju

Problem se naziva koherencijom predmemorije i članak iz Wikipedije o toj temi ima lijep pregled problema i mogućih rješenja.

I naš konačni odgovor Kimberlyja W:

Da biste odgovorili na pitanje u naslovu postova, to ovisi o tome što je protokol spremljen. Ako je pisanje natrag, predmemorija će biti ispraznjena natrag u glavnu memoriju kada kontrolor predmemorije nema drugog izbora nego staviti novi blok predmemorije u već zauzeti prostor. Blok koji je prethodno zauzimao prostor je uklonjen i njegova je vrijednost zapisana natrag u glavnu memoriju.

Drugi protokol je pisanje. U tom slučaju, svaki put kada je blok cachea napisan na razini n, odgovarajući blok na razini n + 1 se ažurira. Slično je u konceptu ispunjavanja obrasca s ugljenim papirom ispod; sve što napišete na vrhu kopira se na donjoj tablici. To je sporije jer očigledno uključuje više operacija pisanja, no vrijednosti između skrbova su dosljednije. U shemi za poništenje, samo najviša razina predmemorije imala bi najnovija vrijednost za određeni blok memorije.

Imate li nešto za objašnjenje? Zvuči u komentarima. Želite li pročitati više odgovora od drugih tehnoloških korisnika Stack Exchangea? Pogledajte ovdje cijelu raspravu.

Slikovni kredit: Lemsipmatt (Flickr)