Calcul paralel
Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de
versiunea revizuită la 5 octombrie 2014; verificările necesită
12 modificări .
Calculul paralel este o modalitate de organizare a calculului computerizat , în care programele sunt dezvoltate ca un set de procese de calcul care interacționează care funcționează în paralel (simultan). Termenul cuprinde toate problemele de paralelism în programare , precum și crearea de implementări hardware eficiente . Teoria calculului paralel este o secțiune a teoriei aplicate a algoritmilor [1] .
Există diferite moduri de a implementa calculul paralel. De exemplu, fiecare proces de calcul poate fi implementat ca un proces de sistem de operare sau procesele de calcul pot fi un set de fire de execuție într-un singur proces OS. Programele paralele pot fi executate fizic fie secvenţial pe un singur procesor - alternând pe rând etapele de execuţie a fiecărui proces de calcul, fie în paralel - alocarea unuia sau mai multor procesoare (situate în apropiere sau distribuite într-o reţea de calculatoare ) fiecărui proces de calcul.
Principala dificultate în proiectarea programelor paralele este de a asigura succesiunea corectă a interacțiunilor între diferite procese de calcul, precum și coordonarea resurselor partajate între procese.
Modalități de sincronizare a comunicațiilor paralele
În unele sisteme de programare simultană, trecerea datelor între componente este ascunsă de programator (de exemplu, prin utilizarea mecanismului promisiunii ), în timp ce în altele trebuie specificată în mod explicit. Interacțiunile explicite pot fi împărțite în două tipuri:
- Interacțiune prin memorie partajată : pe fiecare procesor al unui sistem multiprocesor se lansează un fir de execuție , care aparține unui singur proces. Firele fac schimb de date printr-o zonă de memorie partajată pentru un proces dat [2] . Numărul de fire corespunde numărului de procesoare. Threadurile sunt create fie prin intermediul limbajului (de exemplu, în Java sau C# , C++ (începând cu C++11 ), C (începând cu C11 )), fie folosind biblioteci în mod explicit (de exemplu, în C/C++ folosind PThreads). ), sau declarativ (de exemplu, folosind biblioteca OpenMP) sau instrumente de compilare încorporate automat (de exemplu, High Performance Fortran ). Acest tip de programare paralelă necesită de obicei o anumită formă de captură de control ( mutexuri , semafore , monitoare ) pentru a coordona firele între ele.
- Comunicare prin transmiterea mesajelor : Un proces cu un singur thread rulează pe fiecare procesor al unui sistem multiprocesor și comunică cu alte procese care rulează pe alte procesoare folosind mesaje. Procesele sunt create explicit prin apelarea funcției adecvate a sistemului de operare, iar mesageria este creată folosind o bibliotecă (de exemplu, o implementare a protocolului MPI ) sau folosind instrumente de limbaj (de exemplu, High Performance Fortran , Erlang sau occam ). Mesajele pot fi schimbate asincron, sau folosind o metodă de întâlnire, în care expeditorul este blocat până când mesajul său este livrat. Transmiterea asincronă a mesajelor poate fi fie fiabilă (cu livrare garantată) fie nesigură [3] .
Sistemele paralele bazate pe mesagerie sunt adesea mai ușor de înțeles decât sistemele cu memorie partajată și sunt în general privite ca o metodă superioară de programare paralelă. Există o mare varietate de teorii matematice pentru studiul și analiza sistemelor de transmitere a mesajelor, inclusiv modelul actorului și diferitele tipuri de calcul al procesului . Mesageria poate fi implementată eficient pe multiprocesoare simetrice atât cu memorie coerentă partajată, cât și fără aceasta.
Paralelismul de memorie distribuită și paralelismul de transmitere a mesajelor au caracteristici de performanță diferite. De obicei (dar nu întotdeauna), supraîncărcarea memoriei procesului și timpul de comutare a sarcinilor sunt mai mici pentru sistemele cu transmitere de mesaje, dar transmiterea mesajului în sine este mai mare decât apelurile de procedură. Aceste diferențe sunt adesea depășite de alți factori care afectează performanța.
- Metoda hibridă : Pe sistemele cu multiprocesor cu memorie distribuită ( DM-MIMD ), unde fiecare nod al sistemului este un multiprocesor cu memorie partajată ( SM-MIMD ), poate fi utilizată o metodă de programare hibridă [4] . Pe fiecare nod al sistemului se lansează un proces multi-threaded, care distribuie fire între procesoarele acestui nod. Schimbul de date între firele de execuție de pe un nod se realizează prin intermediul memoriei partajate, iar schimbul de date între noduri se realizează prin transmiterea de mesaje. În acest caz, numărul de procese este determinat de numărul de noduri, iar numărul de fire este determinat de numărul de procesoare de pe fiecare nod. Metoda de programare hibridă este mai complicată (necesită o rescriere specială a programului paralel), dar este cea mai eficientă în utilizarea resurselor hardware ale fiecărui nod al sistemului multiprocesor.
Desigur, într-un astfel de sistem, este posibil să se utilizeze exclusiv metoda de transmitere a mesajelor, adică să ruleze un proces separat pe fiecare procesor al fiecărui nod. În acest caz, numărul de procese (și fire) va fi egal cu numărul de procesoare de pe toate nodurile. Această metodă este mai simplă (într-un program paralel, trebuie doar să creșteți numărul de procese), dar este mai puțin eficientă, deoarece procesoarele aceluiași nod vor schimba mesaje între ele ca și cum ar fi pe mașini diferite
[5] .
Sarcini tipice care permit calculul paralel
- hartă - executarea aceleiași funcții pe fiecare element al matricei de date de intrare, obținând o matrice de rezultate de calcul egale ca putere
- reduce - executând aceeași funcție pentru a adăuga contribuția fiecărui element al intrării la o valoare finală
Instrumente software de concurență
- OpenMP este un standard de interfață de aplicație pentru sistemele paralele cu memorie partajată.
- POSIX Threads este un standard pentru implementarea thread-urilor (threads-urilor) de execuție.
- Windows API - aplicații multi-threaded pentru C++.
- PVM (Mașină virtuală paralelă) vă permite să combinați un set eterogen (dar în rețea) de computere într-o resursă de calcul comună.
- MPI (Message Passing Interface) este un standard pentru sistemele de transmitere a mesajelor între procesele de execuție paralele.
Vezi și
Note
- ↑ Mihailevici, 1989 , p. unu.
- ↑ RedBook, 1999 , p. unu.
- ↑ RedBook, 1999 , p. 2.
- ↑ RedBook, 1999 , p. 5.
- ↑ RedBook, 1999 , p. patru.
Literatură
- Dicţionar de cibernetică / Editat de academicianul V. S. Mikhalevich . - al 2-lea. - Kiev: Ediția principală a Enciclopediei sovietice ucrainene numită după M. P. Bazhan, 1989. - 751 p. - (C48). — 50.000 de exemplare. - ISBN 5-88500-008-5 .
- RS/6000SP: Programare MPI practică . - IBM RedBook, 1999. - 238 p. Arhivat pe 19 ianuarie 2008 la Wayback Machine
- Voevodin VV, Voevodin Vl. B. Calcul paralel. - Sankt Petersburg. : BHV-Petersburg, 2002. - 608 p. — ISBN 5-94157-160-7 .
- Olenev N. N. Fundamentele programării paralele în sistemul MPI . - M. : VTs RAN, 2005. - 80 p. — ISBN 5201098320 .
Link -uri
Dicționare și enciclopedii |
|
---|