Analiza Comutativității

Sursă Originală: https://www.isi.edu/~pedro/CA/commutativity.html

Pedro Diniz (pedro@isi.edu)

Rezumat

Mașinile paralele oferă promisiunea unei creșteri semnificative a performanței, permițând mai multor procesoare să execute simultan diferite părți ale calculului. Programatorii au dezvoltat în mod tradițional aplicații pentru mașini paralele utilizând limbi în mod explicit paralele. Spre deosebire de limbile de programare în serie, limbile în mod explicit paralele prezintă un model complex de programare caracterizat de fenomene precum blocarea, execuția nedeterministă și, în cazul mașinilor care trec prin mesaje, necesitatea de a gestiona în mod direct circulația datelor prin calcul. Avantajele programabile evidente ale paradigmei de programare imperative secvențială au inspirat, prin urmare, dezvoltarea unor tehnici de analiză și compilatoare concepute pentru a paraleliza automat programele seriale.

Compilatoarele paralelizatoare actuale păstrează semantica programului serial original prin păstrarea dependențelor de date. Acești compilatori încearcă să identifice fragmente de calcul independente (două piese de calcul sunt independente dacă nu scrie nici o piesă de date pe care accesează celălalt), apoi generează cod care execută simultan părți independente. O limitare semnificativă a acestei abordări este dificultatea de a efectua o analiză a dependenței care este suficient de precisă pentru a expune cantități substanțiale de concurrency. În timp ce cercetătorii au reușit să dezvolte algoritmi rezonabil de eficienți pentru cuiburile de buclă care manipulează matrice densă utilizând funcții de acces afină, s-au înregistrat progrese mici în ceea ce privește analiza automată reușită a programelor care manipulează structurile de date bazate pe pointer. Cercetătorii au încercat să construiască sisteme complet automate, dar abordările cele mai promițătoare necesită programatorul să furnizeze adnotări care să specifice informațiile despre topologia globală a structurilor de date manipulate. O a doua limitare mai fundamentală a abordărilor bazate pe dependența de date este incapacitatea de a paraleliza calculele care manipulează structurile de date asemănătoare grafurilor. Pseudonimele prezente în aceste structuri de date împiedică descoperirea statică a unor fragmente independente de cod, forțând compilatorul să genereze cod de serie. În cele din urmă, păstrarea dependențelor de date pentru programele care actualizează periodic structurile de date partajate poate limita în mod artificial valoarea concurenței expuse,

Analiza comutativității este un cadru de analiză statică pentru detectarea operațiilor de navetă. Două operațiuni se deplasează atunci când generează același rezultat, indiferent de ordinea în care acestea execută. Analiza comutativității elimină numeroasele limitări ale abordărilor existente bazate pe dependența de date În loc să păstreze ordinea relativă a citirilor și scrierilor individuale în cuvinte individuale de memorie, analiza comutativității agregă atât datele cât și calculul în unități mari de cereale. Apoi, analizează în mod static calculul la această granularitate pentru a descoperi când piesele din calculul de ieșire generează același rezultat, indiferent de ordinea în care acestea execută. Dacă toate operațiile necesare pentru a efectua o anumită navetă de calcul, compilatorul poate genera automat cod paralel.

Această abordare are câteva proprietăți interesante. Deoarece analiza comutativității nu se bazează pe informațiile despre topologia structurilor de date manipulate, un compilator care utilizează analiza comutativității nu are nevoie să analizeze părțile codului care construiesc structura de date. Analiza comutativității este, prin urmare, potrivită pentru calcule incomplete, cum ar fi aplicațiile care manipulează date persistente (de exemplu, aplicații de bază de date orientate pe obiecte) sau aplicații care manipulează date dispersate geografic (de exemplu, calcule mobile pe World Wide Web). În aceste cazuri, codul care a creat inițial structura de date poate să nu fie disponibil sau să nu mai existe. Analiza comutativității este, de asemenea, potrivită în special pentru calculele care manipulează graficele.

Am luat o abordare orientată spre sisteme pentru a evalua capacitatea analizei comutativității de a extrage și exploata cantități semnificative de paralelism în aplicațiile complete. Am construit un compilator de paralelizare care utilizează analiza comutativității ca paradigmă de analiză primară. Acest compilator ia ca intrare un program secvențial neanotat scris într-un subset de C ++ și generează cod paralel pentru un multiprocesor de memorie partajată. Folosind acest compilator de paralelizare, paralelizăm în mod automat mai multe aplicații, incluzând solverul N-corp Barnes-Hut, un cod de simulare a apei lichide și un cod de modelare seismică. Pentru toate aceste aplicații, analiza comutativității poate expune o cantitate substanțială de concurrency, iar codul paralel generat prezintă performanțe foarte bune. Pe 16 procesoare, versiunea paralelizată în mod automat a lui Barnes-Hut rulează între 11 și 12 ori mai rapidă decât versiunea secvențială originală; pentru aplicația de simulare a apei, versiunea paralelizată în mod automat rulează între 7 și 8 ori mai rapid decât versiunea secvențială originală; pentru aplicația de modelare seismică, versiunea paralelizată în mod automat rulează de aproximativ 12 ori mai rapid decât versiunea secvențială originală.

Aceste rezultate experimentale sunt foarte încurajatoare. Aceste aplicații sunt foarte dinamice în natură – fie manipulează structuri sofisticate de date bazate pe pointer, fie prezintă modele foarte accesibile de acces la date. Exploatarea paralelismului cu cereale grosiere în aplicații cu aceste caracteristici a fost recunoscută ca o problemă foarte dificilă. Nu suntem constienti de nici o alta tehnica de compilare sau de compilare care sa poata extrage cantitati semnificative de concurrency pentru aceste calcule. Mai mult, rezultatele experimentale pozitive oferă dovezi concrete ale semnificației practice a analizei comutativității ca tehnică pentru compilarea automată a paralelizării.


Publicații înrudite