• Keine Ergebnisse gefunden

Automatische Parallelisierung

N/A
N/A
Protected

Academic year: 2022

Aktie "Automatische Parallelisierung"

Copied!
27
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

.c

int a[1817];

main(z,p,q,r) {for(p=80;q+p-80;p-

=2*a[p])for(z=9;z--;) q=3&(r=time(0)+r*57)/7, q=q?q-1?q-2?1-p%79?- 1:0:p%79-77?1:0:p<1659

?79:0:p>158?- 79:0, q?!a[p+q*2]

?a[p+=a[p+= q]=q]=q:0:0;

for(;q++-1817;) printf(q%79?“%c“: “%c\n“,“

#“[!a[q-1]]);}

.exe

010111010010001 010101010101010 10101010101010 10101101110101111010101010 10101111111110101010101010 10100000000000000101010101 01010000000000000000010101 01010101010101010111011111 01101101011101111111110000 00101010000110010101010000 00000010101010101111111111 11111010101001010110101010

Analyse

Synthese Magic

Automatische Parallelisierung

Seminar »Sprachen für Parallelprogrammierung«

Julian Oppermann

IPD Snelting, Lehrstuhl Programmierparadigmen

(2)

Warum Autoparallelisierung?

Multicores überall, Rechenleistung liegt brach.

Existierender Code soll parallelisiert werden.

Effiziente, korrekte parallele Programme zu schreiben ist schwierig.

(3)

Voraussetzungen für effizientes, paralleles Rechnen

Minimiere Kommunikation (Datentransfer, Synchronisation, Wartezeiten) Skalierbarkeit

(4)

Wo setzt die automatische Parallelisierung an?

Granularität

grob

Instruction Level Parallelism

Data Parallelism

Task Parallelism fein

(5)

Beispiel

Original

1 f o r ( i = 0 ; i < N ; i ++) {

2 a [ i ] = a [ i ] + 1 ;

3 }

Transformation

1 i n t p i d = g e t p i d ( ) ;

2 i n t l b = N / NUM_CPUS ∗ p i d ;

3 i n t ub = N / NUM_CPUS ∗ ( p i d + 1 ) ;

4 f o r ( i = l b ; i < ub ; i ++) {

5 a [ i ] = a [ i ] + 1 ;

6 }

(6)

Beispiel

Original

1 f o r ( i = 0 ; i < N ; i ++) {

2 a [ i ] = a [ i ] + 1 ;

3 }

Transformation

1 i n t p i d = g e t p i d ( ) ;

2 i n t l b = N / NUM_CPUS ∗ p i d ;

3 i n t ub = N / NUM_CPUS ∗ ( p i d + 1 ) ;

4 f o r ( i = l b ; i < ub ; i ++) {

5 a [ i ] = a [ i ] + 1 ;

6 }

(7)

Beispiel (2)

Original

1 f o r ( j = 0 ; j < 100; j ++) {

2 f o r ( k = 0 ; k < 100; k ++) {

3 a [ j , k ] = a [ j , k ] + b [ j−1 , k ] ;

4 b [ j , k ] = a [ j , k−1] ∗ b [ j , k ] ;

5 }

6 }

Transformation

?

(8)

Beispiel (2)

Original

1 f o r ( j = 0 ; j < 100; j ++) {

2 f o r ( k = 0 ; k < 100; k ++) {

3 a [ j , k ] = a [ j , k ] + b [ j−1 , k ] ;

4 b [ j , k ] = a [ j , k−1] ∗ b [ j , k ] ;

5 }

6 }

Transformation

?

(9)

Autoparallelisierung für imperative Programmiersprachen

Problemumfeld:

Numerische Anwendungen.

Sprachen wie Fortran oder C.

Mehrfach geschachtelte Schleifen führen Berechnungen auf Daten in Arrays auf.

(10)

Grundvoraussetzung für korrekte Parallelisierung

Def. Datenabhängigkeit

Zwischen zwei Speicherzugriffen besteht eine Datenabhängigkeit, wenn sie das gleiche Ziel haben und mindestens ein Zugriff ein Schreibzugriff ist.

Zentrale Einsicht

Parallelisieren geht nur Berücksichtung der Datenabhängigkeiten!

Zentrale Frage

Wann haben zwei Speicherzugriffe das gleiche Ziel?

(11)

Affine Arrayzugriffe

j i

Array a

Iterationsraum I

affine Abbildung

Iteration (2,5) Element (3,10)

Beispiel

1 f o r ( i = 1 ; i <=5; i ++)

2 f o r ( j = i ; j <=7; j ++)

3 a [ i +1 ,2∗j ] = 0 ;

Affine Arrayzugriffe

a[i], a[i−1], b[2·i+2, 3·j−7]

Nicht-affine Arrayzugriffe

a[a[i]], a[i·j], a[N·i+1]

(12)

Schleifengetragene Abhängigkeiten

engl. loop-carried dependences

j i

f(i,j) g(i,j)

∃ ~ x ,~ y ∈ I ,

~ x , ~ y : f (~ x) = g(~ y)

?

Affine Zugriffe = ⇒ lineares Gleichungssystem

(13)

Test auf Unabhängigkeit

Fragestellung »gibt es solche Lösungen?« ist allgemein NP-schwer.

Ansätze

Es gibt keine ganzzahligen Lösungen. (→ggT-Test) Bsp.:a[2i] = ...; ... = a[2i+1]

2x=2y+1 =⇒ 2x−2y=1 =⇒ ggT(2,2)=2-1

Es gibt keine reellen Lösungen innerhalb des Iterationsraums (→ Bannerjee-Wolfe-Test).

Es gibt exakte Verfahren (nutzen praxisbezogene Einschränkungen)

(14)

Abhängigkeitsvektoren

engl. dependence vectors

Vollständige Unabhängigkeit ist selten. Wenn es Abhängigkeiten gibt, wie verlaufen sie?

Abhängigkeitsvektoren

~z=(z1, ..,zd),zk=









= Abh. zur selben Iteration der k-ten Schleife

< Abh. zu einer späteren Iteration der k-ten Schleife

> Abh. zu einer früheren Iteration der k-ten Schleife

(15)

Beispiel

Modifziertes Beispiel

1 f o r ( i = 1 ; i <=5; i ++)

2 f o r ( j = i ; j <=7; j ++)

3 a [ i +1 ,2∗j ] = a [ i , j ] + c ;

Gleichungen

xi+1=yi

2xj=yj

1≤xi,yi≤5 xi≤xj≤7∧yi≤yj≤7

Lösungen

h~x,~yi

=[(1,1),(2,2)]

| {z }

(<,<)

,[(1,2),(2,4)]

| {z }

(<,<)

, ... (([(3,2),(((4,(4)],(

(([(5,5),(((6,((10)]

(16)

Affine Partitionierung

Und nun? Anwenden eines Katalogs an Transformationen. Aber wie?

Besseres Verfahren: Affine Partitionierung.

Idee

Finde sämtliche Parallelität, die keine, konstant viele oderO(n) Synchronisationen erfordert, durch Suchen einer Abbildung vom Iterationsraum zu einer Partitionsnummer.

(17)

Raumpartitionen

Bedingung für Raumpartition

Besteht zwischen zwei Anweisungen eine Abhängigkeit, werden sie in die gleiche Partition abgebildet.

i1 i2

Synchronisationsfreie Parallelität!

(18)

Sonderfall / Zeitpartitionen

O(1) Synchronisationen

Suche starke

Zusammenhangskomponenten im Programmabhängigkeitsgraph.

Wende Raumpartitionierung auf diese SCCs an.

O(n) Synchronisationen

Bedingung fürZeitpartition: Alle Anweisungen in Zeitpartitionimüssen vor denen in Zeitpartitioni+1

ausgeführt werden.

(19)

Wie funktioniert das?

Mit Standardverfahren der linearen Algebra.

Arrayzugriffe, Abhängigkeiten und Bedingungen für die Partitionen lassen sich als Gleichungssysteme darstellen. Die Partitionierung ist eine affine Abbildung, deren Koeffizientenmatrix ausgerechnet werden kann.

Zum Schluss: SPMD-Code generieren.

(20)

Probleme

Heutzutage nutzen Programme

aufwändige Objektstrukturen im Heapspeicher statt linearer Arrays, und über Methodengrenzen verteilte Algorithmen anstatt geschachtelter Schleifen.

Zentrales Problem (immer noch)

Die Vorhersage der Speicherzugriffe!

(21)

Aktuelle Forschung zur Autoparallelisierung

Abhängigkeitsanalyse durch Shape Analysis [7]

Leitet Aussagen über den Aufbau von dynamischen Datenstrukturen her (z.B. Listen).

Besser für Abhängigkeitsanalyse geeignet als Points-To-Analyse.

Trace-basierte Parallelisierung [3]

Trace = Folge von paarweise verschiedenen Grundblöcken.

Granularität zwischen Schleifen und Tasks.

Microsoft Research untersucht einen tracing Just-in-Time Compiler [6].

(22)

Fazit

Für numerische Anwendungen ist Autoparallelisierung machbar.

Nur die vorhandenen Anweisungen, nicht der Algorithmus, können parallelisiert werden.

Kein Ersatz für explizit parallel geschriebene

Software.

(23)

Literatur

[1, 2, 4, 5]

AHO, A. V., Ed.

Compiler : Prinzipien, Techniken und Werkzeuge, 2., aktualisierte aufl. ed.

it Informatik. Pearson Studium, München [u.a.], 2008, ch. 11, pp. 929–1090.

BACON, D. F., GRAHAM, S. L.,ANDSHARP, O. J.

Compiler transformations for high-performance computing.

ACM Comput. Surv. 26, 4 (1994), 345–420.

BRADEL, B. J.,ANDABDELRAHMAN, T. S.

A study of potential parallelism among traces in java programs.

Science of Computer Programming 74, 5-6 (2009), 296 – 313.

Special Issue on Principles and Practices of Programming in Java (PPPJ 2007).

BURKE, M.,ANDCYTRON, R.

Interprocedural dependence analysis and parallelization.

InSIGPLAN ’86: Proceedings of the 1986 SIGPLAN symposium on Compiler construction(New York, NY, USA, 1986), ACM, pp. 162–175.

LIM, A. W.,ANDLAM, M. S.

Maximizing parallelism and minimizing synchronization with affine transforms.

InPOPL ’97: Proceedings of the 24th ACM SIGPLAN-SIGACT symposium on Principles of programming languages(New York, NY, USA, 1997), ACM, pp. 201–214.

SCHULTE, W.,ANDTILLMANN, N.

Automatic parallelization of programming languages: Past, present und future.

http://www.ipd.uni-karlsruhe.de/multicore/iwmse2010/IWMSE-keynote-schulte.pdf, May 2010.

Extended abstract of the keynote presentation at the Third International Workshop on Multicore Software Engineering.

TINEO, A., CORBERA, F., NAVARRO, A., ASENJO, R.,ANDZAPATA, E.

On the automatic detection of heap-induced data dependencies with interprocedural shape analysis.

(24)

Zusatzfolien

(25)

SPMD-Code zu Einführungsbeispiel 2

1 i f ( p == −99)

2 a [ 1 , 1 0 0 ] = a [ 1 , 1 0 0 ] + b [ 0 , 1 0 0 ] ;

3 i f (−98 <= p && p <= 99) {

4 i f ( 1 <= p && p <= 99) {

5 b [ p , 1 ] = a [ p , 0 ] ∗ b [ p , 1 ] ;

6 }

7 f o r ( l = max( 1 , 1 + p ) ; l <= min (100 ,99+ p ) ; l ++) {

8 a [ l , l−p ] = a [ l , l−p ] + b [ l−1 , l−p ] ;

9 b [ l , l−p + 1 ] = a [ l , l−p ] ∗ b [ l , l−p + 1 ] ;

10 }

11 i f (−98 <= p && p <= 0 ) {

12 a [100+ p , 1 0 0 ] = a [100+ p , 1 0 0 ] + b [99+ p , 1 0 0 ] ;

13 }

14 }

15 i f ( p == 100)

16 b [ 1 0 0 , 1 ] = a [ 1 0 0 , 0 ] ∗ b [ 1 0 0 , 1 ] ;

(26)

Hierarchische Abhängigkeitsvektoren

(*,*)

(>,=)

(<,*) (=,*) (>,*)

(<,=)

(<,<) (<,>) (=,<) (=,=) (=,>) (>,<) (>,>)

(27)

Beispiel zur Shape Analysis

1 l = p = c r e a t e _ l i s t ( ) ;

2 q = p−>n e x t ;

3

4 while ( q ! = NULL ) {

5 @READ_1

6 v a l = q−>data ;

7

8 @WRITE_2

9 p−>data = v a l ;

10

11 p = q ;

12 q = p−>n e x t ;

13 }

q q q q p p p p p p

p l l l l l l l

READ_1

WRITE_2 READ_1 Initialisierung

Iteration 1

WRITE_2

WRITE_2

WRITE_2

WRITE_2 READ_1

READ_1

READ_1

READ_1

q q q

READ_1

READ_1 WRITE_2 Iteration 2

Referenzen

ÄHNLICHE DOKUMENTE

mälden, Zeichnungen und technischen Entwürfen (und der auch mit Francesco persönlich befreundet gewesen zu sein scheint). Weiter dann zu Bertoldo, dem der Sienese bisweilen so

!  jahr ist Schaltjahr wenn jahr durch 4 teilbar ist (ohne Rest), jahr aber nicht durch 100 ohne Rest teilbar ist, es sei denn dass jahr ohne Rest durch 400 teilbar

Man gehe im Web-Browser nach bourbaki.upb.de/mfp1 und melde sich im automatischen Abgabe-Tool an. Diese Aufgabe wird dort als ’Miniprojekt 10’ bezeichnet.. 10 Bonuspunkte).. Man

Weiter ist es zwar sicher, dass in einem gewissen Grade auch Tiere eine Sprache haben, wenn man darunter versteht, dass sie sich durch Laute mit ihren Genossen verständigen, sie

Zeige, dass RUCKSACK ≤ p PARTITION. Man braucht also eine Funktion von RUCKSACK nach PARTITION , bzw. Da RUCKSACK -Probleme mindestens 1 lang sind, und PARTITION -Probleme mindestens

seine energetische Lage ist mit anderen Chlorophyllen des Reaktionszentrums und der Kernantenne vergleichbar, so daß eine Anregung von P680 nicht zwangsläufig zur Ladungstrennung

Wenn du alle „P“ rot malst, erkennst du Gegenstände, die wir im Alltag oft nutzen. BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB BBBBPBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBPBBBB

F ü r eine Reihe von Elem enten, insbesondere für die Edelgase, liegen keine oder nur unzureichende D aten vor, um ihre E lek tro n eg ativ itäten (EN) nach Gl.. In der