Paralelizare automată
Paralelizare automată - optimizarea programului de către compilator , care constă în convertirea automată a acestuia într-un formular care rulează pe un computer paralel , de exemplu, pe o mașină SMP sau NUMA. Scopul automatizării paralelizării este de a elibera programatorul de procesul de paralelizare manuală, consumator de timp și predispus la erori. În ciuda faptului că calitatea paralelizării automate s-a îmbunătățit în ultimii ani, paralelizarea completă a programelor secvențiale rămâne o sarcină prea dificilă care necesită cele mai complexe tipuri de analiză a programelor.
Auto-paralelizatorul se concentrează de obicei pe constructe de control, cum ar fi bucle care procesează matrice, deoarece, în general, cea mai mare parte a execuției programului are loc în bucle de un fel. Compilatorul paralel încearcă să împartă bucla în părți, astfel încât iterațiile sale separate să poată fi executate pe diferite procesoare în același timp.
Analiza programului
Compilatorii analizează înainte de a face paralelizarea pentru a răspunde la următoarele întrebări:
- Este sigur să paralelizezi această buclă? Este necesară o analiză atentă a dependenței și o analiză a independenței indicatorului sau aliasului ( en:alias analysis ). Iterațiile buclei nu ar trebui să aibă dependențe de date. [unu]
- Merită să paralelizezi bucla? [1] Răspunsul la această întrebare necesită o evaluare (simulare) fiabilă a funcționării programului și luarea în considerare a proprietăților sistemului paralel.
Dificultăți
Paralelizarea automată este dificilă pentru compilatori din motive:
- Analiza dependenței este dificilă pentru codul care utilizează indirecte , pointeri, recursivitate, apeluri de funcții [1] , în special apeluri prin indirecte (de exemplu, funcții virtuale ale unei clase necunoscute anterior).
- Buclele pot avea un număr necunoscut de iterații sau un număr variabil complex de iterații. [1] Acest lucru face mai dificilă selectarea buclelor care necesită paralelizare.
- Accesul la resursele globale este greu de coordonat în ceea ce privește alocarea memoriei, I/O, variabile partajate.
Datorită complexității paralelizării automate complete, există mai multe abordări pentru a o simplifica:
- Oferiți programatorilor posibilitatea de a adăuga sugestii de compilator la program pentru a influența procesul de paralelizare (fie pentru a simplifica analizele prin marcarea pointerilor ca nesuprapuse (restricționare [1] ), fie prin specificarea buclelor „fierbinte”. Soluțiile care necesită instrucțiuni destul de detaliate ale compilatorului includ High Performance Fortran pentru sistemele de memorie distribuită și OpenMP pentru sistemele de memorie partajată.
- Creați un sistem interactiv de compilare la care ar lua parte o persoană. Astfel de sisteme au fost create ca parte a subproiectului SUIF Explorer (proiect SUIF - Compilatorul de format intermediar al Universității Stanford, http://suif.stanford.edu/ ), în compilatoarele Polaris și ParaWise (mediul CAPTools).
- Adăugați multithreading speculativ la hardware .
Compilatoarele de paralelizare timpurii
Mulți compilatori de paralelizare timpurii au lucrat cu programe scrise în Fortran , datorită restricțiilor mai stricte privind aliasarea pointerului în comparație cu C. În plus, un număr mare de programe de matematică computațională sunt scrise în Fortran, necesitând resurse mari pentru munca lor. Exemple de compilator:
- Rice Fortran D compilator
- Viena Fortran compilator
- compilator de paradigme
- compilator Polaris
- compilator SUIF
Compilatoare moderne cu suport de paralelizare
Vezi și
- Optimizarea cuibului în buclă
- model politop
- Paralelism scalabil
- instrument de paralelizare automată
Note
- ↑ 1 2 3 4 5 6 7 8 Patrick Lam. Cursul 12. Vom vorbi astăzi despre paralelizarea automată (link nu este disponibil) . ECE459: Programare pentru performanță (10 februarie 2011). Consultat la 17 noiembrie 2013. Arhivat din original pe 27 mai 2015. (nedefinit)
- ↑ 1 2 Robert van Engelen. Calcul de înaltă performanță și calculul științific . HPC @ Florida State University (3 octombrie 2012). Consultat la 17 noiembrie 2013. Arhivat din original pe 27 mai 2015. (nedefinit)
Link -uri