Organizarea fizică și logică a memoriei în sisteme informatice. Sisteme de calcul cu memorie partajată

Capitolul 11

Organizarea memoriei sisteme de calcul

În sistemele de calcul care combină multe procesoare sau mașini paralele, sarcina de a organiza corect memoria este una dintre cele mai importante. Diferența dintre viteza procesorului și a memoriei a fost întotdeauna o piatră de poticnire în VM-urile cu un singur procesor. Multiprocesarea calculatoarelor duce la o altă problemă - problema accesului simultan la memorie de către mai multe procesoare.

În funcție de modul în care este organizată memoria sistemelor multiprocesor (multi-mașină), sistemele de calcul cu memorie partajată(memorie partajată) și aeronave cu memorie distribuită (memorie distribuită). ÎN sisteme de memorie partajată(numită adesea și memorie partajată sau partajată), memoria este tratată ca o resursă partajată și fiecare procesor are acces deplin la întreg spațiul de adrese. Sunt apelate sistemele cu memorie partajată puternic conectat(sisteme strâns cuplate). O construcție similară a sistemelor de calcul are loc atât în ​​clasa SIMD, cât și în clasa MIMD. Uneori, pentru a sublinia această împrejurare, sunt introduse subclase speciale, folosind abrevierile SM-SIMD (Shared Memory SIMD) și SM-MIMD (Shared Memory MIMD) pentru a le desemna.

In optiune cu memorie distribuită Fiecare procesor are propria sa memorie. Procesoarele sunt combinate V rețea și pot, dacă este necesar, să facă schimb de date stocate în memoria lor, transferându-și unul altuia așa-numitele mesaje. Acest tip de aeronavă se numește slab conectat(sisteme slab cuplate). Slab sistemele conectate se regăsesc și în clasa SIMD și în clasa MIMD, iar uneori, pentru a sublinia această caracteristică, sunt introduse subclasele DM-SIMD (Distributed Memory SIMD) și DM-MIMD (Distributed Memory MIMD).

În unele cazuri, sunt apelate sisteme de calcul cu memorie partajată multiprocesoare,și sisteme cu memorie distribuită - mtslticomputere.

Diferența dintre memoria partajată și cea distribuită este diferența de structură memorie virtuala, adică în modul în care arată memoria din partea procesorului. Din punct de vedere fizic, aproape fiecare sistem de memorie este împărțit în componente autonome care pot fi accesate independent. Ceea ce separă memoria partajată de memoria distribuită este modul în care subsistemul de memorie interpretează adresa celulei primită de la procesor. De exemplu, să presupunem că procesorul execută instrucțiunea de încărcare RO, i, adică „Încărcați registrul R0 cu conținutul celulei i”. În cazul memoriei partajate, i este o adresă globală, iar pentru orice procesor indică aceeași celulă. ÎN sistem distribuit memoria i este adresa locala Dacă două procesoare execută comanda load RO, i, atunci fiecare dintre ele accesează celula i-a din memoria sa locală, adică celule diferite, iar valori inegale pot fi încărcate în registrele R0.

Diferența dintre cele două sisteme de memorie trebuie luată în considerare de către programator deoarece determină modul în care părțile unui program paralelizat interacționează. În opțiunea de memorie partajată, este suficient să creați o structură de date în memorie și să transmiteți referințe la această structură către subrutine paralele. Într-un sistem de memorie distribuită, este necesar să existe o copie a datelor partajate în fiecare memorie locală. Aceste copii sunt create prin încorporarea datelor partajate în mesajele trimise altor procesoare.

Memoria intercalată

Din punct de vedere fizic, memoria unui sistem informatic este formată din mai multe module (bănci), iar o problemă semnificativă este modul în care este distribuit spațiul de adrese în acest caz (setul tuturor adreselor pe care procesorul le poate genera). O modalitate de a distribui adrese virtuale între modulele de memorie este împărțirea spațiului de adrese în blocuri secvențiale. Dacă memoria constă din P bănci, apoi celula cu adresa i cu partiţionare bloc cu bloc va fi în banca cu număr i/ n. În sistem memorie intercalată(memorie intercalată) adresele consecutive sunt situate în bănci diferite: celula cu adresa i este în bancă cu numărul i mod P. Să fie, de exemplu, memoria formată din patru bănci, de 256 de octeți fiecare. Într-o schemă orientată pe bloc, primului banc i se vor aloca adrese virtuale 0-255, al doilea - 256-511 etc. Într-o schemă cu adrese intercalate, celulele succesive din prima bancă vor avea adrese virtuale 0, 4, 8 , .. .. în al doilea mal - 1, 5, 9 etc. (Fig. 11.1, a).

Distribuirea spațiului de adrese între module face posibilă procesarea simultană a cererilor de acces la memorie dacă adresele corespunzătoare aparțin unor bănci diferite. Procesorul poate solicita accesul la o celulă într-unul dintre cicluri i iar în ciclul următor - la celula j. Dacă iȘij sunt în bănci diferite, informațiile vor fi transmise în cicluri succesive. Aici ciclul se referă la ciclul procesorului, în timp ce ciclu complet memoria ocupă mai multe cicluri de procesor. Astfel, în acest caz, procesorul nu trebuie să aștepte până la finalizarea întregului ciclu de accesare a celulei i. Această tehnică vă permite să măriți lățimea de bandă: dacă sistemul de memorie este format din

Orez. 11.1- Memorie cu adrese alternante: a - distributie adrese; b- elemente extrase în trepte de 9 dintr-o matrice 8 x 8

număr suficient de bănci, este posibil să se facă schimb de informații între procesor și memorie la o viteză de un cuvânt pe ciclu de procesor, indiferent de durata ciclului de memorie.

Decizia cu privire la opțiunea de distribuire a adresei să alegeți (în bloc sau în dungi) depinde de ordinea așteptată de acces la informații. Programele sunt compilate în așa fel încât instrucțiunile secvențiale să fie localizate în celule cu adrese secvențiale, deci există o mare probabilitate ca după instrucțiunea extrasă din adresa celulei i, instrucțiunea din celulă să fie executată i + 1. Compilatorul plasează și elemente de vectori în celule secvențiale, astfel încât în ​​operațiile cu vectori puteți profita de metoda intercalării. Din acest motiv, procesoarele vectoriale folosesc de obicei o anumită formă de intercalare a adreselor. Multiprocesoarele cu memorie partajată folosesc încă adresarea bloc, deoarece modelele de acces la memorie ale sistemelor MIMD pot varia foarte mult. În astfel de sisteme, scopul este de a conecta procesorul la un bloc de memorie și de a utiliza cât mai mult posibil din informațiile din acesta înainte de a trece la un alt bloc de memorie.

Sistemele de memorie oferă adesea flexibilitate suplimentară atunci când preiau vectori de elemente. Pe unele sisteme, este posibil să se încarce simultan fiecare al n-lea element al unui vector, de exemplu atunci când se regăsesc elemente ale unui vector V, stocate în celule de memorie succesive; la P= 4, memoria va reveni Se numește distanța dintre elemente pas cu index sau "pas"(pas). Unul dintre aplicatii interesante Această proprietate poate servi drept Matrix Access. Dacă pasul de index este cu unul mai mare decât numărul de rânduri din matrice, o singură cerere de acces la memorie va returna toate elementele diagonale ale matricei (Fig. 11.1b). Responsabilitatea de a se asigura că toate elementele matricei extrase sunt localizate în bănci diferite revine programatorului.

Modele de arhitectură de memorie a sistemelor informatice

Mai multe modele de arhitecturi ale sistemelor de memorie sunt implementate atât în ​​memoria partajată, cât și în cea distribuită.

Orez. 11.2. Clasificarea modelelor de arhitectură de memorie a sistemelor informatice

În fig. 11.2 arată clasificarea unor astfel de modele utilizate în sistemele de calcul din clasa MIMD (acest lucru este valabil și pentru clasa S1MD).

Modele de arhitectură a memoriei partajate

În sistemele cu memorie partajată, toate procesoarele au capacități egale, dar acces la un singur spațiu de adrese. O singură memorie poate fi construită ca un singur bloc sau modulară, dar a doua opțiune este de obicei practicată.

Sunt apelate sistemele de calcul cu memorie partajată, unde orice procesor accesează memoria uniform și durează același timp sisteme cu acces uniform la memorieși este desemnat prin abrevierea UMA (Uniform Memory Access). Aceasta este cea mai comună arhitectură de memorie VS paralelă cu memorie partajată.

Din punct de vedere tehnic, sistemele UMA presupun prezența unui nod care conectează fiecare dintre ele P procesoare cu fiecare T module de memorie. Cel mai simplu mod construcția unor astfel de calculatoare - care combină mai multe procesoare (P i) cu o singură memorie (M p) printr-o magistrală comună - este prezentată în Fig. 11.3, A.În acest caz, însă, doar unul dintre procesoare poate comunica pe magistrală în orice moment, adică procesoarele trebuie să concureze pentru accesul la spike. Când procesorul P i selectează o instrucțiune din memorie, celelalte procesoare trebuie să așteptați până când anvelopa este liberă. Dacă V Sistemul include doar două procesoare, acestea fiind capabile să lucreze cu performanțe aproape de maxim, deoarece accesul lor la magistrală poate fi intercalat: în timp ce un procesor decodifică și execută o instrucțiune, celălalt are dreptul de a folosi magistrala pentru a prelua următoarea instrucțiune din memorie. Cu toate acestea, atunci când se adaugă un al treilea procesor, performanța începe să scadă. Dacă există zece procesoare pe magistrală, curba de performanță a magistralei (Fig. H.3, A) devine orizontală, așa că adăugarea unui al 11-lea procesor nu mai oferă o creștere a performanței. Curba de jos din această figură ilustrează faptul că memoria și magistrala au o lățime de bandă fixă ​​determinată de combinația dintre timpul ciclului de memorie și protocolul de magistrală, iar într-un sistem multiprocesor cu magistrală partajată acest lucru debitului distribuite între mai multe procesoare. Dacă timpul ciclului procesorului este mai lung decât ciclul memoriei, multe procesoare pot fi conectate la magistrală. Cu toate acestea, în realitate procesorul este de obicei mult mai rapid decât memoria, prin urmare această schemă nu este utilizată pe scară largă.

Orez. 11.3. Memoria partajată: a - combinarea procesoarelor folosind o magistrală; b - sistem cu cache locale; V- performanta sistemului in functie de numarul de procesoare de pe magistrala; d - calculator multiprocesor cu memorie partajată format din module separate

O modalitate alternativă de a construi un computer multiprocesor cu memorie partajată bazată pe NML este prezentată în Fig. 11.3, G. Aici vârful este înlocuit de un comutator care direcționează cererile procesorului către unul dintre mai multe module de memorie. Chiar dacă există mai multe module de memorie, toate fac parte dintr-un singur spațiu de adrese virtuale. Avantajul acestei abordări este că comutatorul este capabil să servească mai multe cereri în paralel. Fiecare procesor poate fi conectat la propriul modul de memorie și are acces la el la viteza maximă permisă. Conflictele între procesoare pot apărea atunci când încercați să accesați același modul de memorie în același timp. În acest caz, doar un procesor are acces, iar celelalte sunt blocate.

Din păcate, arhitectura UMA nu se scalează foarte bine. Cele mai comune sisteme conțin 4-8 procesoare, mult mai rar 32-64 procesoare. În plus, astfel de sisteme nu pot fi clasificate ca tolerante la erori, deoarece defecțiunea unui procesor sau a unui modul de memorie implică defecțiunea întregului computer.

O altă abordare a construirii unui computer cu memorie partajată este acces heterogen la memorie, notat ca NUM A (Acces la memorie non-uniformă). Aceasta implică încă un singur spațiu de adrese, dar fiecare procesor are memorie locală. Procesorul accesează direct propria memorie locală, ceea ce este mult mai rapid decât accesarea memoriei de la distanță printr-un comutator sau rețea. Un astfel de sistem poate fi suplimentat cu memorie globală, apoi dispozitivele de stocare locale acționează ca o memorie cache rapidă pentru memoria globală. O astfel de schemă poate îmbunătăți performanța aeronavei, dar nu poate întârzia la nesfârșit nivelarea performanței directe. Dacă fiecare procesor are o memorie cache locală (Fig. 11.3.6), există o mare probabilitate (p > 0.9) că comanda sau datele necesare sunt deja în memoria locală. Probabilitatea rezonabilă de a atinge memoria locală reduce semnificativ numărul de accesări la procesor La memorie globală și astfel duce la creșterea eficienței. Locația punctului de inflexiune în curba de performanță (curba superioară din Fig. 11.3, V), corespunzând punctului în care adăugarea procesoarelor este încă eficientă, acum se deplasează în regiunea a 20 de procesoare, iar punctul în care curba devine orizontală se deplasează în regiunea a 30 de procesoare.

În cadrul conceptului NUMA Sunt implementate mai multe abordări diferite, notate prin acronime SOMA,CC- NUMA Și NCC- NUMA.

ÎN arhitectură doar cache(SOMA, Cache Only Memory Architecture) memoria locală a fiecărui procesor este construită ca o memorie cache mare pentru acces rapid de către procesorul „sau”. Cache-urile tuturor procesoarelor sunt considerate colectiv ca memorie de sistem globală. Nu există o memorie globală reală. Caracteristica fundamentală a conceptului SOMA este exprimată în dinamică. Aici, datele nu sunt legate static de un anumit modul de memorie și nu au o adresă unică care rămâne neschimbată pe toată durata de viață a variabilei. În arhitectura SOMA, datele sunt transferate în memoria cache a procesorului care le-a solicitat ultima dată, în timp ce variabila nu este fixată printr-o adresă unică și poate fi localizată în orice celulă fizică în orice moment. Mutarea datelor dintr-un cache local în altul nu necesită participarea la acest proces sistem de operare, dar implică hardware complex și costisitor de gestionare a memoriei. Pentru a organiza un astfel de regim, așa-zis directoarele cache. De asemenea, rețineți că ultima copie Elementul de date nu este niciodată eliminat din cache.

Deoarece în arhitectura COMA datele sunt mutate în memoria cache locală a procesorului proprietar, astfel de computere au un avantaj semnificativ de performanță față de alte arhitecturi NUM A Pe de altă parte, dacă o singură variabilă sau două variabile diferite sunt stocate în aceeași linie din aceeași memorie cache , sunt solicitate de două procesoare, această linie de cache trebuie să se deplaseze înainte și înapoi între procesoare cu fiecare acces la date. Astfel de efecte pot depinde de detaliile alocării memoriei și pot duce la situații imprevizibile.

Model cache acces coerent la memoria eterogenă(CC-NUMA, Сасhe Coherent Non-Uniform Memory Architecture) este fundamental diferit de modelul SOMA. Sistemul CC-NUMA nu folosește memorie cache, ci memorie obișnuită distribuită fizic. Nu există copiere a paginilor sau a datelor între celulele de memorie. Nu există nicio transmitere de mesaje implementată de software. Există pur și simplu un card de memorie, cu piesele conectate fizic printr-un cablu de cupru și hardware „inteligent”. Coerența cache-ului implementată de hardware înseamnă că nu software pentru a stoca mai multe copii ale datelor actualizate sau a le transmite. Nivelul hardware se ocupă de toate acestea. Accesul la modulele de memorie locale din diferite noduri ale sistemului se poate face simultan și este mai rapid decât la modulele de memorie la distanță.

Diferența dintre model și acces incoerent în cache la memoria eterogenă(NCC-NUMA, Non-Cache Coherent Non-Uniform Memory Architecture) de la CC-NUMA este evident din nume. Arhitectura memoriei presupune un singur spațiu de adresă, dar nu oferă consistență globală a datelor nivelul hardware. Gestionarea utilizării acestor date revine în întregime software-ului (aplicații sau compilatoare). În ciuda acestei circumstanțe, care pare a fi un dezavantaj al arhitecturii, se dovedește a fi foarte utilă în creșterea performanței sistemelor de calcul cu o arhitectură de memorie de tip DSM, discutată în secțiunea „Modele de arhitecturi de memorie distribuită”.

În general, sunt numite calculatoare cu memorie partajată, construite după schema NUMA arhitecturi cu memorie virtuală partajată(arhitecturi de memorie virtuală partajată). Acest tip de arhitectură, în special CC-NUMA, În ultima vreme este considerat un tip independent și destul de promițător de sisteme de calcul din clasa MIMD, prin urmare, astfel de computere vor fi discutate mai detaliat mai jos.

Modele de arhitecturi de memorie distribuită

Într-un sistem de memorie distribuită, fiecare procesor are propria sa memorie și poate doar să o adreseze. Unii autori numesc acest tip de sistem aeronave cu mai multe mașini sau mai multe computere, subliniind faptul că blocurile din care este construit sistemul sunt ele însele mici sisteme de calcul cu procesor și memorie. Modelele de arhitecturi cu memorie distribuită sunt de obicei notate ca arhitectura fara acces direct la memoria de la distanță(NORMA, Fără acces la memorie la distanță). Acest nume vine de la faptul că fiecare procesor are acces doar la memoria sa locală. Accesul la memoria de la distanță (memoria locală a altui procesor) este posibil doar prin schimbul de mesaje cu procesorul care deține memoria adresabilă.

O astfel de organizație se caracterizează printr-o serie de avantaje. În primul rând, la accesarea datelor, nu există nicio dispută pentru magistrală sau comutatoare - fiecare procesor poate folosi pe deplin lățimea de bandă a căii de comunicație cu propria sa memorie locală. În al doilea rând, absența unei magistrale comune înseamnă că nu există restricții asociate cu privire la numărul de procesoare: dimensiunea sistemului este limitată doar de rețeaua care conectează procesoarele. În al treilea rând, problema coerenței memoriei cache este eliminată. Fiecare procesor are dreptul de a-și schimba datele în mod independent, fără a-și face griji cu privire la potrivirea copiilor de date din propriul cache local cu cache-urile altor procesoare.

Principalul dezavantaj al calculatoarelor cu memorie distribuită este complexitatea schimbului de informații între procesoare. Dacă unul dintre procesoare are nevoie de date din memoria altui procesor, trebuie să facă schimb de mesaje cu acel procesor. Rezultă două tipuri de costuri:

    este nevoie de timp pentru a genera și redirecționa un mesaj de la unul! procesor la altul;

    Pentru a răspunde la mesajele de la alți procesoare, procesorul care primește trebuie să primească o cerere de întrerupere și să execute procedura de gestionare a întreruperilor.

Structura unui sistem cu memorie distribuită este prezentată în Fig. 11.4. La stânga! piese (Fig. 11.4, A) este prezentat un element de prelucrare (PE). Include) procesorul însuși (P), memoria locală (M) și două controlere de intrare/ieșire (K o și CD pe partea dreaptă (Fig. 11.4, b) prezintă un sistem cu patru procesoare, ilustrând modul în care mesajele sunt trimise de la un procesor la altul. În raport cu fiecare PE, toate celelalte elemente de procesare pot fi considerate pur și simplu ca dispozitive de intrare/ieșire. Pentru a trimite un mesaj către un alt PE, procesorul formează un bloc de date în memoria locală și își anunță controlorul local despre necesitatea de a transfera informații către dispozitiv extern. Prin intermediul rețelei de interconectare, acest mesaj este trimis controlerului I/O receptor al PE receptor. Acesta din urmă găsește un loc pentru mesaj în propria memorie locală și anunță procesorul sursă că mesajul a fost primit.

Orez. 11.4. Sistem de calcul cu memorie distribuită: a - element de procesare; b- combinarea elementelor de prelucrare o

O variantă interesantă a unui sistem de memorie distribuită este; model memorie partajată distribuită(DSM, Distribuiți memorie partajată), cunoscut și sub un alt nume arhitecturi cu eterogeneacces la memorie și coerență software(SC-NUMA, Software-Coerent Non-Uniform Memory Architecture). Ideea acestui model este că computerul, fizic fiind un sistem cu memorie distribuită, datorită sistemului de operare, este prezentat utilizatorului ca un sistem cu memorie partajată. Aceasta înseamnă că sistemul de operare oferă utilizatorului un singur spațiu de adresă, în ciuda faptului că accesul efectiv la memoria computerului „străin” BC este încă asigurat prin schimbul de mesaje.

Multiprocesorcoerența cache-ului

Un sistem multiprocesor cu memorie partajată constă din două sau mai multe procesoare independente, fiecare dintre ele executând fie o parte a unui program mare, fie program independent. Toate procesoarele accesează instrucțiunile și datele stocate într-o memorie principală comună. Deoarece memoria este o resursă partajată, conflictele între procesoare apar la accesarea acesteia, ceea ce duce la o creștere a latenței medii de acces la memorie. Pentru a reduce această latență, fiecărui procesor i se oferă un cache local, care, prin deservirea acceselor la memoria locală, în multe cazuri previne necesitatea accesului la memoria principală partajată. La rândul său, echiparea fiecărui procesor cu memorie cache locală duce la așa-numitul problema de coerență sau securitate conformmemorie cache. Conform , un sistem este coerent dacă fiecare operaţie de citire la orice adresă efectuată de oricare dintre procesoare returnează valoarea introdusă în timpul ultimei operaţii de scriere la această adresă, indiferent de ce procesor a efectuat ultima scriere.

În forma sa cea mai simplă, problema coerenței cache-ului poate fi explicată după cum urmează (Figura 11.5). Lăsați două procesoare R G și R g sunt conectate la memoria partajată printr-o magistrală. Mai întâi, ambele procesoare citesc variabila X. Copii ale blocurilor care conțin această variabilă sunt trimise din memoria principală către cache-urile locale ale ambelor procesoare (Fig. 11.5, A).În continuare, procesorul P t realizează operația de creștere a valorii variabilei X pe unitate. Deoarece o copie a variabilei se află deja în memoria cache a acestui procesor, va avea loc o lovire în cache și valoarea va fi modificată doar în memoria cache 1. Dacă procesorul P 2 efectuează din nou operația de citire X, atunci va apărea și o lovitură de cache și P 2 va primi valoarea „veche” stocată în memoria sa cache X(Fig. 11.5, b).

Menținerea coerenței necesită ca atunci când un element de date este modificat de către unul dintre procesoare, modificările corespunzătoare să fie făcute în memoria cache a procesoarelor rămase, unde există o copie a elementului de date modificat, precum și în memoria partajată. O problemă similară apare, de altfel, în sistemele cu un singur procesor unde există mai multe niveluri de memorie cache. Aici este necesar să se coordoneze conținutul cache-urilor de diferite niveluri.

Există două abordări pentru rezolvarea problemei de coerență: software și hardware. Unele sisteme folosesc strategii care combină ambele abordări.

Soluții softwareprobleme de coerență

Tehnicile software pentru rezolvarea problemei de coerență vă permit să faceți fără echipamente suplimentare sau să le reduceți la minimum)