Model de programare paralelă - Parallel programming model
În calcul , un model de programare paralelă este o abstractizare a arhitecturii computerului paralel , cu care este convenabil să se exprime algoritmi și compoziția lor în programe . Valoarea unui model de programare poate fi judecată în funcție de generalitatea sa : cât de bine poate fi exprimată o serie de probleme diferite pentru o varietate de arhitecturi diferite și performanța sa : cât de eficient pot executa programele compilate. Implementarea unui model de programare paralelă poate lua forma unei biblioteci invocate dintr-un limbaj secvențial , ca o extensie la un limbaj existent sau ca un limbaj complet nou.
Consensul în jurul unui anumit model de programare este important deoarece duce la construirea diferitelor computere paralele cu suport pentru model, facilitând astfel portabilitatea software-ului. În acest sens, modelele de programare sunt denumite punte între hardware și software.
Clasificarea modelelor de programare paralelă
Clasificările modelelor de programare paralelă pot fi împărțite în două domenii: interacțiunea procesului și descompunerea problemei.
Interacțiunea procesului
Interacțiunea proceselor se referă la mecanismele prin care procesele paralele sunt capabile să comunice între ele. Cele mai frecvente forme de interacțiune sunt memoria partajată și transmiterea mesajelor, dar interacțiunea poate fi, de asemenea, implicită (invizibilă pentru programator).
Memoria partajată este un mijloc eficient de transmitere a datelor între procese. Într-un model de memorie partajată, procesele paralele împărtășesc un spațiu global de adrese pe care le citesc și scriu în mod asincron. Accesul simultan asincron poate duce la condiții de cursă , iar mecanisme precum blocări , semafore și monitoare pot fi utilizate pentru a le evita. Procesoarele convenționale multi-core acceptă direct memoria partajată, pe care multe limbaje și biblioteci de programare paralele, cum ar fi Cilk , OpenMP și Threading Building Blocks , sunt proiectate să le exploateze.
Trimiterea mesajului
Într-un model de transmitere a mesajelor, procesele paralele fac schimb de date prin transmiterea mesajelor reciproc. Aceste comunicații pot fi asincrone, unde un mesaj poate fi trimis înainte ca receptorul să fie gata, sau sincron, unde receptorul trebuie să fie gata. Comunicante procese secvențiale (CSP) formalizarea mesajului care trece cu utilizarea canalelor de comunicare sincrone la procesele de conectare, și a condus la limbi importante , cum ar fi Occam , Limbo și Go . În contrast, modelul actorului folosește transmiterea mesajelor asincrone și a fost angajat în proiectarea limbajelor precum D , Scala și SALSA.
Interacțiune implicită
Într-un model implicit, nici o interacțiune de proces nu este vizibilă pentru programator și, în schimb, compilatorul și / sau timpul de execuție este responsabil pentru efectuarea acestuia. Două exemple de paralelism implicit sunt cu limbaje specifice domeniului în care este prescrisă concurența în cadrul operațiunilor la nivel înalt și cu limbaje funcționale de programare deoarece absența efectelor secundare permite executarea funcțiilor nedependente în paralel. Cu toate acestea, acest tip de paralelism este dificil de gestionat, iar limbajele funcționale, cum ar fi Concurrent Haskell și Concurrent ML, oferă caracteristici pentru gestionarea paralelismului în mod explicit și corect.
Descompunerea problemei
Un program paralel este compus din executarea simultană a proceselor. Descompunerea problemei se referă la modul în care sunt formulate procesele constitutive.
Paralelismul sarcinilor
Un model paralel cu sarcina se concentrează pe procese sau fire de execuție. Aceste procese vor fi adesea distincte din punct de vedere comportamental, ceea ce subliniază necesitatea comunicării. Paralelismul sarcinilor este un mod natural de a exprima comunicarea de transmitere a mesajelor. În taxonomia lui Flynn , sarcina paralelism este de obicei clasificat ca MIMD / MPMD sau MISD .
Paralelismul datelor
Un model paralel cu datele se concentrează pe efectuarea operațiunilor pe un set de date, de obicei un tablou structurat în mod regulat. Un set de sarcini va funcționa pe aceste date, dar independent pe partițiile disjuncte. În taxonomia Flynn , paralelismul datelor este de obicei clasificat ca MIMD / SPMD sau SIMD .
Paralelism implicit
Ca și în cazul interacțiunii implicite a proceselor, un model implicit de paralelism nu dezvăluie nimic programatorului, întrucât compilatorul, runtime-ul sau hardware-ul sunt responsabile. De exemplu, în compilatoare, paralelizarea automată este procesul de conversie a codului secvențial în cod paralel, iar în arhitectura computerului, execuția suprascalară este un mecanism prin care paralelismul la nivel de instrucțiuni este exploatat pentru a efectua operațiuni în paralel.
Terminologie
Modelele de programare paralelă sunt strâns legate de modelele de calcul . Un model de calcul paralel este o abstractizare utilizată pentru a analiza costul proceselor de calcul, dar nu trebuie neapărat să fie practic, în sensul că poate fi implementat eficient în hardware și / sau software. Un model de programare, în schimb, implică în mod specific considerațiile practice ale implementării hardware și software.
Un limbaj de programare paralel se poate baza pe unul sau o combinație de modele de programare. De exemplu, Fortran de înaltă performanță se bazează pe interacțiuni de memorie partajată și descompunerea problemelor în paralel cu datele, iar Go oferă mecanism pentru interacțiunea de memorie partajată și interacțiunea de transmitere a mesajelor.
Exemple de modele de programare paralelă
| Nume | Clasa de interacțiune | Clasa de descompunere | Exemple de implementări |
|---|---|---|---|
| Model de actor | Transmiterea mesajului asincron | Sarcină | D , Erlang , Scala , SALSA |
| Paralel sincron în vrac | Memorie partajată | Sarcină | Apache Giraph , Apache Hama , BSPlib |
| Comunicarea proceselor secvențiale | Transmiterea mesajului sincron | Sarcină | Ada , Occam , VerilogCSP , Go |
| Circuite | Trimiterea mesajului | Sarcină | Verilog , VHDL |
| Flux de date | Trimiterea mesajului | Sarcină | Lustre , TensorFlow , Apache Flink |
| Funcţional | Trimiterea mesajului | Sarcină | Haskell simultan , ML concurent |
| Mașină LogP | Transmiterea mesajului sincron | Nu este specificat | Nici unul |
| Mașină cu acces aleator paralel | Memorie partajată | Date | Cilk , CUDA , OpenMP , Threading Building Blocks , XMTC |
Vezi si
- Paralelizare automată
- Model de punte
- Concurență
- Gradul de paralelism
- Paralelism explicit
- Lista limbajelor de programare simultane și paralele
- Memorie externă paralelă (model)
Referințe
Lecturi suplimentare
- Blaise Barney, Introducere în calcul paralel , Lawrence Livermore National Laboratory
- Murray I. Cole., Scheletele algoritmice: gestionarea structurată a calculului paralel (PDF) , Universitatea din Glasgow
- J. Darlinton; M. Ghanem; HW To (1993), „Programare paralelă structurată” , în modele de programare pentru computere paralele masive. IEEE Computer Society Press : 160–169, doi : 10.1109 / PMMP.1993.315543 , ISBN 0-8186-4900-3, S2CID 15265646
- Ian Foster, proiectarea și construirea de programe paralele , Laboratorul Național Argonne