Automatisk parallellisering
Automatisk parallellisering - optimering av programmet av kompilatorn , vilket består i att automatiskt konvertera det till en form som körs på en parallell dator , till exempel på en SMP- eller NUMA-maskin. Målet med att automatisera parallellisering är att befria programmeraren från den tidskrävande och felbenägna processen med manuell parallellisering. Trots att kvaliteten på automatisk parallellisering har förbättrats under de senaste åren, är den fullständiga parallelliseringen av sekventiella program fortfarande en alltför svår uppgift som kräver de mest komplexa typerna av programanalys.
Auto-parallelleraren fokuserar vanligtvis på kontrollkonstruktioner som slingor som bearbetar arrayer, eftersom i allmänhet det mesta av programmets exekvering sker inuti slingor av något slag. Den parallella kompilatorn försöker dela slingan i delar så att dess separata iterationer kan köras på olika processorer samtidigt.
Programanalys
Kompilatorer analyserar innan de gör parallellisering för att svara på följande frågor:
- Är det säkert att parallellisera denna loop? Noggrann beroendeanalys och pekare eller alias oberoende analys ( en:alias analys ) krävs. Loop-iterationer bör inte ha databeroende. [ett]
- Är det värt det att parallellisera slingan? [1] Svaret på denna fråga kräver en tillförlitlig utvärdering (simulering) av programdriften och med hänsyn till det parallella systemets egenskaper.
Svårigheter
Automatisk parallellisering är svårt för kompilatorer av skäl:
- Beroendeanalys är svårt för kod som använder indirektion , pekare, rekursion, funktionsanrop [1] , speciellt anrop genom indirektion (till exempel virtuella funktioner av en tidigare okänd klass).
- Slingor kan ha ett okänt antal iterationer eller ett komplext varierande antal iterationer. [1] Detta gör det svårare att välja slingor som kräver parallellisering.
- Tillgång till globala resurser är svår att koordinera när det gäller minnesallokering, I/O, delade variabler.
På grund av komplexiteten i helautomatisk parallellisering finns det flera metoder för att förenkla det:
- Ge programmerare möjligheten att lägga till kompilatortips till programmet för att påverka parallelliseringsprocessen (antingen för att förenkla analyser genom att markera pekare som icke-överlappande (begränsa [1] ), eller genom att ange "heta" loopar). Lösningar som kräver ganska detaljerade kompileringsinstruktioner inkluderar High Performance Fortran för distribuerade minnessystem och OpenMP för delade minnessystem.
- Skapa ett interaktivt kompileringssystem där en person skulle delta. Sådana system skapades som en del av SUIF Explorer-delprojektet (SUIF-projektet - The Stanford University Intermediate Format compiler, http://suif.stanford.edu/ ), i Polaris- och ParaWise-kompilatorer (CAPTools-miljö).
- Lägg till spekulativ multithreading till hårdvaran .
Tidiga parallelliserande kompilatorer
Många tidiga parallelliserande kompilatorer arbetade med program skrivna i Fortran , på grund av dess strängare restriktioner för pekaraliasing jämfört med C. Dessutom skrivs ett stort antal beräkningsmatematikprogram i Fortran, vilket kräver stora resurser för sitt arbete. Exempel på kompilatorer:
- Rice Fortran D kompilator
- Vienna Fortran kompilator
- paradigmkompilator
- Polaris kompilator
- SUIF- kompilator
Moderna kompilatorer med stöd för parallellisering
Se även
- Optimering av loopbo
- polytopmodell
- Skalbar parallellism
- automatiskt parallelliseringsverktyg
Anteckningar
- ↑ 1 2 3 4 5 6 7 8 Patrick Lam. Föreläsning 12. Vi ska prata om automatisk parallellisering idag (länk ej tillgänglig) . ECE459: Programmering för prestanda (10 februari 2011). Hämtad 17 november 2013. Arkiverad från originalet 27 maj 2015. (obestämd)
- ↑ 1 2 Robert van Engelen. Högpresterande beräkningar och vetenskaplig beräkning . HPC vid Florida State University (3 oktober 2012). Hämtad 17 november 2013. Arkiverad från originalet 27 maj 2015. (obestämd)
Länkar