Tipuri de paralelism. Procesul de procesare paralel

Trimiteți-vă munca bună în baza de cunoștințe este simplu. Utilizați formularul de mai jos

Buna treaba la site">

Studenții, studenții absolvenți, tinerii oameni de știință care folosesc baza de cunoștințe în studiile și munca lor vă vor fi foarte recunoscători.

MINISTERUL EDUCAȚIEI ȘI ȘTIINȚEI AL REPUBLICII KAZAKHSTAN

Kazahstanul de Nord Universitate de stat lor. M. Kozybaeva

Facultatea de Tehnologia Informaţiei

Departamentul Sisteme Informaţionale

Proces de prelucrare paralel

Completat de: Makhkambaeva A.S.

Verificat de: Kasimov I.R.

Petropavlovsk, 2014

Introducere

În sistemele cu un singur procesor, apare așa-numitul pseudo-paralelism - deși la un moment dat procesorul este ocupat să proceseze unul sarcina specifica pe de altă parte, se realizează iluzia executării paralele a mai multor sarcini. În sistemele multiprocesor, sarcina este maximă utilizare eficientă fiecare procesor specific se rezolvă și prin comutarea între procese, dar aici, alături de pseudo-paralelism, există și paralelism real, când este pornit. diferite procesoare diferite procese sunt executate în același moment în timp.

Ideea paralelizării procesării datelor se bazează pe ideea că majoritatea problemelor pot fi împărțite într-un set de probleme mai mici care pot fi rezolvate simultan. Procesele a căror execuție se suprapune cel puțin parțial în timp se numesc paralele.

În 1967, Gene Amdahl a formulat legea limitării creșterii productivității la paralelizarea calculelor: „În cazul în care o sarcină este împărțită în mai multe părți, timpul total de execuție a acesteia de către sistem paralel nu poate fi mai mic decât timpul de execuție al celui mai lung fragment.” Conform acestei legi, accelerarea execuției unui program prin paralelizarea instrucțiunilor acestuia este limitată de timpul necesar executării instrucțiunilor sale secvențiale.

Clasificare Flynn

planificarea accesului la sincronizarea proceselor

Clasificarea se bazează pe două concepte: fluxuri de comandă și fluxuri de date. Un sistem cu N procesoare are N contoare de programe și, prin urmare, N fire de instrucțiuni.

Fluxuri de comandă

Fluxuri de date

Titluri

SISD (Single Instruction, Single Data) este o arhitectură de computer în care un procesor execută un flux de comenzi, operând pe un flux de date. Pentru din această clasă numai pseudo-paralelismul este posibil.

SIMD (Single Instruction, Multiple Data) este o arhitectură de computer care permite paralelismul la nivel de date. Ideea principală a abordării bazate pe paralelismul datelor este că o singură operație este efectuată pe toate elementele matricei de date simultan. Aceste sisteme au de obicei un numar mare de procesoare, de la 1024 la 16384, care pot executa aceeași instrucțiune, generată de o singură unitate de control, față de date diferite. În orice moment, fiecare procesor execută aceeași instrucțiune, dar procesează date diferite. Este implementat un proces de calcul paralel sincron.

MISD (Multiple Instruction, Simple Data) este o arhitectură de computer în care mai multe module funcționale (două sau mai multe) efectuează diverse operații asupra acelorași date. Calculatoarele tolerante la erori care execută aceleași comenzi în mod redundant pentru a detecta erorile, așa cum sugerează definiția, aparțin acestui tip.

MIMD (Multiple Instruction, Multiple Data) este o arhitectură de computer în care mai multe procesoare independente lucrează ca parte sistem mare. Procesarea este împărțită în mai multe fire de execuție (paralelismul este asigurat), fiecare având propria stare hardware a procesorului, în cadrul unui singur proces definit. software proces sau în cadrul mai multor procese.

Dintre sistemele MIMD se pot distinge două subclase: sisteme cu RAM partajată și sisteme cu memorie distribuită. Primul tip de sistem se caracterizează prin faptul că orice procesor are acces direct la orice celulă din acest comun memorie cu acces aleator. Sistemele de memorie distribuită sunt de obicei o colecție de noduri de computer. Un nod este înțeles ca un procesor independent cu propria RAM locală. În aceste sisteme, orice procesor nu poate accesa în mod arbitrar memoria altui procesor.

OpenMP (Open Multi-Processing) -- standard deschis pentru paralelizarea programelor în limbaje C, C++ și Fortran. Descrie un set de comenzi care sunt destinate programării aplicațiilor multithreaded pe sisteme multiprocesor cu memorie partajată. implementează OpenMP calcul paralel folosind multithreading, în care un fir „master” creează un set de fire slave și sarcina este distribuită între ele.

Sarcinile efectuate de fire în paralel, precum și datele necesare pentru îndeplinirea acestor sarcini, sunt descrise folosind directive speciale de preprocesor ale limbajului corespunzător - pragmas. Programul C trebuie să includă fișierul „omp.h”.

Următoarea buclă adaugă tablourile „a” și „b” element cu element. Tot ceea ce este necesar pentru execuția paralelă în acest caz este o singură pragma introdusă imediat înaintea buclei.

#pragma omp paralel pentru

pentru (i=0; i< numPixels; i++)

c[i] = a[i]+b[i];

Acest exemplu folosește „echilibrarea încărcăturii” - un termen comun folosit în OpenMP pentru a descrie distribuția volumul de muncăîntre fire. Când echilibrarea sarcinii este utilizată cu o directivă for, așa cum se arată în exemplu, iterațiile buclei sunt distribuite pe mai multe fire, astfel încât fiecare iterație a buclei este executată o singură dată, în paralel de unul sau mai multe fire. OpenMP determină câte fire de execuție trebuie create și, de asemenea cea mai buna cale crearea, sincronizarea și distrugerea thread-urilor. Tot ceea ce este necesar de la programator este să spună OpenMP care anume buclă ar trebui să fie paralelizată.

Echilibrarea sarcinii (distribuirea egală a sarcinii de lucru între fire) este unul dintre cele mai importante atribute ale execuției paralele a unei aplicații. Fără aceasta, unele fire de execuție își pot finaliza munca mult mai devreme decât altele, ceea ce duce la resurse de calcul inactive și pierderi de performanță.

În mod implicit, OpenMP presupune că toate iterațiile buclei durează aceeași perioadă de timp. Ca rezultat, OpenMP distribuie iterațiile buclei aproximativ în mod egal între fire și astfel încât să minimizeze probabilitatea conflictelor de memorie din cauza partajării necorespunzătoare a memoriei.

#pragma omp paralel pentru

pentru (i=2; i< 10; i++)

factorial[i] = i * factorial;

Dacă bucla îndeplinește toate constrângerile și compilatorul a paralelizat bucla, acest lucru nu este garantat operatiune adecvata, deoarece poate exista o dependență de date.

Există o dependență de date dacă diferite iterații ale buclei (mai precis, o iterație care rulează pe un fir diferit) citesc sau scriu memoria partajată.

MPI (Interfață de transmitere a mesajelor) -- interfata software pentru transferul de informații, care permite schimbul de mesaje între procesele care îndeplinesc aceeași sarcină. MPI se concentrează în primul rând pe sisteme de memorie distribuită. Există implementări pentru limbajele Fortran, C și C++.

În prima versiune a MPI, numărul de procese (ramuri) este setat în momentul lansării programului, adică. Nu există nicio modalitate de a crea ramuri dinamic. În versiunea 2.0 a apărut această caracteristică.

Când o aplicație rulează, toate ramurile sale secundare formează un grup de ramuri (un set ordonat de ramuri). Fiecare grup este asociat cu un „câmp de comunicare” care descrie toți participanții la schimbul de date și datele comune tuturor participanților. Comutatoarele sunt folosite pentru a descrie câmpul de comunicare. Toate operațiunile de schimb de date pot avea loc doar într-un singur câmp de comunicare (acest lucru este asigurat prin verificarea comutatoarelor).

Pentru C, formatul general este

rc = MPI_Xxxxx(parametru, ...);

Rețineți că cazul este important aici. De exemplu, MPI trebuie să fie scris cu majuscule, la fel ca prima literă după liniuță. Toate caracterele următoare trebuie să fie cu litere mici. Variabila rc este un anumit cod de returnare care are întreg tip. Dacă are succes, este setat la MPI_SUCCESS. Programul C trebuie să includă fișierul „mpi.h”.

Mesajele MPI constau din două părți principale: datele trimise/primite și informațiile însoțitoare (intrari în plic) care ajută la trimiterea datelor de-a lungul unei anumite rute.

Datele corespund la începutul bufferului, numărului, tipului de date. Un buffer este pur și simplu memorie pe care compilatorul a alocat-o unei variabile (adesea o matrice) din programul dumneavoastră. Buffer start este adresa de unde încep datele. De exemplu, începutul unei matrice în programul dvs. Număr - numărul de elemente (nu octeți!) de date din mesaj. Tipul de date determină dimensiunea unui singur element.

Informațiile „pe copertă” includ rangul în comunicator - identificatorul procesului în câmpul de comunicare, eticheta - un număr arbitrar care ajută la distingerea mesajelor și comunicatorul însuși, a cărui verificare asigură transmiterea într-un singur câmp de comunicare.

Prelucrare paralelă a datelor

Există mai multe moduri de a separa responsabilitățile între procese:

* delegare („manager-lucrător”);

* rețea peer-to-peer;

* transportor;

* „producător-consumator”.

Fiecare model are propria sa structură de defalcare a muncii, care determină cine este responsabil pentru crearea firelor și în ce condiții sunt create.

În modelul de delegare, un thread („managerul”) creează fire („lucrătorii”) și atribuie câte o sarcină fiecăruia dintre ei. Firul de control trebuie să aștepte până când toate firele și-au finalizat sarcinile. Firul de control deleagă sarcina pe care trebuie să o îndeplinească fiecare fir de lucru prin specificarea unei anumite funcții. Alături de sarcină, firului de lucru i se atribuie și responsabilitatea implementării și obținerii rezultatelor. În plus, în stadiul de obținere a rezultatelor, este posibilă sincronizarea acțiunilor cu firul de control (sau altul).

În timp ce în modelul de delegare există un fir de control care deleagă sarcini către firele de lucru, în modelul peer toate firele au aceeași stare de lucru. Deși există un fir de execuție care creează inițial toate firele de execuție necesare pentru a finaliza toate sarcinile, acest fir de execuție este considerat un fir de lucru, dar nu îndeplinește nicio funcție de delegare a sarcinilor. În acest model, nu există un fir centralizat, dar firelor de lucru li se acordă mai multă responsabilitate. Toate firele de execuție de la egal la egal pot procesa cereri din același flux de date de intrare sau fiecare fir de execuție de lucru poate avea propriul flux de date de intrare pentru care este responsabil. Este posibil ca firele de lucru să aibă nevoie să comunice și să partajeze resurse.

Modelul transportorului este similar cu o linie de asamblare prin faptul că implică un flux de articole care sunt procesate în etape. La fiecare etapă, un fir separat efectuează unele operații pe un set specific de date de intrare. Când acest corp de date a trecut prin toate etapele, procesarea întregului flux de date de intrare va fi finalizată. Această abordare vă permite să procesați mai multe fluxuri de intrare simultan. Fiecare fir este responsabil pentru producerea de rezultate intermediare, făcându-le disponibile pentru următoarea etapă (sau următorul fir) din conductă Stadiu final(sau thread) generează rezultatele conductei ca întreg.

În modelul producător-consumator, există un thread de producător care pregătește datele consumate de firul de consum. Datele sunt stocate într-un bloc de memorie partajat între thread-urile producătorului și consumatorului. Firul producător trebuie să pregătească mai întâi datele, pe care le va primi apoi firul de consum. Acest proces necesită sincronizare. Dacă firul de execuție produce date mult mai rapid decât poate consuma firul de execuție, firul de execuție va suprascrie rezultatele pe care le-a primit anterior de mai multe ori înainte ca firul de execuție să aibă timp să le proceseze. Dar dacă firul de execuție consumator primește date mult mai rapid decât poate furniza firul de execuție, firul de execuție consumator fie va reprocesa datele pe care le-a procesat deja, fie va încerca să accepte date care nu au fost încă pregătite.

Procese sincrone și asincrone

Procesele sincrone sunt procese cu execuție intermitentă, în care un proces își suspendă execuția până când celălalt se termină. De exemplu, procesul A, părintele, când este executat, creează procesul B, copilul. Procesul A își întrerupe execuția până când procesul B se termină. Când procesul B se termină, codul său de ieșire este plasat în tabelul de proces. Acest lucru informează procesul A că procesul B s-a încheiat.

Procesele asincrone rulează independent unele de altele. Aceasta înseamnă că procesul A se va executa până la finalizare, indiferent de procesul B. Poate exista sau nu o relație directă părinte-fiu între procesele asincrone. Dacă procesul A creează procesul B, ambele pot rula independent, dar la un moment dat părintele trebuie să obțină starea de ieșire a procesului copil. Dacă procesele nu sunt direct legate, ele pot avea un părinte comun.

Procesele asincrone pot partaja resurse precum fișiere sau memorie. Acest lucru poate (sau nu) necesita sincronizare sau interacțiune atunci când partajați resurse.

Sincronizarea proceselor înseamnă aducerea mai multor procese la un astfel de curs atunci când anumite etape ale diferitelor procese sunt finalizate într-o anumită ordine sau simultan.

Sincronizarea este necesară în orice cazuri în care procesele paralele trebuie să interacționeze. Pentru organizarea acestuia se folosesc mijloace de comunicare interprocese. Printre instrumentele cele mai frecvent utilizate se numără semnalele și mesajele, semaforele și mutexurile, conductele și memoria partajată.

Comunicarea intraprocesuala

O soluție la problemele de sincronizare a accesului la resursele critice este să dezactivați toate întreruperile imediat după ce un proces intră în secțiunea critică și să le activați chiar înainte de a ieși din ea. Dacă întreruperile sunt dezactivate, atunci comutarea procesului nu are loc, deoarece transferul controlului către planificator poate fi implementat numai folosind întreruperi.

Această abordare are însă un număr de neajunsuri semnificative. Nu există nicio garanție că un proces care are întreruperi dezactivate nu se va bucla în secțiunea sa critică, făcând astfel sistemul complet inoperabil. În plus, această metodă nu este potrivită pentru un sistem multiprocesor, deoarece dezactivarea întreruperilor pe unul dintre procesoare nu afectează în niciun fel execuția proceselor pe alte procesoare ale computerului, iar aceste procesoare au încă acces la resursa partajată.

Un mesaj este o metodă de interacțiune când un proces trimite un mesaj unui al doilea și acel proces îl primește. Dacă mesajul nu ajunge, al doilea proces este blocat (în așteptarea unui mesaj) sau returnează imediat un cod de eroare.

Există o mulțime de probleme asociate cu sistemele de transmitere a mesajelor. De exemplu, mesajul se poate pierde. Pentru a evita pierderea, destinatarul trimite înapoi un mesaj de confirmare. Dacă expeditorul nu primește confirmarea după un timp, el retrimite mesajul din nou.

Acum să ne imaginăm că mesajul a fost primit, dar confirmarea nu a ajuns la expeditor. Expeditorul îl va trimite din nou și va ajunge la destinatar de două ori. Este esențial ca destinatarul să poată distinge o copie a mesajului anterior de cel nou. Acest lucru poate fi rezolvat cu ușurință prin încorporarea numărului mesajului în corpul său.

Un semafor este un obiect care permite nu mai mult de n procese să intre într-o anumită secțiune de cod (de obicei o secțiune critică).

Trei operații sunt posibile cu un semafor:

1) init(n); - inițializarea contorului (numărul trecut la contor este numărul de procese care pot accesa simultan secțiunea critică)

2) așteptați(); - așteptați până când contorul devine mai mare decât 0; după aceea, reduceți contorul cu unul.

3) pleca(); - creșteți contorul cu unul.

Înainte ca un proces să acceseze secțiunea critică, este necesar să apelați metoda wait(), după care se garantează că numărul de procese care îl accesează simultan nu depășește n-1. Apoi, procesul poate continua să lucreze și să execute metoda leave() după ce a lucrat cu secțiunea critică, permițând astfel altor procese să știe că „spațiul a devenit liber”.

Dacă numărul de apeluri la metodele wait() și leave() nu se potrivește, atunci sistemul nu va funcționa corect, la fel ca în cazul blocajului procesului - o situație în care mai multe procese sunt într-o stare nesfârșită de așteptare pentru resursele ocupate de aceste procese în sine:

Procesul 1

Procesul 2

Vrea să captureze A și B, începe cu A

Vrea să captureze A și B, începe cu B

Captează resursa A

Captează resursa B

Așteptând ca resursa B să devină liberă

Așteptând ca resursa A să devină liberă

Blocare reciprocă

Depanarea blocajelor, ca și alte erori de sincronizare, este complicată de faptul că necesită condiții specifice pentru ca execuția simultană a mai multor procese să apară (în exemplul descris mai sus, dacă procesul 1 ar fi reușit să achiziționeze resursa B înainte de procesul 2, eroarea ar fi nu au avut loc).

Mutexurile sunt cele mai simple semafore binare care pot fi în una dintre cele două stări - marcate sau nemarcate (deschise și, respectiv, închise). Când orice fir care aparține oricărui proces devine proprietarul unui obiect mutex, acesta din urmă este plasat într-o stare neetichetat. Dacă o sarcină eliberează un mutex, starea acestuia devine verificată.

Scopul unui mutex este de a proteja un obiect de a fi accesat de alte fire de execuție decât cel care a dobândit mutexul. În orice moment, doar un fir poate deține un obiect protejat de un mutex. Dacă un alt fir are nevoie de acces la o variabilă protejată de un mutex, atunci acel fir de execuție intră în repaus până când mutex-ul este eliberat.

Test-and-set este o instrucțiune simplă a procesorului (atomic) care nu se întrerupe, care copiază valoarea unei variabile într-un registru și setează o nouă valoare. În timp ce această instrucțiune este în execuție, procesorul nu poate întrerupe execuția acesteia și nu poate trece la executarea unui alt fir. Dacă este folosit arhitectura multiprocesor, apoi în timp ce un procesor execută această instrucțiune cu o celulă de memorie, alte procesoare nu pot accesa această celulă.

Algoritmul lui Dekker este prima soluție corectă cunoscută la problema excluderii reciproce în programarea competitivă. Permite două fire de execuție să partajeze o resursă nepartajată fără a provoca conflicte, folosind doar memoria partajată pentru comunicare.

Dacă două procese încearcă să intre în secțiunea critică în același timp, algoritmul va permite doar unuia dintre ele să facă acest lucru, în funcție de a cărui coadă se află în acel moment. Dacă un proces a intrat deja în secțiunea critică, celălalt va aștepta până când primul îl părăsește. Acest lucru este implementat prin utilizarea a două steaguri (indicatori ai „intenției” de a intra în secțiunea critică) și a variabilei turn (care indică rândul procesului care a sosit).

Unul dintre avantajele algoritmului este că nu necesită instrucțiuni speciale Test-and-set și, ca urmare, este ușor de portat la limbi diferite programare si arhitectura calculatoarelor. Dezavantajele includ aplicabilitatea acestuia la cazul cu doar două procese și utilizarea așteptării ocupate în loc de suspendarea procesului (folosirea așteptării ocupate implică faptul că procesele ar trebui să petreacă o perioadă minimă de timp în interiorul secțiunii critice).

Algoritmul lui Peterson este un algoritm software pentru excluderea reciprocă a firelor de execuție a codului. Deși a fost formulat inițial pentru cazul cu 2 fire, algoritmul poate fi generalizat pentru un număr arbitrar de fire. Algoritmul se numește în mod convențional software, deoarece nu se bazează pe utilizare echipe speciale procesor pentru a dezactiva întreruperile, a bloca magistrala de memorie etc., numai variabilele de memorie partajată și o buclă sunt folosite pentru a aștepta intrarea în secțiunea critică a codului de execuție.

Înainte de a începe execuția secțiunii critice, thread-ul trebuie să apeleze o procedură specială (să o numim EnterRegion) cu numărul său ca parametru. Trebuie să aranjeze ca un fir să aștepte ca coada sa să intre în secțiunea critică. După ce a executat secțiunea critică și a părăsit-o, thread-ul apelează o altă procedură (să o numim LeaveRegion), după care alte fire vor putea intra în regiunea critică.

Principiul general al algoritmului lui Peterson pentru 2 fire:

Postat pe http://www.allbest.ru/

Planificarea procesului

Programare - asigurarea accesului secvenţial al proceselor la un singur procesor.

Planificatorul este partea sistemului de operare responsabilă pentru acest lucru.

Algoritm de programare non-preemptive (neprioritar) - nu necesită o întrerupere a temporizatorului hardware, procesul se oprește doar atunci când se blochează sau iese.

Algoritm de planificare preventivă (prioritate) - necesită o întrerupere a cronometrului hardware, procesul rulează doar pentru o perioadă de timp alocată, după care este suspendat de un cronometru pentru a transfera controlul către planificator.

Procesele sunt plasate în cozi prioritare în conformitate cu strategia de programare. Sistemele UNIX/Linux folosesc două strategii de planificare: FIFO (prescurtare de la First In First Out) și RR (prescurtare de la round-robin).

Când se utilizează strategia FIFO, procesele sunt atribuite procesorului în funcție de momentul în care ajung la coadă.

Programarea RR este aceeași cu programarea FIFO, cu o excepție: după expirarea intervalului de timp, procesul este plasat la sfârșitul cozii de prioritate, iar următorul proces din coadă este atribuit procesorului.

A furniza munca paralela proceselor, programarea cu prioritate poate fi adecvată. Fiecărui proces i se atribuie o prioritate, iar controlul este transferat procesului cu cea mai mare prioritate. Prioritatea poate fi dinamică sau statică. Prioritatea dinamică poate fi setată după cum urmează: P = 1/T, unde T este partea din ultima cuantă utilizată (dacă se folosește 1/50 din cuantă, atunci prioritatea este 50. Dacă se folosește întregul cuantum, atunci prioritatea este 1).

Procesele sunt adesea grupate în funcție de prioritate și folosesc programarea cu prioritate între grupuri, dar în cadrul grupului folosesc programarea round-robin.

Postat pe Allbest.ur

Documente similare

    Structura, specificitatea și arhitectura sistemelor multiprocesor; Clasificare Flynn. Organizarea excluderii reciproce pentru a sincroniza accesul la resursele partajate. Dezactivați întreruperile; semafoare cu drivere de dispozitiv. Grupuri de distribuție a încărcăturii.

    lucrare curs, adăugată 06.07.2014

    Gestionarea memoriei primare și secundare a computerului. Accesul utilizatorului la diverse comune resursele rețelei. Sistem de suport interpret de comenzi. Distribuirea resurselor între utilizatori, programe și procese care rulează simultan.

    prezentare, adaugat 24.01.2014

    Îmbunătățirea parametrilor modulului de memorie. Funcționarea și interacțiunea sistemului de operare cu RAM. Analiza principalelor tipuri și parametri ai RAM. Partea software procesează execuția comenzilor și le plasează în RAM.

    lucrare de curs, adăugată 12.02.2009

    Principalele funcții și procese ale subsistemului de management al proceselor. Procese de expediere (file). Algoritmi pentru programarea executării firelor. Scopul și tipurile de priorități în sisteme de operare Oh. Funcțiile subsistemului principal de gestionare a memoriei.

    prezentare, adaugat 20.12.2013

    Modele abstracte și metode de prelucrare paralelă a datelor, eroare admisă de calcul. Conceptul de proces paralel, granulele de sincronizare și paralelizare ale acestora, definiția legii lui Amdahl. Arhitectura sistemelor de calcul multiprocesor.

    teză, adăugată 09.09.2010

    Scrierea unui program care implementează funcționarea unui sistem multiprocesor cu memorie partajată care procesează cozi de cereri de lungime variabilă. Analiza unei arhitecturi tipice de sistem multiprocesor. Descrierea procedurilor și variabilelor utilizate în program.

    lucrare curs, adaugat 21.06.2013

    Avantajele sistemelor multiprocesor. Crearea unui program care implementează funcționarea unui sistem multiprocesor cu memorie de procesare partajată diverse cantitati aplicații, precum și un număr diferit de procesoare. Modele de calcule pe calculatoare vectoriale și matrice.

    lucrare curs, adaugat 21.06.2013

    Managementul proceselor este o parte a sistemului de operare care afectează funcționarea computerului. Descriptor de context al procesului și algoritm pentru programarea acestuia. Mijloace de sincronizare și interacțiune a proceselor. Secțiune critică, puncte mortuare și fire.

    prelegere, adăugată 02/05/2009

    Esența și conținutul conceptelor de bază ale sistemelor de operare: procese, memorie, fișiere. Clasificare după diverse semneși tipuri de procese, direcții de relație. Principii de planificare a procesorului. Ordine de gestionare a memoriei non-virtuale.

    prezentare, adaugat 24.07.2013

    Clasificarea aeronavelor paralele. Sisteme cu memorie partajată și distribuită. Conducte de operare. Performanța unui transportor ideal. Arhitecturi suprascalare. Arhitectura VLIW. Predicția tranziției. Procesoare Matrix. legile lui Amdahl și Gustafson.

Un supercomputer este un computer foarte puternic, cu o performanță de peste 10 MFLOPS. Astăzi, acest rezultat este acoperit nu numai de stațiile de lucru, ci și de performanta de varf, și PC. La începutul anilor 1990, limita era deja trasă în jurul valorii de 300 MFLOPS. În 2001, specialiști din două țări de vârf în „supercomputer”, SUA și Japonia, au convenit să ridice ștacheta la 5 GFLOPS.

Astfel, principalele caracteristici care caracterizează un supercomputer sunt următoarele:

  • cea mai înaltă performanță;
  • cel mai modern nivel tehnologic (de exemplu, tehnologia GaAs);
  • soluții arhitecturale specifice care vizează creșterea performanței (de exemplu, prezența operațiilor pe vectori);
  • preț, de obicei peste 1-2 milioane de dolari.

Care este factorul decisiv în atingerea nivelurilor fantastice de performanță de astăzi? Să ne întoarcem la fapte istorice. Pe unul dintre primele calculatoare EDSAC (1949), care avea un timp de ceas de 2 μs, a fost posibil să se execute o medie de 100 operatii aritmetice pe secunda. A performanta de varf supercalculator CRAY C90 cu un timp de ceas de aproximativ 4 ns - aproximativ 1 miliard de operații aritmetice pe secundă. Prin urmare, performanţăÎn această perioadă, viteza computerelor a crescut de aproximativ 10 milioane de ori, dar timpul ciclului ceasului a scăzut doar de 500 de ori. Prin urmare, cresterea productivitatii a apărut din cauza altor factori, dintre care cel mai important este utilizarea noului solutii arhitecturale, în special - principiul procesare paralelă a datelor.

Are două soiuri: pipeline și paralel.

Idee prelucrarea transportoarelor constă în evidenţierea unor etape individuale de execuţie funcţionare generală, și în așa fel încât fiecare etapă, după ce și-a încheiat activitatea, să transmită rezultatul celei următoare, acceptând simultan o nouă porțiune de date de intrare. Câștigul în viteza de procesare a datelor se obține prin combinarea operațiilor distanțate anterior.

Prelucrare paralelă a datelor presupune prezența mai multor dispozitive independente funcțional.

Legea lui Amdahl

Legea lui Amdahl

S<= 1/

unde S este accelerația, f este proporția operațiilor care trebuie efectuate secvențial, p este numărul de procesoare.

Corolar de la legea lui Amdahl: pentru a grăbi execuția unui program de q ori, este necesar să grăbiți de cel puțin q ori și cel puțin (1-1/q)-a parte a programului. Prin urmare, dacă trebuie să accelerați un program de 100 de ori în comparație cu versiunea sa secvențială, atunci trebuie să obțineți o accelerare nu mai mică pe cel puțin 99,99% din cod!

Istoria apariției paralelismului în arhitectura computerelor

Toate procesoarele moderne folosesc o anumită formă de

  • 1974 - ALLIAC: procesoare matrice (CU + matrice de 64 procesoare).
  • 1976 - CRAY1: procesoare vector-pipeline. Introducerea comenzilor vectoriale care funcționează cu matrice întregi de date independente.
  • Creșterea performanței computerului din cauza ce?

    De ce supercalculatoarele calculează atât de repede? Pot exista mai multe variante de răspuns, dintre care două au un avantaj clar: dezvoltarea bazei de elemente și utilizarea de noi soluții în arhitectura computerelor.

    Să încercăm să ne dăm seama care dintre acești factori este decisiv pentru obținerea unei performanțe record. Să ne întoarcem la faptele istorice cunoscute. Pe unul dintre primele computere din lume - EDSAC, care a apărut în 1949 la Cambridge și a avut un timp de ceas de 2 microsecunde (2 * 10-6 secunde), a fost posibil să se efectueze 2 * n operații aritmetice în 18 * n milisecunde. , adică în medie 100 de operații aritmetice pe secundă. Să comparăm cu un nod de calcul al unui supercomputer modern Hewlett-Packard V2600: timpul de ceas este de aproximativ 1,8 nanosecunde (1,8 * 10-9 secunde), iar performanța maximă este de aproximativ 77 de miliarde de operații aritmetice pe secundă.

    Ce se întâmplă? Peste o jumătate de secol, performanța computerului a crescut cu mai mult de șapte sute de milioane o singura data. În același timp, câștigul de performanță asociat cu reducerea timpului ciclului de ceas de la 2 microsecunde la 1,8 nanosecunde este de numai aproximativ 1000 de ori. De unde a venit restul? Răspunsul este evident - utilizarea de noi soluții în arhitectura computerelor. Locul principal printre ele este ocupat de principiul procesării paralele a datelor, care întruchipează ideea executării simultane (paralele) a mai multor acțiuni.

    Prelucrarea paralelă a datelor, care întruchipează ideea executării simultane a mai multor acțiuni, are două variante: pipeline și paralelism real. Ambele tipuri de procesare paralelă sunt intuitive, așa că vom face doar mici explicații.

    Procesare paralelă. Dacă un anumit dispozitiv efectuează o operație pe unitatea de timp, atunci va efectua o mie de operații într-o mie de unități. Dacă presupunem că există cinci dispozitive independente identice capabile să funcționeze simultan, atunci un sistem de cinci dispozitive poate efectua aceeași mie de operații nu într-o mie, ci în două sute de unități de timp. În mod similar, un sistem de N dispozitive va efectua aceeași muncă în 1000/N unități de timp. Analogii similare pot fi găsite în viață: dacă un soldat sapă o grădină în 10 ore, atunci o companie de cincizeci de soldați cu aceleași abilități, lucrând simultan, va face față aceleiași lucrări în 12 minute - principiul paralelismului în acțiune!

    Apropo, pionierul procesării paralele a fluxurilor de date a fost academicianul A.A Samarsky, care a efectuat calculele necesare pentru a simula exploziile nucleare la începutul anilor '50. Samarsky a rezolvat această problemă așezând câteva zeci de domnișoare cu aparate de adăugare la mese. Doamnele și-au transferat date între ele pur și simplu în cuvinte și au scris numerele necesare la mașinile de adăugare. Astfel, în special, a fost calculată evoluția undei de explozie. Era multă muncă, domnișoarele erau obosite, iar Alexander Andreevici a mers printre ele și le-a încurajat. Acesta, s-ar putea spune, a fost primul sistem paralel. Deși calculele pentru bomba cu hidrogen au fost efectuate cu măiestrie, acuratețea lor a fost foarte scăzută, deoarece erau puține noduri în grila folosită, iar timpul de calcul era prea lung.



    Prelucrare transportoare. Ce este necesar pentru a adăuga două numere reale reprezentate sub formă de virgulă mobilă? O mulțime de operațiuni mici, cum ar fi compararea comenzilor, alinierea comenzilor, adăugarea de mantise, normalizarea etc. Procesoarele primelor calculatoare au efectuat toate aceste „micro-operații” pentru fiecare pereche de argumente, unul după altul, până au ajuns la rezultatul final și abia apoi au trecut la procesarea următoarei perechi de termeni.

    Ideea procesării în conductă este de a izola etapele individuale ale efectuării unei operații generale, iar fiecare etapă, după ce și-a încheiat activitatea, ar trece rezultatul la următoarea, primind simultan o nouă porțiune de date de intrare. Obținem un câștig evident în viteza de procesare prin combinarea operațiilor distanțate anterior. Să presupunem că într-o operație există cinci micro-operații, fiecare dintre acestea fiind efectuată într-o unitate de timp. Dacă există un dispozitiv serial indivizibil, atunci va procesa 100 de perechi de argumente în 500 de unități. Dacă fiecare microoperație este separată într-o etapă separată (sau numită în alt mod o etapă) a unui dispozitiv transportor, atunci în a cincea unitate de timp, la diferite etape de procesare a unui astfel de dispozitiv, vor fi localizate primele cinci perechi de argumente. , iar întregul set de o sută de perechi va fi procesat în 5 + 99 = 104 unități de timp - accelerația față de un dispozitiv serial este de aproape cinci ori (în funcție de numărul de trepte transportoare).

    S-ar părea că procesarea conductei poate fi înlocuită cu succes de paralelism obișnuit, pentru care duplicăm dispozitivul principal de câte ori se presupune că trebuie alocat numărul de etape ale conductei. De fapt, cele cinci dispozitive din exemplul anterior vor procesa 100 de perechi de argumente în 100 de unități de timp, ceea ce este mai rapid decât timpul de funcționare al dispozitivului transportor! Ce s-a întâmplat? Răspunsul este simplu: prin creșterea numărului de dispozitive de cinci ori, creștem semnificativ atât volumul echipamentelor, cât și costul acestuia. Imaginați-vă că o fabrică de mașini a decis să elimine linia de asamblare, menținând în același timp ritmul de producție de mașini. Dacă anterior existau o mie de mașini pe linia de asamblare în același timp, atunci, acționând prin analogie cu exemplul anterior, este necesar să recrutați o mie de echipe, fiecare dintre ele (1) capabilă să asambleze complet mașina de la început. pentru a termina, efectuând sute de tipuri diferite de operații și (2) faceți acest lucru în același timp în care mașina a fost anterior pe linia de asamblare. Vă puteți imagina costul unei astfel de mașini? Nu? Sunt de acord, este dificil, dacă nu ne vine în minte Lamborghini, dar de aceea a apărut procesarea pe linia de asamblare...

      Mesaje

    • Prelucrare în paralel și prin conducte

      Procesarea paralelă a datelor întruchipează ideea de a efectua mai multe acțiuni simultan, cum ar fi banda rulantaȘi paralelism.

      Procesare paralelă

      Când un dispozitiv efectuează o operație pe unitatea de timp, putem spune că dispozitivul va efectua o mie de operații într-o mie de unități. Dacă presupunem că există cinci dispozitive independente care funcționează simultan, atunci un astfel de sistem de dispozitive poate efectua aceeași mie de operații în două sute de unități de timp. Prin analogie, un sistem de N dispozitive va efectua aceeași muncă în 1000/N unități de timp. Acest lucru se aplică și vieții reale, de exemplu:

      o grădină de legume poate fi săpată de un soldat în 10 ore, iar o companie de 50 de soldați cu aceleași abilități, lucrând simultan, o va dezgropa în 12 minute - principiul paralelismului în acțiune.

      Samarsky A.A., care a efectuat calcule pentru a simula exploziile nucleare la începutul anilor '50, a fost un pionier în procesarea paralelă a fluxurilor de date. Samarsky a calculat evoluția undei de explozie într-un mod interesant - a așezat câteva zeci de oameni cu mașini de adăugare la mese, forțându-i să transfere date unul către celălalt pur și simplu în cuvinte și să pună numerele necesare pe mașini de adăugare. Ai putea spune că asta este
      și a existat primul sistem paralel. Deși calculele pentru bomba cu hidrogen au fost efectuate cu măiestrie, acuratețea lor a fost destul de scăzută deoarece grila folosită avea puține noduri și timpul de calcul era prea lung.

      Prelucrare transportoare

      Pentru a adăuga două numere reale reprezentate sub formă de virgulă mobilă, este necesar să efectuați o mulțime de operații mici - comparați ordine, aliniați ordine, adăugați mantise, normalizați etc. Procesoarele primelor calculatoare au efectuat toate aceste „micro-operații” pentru fiecare pereche de argumente succesiv, unul după altul, până când au ajuns la rezultatul final și abia atunci a fost procesată următoarea pereche.
      termeni.

      Esența procesării conductelor este de a izola etapele individuale ale unei operațiuni comune. Fiecare etapă, după ce și-a încheiat activitatea, ar transmite rezultatul următoarei, primind simultan o nouă porțiune de date. Combinarea operațiunilor separate anterior are cu siguranță un efect pozitiv asupra vitezei de procesare. De exemplu, o operație poate avea cinci micro-operații, fiecare dintre acestea fiind efectuată într-o unitate de timp.
      Dacă există un dispozitiv serial indivizibil, atunci procesează 100 de perechi de argumente în 500 de unități. Dacă fiecare microoperație este separată într-o etapă (sau etapă) separată a unui dispozitiv transportor, atunci în a cincea unitate de timp, primele cinci perechi de argumente se vor afla în diferite etape de procesare a unui astfel de dispozitiv și întregul set. de o sută de perechi vor fi procesate în 104 (5+99) unități de timp - accelerația față de un dispozitiv serial este de aproape cinci ori (pe baza numărului de etape de conductă).

      S-ar părea că procesarea conductei poate fi înlocuită cu succes prin paralelism obișnuit, este suficient să duplicați pur și simplu dispozitivul principal de câte ori ar trebui să fie alocat numărul de etape ale conductei; De fapt, 5 dispozitive procesează 100 de perechi de argumente în 100 de unități de timp, ceea ce este mai rapid decât timpul de funcționare al unui dispozitiv transportor. Dacă creșteți numărul de dispozitive de cinci ori, volumul echipamentului și costul acestuia vor crește semnificativ. De exemplu, luați în considerare o situație în care o bandă transportoare de la o fabrică de mașini este înlăturată, în timp ce ritmul producției de mașini trebuie menținut în consecință, vor fi necesare o mie de echipe, fiecare dintre acestea putând asambla o mașină de la început până la sfârșit; efectuând sute de operații diferite și într-un timp destul de scurt.

      Costul mașinii va fi colosal. De aceea a apărut procesarea conductelor.

      Sisteme paralele moderne

      În prezent, există patru direcții în dezvoltarea tehnologiei de calcul de înaltă performanță.

      Calculatoare transportoare vectoriale

      Caracteristicile unor astfel de mașini sunt un set de comenzi vectoriale și dispozitive funcționale transportoare. Spre deosebire de abordarea tradițională, comenzile vectoriale sunt capabile să opereze cu matrice întregi de date independente, ceea ce înseamnă că devine posibilă încărcarea eficientă a conductelor disponibile, de exemplu. o comandă precum A=B+C poate însemna nu adăugarea a două numere, ci a două matrice. Un reprezentant tipic al acestei direcții este familia CRAY de calculatoare vector-pipeline.

      Calculatoare masiv paralele cu memorie distribuită.

      Construcția calculatoarelor din această clasă se distinge printr-o idee simplă: fiecare microprocesor serial este echipat cu propria sa memorie locală, apoi conectat printr-un mediu de comunicare. Această arhitectură are multe avantaje: pentru a crește performanța, este suficientă creșterea numărului de procesoare, configurația optimă este ușor de selectat dacă se cunoaște puterea de calcul necesară.

      Cu toate acestea, există un dezavantaj semnificativ care depășește multe dintre avantaje. În aceste computere, comunicarea între procesoare este mult mai lentă decât procesarea locală a datelor de către procesoarele înșiși. În acest sens, este foarte dificil să scrieți un program eficient pentru astfel de computere, pentru unii algoritmi, este uneori pur și simplu imposibil. Exemple de astfel de calculatoare: Intel Paragon, IBM SP1, Parsytec, într-o oarecare măsură IBM SP2 și CRAY T3D/T3E, deși influența acestui dezavantaj în aceste computere este mult mai mică. Rețelele de calculatoare, care sunt din ce în ce mai văzute ca o alternativă destul de ieftină la calculatoarele extrem de scumpe, pot fi, de asemenea, clasificate în aceeași clasă.

      Calculatoare paralele cu memorie partajată

      Toată memoria RAM a acestor computere este partajată de mai multe procesoare identice. Problemele clasei anterioare au fost rezolvate, dar au fost adăugate altele noi - din motive tehnice este imposibil să se mărească numărul de procesoare care ar avea acces la memoria partajată. Exemple ale acestei direcții sunt multe computere SMP multiprocesor sau, de exemplu, noduri individuale ale calculatoarelor HP Exemplar și Sun StarFire.

      Sisteme combinate

      Ultima direcție nu este mai degrabă independentă, ci pur și simplu o combinație a celor trei anterioare. Să formăm un nod de calcul din mai multe procesoare (tradiționale sau vector-pipeline) și o memorie comună pentru acestea. Dacă există o lipsă de putere de calcul, puteți combina mai multe noduri cu canale de mare viteză. Acest tip de arhitectură se numește arhitectură cluster. Sun StarFire, NEC SX-5, CRAY SV1, HP Exemplar, cele mai recente modele IBM SP2 și altele sunt construite pe acest principiu.

      Această direcție este în prezent cea mai promițătoare pentru proiectarea computerelor cu indicatori de performanță record.

      Niveluri de paralelism

      În funcție de nivelul la care trebuie asigurat paralelismul, se folosesc anumite metode și mijloace de implementare. Se disting următoarele niveluri de paralelism.

      Nivel micro. Execuția unei comenzi este împărțită în faze, iar fazele mai multor comenzi învecinate pot fi suprapuse prin pipeline. Acest nivel poate fi atins pe o aeronavă cu un singur procesor.

      Nivelul firului. Sarcinile sunt împărțite în părți care pot fi executate în paralel (file). Acest nivel este atins pe aeronave paralele.

      Nivel de comandă. Mai multe instrucțiuni sunt executate în paralel; procesorul găzduiește mai multe conducte simultan. Tipic pentru procesoarele superscalare.

      Nivel de sarcină. Sarcinile independente sunt executate simultan pe diferite procesoare, practic nu există nicio interacțiune între ele. Nivelul este tipic pentru computere cu mai multe procesoare și mai multe mașini.

      Conceptul de nivel de paralelism este strâns legat de conceptul de granularitate. Granularitatea este o măsură a raportului dintre cantitatea de calcul efectuată într-o sarcină paralelă și cantitatea de comunicare (pentru mesagerie). Gradul de granularitate variază de la granulație fină la granulație grosieră. Legea lui Amdahl se concentrează pe cereale grosiere
      paralelism.

      Paralelismul cu granulație grosieră înseamnă că fiecare calcul paralel este suficient de independent de celelalte, iar calculele individuale necesită un schimb relativ rar de informații între ele. Unitățile de paralelizare sunt programe mari și independente care conțin mii de instrucțiuni. Sistemul de operare oferă acest nivel de paralelism.

      Pentru o execuție paralelă eficientă, este necesar să se echilibreze gradul de granularitate a programului și cantitatea de întârziere de comunicare care apare între diferite granule. Pentru o latență minimă de comunicare, partiționarea cu granulație fină a programului este cea mai bună. În acest caz, funcţionează paralelismul de date. Dacă întârzierea comunicării este mare, atunci este mai bine să utilizați partiționarea programelor cu granulație grosieră.

      Literatură

      1. Badenko V.L. Calcul de înaltă performanță. Tutorial. - Sankt Petersburg: Editura Politehnică. Universitatea, 2010. - 180 p.
      2. Barsky A.B. Tehnologii informaționale paralele: Manual/A.B. Barsky.-M.: Internet University of Information Technologies; BINOM. Knowledge Laboratory, 2007.-503 p.: ill., tab.-(serie „Fundamentals of Information Technologies”) - p.20-28, p.56-58.
      3. Korneev V.V. Sisteme informatice.-M.: Helios APB, 2004.-512 p., ill.- p. 34-46
      4. Latsis A.O. Prelucrare paralelă a datelor. M.: Academia, 2010. - 336 p.
      5. Tsilker B.Ya., Orlov S.A. Organizarea calculatoarelor si sistemelor. Manual pentru universități. - Sankt Petersburg: Peter, 2004. - 668 p.
    • Mesaje

    Modalități de îmbunătățire a performanței aeronavei sunt încorporate în arhitectura sa. Pe de o parte, acesta este un set de procesoare, unități de memorie, dispozitive de intrare/ieșire și, desigur, metode de conectare a acestora, de exemplu. mediu de comunicare. Pe de altă parte, acestea sunt acțiunile efective ale aeronavei pentru a rezolva o anumită problemă și acestea sunt operațiuni pe comenzi și date. Aceasta este de fapt întreaga bază principală pentru procesarea paralelă. Prelucrarea paralelă, care întruchipează ideea de execuție simultană a mai multor acțiuni, are mai multe varietăți: superscalaritate, conducte,SIMD– extensii,Hiper Filetat, multi-core. Practic, aceste tipuri de procesare paralelă sunt intuitive, așa că vom face doar mici explicații. Dacă un anumit dispozitiv efectuează o operație pe unitatea de timp, atunci va efectua o mie de operații într-o mie de unități. Dacă presupunem că există cinci dispozitive independente identice capabile să funcționeze simultan, atunci un sistem de cinci dispozitive poate efectua aceeași mie de operații nu într-o mie, ci în două sute de unități de timp. În mod similar, un sistem de N dispozitive va efectua aceeași muncă în 1000/N unități de timp. Analogii similare pot fi găsite în viață: dacă un soldat sapă o grădină în 10 ore, atunci o companie de cincizeci de soldați cu aceleași abilități, lucrând simultan, va face față aceleiași lucrări în 12 minute (prelucrare paralelă a datelor) și chiar cu melodii (procesare paralelă a comenzilor).

    Prelucrare transportoare . Ce este necesar pentru a adăuga două numere reale reprezentate sub formă de virgulă mobilă? O mulțime de operațiuni mici, cum ar fi compararea comenzilor, alinierea comenzilor, adăugarea de mantise, normalizarea etc. Procesoarele primelor calculatoare au efectuat toate aceste „micro-operații” pentru fiecare pereche de argumente, unul după altul, până au ajuns la rezultatul final și abia apoi au trecut la procesarea următoarei perechi de termeni. Ideea procesării în conductă este de a izola etapele individuale ale efectuării unei operații generale, iar fiecare etapă, după ce și-a încheiat activitatea, ar trece rezultatul la următoarea, primind simultan o nouă porțiune de date de intrare. Obținem un câștig evident în viteza de procesare prin combinarea operațiilor distanțate anterior.

    Superscalaritate. Ca și în exemplul anterior, numai atunci când se construiește o conductă, sunt utilizate mai multe implementări hardware și software ale dispozitivelor funcționale, de exemplu, două sau trei ALU, trei sau patru dispozitive de eșantionare.

    Hiper Filetat. O direcție promițătoare în dezvoltarea microprocesoarelor moderne bazate pe arhitectură multithreaded. Principalul obstacol în calea creșterii productivității prin creșterea numărului de dispozitive funcționale este organizarea încărcării eficiente a acestor dispozitive. Dacă codurile de program de astăzi nu sunt capabile să încarce toate dispozitivele funcționale cu lucru, atunci puteți permite procesorului să efectueze mai mult de o sarcină (fir), astfel încât firele suplimentare să încarce toate unitățile funcționale (la fel ca multitasking).

    Multi-core. Este posibil, desigur, să se implementeze multiprocesare la nivel de cip, adică plasați mai multe procesoare pe un cip (Putere 4). Dar dacă luăm un microprocesor împreună cu memoria ca nuclee de sistem, atunci mai multe astfel de nuclee pe un cip vor crea o structură multi-core. În acest caz, funcțiile (de exemplu, interfețele sistemelor de rețea și telecomunicații) sunt integrate în cip, pentru care se folosesc de obicei chipset-uri (Motorola MPC8260, procesoare Power 4).

    Implementarea tehnologiei de calcul de înaltă performanță se desfășoară în prezent în patru direcții principale.

    1. Calculatoare transportoare vectoriale. Dispozitivele funcționale pentru conducte și setul de instrucțiuni vectoriale sunt două caracteristici ale unor astfel de mașini. Spre deosebire de abordarea tradițională, comenzile vectoriale operează pe rețele întregi de date independente, ceea ce permite încărcarea eficientă a conductelor disponibile, de ex. o comandă precum A=B+C poate însemna adăugarea a două matrice, nu a două numere. Un reprezentant tipic al acestei direcții este familia CRAY de calculatoare vector-pipeline, care include, de exemplu, CRAY EL, CRAY J90, CRAY T90 (în martie 2000, compania americană TERA a cumpărat divizia CRAY de la Silicon Graphics, Inc.) .

    2. Calculatoare masiv paralele cu memorie distribuită. Ideea de a construi computere din această clasă este banală: să luăm microprocesoare seriale, să oferim fiecăruia propria sa memorie locală, să ne conectăm printr-un mediu de comunicare - asta e tot. Această arhitectură are multe avantaje: dacă este nevoie de performanțe ridicate, atunci pot fi adăugate mai multe procesoare dacă finanțele sunt limitate sau se cunoaște dinainte puterea de calcul necesară, atunci este ușor să selectați configurația optimă etc.

    Cu toate acestea, există și un „minus” decisiv care reduce multe dintre „plusuri” la nimic. Faptul este că este independent, ci mai degrabă o combinație a celor trei anterioare. Vom forma un nod de calcul din mai multe procesoare (tradiționale sau vector-pipeline) și memoria lor comună. Dacă puterea de calcul obținută nu este suficientă, atunci vom combina mai multe noduri cu canale de mare viteză. Acest tip de arhitectură se numește cluster SV1, HP Exemplar,Soare StarFire, N.E.C. SX-5, ultimele modele IBM SP2

    3. Paralelcalculatoare cu memorie partajată. Toată memoria RAM a unor astfel de computere este partajată de mai multe procesoare identice. Acest lucru elimină problemele clasei anterioare, dar adaugă altele noi - numărul de procesoare cu acces la memoria partajată nu poate fi mărit din motive pur tehnice. Această zonă include multe computere SMP multiprocesoare moderne sau, de exemplu, noduri individuale ale computerelor HP Exemplarși Soare StarFire.

    4. Sisteme de clustere. Ultima direcție, strict vorbind, nu este independentă, ci mai degrabă o combinație a celor trei anterioare. Vom forma un nod de calcul din mai multe procesoare (tradiționale sau vector-pipeline) și memoria lor comună. Dacă puterea de calcul obținută nu este suficientă, atunci vom combina mai multe noduri cu canale de mare viteză. Acest tip de arhitectură se numește cluster, iar CRAY-urile sunt construite pe acest principiu SV1, HP Exemplar,Soare StarFire, N.E.C. SX-5, ultimele modele IBM SP2 si altii. Această direcție este în prezent cea mai promițătoare pentru proiectarea computerelor cu indicatori de performanță record.