2. TIPURI DE ARHITECTURI
2.1. Clasificarea arhitecturii sistemelor de calcul 2.1.1. Clasificarea Flynn Clasificarea Flynn se face după gradul de multiplicitate al şirurilor formate din secvenţe de instrucţiuni şi secvenţe de date care pot fi tratate simultan din punct de vedere hardware. Prin secvenţă de date se înţelege un şir de date de intrare, rezultate parţiale sau rezultate temporare care sunt apelate de către o secvenţă de instrucţiuni. Conform acestei clasificări există patru tipuri de arhitecturi: SISD (Single Instruction Stream – Single Data Stream); SIMD (Single Instruction Stream – Multiple Data Stream); MISD (Multiple Instruction Stream – Single Data Stream); MIMD (Multiple Instruction Stream – Multiple Data Stream). Pentru aceste arhitecturi există trei tipuri de componente de sistem: UC (unitatea centrală), UP (unitatea de prelucrare) şi MM (modulul de memorie). Deşi sunt diferite între ele, toate schemele următoare respectă succesiunea evenimentelor din arhitectura Von Neumann: instrucţiunile şi datele sunt extrase din memorie, instrucţiunile sunt decodate de UC care trimite secvenţa de instrucţiuni către UP pentru execuţie, datele circulă între memorie şi procesor pe o cale bidirecţională. În continuare se va nota şirul de date cu SD şi cel de instrucţiuni cu SI. 2.1.1.1. Arhitectura SISD
Fig. 2.1. Structura arhitecturii SISD.
Caracteristici: instrucţiunile sunt executate serial, însă pot exista suprapuneri în execuţie (pipeline). Majoritatea structurilor SISD rămase astăzi în uz folosesc structuri pipeline.
ARHITECTURA SISTEMELOR DE CALCUL
22
un calculator cu structură SISD poate avea mai multe elemente de prelucrare (funcţii definite), toate găsindu-se sub supervizarea aceleiaşi unice UC. Exemple: IBM 7090, VAX 11/780, CDC 6600, IBM 360/91, CRAY. Limitările arhitecturii SISD La acest tip de arhitecturi, viteza calculatorului este determinată de perioada ceasului. Dacă perioada ceasului scade, calculatorul devine în consecinţă mai rapid. Pentru a obţine un ceas mai rapid există două posibilităţi: calea de semnal să fie mai scurtă; tranzistoarele folosite să fie mai rapide. Din nefericire, se pare că ambele au atins o anumită limitare din punct de vedere tehnologic. Scurtarea căii de semnal ar costa foarte mult. Creşterea numărului de tranzistori pe unitatea de arie ar duce la creşterea dramatică a căldurii disipate în exterior. Sistemele suplimentare de răcire ar costa şi ele foarte mult. Se lucrează în prezent la fabricarea unor cipuri de joasă putere (Low Power Chips) care ar duce la scăderea căldurii generate. Aceasta se poate realiza prin menţinerea constantă a densităţii de energie în timp ce numărul de tranzistori pe unitatea de arie a cipurilor ar creşte. Realizarea de tranzistori mai rapizi este, de asemenea, foarte costisitoare. În acest scop se lucrează la scăderea rezistenţei firelor prin care trece curentul. Aluminiul este elementul folosit în 1998, dar recent s-a reuşit construcţia unui cip cu fire din cupru. Concomitent cu scăderea rezistenţei firelor se lucrează şi la îmbunătăţirea izolaţiei dintre fire. Este evident că perioada ceasului nu poate fi făcută egală cu 0. În consecinţă, modul secvenţial de tratare a operaţiilor impus de arhitectura von Neumann distruge orice speranţă într-o viitoare creştere a vitezei calculatoarelor. Această situaţie este cunoscută sub denumirea de gâtul sticlei lui Neumann (Neumann bottleneck). Pentru a sparge această limitare, trebuie introdusă o arhitectură de tip neserial. Alternativa este reprezentată de arhitecturile de calcul paralele. 2.1.1.2. Arhitectura SIMD Caracteristici: există mai multe UP datorită şirului de date multiplu, preluat din memoria partajată (memoria împărţită în mai multe memorii); corespunde matricelor de microprocesoare: UP identice şi supervizate de o singură UC; toate UP primesc instrucţiunile (setul unic de instrucţiuni) care acţionează asupra unor seturi de date diferite, provenite din şiruri diferite de date SD1, ..., SDn; maşinile SIMD pot efectua două tipuri de prelucrări: pe cuvânt (wordslice) şi pe bit (bit-slice).
Tipuri de arhitecturi
23
Fig. 2.2. Structura arhitecturii SIMD.
Aceste tipuri de maşini lucrează foarte bine pe seturi de date formate de matrice de dimensiuni foarte mari atunci când este necesar să se execute asupra lor aceeaşi operaţie. Maşinile SIMD sunt eficiente şi în cazul procesării reţelelor neurale. Exemplu: CM (Connection Machine) fabricată de Thinking Machines Company din Cambridge (Massachusetts). Limitările arhitecturii SIMD Aceste tipuri de maşini sunt destul de scumpe în ceea ce priveşte costurile de producţie, deoarece bancurile de procesoare nu sunt componente standard. Chiar dacă numărul celor care au nevoie de astfel de maşini este în continuă creştere, aceştia nu sunt destul de numeroşi pentru a justifica existenţa unor fabrici dedicate exclusiv producţiei de SIMD-uri. În consecinţă, aceste maşini sunt în general făcute la comandă şi costă foarte mult. 2.1.1.3. Arhitectura MISD Deşi această maşină este posibil de realizat din punct de vedere teoretic, nu a fost niciodată fabricată în scop comercial. A fost construită în laboratoare de cercetare, dar nu au existat clienţi dornici să investească într-o astfel de arhitectură, deoarece nu se adresează nici uneia dintre aplicaţiile de bază.
Fig. 2.3. Structura arhitecturii MISD.
Caracteristici: fiecare UC lucrează cu şirul de instrucţiuni propriu SI1, ..., SIn; fiecare UP lucrează cu acelaşi şir de date, care suportă mai multe prelucrări; partajare pe orizontală (un singur şir de date, mai multe şiruri de instrucţiuni);
24
ARHITECTURA SISTEMELOR DE CALCUL
ieşirea de la UP1 devine intrare pentru UP2 ş.a.m.d. Structura se numeşte macro-pipeline (are doar o valoare teoretică). 2.1.1.4. Arhitectura MIMD Aceste tipuri de calculatoare sunt cunoscute sub denumirea de multiprocesoare, chiar dacă şi maşinile SIMD sunt tot multiprocesor. În calculatoarele MIMD paralelismul este realizat prin lansarea în execuţie a mai multor instrucţiuni în acelaşi timp pe diferite seturi de date. Este evident că sunt necesare elemente adiţionale de control pentru a trimite instrucţiunea corectă şi data care trebuie la procesorul ales, toate în acelaşi timp. Cele mai multe sisteme multiprocesor intră în această clasă.
Fig. 2.4. Structura arhitecturii MIMD.
Avantajele arhitecturii MIMD sunt: viteză mare de prelucrare, dacă prelucrarea poate fi descompusă în fire paralele, toate procesoarele prelucrând simultan; întrucât procesoarele şi blocurile de memorie sunt resurse de tip general, defectarea unei unităţi se poate compensa prin alocarea sarcinii de prelucrare altei unităţi (grad ridicat de toleranţă la defectări); se poate utiliza reconfigurarea dinamică pentru a face faţă gradelor variabile de încărcare a procesoarelor. Exemple de sisteme MIMD: C.mmp, Cm* (Carnegie Mellon University), Ultracomputer (New York University), Cedar (University of Illinois), BBN Butterfly, Alliant FX, CM-5 (Thinking Machine Corporation), seria Intel iPSc etc. Sistemele MIMD se mai numesc intrinseci sau propriu-zise dacă au UP interactive: toate şirurile de date provin din acelaşi spaţiu de memorie adresat de cele n procesoare (dacă nu se întâmplă acest lucru – spaţii disjuncte ale memoriei – se spune că există un set de n sisteme SISD independente). Cele două tipuri de sisteme prezentate mai sus se mai numesc shared memory (memoria este accesată de toate procesoarele) şi shared nothing (fiecare procesor are propria memorie, propriul disc şi propriul sistem de comunicaţii). Dacă la un sistem MIMD intrinsec interacţiunea între microprocesoare este puternică, sistemul se numeşte cu cuplaj strâns. Legătura procesor – memorie se face prin intermediul unor magistrale de interconectare. Comunicaţia şi sincronizarea între procesoare se realizează prin zone comune de memorie. Avantaj: comoditate de programare oferită de spaţiul comun de adrese (shared address space).
Tipuri de arhitecturi
25
În caz contrar, sistemul se numeşte cu cuplaj slab. Legătura procesor – memorie se face prin conexiuni seriale punct-la-punct (de tip reţea). Comunicaţia între procesoare se face prin mesaje (message passing). Fiecare procesor dispune de memorie proprie (private memory). Avantaj: scalabilitate (posibilitate comodă de expandare). Cele mai multe sisteme comerciale sunt cu cuplaj slab. Exemple: IBM 370/168 – cuplaj slab, CRAY 2 – cuplaj strâns. 2.1.1.5. Sisteme cu memorie partajată (shared memory) În cazul maşinilor cu memorie partajată, maşina originală von Neumann a fost extinsă prin includerea a ceea ce se numeşte memorie cache. Aceasta este o memorie locală ataşată fiecărui procesor în parte, care îi permite procesorului să aibă acces rapid la propriile seturi de instrucţiuni şi date, dar să poată accesa în continuare memoria principală prin magistrala de memorie. Acest tip de maşină se mai numeşte arhitectură cu multiprocesare simetrică şi este prezentat în figura 2.5.
Fig. 2.5. Arhitectura sistemelor shared memory.
Dintre sistemele mai vechi, în această categorie se înscrie seria IBM RS/6000: J40, J50, R40 şi R50. Modelul J40 are două nivele de cache în loc de unul singur. În loc să folosească o magistrală pentru a lega diferitele procesoare cu memoria principală, IBM a dezvoltat un aşa-numit crossbar care, spre deosebire de magistrala convenţională, permite până la patru transferuri simultane cu memoria. Limitările arhitecturilor MIMD cu memorie partajată
Fig. 2.6. Limitările calculatoarelor cu memorie partajată.
26
ARHITECTURA SISTEMELOR DE CALCUL
La aceste arhitecturi, „gâtul sticlei” (bottleneck) îl reprezintă magistrala de memorie. Toate instrucţiunile şi datele fiecărui procesor trebuie să treacă prin această magistrală. Când procesoarele care folosesc aceeaşi memorie sunt puţine, performanţele depind liniar de numărul procesoarelor. Pe măsură ce acesta creşte, mărirea performanţelor este din ce în ce mai slabă, aşa cum rezultă din figura 2.6. Există două tipuri de sisteme MIMD cu memorie partajată: cu resurse globale (Global Shared Memory): o arhitectura UMA (Uniform Memory Access); o arhitectura UMA cu memorii cache locale; cu resurse distribuite (Distributed Shared Memory): o arhitectura NUMA (Non-Uniform Memory Access); o arhitectura COMA (Cache-Only Memory Access); o arhitectura CC-NUMA (Cache Coherent Non-Uniform Memory Access). A. Arhitecturile GSM (Global Shared Memory) Calculatoarele MIMD cu spaţiu unic de memorie au un cost relativ scăzut şi, din acest motiv, se bucură de o popularitate ridicată. Acestea sunt considerate a fi sisteme cu cuplaj strâns, datorită gradului ridicat de partajare a resurselor. Funcţionarea întregului sistem paralel este coordonată de către un singur sistem de operare, care se ocupă de planificarea în execuţie a proceselor pe procesoarele disponibile în sistem, în condiţiile în care se doreşte o încărcare cât mai echilibrată a acestora. Arhitectura UMA (Uniform Memory Access) Memoria fizică a calculatoarelor de tip UMA este compusă din mai multe blocuri care formează un spaţiu unic de adresare. Procesoarele accesează blocurile de memorie prin intermediul reţelei de interconectare (vezi figura 2.7), care poate fi statică (formată din conexiuni fixe, punct-la-punct, între nodurile reţelei) sau dinamică (formată din conexiuni variabile în timp, de tip crossbar).
Fig. 2.7. Arhitectura UMA.
Principala caracteristică a calculatoarelor UMA este că toate procesoarele au timp de acces egal la memoria partajată. Însă, tocmai de aceea, numărul procesoarelor utilizate în cadrul sistemului paralel nu poate fi foarte mare, deoarece creşterea numărului de procesoare din sistem atrage după sine o probabilitate mai mare de conflict în ceea ce priveşte accesarea concurentă a aceleiaşi zone de memorie. Într-un astfel de caz, se vor înregistra timpi de aşteptare care vor conduce la o utilizare ineficientă a procesoarelor şi la o încărcare neechilibrată a acestora.
Tipuri de arhitecturi
27
În plus, pentru obţinerea unor performanţe deosebite, reţeaua de comunicaţie va trebui să ofere o lărgime de bandă suficient de mare, deoarece fiecare procesor poate necesita accesul la memoria partajată, ceea ce presupune transportul datelor solicitate din memoria comună către procesorul care a formulat cererea. Arhitectura UMA cu memorii cache locale O îmbunătăţire adusă modelului UMA o reprezintă utilizarea memoriilor cache la nivelul elementelor de procesare (vezi figura 2.8). Fiecare procesor va avea asociată o astfel de memorie. Atunci când un procesor solicită date, mai întâi se verifică dacă aceste date se găsesc deja în memoria cache locală. În caz afirmativ, acestea se transferă foarte rapid procesorului, fără a accesa memoria partajată. Astfel, problema conflictelor de acces concurent la spaţiul unic de memorie se rezolvă, cel puţin, parţial. Mult mai puţine cereri vor ajunge să acceseze memoria partajată şi, din acest motiv, probabilitatea de apariţie a conflictelor devine mult mai mică.
Fig. 2.8. Arhitectura UMA cu memorii cache locale.
Utilizarea memoriilor cache presupune însă şi asigurarea consistenţei acestora. În momentul în care anumite date stocate în memoria globală se modifică, aceste modificări trebuie să fie semnalate tuturor memoriilor cache care stochează cópii ale datelor respective. Mai mult chiar, atunci când se schimbă conţinutul datelor de la nivelul unei memorii cache este nevoie ca modificările să fie efectuate în toate memoriile cache care conţin cópii ale datelor actualizate. Menţinerea coerenţei memoriei cache se poate realiza atât prin mecanisme software, cât şi prin mecanisme hardware. Modelele cu acces neuniform la memorie încearcă să evite dezavantajele întâlnite la calculatoarele de tip UMA. B. Arhitecturile DSM (Distributed Shared Memory) Reprezintă sisteme cu memorie partajată, dar care este distribuită din punct de vedere fizic. Astfel, procesoarele au asociate memorii locale care formează împreună o memorie globală care poate fi accesată direct de către toate elementele de procesare. Timpul de acces la locaţiile de memorie nu mai este uniform, el depinzând de localizarea fizică a datelor care se doresc a fi transferate.
28
ARHITECTURA SISTEMELOR DE CALCUL
Arhitectura NUMA (Non-Uniform Memory Access) În cazul acestui model, memoria partajată este distribuită fizic procesoarelor din sistem (vezi figura 2.9). Astfel, fiecare element de procesare are asociată o memorie locală. Toate aceste memorii locale formează un spaţiu unic de adresă şi, din acest motiv, timpul de acces la memorie este neuniform. Explicaţia este aceasta: accesul la datele aflate în memoria locală este foarte rapid, în timp ce accesul la datele aflate în memoria locală a altor elemente de procesare va fi mult mai lent, din cauza faptului că datele respective vor fi transportate prin reţeaua de comunicaţie.
Fig. 2.9. Arhitectura NUMA.
Observaţie. Sistemele NUMA sunt foarte asemănătoare sistemelor distribuite, din moment ce fiecare procesor dispune de o memorie locală, iar toate aceste module locale formează un spaţiu unic de adresare. O caracteristică importantă pentru maşinile NUMA este factorul NUMA. Acest factor arată diferenţele de latenţă pentru accesarea datelor din memoria locală comparativ cu accesarea dintr-o zonă care nu este locală. În funcţie de conexiunile sistemului, factorul NUMA poate diferi pentru diverse părţi ale maşinii: accesarea datelor dintr-un nod vecin este mai rapidă decât accesarea datelor dintr-un nod mai îndepărtat pentru care este necesară traversarea unui număr mai mare de etaje crossbar. Aşadar, atunci când este menţionat, factorul NUMA se referă de obicei la cele mai îndepărtate două procesoare ale unei reţele. Arhitectura COMA (Cache-Only Memory Access) În cazul modelului COMA, spaţiul global de adrese este format din memorii cache locale fiecărui procesor. Atunci când un procesor are nevoie de anumite date, acestea sunt mai întâi aduse în memoria cache de către controlerul de memorie, după care acestea vor fi accesate foarte rapid (vezi figura 2.10).
Fig. 2.10. Arhitectura COMA.
Tipuri de arhitecturi
29
Observaţie. Dispare conceptul de memorie globală, controlerul de memorie având responsabilitatea de a încărca în memoriile cache locale datele ce urmează a fi accesate de către procesoare. Încărcarea datelor presupune localizarea şi transportul acestora prin intermediul reţelei de interconectare. Prin folosirea memoriilor cache locale, probabilitatea ca un procesor să acceseze majoritar date numai din memoria locală creste foarte mult. Totuşi, folosirea memoriilor cache pe post de memorii locale atrage după sine şi o serie de probleme. Atunci când se încearcă aducerea unui bloc de date într-o memorie cache integral ocupată, apare necesitatea mutării unui alt bloc de date pentru a se crea spaţiul necesar memorării noului bloc care va fi accesat de către procesor. Însă, din cauza faptului că nu mai există o memorie globală în care să se scrie acest bloc, va fi nevoie ca datele conţinute să fie mutate în memoria cache a unui alt procesor. Aceste date însă nu vor fi niciodată accesate de către procesorul care foloseşte memoria respectivă, ceea ce conduce la o scădere a eficienţei de utilizare a sistemului. În plus, operaţia de transfer a blocului de date dintr-o memorie cache în alta este şi ea consumatoare de timpi de procesare, din moment ce datele trebuie să circule prin reţeaua de interconectare. Aceşti timpi morţi atrag după sine o utilizare ineficientă şi o încărcare neechilibrată a procesoarelor. O altă problemă o reprezintă asigurarea coerenţei memoriilor cache, în contextul în care operaţiile de mutare a blocurilor devin din ce în ce mai complicate, atunci când numărul de procesoare din sistem este din ce în ce mai mare. Controlerul de memorie trebuie să asigure gestiunea nu numai a datelor care vor fi aduse în memoriile cache, ci şi a blocurilor care au fost mutate dintr-o memorie locală în alta. Din aceste motive, arhitectura COMA este tot mai rar folosită. Arhitectura CC-NUMA (Coherent Cache NUMA) Modelul CC-NUMA combină modul în care este construit spaţiul unic de adresă la calculatoarele de tip NUMA şi la cele de tip COMA. Fiecare element de procesare al unui calculator de tip CC-NUMA dispune atât de o memorie locală. cât şi de o memorie cache asociată (vezi figura 2.11).
Fig. 2.11. Arhitectura CC-NUMA.
30
ARHITECTURA SISTEMELOR DE CALCUL
Ca şi în cazul modelului NUMA, accesul la datele stocate în memoria locală proprie este foarte rapid. Accesarea unor date aflate în memoria locală a unui alt procesor implică aducerea acestora în memoria locală proprie. Transferul de date folosind reţeaua de comunicaţie atrage după sine întârzieri, deoarece nu este la fel de rapid precum accesarea memoriilor locale. Existenţa memoriilor cache are ca efect reducerea traficului prin reţeaua de comunicaţie. Datele solicitate de către un procesor sunt mai întâi căutate în memoriile locale, după care sunt aduse în memoria cache, în cazul în care acestea se găsesc în memoria locală a unui alt procesor. La accesările ulterioare, se va folosi copia datelor respective stocată în memoria cache, deci nu va mai fi nevoie ca datele să fie din nou transferate prin reţeaua de interconectare. Utilizarea memoriile cache implică necesitatea implementării unor mecanisme software sau hardware care să asigure consistenţa memoriilor cache. La modificarea unor date aflate în memoria locală a unui procesor, este nevoie să se actualizeze toate copiile acestor date aflate în memoriile cache. Aceste mecanisme care asigură coerenţa memoriilor cache contribuie la creşterea traficului efectuat în cadrul reţelei de interconectare. Arhitectura CC-NUMA este utilizată de o serie de supercalculatoare foarte cunoscute: Bull NovaScale, HP Superdome şi SGI Altix. Dezavantajele arhitecturilor DSM Principalul dezavantaj al arhitecturilor MIMD cu memorie distribuită şi cu spaţiu individual de adresare (NUMA, COMA, CC-NUMA) îl reprezintă întârzierile care pot să apară atunci când un procesor doreşte să acceseze date aflate în memoria locală a unui alt element de procesare. Aceste întârzieri sunt cauzate de faptul că procesorul respectiv va aştepta ca datele solicitate să fie transportate în memoria sa locală. Pentru minimizarea timpilor de inactivitate, procesorul în cauză poate efectua o comutare de procese, atunci când procesul activ este blocat în aşteptarea datelor solicitate. În general comutarea proceselor este o operaţiune complexă, implicând costuri importante, ce pot influenţa performanţele sistemului. Eficienţa operaţiei de comutare poate fi substanţial îmbunătăţită prin utilizarea firelor de execuţie (thread-uri). Un proces poate fi împărţit în mai multe fire de execuţie, care comunică între ele prin accesul la spaţiul de adresă alocat procesului, pe care îl partajează. Din acest motiv, firele de execuţie reprezintă un mecanism eficient de exploatare a concurenţei programelor. Un fir de execuţie reprezintă cea mai mică entitate de planificare în sistemele bazate pe thread-uri. Comutarea între două fire de execuţie care aparţin aceluiaşi proces este o operaţie foarte rapidă, care nu atrage după sine costuri suplimentare semnificative. Astfel, procesul activ este suspendat până în momentul în care datele solicitate au fost aduse în memoria locală. În acest timp, este executat un alt fir de execuţie al aceluiaşi proces. Această comutare între fire de execuţie aparţinând aceluiaşi proces conduce la scăderea timpilor de inactivitate şi, implicit, la creşterea eficienţei cu care este utilizat sistemul paralel. Calculatoarele MIMD cu memorie distribuită se numesc multicalculatoare şi reprezintă sisteme cu cuplaj slab, din cauza gradului redus de partajare a resurselor.
Tipuri de arhitecturi
31
Principalul avantaj al acestor sisteme îl reprezintă scalabilitatea, adică, posibilitatea extinderii prin conectarea unor noi procesoare. Creşterea numărului de procesoare nu atrage după sine probleme legate de accesul concurent la memorie, deoarece majoritatea apelurilor sunt către memoria locală. Însă transferul de mesaje presupune schimburi de date care pot aglomera reţeaua. Transferul de date între două procesoare este o operaţie mare consumatoare de timp. Din acest motiv, performanţele reţelei de interconectare pot influenţa în mod hotărâtor eficienţa cu care este utilizat sistemul paralel. În plus, este foarte greu ca sarcina de calcul distribuită procesoarelor să fie echilibrată. Sistemul de operare rulează în fiecare nod şi, din acest motiv, întregul sistem poate fi văzut ca fiind format din staţii de lucru care comunică prin transfer de mesaje. Complexitatea acestor sisteme este foarte mare, datorită faptului că într-un nod de procesare individual se poate găsi un simplu procesor sau un întreg sistem de tip UMA. Exemple de arhitecturi MIMD cu memorie partajată Din perspectivă istorică, maşinile paralele cu memorie partajată sunt de trei categorii: bazate pe magistrală (Pentium SMP, nodul IBM SP), bazate pe directoare de tip CC-NUMA (Origin 2000) şi cu spaţiu de adresare global (Cray T3D, T3E). Maşinile multiprocesor din anii '60 ai secolului trecut aveau structura din figura 2.12.a. Capacitatea de memorare sau posibilitatea de comunicare I/O se puteau ameliora prin adăugarea de module de memorie şi de dispozitive I/O.
Fig. 2.12. a. Arhitectura sistemelor multiprocesor. b. Arhitectura reţelei crossbar (multistage).
Creşterea capacităţii de procesare se putea realiza prin adăugarea de procesoare. Apărea deja necesitatea unei interconectări a modulelor de memorie, a procesoarelor şi a legăturilor cu canalele I/O. Se foloseau reţele multietajate de tip crossbar sau multistage (vezi figura 2.12.b). Memoriile cache, marea lovitură a anilor '70, au fost de natură a influenţa puternic structurile de memorare. Sistemele de memorie scalate prin adăugarea de module suplimentare aveau nevoie de capacitate, dar şi de viteză ridicată. Memoria era o sursă de strangulări (bottleneck). Introducerea memoriilor cache a schimbat aproape radical datele problemei. 2.1.1.6. Sisteme fără memorie partajată (shared nothing) În acest caz, fiecare procesor are propria lui memorie. Aceste maşini sunt practic calculatoare independente legate într-o reţea. Fiecare calculator se mai numeşte şi nod (al reţelei). Arhitectura shared nothing se mai numeşte cu multiprocesare asimetrică şi este prezentată în figura 2.13.
32
ARHITECTURA SISTEMELOR DE CALCUL
Fig. 2.13. Arhitectura sistemelor shared nothing.
Pentru ca aceste calculatoare să lucreze bine trebuie să existe un protocol bun de transmitere a mesajelor între ele. Acest protocol trebuie să fie foarte rapid şi fără erori. IBM foloseşte în acest scop protocolul Message Passing Interface (MPI) şi mai multe căi redundante care formează un switch de mare viteză. Aceste noduri sunt conectate şi printr-o reţea convenţională Ethernet din motive de management al sistemului.
2.1.2. Clasificarea Wang Criteriul de clasificare este în acest caz gradul de paralelism în procesarea cuvintelor, respectiv biţilor de date. Datele pot fi configurate într-o matrice (vezi figura 2.14). Se notează cu m numărul de cuvinte procesate la un moment dat şi cu n lungimea unui cuvânt.
Fig. 2.14. Organizarea datelor într-o matrice.
Conform acestei clasificări, există patru tipuri de arhitecturi: WSBS (Word Serial – Bit Serial). Se lucrează pe un singur cuvânt, fiecare cuvânt fiind prelucrat bit cu bit: m = 1, n = 1; WSBP (Word Serial – Bit Parallel): m = 1, n > 1; WPBS (Word Parallel – Bit Serial): m > 1, n = 1; WPBP (Word Parallel – Bit Parallel): m > 1, n > 1. În cazul tipului WPBP, structura paralelă este completă, corespunzătoare prelucrării pe matrice m n. În cazul tipului WSBP, prelucrarea este pe orizontală, iar în cazul tipului WPBS, prelucrarea este pe verticală.
Tipuri de arhitecturi
33
2.2. Structura fizică a unui calculator secvenţial Calculatorul numeric este un sistem fizic de prelucrare automată a informaţiei codificate sub formă de valori discrete, conform unui program, care indică o succesiune determinată de operaţii aritmetice şi logice. Sistemul de calcul este compus din două subsisteme principale: subsistemul hardware (echipamente fizice componente); subsistemul software (programele şi structurile de date). Structura de bază a calculatorului secvenţial, cu program memorat, stabilită de von Neumann în 1945, este reprezentată în figura 2.15 şi cuprinde cinci unităţi funcţionale: unitatea de intrare (UI), unitatea de memorare (M), unitatea de ieşire (UE), unitatea aritmetico-logică (UAL) şi unitatea de comandă (UCd).
Fig. 2.15. Maşina von Neumann.
Linia continuă reprezintă fluxul de date şi instrucţiuni, iar linia întreruptă, fluxul de comenzi şi stări. Unitatea de comandă (UCda) controlează activitatea tuturor componentelor din sistem pe baza unei secvenţe de instrucţiuni, reprezentând programul memorat. Caracterul secvenţial al calculatorului rezultă din modul de execuţie al programului. Sunt necesare următoarele etape majore (vezi figura 2.16): încărcarea instrucţiunii IF (instruction fetch); decodificarea instrucţiunii ID (instruction decoding); încărcarea (din memorie) a operanzilor OF (operand fetch); execuţia operaţiilor impuse de instrucţiune EX (execution). După terminarea unei instrucţiuni, se trece la următoarea instrucţiune. Astfel, programul este executat secvenţial, instrucţiune cu instrucţiune.
34
ARHITECTURA SISTEMELOR DE CALCUL
Fig. 2.16. Etapele execuţiei secvenţiale a unei instrucţiuni.
Unitatea aritmetico-logică (ALU) realizează prelucrarea informaţiei preluate din memorie, iar rezultatele se depun din nou în memorie sau sunt furnizate în exterior. ALU realizează două categorii de operaţii: aritmetice: adunare, scădere, înmulţire, împărţire; logice: ŞI, SAU, SAU-EXCLUSIV, NEGAŢIE. Unitatea de comandă şi cea aritmetico-logică, împreună cu memoria, formează unitatea centrală (UC sau CPU) a calculatorului. Datele şi programele sunt introduse în calculator prin intermediul unităţii de intrare, fiind apoi depuse în memorie.
2.2.1. Structuri de calculatoare paralele Calculatoarele paralele se clasifică în trei configuraţii arhitecturale: calculatoare pipeline (CPL); calculatoare (procesoare) matriceale (CM); calculatoare (sisteme) multiprocesor (CMP). Un calculator pipeline utilizează paralelismul temporar. Procesoarele matriceale se bazează pe mai multe unităţi ALU sincronizate pentru a atinge paralelismul spaţial. Un sistem multiprocesor este caracterizat de paralelism asincron, în sensul că setul de procesoare din structura sa interacţionează şi îşi împart resursele (memorii, baze de date). În acelaşi timp, procesoarele matriceale apelează la paralelism sincron (blocuri comandate printr-un unic semnal de ceas). Cele patru tipuri de paralelism enunţate nu se exclud reciproc. Cele mai multe dintre procesoarele actuale au structura internă bazată pe tehnologia pipeline şi multe dintre acestea pot fi organizate în sisteme matriceale sau multiprocesor. Diferenţa de bază dintre un procesor matriceal şi un sistem multiprocesor este aceea că unităţile funcţionale din procesorul matriceal operează sincron, în timp ce procesoarele sistemului multiprocesor funcţionează asincron. Tendinţele indică utilizarea calculatoarelor controlate prin flux de date cu procesoare algoritmice VLSI. Aceste tipuri de calculatoare sunt caracterizate printr-o creştere masivă a hardware-ului pentru a atinge paralelismul.
Tipuri de arhitecturi
35
2.2.1.1. Calculatoare pipeline Execuţia unei instrucţiuni presupune patru faze majore: încărcarea instrucţiunii – IF, decodarea instrucţiunii – ID, încărcarea operanzilor – OF şi execuţia efectivă – EX. În procesoarele non-pipeline, aceste faze se desfăşoară secvenţial, iar în procesoarele pipeline se desfăşoară cu paralelism temporal. Pentru procesoare complexe, faza de execuţie a instrucţiunii poate fi partajată în suboperaţii organizate după principiul pipeline. Problemele care apar în calculatoarele pipeline sunt datorate conflictelor de acces la memorie, salturilor şi întreruperilor. Datorită suprapunerii operaţiilor, calculatoarele pipeline (CPL) sunt optimizate pentru a efectua operaţii de acelaşi tip. Ori de câte ori se modifică tipul operaţiei (instrucţiunii), registrele pipeline trebuie şterse şi reîncărcate şi, ca urmare, se consumă timp suplimentar. Proiectarea CPL include: secvenţializarea sarcinilor (task-urilor), prevenirea conflictelor de acces (coliziunilor), controlul congestiei şi controlul salturilor în program. O schemă funcţională a unui CPL este ilustrată în figura 2.17.
Fig. 2.17. Structura funcţională a unui calculator pipeline.
În schema de mai sus, există două structuri pipeline: una pentru date scalare şi una pentru date vectoriale. Faza de încărcare a operaţiilor este împărţită în două subfaze independente, corespunzătoare operării cu scalari sau cu vectori. Faza de execuţie se desfăşoară în două procesoare distincte, asociate scalarilor sau vectorilor.
36
ARHITECTURA SISTEMELOR DE CALCUL
Tehnica pipeline Execuţia unei instrucţiuni este privită ca fiind alcătuită din mai multe faze (sau stagii), care se succed una după alta şi care pot fi tratate de unităţi specializate, într-un mod asemănător funcţionării unei linii de asamblare (de ex.: de automobile). Exemplu. Fie un şir de procese care are loc la execuţia unei instrucţiuni.
Fig. 2.18. Exemplu de şir de procese la execuţia unei instrucţiuni şi desfăşurarea lor în timp.
Se presupune că de fiecare din aceste procese se ocupă o unitate specializată. Când se atinge al cincilea impuls de ceas, la toate cele cinci procese se lucrează în paralel; astfel se măreşte de cinci ori viteza de execuţie. În faza încadrată, instrucţiunea 5 este în faza de încărcare, instrucţiunea 4 în faza de decodare etc. Problema este că începând din momentul de timp încadrat poate să apară fenomenul de strangulare, pentru că una sau mai multe instrucţiuni aflate între P1 şi P5 pot să nu fie instrucţiuni utile (de exemplu, instrucţiuni de salt). Deşi există un paralelism în execuţia instrucţiunilor, aceasta este o maşină pipeline de tip SISD. 2.2.1.2. Calculatoare matriceale Un procesor matriceal tipic este prezentat în figura 2.19. Există două unităţi funcţionale distincte: o unitate de control şi sincronizare a elementelor de procesare (care are ca sarcină suplimentară efectuarea operaţiilor cu scalari) şi o unitate de prelucrare matriceală. Fiecare element de prelucrare (EP) reprezintă un element pasiv, adică, fără posibilitatea de a decodifica instrucţiuni. Încărcarea instrucţiunilor şi decodarea lor (fazele IF şi ID) pentru unitatea de prelucrare matriceală este efectuată de către unitatea de control, prin intermediul unei reţele de interconectare între EP. Fiecare element de prelucrare este alcătuit dintr-o unitate ALU, registre şi memorie locală, iar conexiunea dintre elemente este realizată într-o arhitectură de tip NUMA. Pentru o sesiune de lucru specifică, unitatea de control stabileşte funcţia ALU pentru fiecare EP, după care transferă operanzi din exterior către memoriile locale ale EP şi rezultatele de la un EP spre alt EP (utilizând reţeaua de interconectare). Programarea CM este mult mai dificilă decât programarea CPL.
Tipuri de arhitecturi
Fig. 2.19. Structura funcţională a unui calculator matriceal.
2.2.1.3. Calculatoare multiprocesor Structură de bază a unui CMP este prezentată în figura 2.20.
Fig. 2.20. Calculator multiprocesor.
37
38
ARHITECTURA SISTEMELOR DE CALCUL
Notaţiile din figura 2.20 sunt următoarele: P1 … Pn – procesoare; ML1 … MLn – memorii locale. Sistemul este alcătuit din mai multe procesoare care împart resurse comune (memorie), dar posedă şi resurse proprii (private), într-o arhitectură de tip UMA cu memorii (cache) locale. Procesoarele funcţionează independent (asincron), dar trebuie să comunice între ele. Structura de interconectare între procesoare şi între procesoare şi resursele comune determină organizarea sistemului multiprocesor. Există trei mari categorii de interconectări: 1. partajarea unei magistrale comune (bus); 2. utilizarea unei reţele de interconectare totală (crossbar); 3. utilizarea unei memorii multiport (ca memorie comună, duală). CMP pot fi centralizate sau distribuite. Sistemele centralizate conţin toate procesoarele în acelaşi sistem de calcul, spre deosebire de sistemele distribuite, în care procesoarele pot fi fizic plasate în subsisteme diferite. Pentru sistemele distribuite este necesară o reţea de comunicaţie rapidă, flexibilă (adaptabilă) şi fiabilă.
2.2.2. Mecanisme de prelucrare paralelă Aceste soluţii de implementare a prelucrării paralele sunt corelate cu arhitecturile clasificării Flynn în privinţa soluţiilor hardware, soluţiile software fiind specifice sistemelor de operare care gestionează intervalele de timp alocate diferitelor aplicaţii şi speculând astfel posibilitatea prelucrărilor paralele. 2.2.2.1. Soluţii hardware de prelucrare paralelă Multiplicarea şi specializarea unităţilor aritmetico-logice (ALU) Procesoarele clasice aveau o singură unitate de tip ALU. În acest fel, nu se efectua decât o singură operaţie la un moment dat. Prin multiplicarea ALU, majoritatea funcţiilor pot fi distribuite între unităţile specializate pe o anumită funcţie aritmetică sau logică şi pot funcţiona în paralel. În unele procesoare există două ALU care pot lucra în paralel (o unitate pentru aritmetica în virgulă fixă şi alta pentru aritmetica în virgulă mobilă). Ideea specializării funcţionale şi a distribuirii şi multiplicării ALU (numite şi unităţi funcţionale) poate fi extinsă atât la sistemele multiprocesor, cât şi la cele matriceale. Acest mecanism constituie, de fapt, implementarea paralelismului la sistemele SISD. În figura 2.21 se prezintă un exemplu de schemă pentru figurarea acestei soluţii. Unitatea centrală conţine 5 unităţi ALU specializate pe diferite operaţii, care pot lucra în paralel. În timp ce o instrucţiune este executată de o anumită unitate ALU, unitatea de comandă încarcă şi decodifică o altă instrucţiune pe care o încredinţează unei alte unităţi ALU ş.a.m.d.
Tipuri de arhitecturi
39
Fig. 2.21. Multiplicarea ALU prin specializarea pe operaţii.
Sistemul este eficient dacă timpul de execuţie de către ALU a unei operaţii este mult mai mare decât timpul de încărcare şi decodificare a unei instrucţiuni. Această condiţie este, în general, îndeplinită. Exprimarea algebrică a condiţiei de eficienţă pentru multiplicarea şi specializarea ALU este: tEX(ALU) >> tIF + tID. Paralelism şi structură pipeline în CPU Primele generaţii de microprocesoare utilizau ALU (în special, sumatoare) care operau cu flux de biţi (serial). Introducerea unui ALU care operează în paralel, pe flux de 8, 16, 32 sau 64 biţi simultan (cu sumatoare, cu transport anticipat sau multiplicatoare matriceale) duce la creşterea vitezei de prelucrare. Arhitectura superscalară În arhitectura superscalară, şiruri de instrucţiuni diferite (de obicei două, eventual mai multe), utilizează resurse diferite în aceleaşi stadii de execuţie a instrucţiunilor de pe fiecare şir. Un exemplu particular de arhitectură superscalară este prezentat în figura 2.22.
40
ARHITECTURA SISTEMELOR DE CALCUL
Fig. 2.22. Arhitectura superscalară.
Structura superscalară cu tehnică de burst (citire în rafale) este folosită începând cu microprocesorul 80486 şi este corelată cu momentul introducerii în capsula procesorului a memoriei cache de nivel 1. Tehnica burst foloseşte această memorie pentru a citi blocuri de instrucţiuni din memoria cache, instrucţiuni care au fost încărcate acolo din memoria principală (MP) în mod secvenţial (vezi figura 2.23). În acest mod, se citesc dintr-o dată fie două, fie patru cuvinte, în funcţie de dimensiunea instrucţiunii (pe 32 sau 16 biţi). S-a folosit iniţial o magistrală internă între cache şi decodificatorul de instrucţiuni de 64 biţi, ajungându-se în prezent la 128 de biţi.
Fig. 2.23. Arhitectura superscalară cu tehnică de burst (citire în rafale).
Tipuri de arhitecturi
41
Exemplu. Schema din figura 2.24 reprezintă o arhitectură superscalară cu trei şiruri de instrucţiuni diferite. Se execută în acelaşi timp o operaţie cu numere reale şi două operaţii cu numere întregi. Fiecare unitate este de tip pipeline şi poate executa câteva operaţii în diferite stagii pipeline.
Fig. 2.24. Exemplu de arhitectură superscalară cu trei unităţi pipeline în paralel.
Arhitectura superpipeline Se bazează pe divizarea stagiului pipeline în substagii şi, deci, pe creşterea numărul de instrucţiuni care sunt procesate de pipeline la un moment dat. Divizând fiecare stagiu în două substagii, perioada ciclului de ceas τ va fi redusă la jumătate: τ/2. La capacitate maximă, structura pipeline produce un rezultat la fiecare τ/2 secunde. Pentru o arhitectură dată şi setul de instrucţiuni aferent ei, există un număr optim de stagii pipeline. Dacă numărul de stagii pipeline creşte peste această limită, se va reduce performanţa globală. O soluţie pentru a creşte viteza fără a face compromisuri este arhitectura superscalară, prezentată anterior. În figura 2.25, este prezentat un exemplu de execuţie pipeline (a), superpipeline (b) şi superscalară (c) a unei instrucţiuni. Suprapunerea operaţiilor CPU cu operaţiile I/O Utilizarea unor controlere I/O separate permite efectuarea în paralel a operaţiilor interne ale CPU cu operaţii de transfer de date pe canalele I/O. Exemple de controlere I/O: controlere DMA (Direct Memory Access), care permit transferul direct de date: memorie – memorie sau memorie – canale I/O, bazat pe principiul cererii de magistrală (aceasta reprezintă una dintre tehnicile evoluate de transfer de date, vezi paragraful 3.4.4.2); procesoare specializate I/O, care lucrează pe canale I/O cu sarcini specifice.
42
ARHITECTURA SISTEMELOR DE CALCUL
a
b
c Fig. 2.25. Modul de operare al tehnicilor pipeline (a), superpipeline (b) şi superscalară (c).
Unitate ALU vectorială
Fig. 2.26. Arhitectură SIMD cu unitate ALU vectorială.
Este o soluţie de paralelism pentru sistemele SIMD, prezentată în figura 2.26.
Tipuri de arhitecturi
43
Utilizarea unui sistem ierarhizat de memorie Memoria unui sistem de calcul trebuie să satisfacă mai multe cerinţe, adesea contradictorii: capacitate mare, timp de acces mic, cost rezonabil şi dimensiuni reduse. Aceste cerinţe nu pot fi îndeplinite simultan de un singur tip de memorie. Cu tehnologia actuală se pot realiza memorii de mare viteză, dar de capacitate mică (RAM static), memorii de capacitate mare, dar de viteză medie (variante de memorii DRAM) sau memorii de capacitate foarte mare, dar cu timp de acces ridicat (memorii externe pe suport magnetic sau optic). În sistemele de calcul performante, spaţiul de memorare este ierarhizat pe mai multe nivele, cu scopul de a beneficia de avantajele oferite de diverse tipuri de memorii. Un sistem de calcul cu memorie organizată ierarhizat poate echilibra diferenţele de viteză între componentele sistemului (CPU, memorie, discuri) . Într-o astfel de arhitectură, memoria este organizată pe patru niveluri: registrele CPU; memoria cache (MC); memoria principală sau operativă (MP); memoria virtuală (MV). Registrele CPU sunt direct adresabile de către ALU. Memoria cache (rapidă) este cea mai apropiată de CPU, ceea ce impune ca timpul de acces să fie mic, capacitatea fiind limitată. Aici sunt păstrate instrucţiunile şi datele cu probabilitatea cea mai mare de a fi utilizate într-o proximitate de timp. Memoria cache reprezintă un tampon între memoria principală şi CPU. Memoria principală sau operativă păstrează programele şi datele aferente în curs de execuţie. Ea poate fi adresată în mod aleatoriu de un program utilizator. Are o capacitate medie-mare şi un timp de acces mediu. Este un tampon între memoria virtuală şi CPU. Memoria virtuală este un concept arhitectural prin care memoria operativă este extinsă peste spaţiul de adresare al memoriei externe (hard disk, bandă magnetică). Prin tehnicile de implementare, numite segmentare şi paginare (vezi capitolul 6), se urmăresc două aspecte esenţiale: creşterea resurselor de memorare disponibile pentru programele utilizator; protejarea zonelor de memorie alocate modulelor de program. Memoria virtuală este utilă în cazul sistemelor de operare multitasking şi multiuser (Windows, Unix). În general, tehnicile de implementare a MC şi a MV sunt transparente pentru programele utilizator. Aparent, programele de aplicaţie lucrează numai cu memoria principală. Transferul de informaţii între diferitele nivele de memorie se realizează în mod automat, fie de către componente hardware specializate (unitatea de gestiune a memoriei, MMU), fie de către sistemul de operare. Procesoarele recente oferă suport hardware pentru implementarea memoriei cache şi a memoriei virtuale. Eficienţa utilizării unei arhitecturi ierarhizate de memorie se bazează pe câteva principii legate de modul de utilizare a informaţiilor conţinute în memorie. Astfel, conform principiului localizării referinţei, adresarea locaţiilor de memorie se realizează într-o secvenţă repetitivă. Există o probabilitate mare ca o
44
ARHITECTURA SISTEMELOR DE CALCUL
locaţie adresată de curând să fie adresată şi într-un timp imediat – localizare temporară – şi, similar, este previzibil ca şi locaţiile adiacente să fie accesate în curând – localizare spaţială. Principiile localizării temporale şi spaţiale sunt o consecinţă a modului uzual de execuţie a secvenţelor de program. Exemple: un program conţine bucle care presupun execuţia repetitivă a aceleiaşi secvenţe de instrucţiuni; execuţia instrucţiunilor este, în majoritatea cazurilor, secvenţială (succesiunea în execuţie), excepţie făcând instrucţiunile de salt; secvenţa de program (procedura) utilizează repetitiv aceeaşi variabilă sau adresează repetat elemente ale unei structuri de date (tablouri, înregistrări). Concluzie. Statistic s-a constatat că pentru majoritatea programelor este valabilă următoarea regulă: 90% din timpul afectat unui program este utilizat pentru execuţia a numai 10% din codul acestuia. Pe baza acestor observaţii, informaţiile pot fi amplasate în mod dinamic pe diferite niveluri ierarhice ale memoriei, în funcţie de probabilitatea de a fi utilizate. 2.2.2.2. Soluţii software de prelucrare paralelă Prelucrarea pe loturi Prelucrarea pe loturi (batch processing) presupune formarea unui fişier cu extensia .bat şi lansarea lui. Procesele au loc succesiv, iar CPU (care execută operaţiile de calcul) nu este folosită în mod eficient.
Fig. 2.27. a. Prelucrarea pe loturi. b. Multiprogramarea.
Tipuri de arhitecturi
45
Exemplu. Fie trei procese paralele, P1, P2 şi P3, fiecare fiind văzut în timp ca o succesiune de trei etape: intrare (i), calcul (c), ieşire (o) (vezi figura 2.27.a). Multiprogramarea În acelaşi interval de timp pot exista mai multe programe (procese) active în sistemul de calcul, concurând pentru memorie, I/O şi CPU. Totuşi, unele programe sunt orientate către calcule (utilizând intens CPU), în timp ce altele sunt orientate către citirea/scrierea dispozitivelor I/O. Se pot astfel organiza (intercala) cele două clase de programe pentru a obţine un timp de prelucrare global cât mai bun. În figura 2.27.b, câştigul de timp este notat cu Δ. Intercalarea programelor permite utilizarea mai eficientă a resurselor calculatorului prin suprapunerea operaţiilor I/O cu operaţiile CPU. Acest mod de organizare este gestionat de sistemul de operare (programul de supervizare). Astfel, multiprogramarea se poate defini ca intercalarea operaţiilor CPU cu operaţii I/O pentru mai multe programe. Observaţii. 1. P1, P2 şi P3 pot aparţine aceluiaşi program sau unor programe diferite. 2. În cadrul multiprogramării, se poate întâmpla ca un proces cu prioritate mare să ocupe CPU un timp îndelungat şi în acest fel se împiedică execuţia altor procese. Neajunsul se poate înlătura folosind un sistem de operare cu divizare în timp. Diviziunea în timp (time sharing) Diviziunea în timp reprezintă împărţirea timpului de execuţie al CPU între toate procesele (task-urile) active din sistemul de calcul. Cuantele de timp alocate fiecărui proces pot fi inegale de la un proces la altul. Dacă există proces dominant, viteza de prelucrare poate creşte astfel mai mult decât în cazul multiprogramării, pentru procesele care urmează celui dominant (vezi cazul particular din figura 2.28).
Fig. 2.28. Repartizarea în timp a desfăşurării proceselor (time sharing).
46
ARHITECTURA SISTEMELOR DE CALCUL
Procesul de calcul se împarte în mai multe etape. În funcţie de divizarea în intervale de timp, se poate face ca procesele să se termine aproximativ în acelaşi interval de timp (nu există un proces dominant). Diviziunea în timp constituie o atribuţie a sistemului de operare (numit, în acest caz, sistem de operare cu diviziune în timp). Utilizarea diviziunii în timp a programelor (sau a proceselor) în sistemele uniprocesor creează conceptul de procesor virtual. Exemplu: sisteme de calcul cu un singur procesor şi mai multe terminale. Pentru subiectul uman, răspunsul unicului procesor este suficient de rapid astfel încât să se considere că fiecare terminal operează independent, ca şi cum ar poseda el însuşi procesor (utilizatorul are impresia că lucrează singur pe calculator). Conceptul de diviziune în timp poate fi extins în mod similar la sistemele multiprocesor. Observaţii. 1. În cazul multiprogramării, procesele îşi termină faza de calcul (în CPU), apărând suprapunere doar între operaţii CPU şi operaţii I/O. 2. În cazul diviziunii în timp, procesele nu îşi termină faza de calcul înainte de a se executa alt proces; procesele pot fi intercalate, astfel încât să se câştige timp de execuţie în raport cu multiprogramarea (suprapuneri între operaţii CPU şi operaţii I/O, respectiv între diferite operaţii I/O). Noţiunea de multithreading Termenul de multithreading reprezintă un aspect important al proiectării software, care necesită atenţie specială în construcţia sistemelor mari şi, în deosebi, atunci când se pune problema eficienţei (exprimate în termeni de viteză a sistemului) şi a performanţei (exprimate în termeni de corectitudine în funcţionare a sistemului). Folosind adecvat instrucţiunile de multithreading, se pot realiza aplicaţii optimizate. Fiecare aplicaţie sau program care rulează pe sistemul de operare este un proces alcătuit din unul sau mai multe fire (thread-uri). Un thread este un set de instrucţiuni sau o parte anume a aplicaţiei, care se execută independent în cadrul programului sau sistemului. Thread-urile sunt entităţi responsabile cu multitasking-ul în cadrul unei singure aplicaţii. De obicei, sistemul de operare (SO) se ocupă cu programarea şi executarea thread-urilor. Multithreading-ul presupune execuţia în paralel a mai multor procese, pentru a îmbunătăţi eficienţa sistemului. Thread-urile sunt implementate în situaţiile în care trebuie îndeplinite mai multe sarcini simultan. Avantajele threading-ului sunt următoarele: sarcinile care cer mai mult timp de execuţie pot fi rulate în background; interfaţa aplicaţiei poate fi realizată mai atrăgător şi mai simplu de utilizat (de ex.: după apăsarea unui buton se afişează o bară de progres); viteza aplicaţiei poate creşte; thread-urile pot fi folositoare în situaţiile în care există decalaje între anumite evenimente, putându-se astfel elibera anumite resurse care nu sunt necesare la un moment dat.
Tipuri de arhitecturi
47
Modelele de threading suportate de sistemele win32 sunt: 1. Modelul thread-ului unic (Single Thread Model). Acest tip de thread presupune rularea unui singur thread la un moment dat. Restul thread-urilor trebuie să aştepte. Principalul dezavantaj al acestui tip de thread îl reprezintă timpii lungi de execuţie pentru sarcini mici. Corespunde din punct de vedere conceptual prelucrării pe loturi (batch processing). 2. Modelul Apartment Thread (Single Thread Apartment Model – STA). În acest model, pot exista mai multe thread-uri care se execută în cadrul aplicaţiei. În STA, fiecare thread este izolat într-un „apartament” separat în cadrul procesului. Fiecare proces poate avea mai multe apartamente, care pot partaja date între ele. În acest caz, aplicaţia este răspunzătoare pentru stabilirea duratei fiecărui thread din cadrul fiecărui apartament. Toate cererile sunt ordonate folosind Windows Message Queue, astfel încât un singur apartament poate fi accesat la un moment dat. Avantajul acestui model fată de modelul thread-ului unic este că se pot procesa simultan mai multe cereri ale utilizatorului. Totuşi, nu este atinsă încă eficienţa maximă, deoarece sarcinile se vor executa una după alta. Corespunde din punct de vedere conceptual multiprogramării. 3. Modelul Multithread Apartment (Free Thread Apartment Model – FTA). Modelul Multithread Apartment presupune existenţa unui singur apartament. Nu este nevoie de ordonare, deoarece toate thread-urile aparţin aceluiaşi apartament şi pot partaje resursele. Aceste aplicaţii se execută mai rapid decât cele care implementează modelul unic sau STA, deoarece sistemul este mai puţin solicitat şi poate fi optimizat să elimine timpii morţi. Corespunde din punct de vedere conceptual diviziunii în timp (time sharing).Aceste tipuri de aplicaţii sunt foarte complexe, deoarece trebuie să se asigure că thread-urile nu accesează simultan aceleaşi resurse (principiul pipeline). Este, astfel, absolut necesar să se furnizeze un sistem de blocare a resurselor. Acesta trebuie implementat cu atenţie, deoarece poate conduce la blocarea totală a sistemului. Prin natura şi arhitectura sa, mediul de programare Microsoft .NET Framework este un mediu de tip multithreading. Evaluarea performanţelor. Utilizând de n ori mai multe resurse în paralel, un algoritm nu va rula de n ori mai repede, din cauza fenomenului de timp suplimentar (overhead), indus prin aplicarea paralelismului. Acest timp suplimentar apare din următoarele cauze: interacţiunea între procese (transmiterea rezultatelor intermediare sau parţiale) şi sincronizarea proceselor; inactivitatea temporară (idling), care înseamnă că există procese inactive pe anumite perioade de timp, datorită încărcării inegale şi a aşteptării sincronizării; calculele suplimentare, care nu apar în formularea serială a algoritmului. Parametrii de intrare care contribuie la calculul performanţelor sunt: timpul de execuţie secvenţial sau serial, TS (timpul măsurat de la începutul şi până la sfârşitul execuţiei algoritmului pe un calculator secvenţial);
ARHITECTURA SISTEMELOR DE CALCUL
48
timpul de execuţie paralel, TP (timpul măsurat de la începutul execuţiei şi până la terminarea ultimului subtask paralel); numărul de procesoare, p. Cu ajutorul acestora, se pot calcula următorii parametri de ieşire: suprasarcina, TO (Total Parallel Overhead) = diferenţa dintre timpul total de lucru însumat al tuturor procesoarelor şi timpul necesar celui mai rapid algoritm secvenţial; accelerarea, S (Speedup) = raportul dintre timpul necesar rezolvării unei probleme pe un procesor şi timpul necesar rezolvării aceleiaşi probleme în paralel pe p procesoare identice; eficienţa utilizării calculatorului paralel, E = S / p; costul, C = TP p, care reflectă timpul total de lucru însumat al procesoarelor.
2.3. Categorii de calculatoare Calculatoarele pot fi grupate în 5 categorii, în funcţie de structură, dimensiuni, viteză, putere de calcul şi destinaţie: microcalculatoare (ex.: computerele Apple şi toate modelele de PC); minicalculatoare (ex.: serverele IBM, SGI, Sun Microsystems etc.); superminicalculatoare (ex.: Norsk Data Nord, Interdata, DEC VAX etc.); mainframe-uri; supercalculatoare.
2.3.1. Mainframe-uri Un mainframe este un computer mare, folosit de instituţii guvernamentale şi companii pentru procesarea datelor importante în statistică, recensăminte, cercetare şi dezvoltare, proiectare, prognoză, planificarea producţiei, tranzacţii financiare etc. Ca aspect exterior, primele mainframe-uri arătau ca nişte dulapuri uriaşe de metal. Cu trecerea anilor, tehnologiile de fabricaţie s-au dezvoltat, mărimea fizică a mainframe-urilor a scăzut, iar viteza lor de calcul a crescut foarte mult. La nivelul anului 2008, prin mainframe se înţelege un calculator compatibil cu modelele de tip IBM System/360 (1965). Actualmente, cel mai modern model de la IBM este System z10. Sunt considerate mainframe-uri calculatoarele actuale de tip: Nova (Fujitsu-Siemens), DPS (Groupe Bull), NonStop (Hewlett-Packard), ClearPath (Unisys) şi cele compatibile IBM System z9 (Hitachi, Platform Solutions). Un mainframe poate rula sau găzdui mai multe sisteme de operare simultan, funcţionând ca mai multe maşini virtuale. Un mainframe poate înlocui astfel chiar şi câteva sute de servere de dimensiuni mici (de exemplu, în aplicaţii web), reducând costurile de întreţinere, dar menţinând un nivel ridicat de siguranţă.
Tipuri de arhitecturi
49
2.3.2. Supercalculatoare Un supercalculator este un calculator complex cu destinaţie specială, compus din mai multe procesoare care accesează aceeaşi memorie centrală şi care funcţionează concomitent şi coordonat, în cooperare strânsă, astfel încât supercalculatorul poate atinge o performanţă totală de calcul foarte ridicată. Modul de operare al supercalculatoarelor este calculul paralel. Numărul de procesoare interconectate ale unui supercalculator depăşeşte la anumite modele chiar şi 100.000. Pentru a menţine costul unui asemenea supercalculator la un nivel rezonabil, există arhitecturi care fac uz de procesoare mai ieftine şi mai lente, dar foarte numeroase, grupate în aşa-numite cluster-e. Printre primele firme care au produs supercalculatoare pe piaţă s-a numărat firma Cray (modelul Cray-1 din 1976 a atins viteza de calcul de 130 Mflops). În acest domeniu, există o listă (actualizată de două ori de an) a celor mai rapide 500 de supercalculatoare din lume (Top 500), care se bazează pe testul standardizat numit Linpack. Pe lângă supercalculatoarele comerciale, există şi linia supercalculatoarelor militare. Exemplu: arhitectura supercalculatorului bazat pe IBM BlueGene/L. Modelele IBM BlueGene deţin momentan (2008) primele două locuri în Top 500. Calculatorul se bazează pe un nou concept, care renunţă la creşterea frecvenţei de ceas în favoarea micşorării componentelor, creşterii densităţii acestora şi reducerii consumului de putere. Reducerea frecvenţei de ceas este compensată prin mărirea gradului de paralelism, folosind un număr mai ridicat de procesoare. Procesorul de bază este un PowerPC 440 la 700 MHz. Două astfel de procesoare sunt amplasate pe un cip împreună cu o memorie cache L3 de 4 MB partajată şi 2 KB memorie cache L2 pentru fiecare procesor. Fiecare procesor are două porturi de încărcare şi unul de stocare către memoriile cache L2, funcţionând cu 8 biţi/ciclu. Aceasta este jumătate din banda necesară celor două unităţi de virgulă mobilă (FPU). Procesoarele au o memorie cache L1 de 32 KB pentru instrucţiuni şi date, în situaţii favorabile atingând performanţe de 2,8 Gflops/2. Se observă că memoria cache L1 este mai mare decât L2, un lucru neobişnuit, care permite însă atingerea unor viteze de procesare mai mari. Arhitectura modelului IBM BlueGene/L este reprezentată în figura 2.29. Sistemul este alcătuit astfel: sunt introduse două cipuri pe o placă cu o memorie de 512 MB, şaisprezece asemenea plăci sunt plasate pe o altă placă nod, iar 32 de plăci nod sunt introduse într-un aşa-numit cabinet. Aşadar, un cabinet conţine 1024 cipuri (2048 CPU). Pentru configuraţia maximă, se folosesc 64 de cabinete cuplate, care formează un sistem cu 65.356 cipuri şi 130.712 CPU. În modul normal de operare, o unitate de procesare a unui cip este folosită pentru calcule, iar cealaltă, pentru sarcinile de comunicare. În acest fel, performanţa de vârf teoretică a sistemului este de 183,5 Tflops. Dacă necesităţile de comunicare sunt mici, se pot folosi ambele procesoare pentru calcule, dublând viteza de vârf, ajungând la 360 Tflops.
50
ARHITECTURA SISTEMELOR DE CALCUL
Fig. 2.29. Arhitectura IBM BlueGene/L.
Din punct de vedere al interconectării, BlueGene/L posedă mai multe reţele: două reţele pentru conectarea procesoarelor, o reţea inel 3D şi o reţea arbore. Reţeaua inel este folosită pentru comunicaţii generale, iar cea arbore pentru comunicaţii colective: broadcast, operaţii de reducere etc. Lărgimea de bandă a reţelei arbore este de două ori mai mare decât a reţelei inel, ajungând la 350 MB/s (faţă de 175 MB/s). Performanţele sistemului ajung la 280,6 Tflops pentru testul Linpack. În urma testului, s-a efectuat rezolvarea unui sistem liniar de N = 1.769.471 ecuaţii. Eficienţa rezultată a fost de 76%. Supercalculatoarele care au la bază modelul IBM BlueGene/L implementează arhitectura masiv paralelă. Aceasta constă într-un număr de procesoare (de obicei, foarte mare – de ordinul miilor) interconectate şi controlate de un singur computer central. Fiecare CPU are memoria sa şi spaţiul de date propriu, care conţine şi o copie a sistemului de operare. Toate blocurile CPU comunică între ele cu ajutorul unor interconectări de foarte mare viteză.
Tipuri de arhitecturi
51
2.4. Exemple de arhitecturi 2.4.1. Arhitecturi uniprocesor Se bazează pe cele trei componente majore: UCP, memoria, subsistemul I/O. VAX 11/780 (superminicalculator) Sistemul a fost produs de firma DEC. Schema de arhitectură generală este prezentată în figura 2.30. Aceasta conţine: CPU – unitatea centrală de prelucrare, care include: o R0, ..., R15 = 16 registre generale a câte 32 biţi fiecare; o PC = contorul de program (program counter); o ALU = unitatea aritmetică şi logică; o ML = memoria locală; MD = memorie de diagnoză; CVM = coprocesor de virgulă mobilă; MP = memoria principală (maxim 232 cuvinte); C = consolă; F = floppy disk; SBI = interfaţa cu magistrala sincronă (Synchronous Bus Interface); AU = adaptor unibus, cu (U) = magistrală unibus; AMB = adaptor masterbus, cu (M) = magistrală masterbus. CPU mai conţine un registru de stare, care indică starea curentă a microprocesorului, a programului care se execută şi a memoriei cache.
Fig. 2.30. Schema arhitecturii generale pentru VAX 11/780.
52
ARHITECTURA SISTEMELOR DE CALCUL
IBM 370/168
Fig. 2.31. Schema arhitecturii generale pentru IBM 370/168.
Schema de principiu (vezi figura 2.31) conţine: MP = memoria principală; LSU = local storage unit (unitate de memorie locală); CM = controller memory (legătură multiport CPU – memorie); SS I/O = subsisteme de intrare-ieşire (mai multe canale asincrone). IBM RS/6000 model 250 Arhitectura simplificată este prezentată în figura 2.32.
Fig. 2.32. Schema arhitecturii generale pentru IBM RS/6000-250.
Schema de principiu conţine: PPC = PowerPC – Processor Optimized With Enhanced RISC Performance Chip; SIMM = Small In-line Memory Modules (module de memorie); CTRL = controler; MCA = magistrală de control şi adresă; Ethernet = controler de reţea.
Tipuri de arhitecturi
53
2.4.2. Arhitecturi multiprocesor Arhitecturile multiprocesor sunt cel mai bun exemplu al tentativei de a paraleliza un sistem de calcul. Acestea sunt de două tipuri: cele care folosesc procesoare multiple, discrete, pe o placă de bază sau sisteme hardware speciale şi cele care folosesc mai multe nuclee în interiorul unui singur procesor fizic. 2.4.2.1. Arhitecturi cu procesoare multiple Arhitecturile cu procesoare multiple pot fi de două feluri: cu multiprocesare simetrică; cu multiprocesare asimetrică. Multiprocesarea simetrică utilizează mai multe procesoare fizice legate printr-o magistrală de memorie partajată şi suportul magnetic aferent (vezi paragrafele 2.1.1.4 şi 2.2.1.3, referitoare la sisteme cu memorie partajată – shared memory şi calculatoare multiprocesor). În cazul sistemelor cu arhitecturi de multiprocesare asimetrică, fiecare procesor are alt task. Exemple: cipseturile 3D din plăcile grafice moderne şi cluster-ele de calculatoare personale (Beowulf), în care fiecare procesor are acces numai la memoria calculatorului din care face parte (vezi paragraful 2.1.1.5, referitor la sisteme fără memorie partajată – shared nothing). IBM RS/6000 model F50 Sistemul cuprinde între 1 şi 4 procesoare Power PC cu cache extern şi are o magistrală de 64 de biţi. Memoria cache se numeşte 8-way (cu 8 căi) pentru că datele sunt grupate în seturi de câte 8 64 biţi. Memoria foloseşte date de 72 biţi: 64 pentru date şi 8 pentru codul corector de erori (ECC = Erorr Correction Code). Procesorul are o arhitectură de tip superscalar şi poate executa până la 4 instrucţiuni pe ciclu. Caracteristici (vezi figura 2.33): frecvenţa de tact: 166–332 MHz, 87 MHz pentru magistrala de memorie; 32 KB cache de date, 32 KB cache de instrucţiuni; magistrală de date de 64 de biţi şi magistrală de adrese de 32 de biţi; memorie de până la 4 GB şi memorie virtuală de până la 4 PB (1P = 252). Arhitectura Intel multiprocesor Arhitectura multiprocesor propusă de firma Intel este reprezentată prin schema din figura 2.34. Notaţiile din schemă au următoarele semnificaţii: BSP = Bootstrap Processor, AP = Application Processor, APIC = Advanced Programmable Integrated Circuit, ICC Bus = Interrupt Controller Communications Bus. 2.4.2.2. Arhitecturi biprocesor Un sistem care suportă două procesoare trebuie să aibă o placă de bază adaptată pentru a servi două CPU. În acest scop, placa de bază este dotată cu o magistrală specială, a cărei construcţii depinde de la producător la producător, dar care se conformează unor reguli generale.
54
ARHITECTURA SISTEMELOR DE CALCUL
Fig. 2.33. Schema arhitecturii generale pentru IBM RS/6000-F50.
Fig. 2.34. Schema arhitecturii Intel multiprocesor.
Astfel, cele două CPU sunt servite de două interfeţe paralele cu magistrala principală a sistemului, iar arbitrarea traficului pe aceasta este efectuată de un controler specializat. Accesul la magistrală este multiplexat, astfel că la un anumit moment de timp şi pentru o durată bine stabilită (fixă sau adaptată sarcinii curente) accesul la magistrală îl are doar un singur procesor. Aceste tipuri de scheme pot cuprinde zone de memorie cache comune (integral sau parţial), iar magistrala poate fi cu lăţime variabilă sau cu adaptare dinamică la cereri.
Tipuri de arhitecturi
55
Pentium II biprocesor
Fig. 2.35. Arhitectura unui sistem biprocesor cu Pentium II.
AMD Athlon biprocesor Este un exemplu de arhitectură biprocesor construit pe baza cipsetului 760 al firmei AMD (vezi figura 2.36).
Fig. 2.36. Arhitectura unui sistem biprocesor cu AMD Athlon.
56
ARHITECTURA SISTEMELOR DE CALCUL
Creşterea performanţelor este realizată prin utilizarea magistralei punct-lapunct (Point-to-Point) şi a modului snoop. Modul snoop permite citirea datelor de către un procesor din celălalt procesor (prin intermediul northbridge-ului), nemaifiind necesară accesarea memoriei. Acest mod elimină tehnica prin care datele necesare unuia din cele două procesoare erau înscrise în memorie de către primul procesor şi apoi citite de către al doilea. AMD K7 biprocesor Microprocesorul AMD K7 lucrează pe magistrala ultrarapidă EV6 la frecvenţa de 200 MHz. Astfel, K7 poate folosi memorii foarte rapide şi cu lărgime de bandă mare, cum este Rambus DRAM. Datorită suportului multiprocesor al protocolului de magistrală EV6, sistemele AMD pot fi folosite în domeniul staţiilor de lucru şi al serverelor. Arhitectura EV6 permite o flexibilitate ridicată, cu facilităţi de tipul topologiei punct-la-punct şi clock-forwarding. Magistralele de date şi de adrese sunt decuplate, procesorul putând să emită cereri în timp ce primeşte date şi comenzi de la logica de sistem. Tot aici sunt gestionate transferurile cu sistemul, către memorie sau către magistralele AGP şi PCI. Schema bloc a acestei arhitecturi este prezentată în figura 2.37.
Fig. 2.37. Arhitectura unui sistem biprocesor cu AMD K7 pe magistrala EV6.
Sun SPARC IV biprocesor Arhitectura biprocesor Sun SPARC IV este prezentată în figura 2.38. Notaţiile din schemă au următoarele semnificaţii: ECC = Error Checking/Correction Code (cod de verificare/corecţie de erori), DCSS = Dual Chip Data Switch (bloc de alegere a cipului), SIU = System Interface Unit (unitatea de interfaţă cu sistemul), MCU = Memory Control Unit (unitate de comandă a memoriei).
Tipuri de arhitecturi
57
Fig. 2.38. Arhitectura Sun SPARC IV biprocesor.
Se observă că cele două procesoare au atât memorie cache comună, cât şi individuală. Accesul la memoria comună se realizează prin intermediul unui multiplexor, care nu permite lucrul simultan celor două CPU cu aceasta, pentru a preveni blocajele şi erorile ce pot apărea în urma unor accesări simultane. Schema este capabilă să ruleze două fire de execuţie (thread-uri) cu latenţe foarte mici de scriere a cache-ului. De asemenea, accesul la magistrala principală este multiplexat, pentru a preveni congestiile şi erorile de transmisie. Strategia de gestiune a memoriei cache este de tipul LRU (Least Recently Used – cel mai puţin recent utilizat), ceea ce duce la mai multe şanse de a găsi în cache informaţia necesară la următoarea procesare (cache hit). Memoria acestui sistem este de tipul SDRAM. Există scheme care aduc îmbunătăţiri suplimentare legate de administrarea eficientă a magistralei (prin repartizarea dinamică a duratelor de acces bazată pe predicţii şi pe comportări anterioare ale proceselor care se repetă la fiecare CPU etc.). Intel Xeon biprocesor Sistemul este echipat cu două procesoare Intel Xeon instalate pe o placă de bază de tipul Supermicro P4DC6+. Această placă de bază este dotată cu cipsetul i860, constituit din trei componente principale: Intel 82806AA PCI 64 Hub (Intel P64H din figura 2.39), Intel 82860 Memory Controller Hub (MCH din figura 2.39) şi Intel 82801BA I/O Controller Hub (ICH2 din figura 2.39). Aceste blocuri asigură un transfer foarte rapid de date atât între procesoare, cât şi între acestea şi memorie sau dispozitive periferice.
58
ARHITECTURA SISTEMELOR DE CALCUL
Fig. 2.39. Arhitectura sistemului Xeon biprocesor.
Pentru aceasta, arhitectura pune la dispoziţie componentelor sistemului (controlerul SCSI, sloturile PCI pe 32 sau 64 de biţi) magistrale distincte, care asigură separarea fluxurilor de date. Acest lucru este vital într-un server în care schimbul de date dintre componente este realizat în flux continuu. Tot pentru o sporire a vitezei de lucru, s-a recurs la utilizarea memoriei de tip RDRAM. AMD Opteron biprocesor Sistemul cu două procesoare AMD Opteron 250 la 2,4 GHz foloseşte o placă de bază dotată cu cipsetul NVIDIA nForce Professional 2200. Noutatea acestei configuraţii este că procesoarele nu împart aceeaşi magistrală pentru a accesa memoria, ca la sistemele tradiţionale. În acel caz, magistrala reprezenta „gâtul sticlei” (bottleneck) sistemului, fiind un obstacol în calea procesării la potenţialul maxim al CPU-urilor. Pentru a evita această limitare, AMD a recurs la o arhitectură cu memorie cache neuniformă, de tip ccNUMA (vezi figura 2.40). Fiecare procesor dispune de un controler de memorie, care poate accesa o porţiune de memorie rezervată doar lui. Sunt evitate astfel suprapunerile de date şi alterarea reciprocă a datelor provenite de la procesoare diferite. În plus, cele două CPU sunt interconectate printr-o magistrală de mare viteză, de tipul HyperTransport (tehnologie patentată de AMD), care nu are legătură directă cu memoria (spre deosebire de un sistem clasic) şi care asigură un dialog eficient între componente. Cele două procesoare pot accesa memoriile proprii cu latenţe foarte mici (mult mai mici decât la sisteme tradiţionale), precum şi memoria care nu le aparţine direct, dar cu latenţe mari. Aceasta nu constituie un dezavantaj, deoarece un CPU lucrează în mod normal doar în zona de memorie care îi este repartizată. Totuşi această tehnologie are şi un punct slab: organizarea corectă a memoriei este crucială. Astfel, arhitectura NUMA trebuie suportată atât de sistemul de operare, cât şi de aplicaţii.
Tipuri de arhitecturi
59
Fig. 2.40. Arhitectura sistemului AMD Opteron biprocesor.
Sistemele de operare Windows XP şi Windows server 2003 suportă în întregime această tehnologie, opţiunea activându-se automat la detectarea unui sistem de acest tip. Calculatoarele biprocesor se pretează pentru diverse aplicaţii complexe, care necesită putere de calcul. Aici intră aplicaţiile grafice de modelare 3D, aplicaţiile de reţea (mai ales dacă sistemul este unul de tip nod coordonator de trafic sau server pentru subreţele de diverse dimensiuni) şi aplicaţiile specifice de prelucrare a semnalelor în timp real. Tot ce au acestea în comun este faptul că sunt create astfel încât să lucreze cu mai multe fire de execuţie simultan, conform principiilor de calcul paralel. Aceste tipuri de algoritmi sunt create pentru a minimiza timpul de execuţie foarte mare pe care îl implică acele aplicaţii în situaţii normale. În ultima vreme, câştigă popularitate un nou tip de aplicaţii care pot folosi arhitectura biprcocesor, anume sistemele embedded. În esenţă, este vorba despre conectarea în paralel, pe aceeaşi placă, a două (sau mai multe) procesoare specializate, cu un scop bine definit, spre deosebire de calculatoarele personale, care au scopuri multiple. De exemplu: prelucrarea unui semnal audio (codare şi decodare) şi, eventual, transmiterea lui mai departe. Din această clasă fac parte procesoarele DSP de la firma Texas Instruments. Premisa acestor aplicaţii este că procesorul este adaptat să realizeze un număr restrâns de operaţii cu scopuri bine determinate. În plus, DSP-ul este capabil să ruleze aplicaţii de sine stătătoare, care să ofere interfaţă cu utilizatorul şi suport pentru memorare şi transmitere către alte componente conectate la acesta. De exemplu: un subsistem care, conectat la un PC, să codeze/decodeze fişiere audio în format mp3.
60
ARHITECTURA SISTEMELOR DE CALCUL
2.4.2.3. Arhitecturi multinucleu Un procesor multinucleu combină două sau mai multe nuclee într-un singur cip fizic, care conţine fie un circuit integrat cu toate nucleele, fie mai multe circuite integrate interconectate. Un procesor cu mai multe nuclee implementează o arhitectură de multiprocesare într-un singur pachet fizic. Un procesor cu toate nucleele pe acelaşi circuit integrat se numeşte procesor multinucleu monolitic. Nucleele pot partaja un singur cache de nivel înalt (de ex.: cache-ul L2 pentru procesoarele Core 2 de la Intel) sau pot avea câte un cache separat pentru fiecare nucleu (de ex.: linia de procesoare dual-core de la AMD). Fiecare nucleu implementează separat optimizări hardware, cum sunt: sisteme pipeline, execuţie superscalară, extensii SSE, multithreading etc. Un sistem cu n nuclee este eficient atunci când pe acesta se rulează n procese (sau fire de execuţie) concurente şi independente. Cele mai cunoscute procesoare multinucleu sunt cele de pe piaţa calculatoarelor personale (Intel şi AMD), precum şi cele folosite în consolele de jocuri pe televizor (de ex.: procesorul Cell folosit la PlayStation 3 are 8 nuclee, iar Xenon folosit la Xbox360 are 3 nuclee). Avantajele sistemelor cu procesoare multinucleu sunt: Nucleele sunt apropiate fizic, ceea ce înseamnă că semnalele trebuie să parcurgă o distanţă mai mică. Acestea permit procesoarelor să interacţioneze cu o frecvenţă mai mare decât dacă ele ar fi fost separate (două procesoare pe o placa de bază). Procesoarele multinucleu oferă designerilor posibilitatea de a face plăcile de bază mai mici decât pentru două sau mai multe procesoare. Un procesor cu două nuclee consumă mai puţin decât două procesoare cu câte un singur nucleu, deoarece acestea necesită mai multă putere să transmită aceleaşi semnale în afara cipului, Preţul produsului este mai redus, pachetul fizic fiind de un singur procesor în loc de mai multe. Dezavantajele sistemelor cu procesoare multinucleu sunt: Deşi, teoretic, două procesoare pot dubla viteza de calcul, software-ul trebuie optimizat pentru a beneficia de acest lucru, în funcţie de posibilitatea aplicaţiilor şi a sistemului de operare de a crea fire de execuţie (thread-uri) paralele şi independente. Integrarea a încă unui nucleu în acelaşi circuit integrat pune probleme deosebite din punct de vedere termic, deoarece, practic, acelaşi pachet fizic trebuie să disipeze de două ori mai multă putere. Intel a rezolvat această problemă prin integrarea a două nuclee dual-core şi a unui cache unificat în locul unui nucleu quad-core cu memorii cache separate. Astfel, se forţează lucrul numai al unuia dintre cele două nuclee, în loc de toate patru deodată, micşorând puterea instantanee disipată de întregul procesor. Din punct de vedere al arhitecturii, procesoarele cu un singur nucleu folosesc mai eficient resursele de tranzistori de pe cip. Astfel, o companie care produce procesoare trebuie tot timpul să aibă o linie de procesoare cu un singur nucleu în paralel cu cele multinucleu.
Tipuri de arhitecturi
61
Există mai mulţi factori care limitează performanţa reală a unui sistem multinucleu. În primul rând, magistralele de sistem şi de memorie sunt partajate, astfel încât devin „gâtuiri” (bottlenecks) care limitează fluxul de date către nucleele multiple ale procesoarelor, în acelaşi mod în care o şosea cu prea puţine benzi de circulaţie produce uneori blocaje.
Intel Core 2 Procesoarele Intel Core 2 Duo sunt produse folosind tehnologia de fabricare Intel pe 65 nm. Versiunea pentru desktop-uri a procesoarelor furnizează o creştere de 40% a performanţei şi este cu peste 40% mai eficientă din punct de vedere al consumului de energie, în comparaţie cu cel mai bun procesor Intel anterior. Potrivit analiştilor independenţi, procesoarele câştigă 9 din cele 10 teste majore de performanţă pentru desktop-uri, servere şi calculatoare destinate jocurilor. Familia de procesoare Intel Core 2 Duo este formată din 5 procesoare pentru platforme desktop destinate afacerilor, utilizării individuale şi entuziaştilor pentru tehnologie, precum şi din 5 procesoare pentru notebook-uri. Familia de procesoare Intel Core 2 Duo este bazată pe micro-arhitectura Intel Core. Prin intermediul celor două nuclee de execuţie, procesoarele pot executa cu viteză un număr mai mare de instrucţiuni. De asemenea, procesoarele pot opera mai rapid la lansarea simultană în execuţie a mai multor aplicaţii, de exemplu, scrierea unui e-mail în acelaşi timp cu descărcarea de muzică şi scanarea antivirus. Procesoarele dual-core contribuie la îmbunătăţirea execuţiei programelor, de exemplu, în cazul vizionării unor clipuri high-definition sau al protejării PC-ului în timpul tranzacţiilor financiare pe Internet, crescând, de asemenea, autonomia bateriei în cazul notebook-urilor, care pot deveni astfel mai subţiri şi mai uşoare. Inovaţiile aduse de Intel prin introducerea arhitecturii Intel Core 2 (Duo şi Exteme) sunt următoarele: Intel Wide Dynamic Execution – îmbunătăţeşte performanţa şi eficienţa, întrucât fiecare nucleu de execuţie poate realiza până la 4 instrucţiuni simultan, folosind un pipeline eficient în 14 stagii. Intel Smart Memory Access – îmbunătăţeşte performanţa sistemului, diminuând latenţa cipurilor de memorie şi optimizând astfel utilizarea lărgimii de bandă disponibile pentru furnizarea datelor către procesor când şi unde este nevoie. Intel Advanced Smart Cache – include o memorie cache L2 comună, proiectată pentru a reduce consumul de energie prin micşorarea traficului de memorie, şi măreşte performanţa, permiţând unui nucleu de execuţie să utilizeze întreg cahe-ul atunci când celălalt nucleu nu este folosit. Această funcţie este asigurată pentru toate segmentele de piaţă: server, desktop şi notebook. Intel Advanced Digital Media Boost – dublează efectiv viteza de execuţie a instrucţiunilor folosite cu precădere în aplicaţiile grafice şi multimedia. Intel 64 Technology – această îmbunătăţire adusă arhitecturii Intel pe 32 de biţi oferă suport pentru procesarea pe 64 de biţi şi permite procesorului să acceseze o cantitate mai mare de memorie. Nucleul de execuţie al procesorului Intel Core este reprezentat în figura 2.41. Caracteristicile funcţionale ale acestei arhitecturi sunt expuse în cele ce urmează.
62
ARHITECTURA SISTEMELOR DE CALCUL
Fig. 2.41. Nucleul de execuţie al procesorului Intel Core.
Unităţile de execuţie cu numere întregi. Intel Core are trei asemenea unităţi pe 64 biţi, fiecare dintre ele putând realiza operaţii pe 64 biţi într-un singur ciclu. Există şi o unitate pe 64 biţi de numere complexe (CIU – Complex Integer Unit), care realizează în mare parte aceeaşi muncă precum cea din P6, şi două unităţi simple de numere întregi (SIU – Simple Integer Unit), pentru operaţiile uzuale, cum ar fi adunarea. Una din unităţile SIU împarte portul 2 cu BEU (Branch Execution Unit), pe care Intel o numeşte unitatea de salt în execuţie). Pe acest port, SIU este capabil să lucreze în tandem cu BEU pentru a executa instrucţiuni macro (comparaţii sau teste +jcc). Posibilitatea de a realiza calcule pe 64 biţi într-un singur ciclu este o premieră în arhitectura Intel 86 şi aceasta îl pune înaintea IBM, cu al său Power PC970, care are o latenţă de două cicluri pentru operaţii cu numere întregi. În plus, datorită unităţilor ALU pe 64 biţi care sunt pe porturi separate, Intel Core poate menţine un total de trei operaţii pe 64 biţi per ciclu. Unităţile de execuţie în virgulă mobilă. Intel Core are două unităţi de execuţie în virgulă mobilă, care se ocupă de ambele tipuri de operaţii aritmetice: scalare şi vectoriale. Unitatea de execuţie de pe portul 1 se ocupă cu adunări sau cu alte operaţii simple în virgulă mobilă, după cum urmează: scalar: simplă precizie (32 biţi) şi dublă precizie (64 biţi); vector: simplă precizie (4) şi dublă precizie (2).
Tipuri de arhitecturi
63
Unitatea de execuţie în virgulă mobilă de pe portul 2 se ocupă cu înmulţiri şi împărţiri cu vectori şi scalari în formatele listate mai sus. Procesarea vectorială reală pe 128 biţi. Arhitectura Intel Core asigură latenţa de un ciclu pentru operaţiile vectoriale pe 128 biţi. Intel realizează acest lucru făcând magistrala pentru virgulă mobilă şi cea internă de date cu lăţimea de 128 biţi, facilitate care înseamnă că este necesară doar o singură micro-operaţie (care trebuie generată, trimisă, programată şi realizată) pentru fiecare operaţie vectorială pe 128 biţi. De aceea, noul design nu numai că elimină dezavantajul generat de latenţă, dar în acelaşi timp îmbunătăţeşte decodarea şi programarea lărgimii de bandă, pentru că jumătate din micro-operaţii sunt generate pentru instrucţiuni vectoriale de 128 biţi (vezi figura 2.42).
Fig. 2.42. Configuraţia de procesare vectorială reală pe 128 biţi.
Pipeline-ul. Intel Core are un pipeline realizat în 14 stagii, la fel de lung ca la Power PC 970, aproximativ jumătate din cel de la Pentium 4 Prescott (~ 30 etape) şi puţin mai lung decât cel de la P6 (12 etape). Aceasta înseamnă că Intel Core este proiectat pentru o creştere lentă a vitezei de ceas şi nu scalează la fel de rapid ca Pentium 4. Fereastra de instrucţiuni. Deoarece partea din spate este mult mai lată decât a predecesorilor, buffer-ul de reorganizare (Reorder Buffer, ROB) a crescut la 96 de intrări, de la 40 cât avea Pentium M, iar staţia de rezervare (Reservation Station, RS) a fost mărită. Fereastra de instrucţiuni din Intel Core a fost mărită nu numai fizic (ROB + RS), ci şi virtual. Macro-fuziunea şi micro-operaţiile (descrise anterior), permit lui Intel Core să reţină mai multe instrucţiuni cu un număr mai mic de resurse hardware.
64
ARHITECTURA SISTEMELOR DE CALCUL
Deoarece lăţimea execuţiei a fost mărită considerabil, vechiul hardware de decodare al lui P6 ar fi fost inadecvat pentru a ţine restul procesorului ocupat cu micro-operaţii. Intel a trebuit să mărească rata de decodare, în aşa fel încât mai multe micro-operaţii/ciclu să ajungă la final. Primul lucru pe care l-a făcut a fost să adauge încă un decodor simplu şi rapid, ceea ce înseamnă că decodorul hardware poate trimite până la 7 instrucţiuni pe ciclu în coada de aşteptare ROB (vezi figura 2.43).
Fig. 2.43. Structura hardware pentru decodarea instrucţiunilor din arhitectura Intel Core.
AMD Opteron Dual-core În figura 2.44 este reprezentată arhitectura simplificată a procesorului Opteron dual-core.
Fig. 2.44. Arhitectura AMD Opteron dual-core.
Tipuri de arhitecturi
65
Tehnologic vorbind, AMD nu a realizat doar o simplă alipire a unei perechi de nuclee K8 pe o bucată de siliciu, ci a efectuat o integrare la nivelul de bază, astfel încât cele două nuclee să poată acţiona împreună mai eficient. Fiecare dintre nucleele K8 are propriul său cache L2, independent, încorporat, dar cele două nuclee împart o coadă comună a cererilor de sistem, un controler de memorie DDR de tip dual-channel şi un set de legături HyperTransport cu mediul exterior. Accesul la resursele I/O este adjudecat printr-o reţea crossbar sau printr-un switch, astfel încât fiecare CPU poate comunica direct şi eficient cu memoria sau cu dispozitivele I/O. În unele privinţe, Opteron dual-core se comportă foarte asemănător unui sistem cu multiprocesare simetrică on-chip, transferând date intern între cele două nuclee. Cu toate acestea, pentru restul infrastructurii I/O a sistemului, Opteron dual-core pare asemenea versiunii mononucleu. Arhitectura de sistem pentru Opteron este foarte diferită de cea a competitorului său principal, Intel Xeon. Arhitectura AMD Direct Connect a fost supra-dimensionată pentru procesorul Opteron mononucleu, anticipând viitorul dual-core. Fiecare procesor (mono- sau binucleu) are propriul său controler de memorie DDR local de tip dual-channel, iar procesoarele comunică între ele şi cu cipurile I/O prin legături HyperTransport punct-la-punct, la frecvenţa de 1 GHz. Lărgimea totală de bandă posibilă prin cei 940 de pini ai procesorului Opteron 875 este de 30,4 GB/s. Cu o legătură HyperTransport mai puţin, procesorul Opteron 275 poate atinge, teoretic, viteza de 22,4 GB/s. Prin contrast, procesoarele Xeon actuale au o magistrală front-side (FSB) partajată, pe care lucrează cipul northbridge (cu controler de memorie) şi ambele procesoare. La frecvenţa de 800 MHz, lărgimea totală de bandă este de 6,4 GB/s, ceea ce poate fi un bottleneck în anumite situaţii. AMD Phenom Triple-core AMD are în producţie un procesor cu trei motoare de procesare, proiectul numindu-se AMD Phenom 3 chip (vezi figura 2.45).
Fig. 2.45. Arhitectura AMD Phenom Triple-core.
66
ARHITECTURA SISTEMELOR DE CALCUL
Noul microprocesor triple-core prezintă propriul design şi nu este un cip quad-core cu un core dezactivat. Totuşi, cipurile includ 2 MB de cache L3 partajat şi beneficiază de caracteristicile micro-arhitecturii K10, cum sunt setul de instrucţiuni SSE4A şi unităţile de prelucrare în virgulă mobilă (FPU) de 128 biţi. Evident, cipurile dispun de posibilităţi avansate de gestiune a puterii. Potrivit unor estimări ale laboratoarelor X-bit, fiecare motor al procesoarelor quad-core AMD Opteron/Phenom ocupă aproximativ 13% din aria fizică a capsulei. Date fiind întreaga dimensiune de 285 mm² şi numărul de aproximativ 218 cipuri candidate obţinute din fiecare bucată de 300 mm, este neobişnuit faptul că AMD a decis dezvoltarea unui design triple-core cu aria fizică de 247 mm² şi 250 de cipuri candidate obţinute de pe o bucată de 300 mm. Tehnic, AMD poate realiza uşor microprocesoare cu un număr impar de motoare de procesare datorită arhitecturii sale Direct Connect. Cu versiunile sale Phenom şi Athlon 64 2, AMD are de combătut procesoarele Intel Core 2 (dual-core şi quad-core). Intel şi AMD Quad-core Ca replică la lansarea CPU-urilor quad-core de la Intel, AMD a lansat propria platformă, Quad FX. Această platformă este un sistem de multiprocesare simetrică, utilizând două CPU-uri Athlon 64 FX dual-core. De aceea, un calculator personal Quad FX are două procesoare fizice dual-core care lucrează în paralel, având în total, în sistem, patru nuclee CPU. Aceste două CPU-uri sunt interconectate printr-o magistrală coerentă dedicată tehnologiei HyperTransport. În CPU-urile quad-core de la Intel, nucleele sunt organizate în perechi. Nucleele fiecărei perechi pot interschimba informaţii direct (la fel se întâmplă la AMD dual-core şi la Intel Core 2 Duo), dar pentru a schimba informaţii cu unul dintre nucleele localizate în cealaltă pereche trebuie să acceseze magistrala externă a CPU, ceea ce se întâmplă pe platforma Quad FX, unde CPU-urile comunică între ele folosind magistrala externă coerentă HyperTransport. Diferenţa dintre platforma Quad FX şi arhitectura utilizată de către procesoarele Intel quad-core se poate remarca în figurile 2.46 şi 2.47 Comparând cele două arhitecturi, se poate observa că platforma Quad FX deţine un avantaj în ceea ce priveşte accesul la memorie. Magistrala externă a CPU-ului Intel quad-core (Front Side Bus, FSB) este utilizată pentru a accesa memoria RAM şi alte dispozitive prezente pe PC, precum şi pentru comunicarea între perechile de nuclee, cu viteze de până la 8 GB/s. Pe platforma Quad FX, CPU-urile folosesc un canal de comunicaţie dedicat (magistrala coerentă HyperTransport), care transferă date cu până la 4 GB/s în fiecare direcţie. Magistrala HyperTransport oferă două canale de comunicaţie, câte unul pentru fiecare direcţie. În procesoarele AMD, controlerul de memorie este încorporat în CPU şi, ca urmare, memoria este accesată utilizând o magistrală dedicată, separat de canalul folosit de către CPU pentru a accesa restul PC-ului. Datorită faptului că platforma Quad FX foloseşte o arhitectură de multiprocesare simetrică, fiecare CPU îşi accesează propria memorie RAM. Procesoarele utilizate pe platforma Quad FX pot accesa, de asemenea, memoria controlată de un alt CPU.
Tipuri de arhitecturi
67
Fig. 2.46 Arhitectura Intel Quad-core.
Fig. 2.47 Arhitectura AMD Quad FX.
În ultima vreme, câştigă popularitate sistemele de tip embedded. Este vorba despre conectarea în paralel a mai multor procesoare specializate, pe aceeaşi placă, cu un scop bine definit. De exemplu, prelucrarea unui semnal audio (codare şi decodare) în format mp3. Procesorul este adaptat să realizeze un număr restrâns de operaţii specifice, iar DSP-urile sunt capabile să ruleze aplicaţii de sine stătătoare, care să ofere interfaţă cu utilizatorul, suport pentru memorare şi transmitere.
68
ARHITECTURA SISTEMELOR DE CALCUL
Intel Core i7 Seria Intel Core a continuat să evolueze, cu variantele i3, i5, i7, acestea fiind microprocesoarele multinucleu pentru calculatoare de performanţă redusă, medie şi, respectiv, înaltă. Fără îndoială că vor urma mai multe alte variante superioare. O imagine a variantei i7 (2011) este prezentată în figura 2.48. De fapt, aici există integrate opt nuclee, dar – cu excepţia versiunii Xeon –, doar şase dintre acestea sunt activate, ceea ce înseamnă că un cip cu unul sau două nuclee defecte din fabricaţie poate fi vândut prin dezactivarea celui/celor defect(e). Fiecare nucleu are propriile sale memorii cache de nivel 1 şi 2, dar există, de asemenea, o memorie cache comună de nivel 3 (L3), utilizată de toate nucleele.
Fig. 2.48. Arhitectura Intel Core i7-3960X, de 21×21 mm, cu 2,27 miliarde tranzistori.