Universität Karlsruhe (TH) Forschungsuniversität gegründet 1825 OpenMP-Programmierung Teil III Multikern-Praktikum Wintersemester 06-07
Inhalt Was ist OpenMP? Parallele Regionen Konstrukte zur Arbeitsteilung Sichtbarkeit / Schutz privater Daten Konstrukte zur Synchronisation Ablaufplanung bei Schleifen Andere nützliche Konstrukte Überlegungen zur Performanz Clauses / Directives- Zusammenfassung Umgebungsvariabeln 2
Überlegungen zur Performanz Wartende Kontrollfäden erledigen keine sinnvolle Arbeit. Die Arbeit sollte zwischen den Fäden so gleichmäßig wie möglich aufgeteilt werden. Die Kontrollfäden sollten die parallelen Aufgaben alle zur gleichen Zeit beenden. Synchronisation kann erforderlich sein. Jedoch: Die Zeit, in der ein Faden auf eine geschützte Ressource wartet, muss minimiert werden. 3
Ungleiche Lastverteilung (1) Ungleiche Verteilung der Aufgaben führt zu unausgelasteten Fäden und damit zu verlorener Rechenzeit. #pragma omp parallel { #pragma omp for for( ; ; ){ Zeit beschäftigt untätig } } 4
Ungleiche Lastverteilung (2) Lastbalancierung Static scheduling Gleiche Anzahl der Iterationsblöcke Basiert auf Schleifengrenzen zur Laufzeit Totalles paralleles scheduling OpenMP* default Dynamic und guided scheduling Die Threads erledigen ihre Arbeit und gehen zum nächsten Arbeitsblock. Aufwand für Schedulingalgorithmen. 5
Synchronisierungsaufwand (1) Verlorene Zeit beim Warten auf Ressourcen #pragma omp parallel { #pragma omp critical {... }... } Zeit beschäftigt untätig in krit. Abschnitt 6
Synchronisierungsaufwand (2) Methoden zur Verfeinerung der Synchronisation: Weniger Sperrkonkurenzen Unterschiedliche Namen für kritische Abschnitte Verwendung domainspezifischer Sperren Mergen paralleler Schleifen und entfernen der Barrieren Mergen kleiner kritischer Abschnitte Verschieben kritischer Abschnitte außerhalb der Schleifen Explizite Synchronisation void omp_init_lock(omp_lock_t *lock) void omp_set_lock(omp_lock_t *lock) void omp_unset_lock(omp_lock_t *lock) void omp_test_lock(omp_lock_t *lock) void omp_destroy_lock(omp_lock_t *lock) 7
Inhalt Was ist OpenMP? Parallele Regionen Konstrukte zur Arbeitsteilung Sichtbarkeit / Schutz privater Daten Konstrukte zur Synchronisation Ablaufplanung bei Schleifen Andere nützliche Konstrukte Überlegungen zur Performanz Clauses / Directives- Zusammenfassung Umgebungsvariabeln 8
Clauses / Directives- Zusammenfassung (1) Directive Clause PARALLEL DO/for SECTIONS SINGLE PARALLEL DO/for PARALLEL SECTIONS IF PRIVATE SHARED DEFAULT FIRSTPRIVATE LASTPRIVATE REDUCTION COPYIN SCHEDULE ORDERED NOWAIT 9
Clauses / Directives- Zusammenfassung (2) Die folgenden OpenMP-Direktive akzeptieren keine Klauseln: MASTER CRITICAL BARRIER ATOMIC FLUSH ORDERED THREADPRIVATE 10
Inhalt Was ist OpenMP? Parallele Regionen Konstrukte zur Arbeitsteilung Sichtbarkeit / Schutz privater Daten Konstrukte zur Synchronisation Ablaufplanung bei Schleifen Andere nützliche Konstrukte Überlegungen zur Performanz Clauses / Directives- Zusammenfassung Umgebungsvariabeln 11
Umgebungsvariabeln OMP_SCHEDULE set OMP_SCHEDULE "guided, 4 OMP_NUM_THREADS set OMP_NUM_THREADS 8 OMP_DYNAMIC Aktivieren und deaktivieren dynamischer Zuweisung von zu Ausführung stehenden Threads für parallele Regionen. set OMP_DYNAMIC TRUE OMP_NESTED Aktivieren und deaktivieren verschachtelter Parallelismus. set OMP_NESTED TRUE 12
OpenMP-Konstrukten 13
Zusammenfassung: Programmieren mit OpenMP OpenMP ist: Ein einfacher Ansatz für paralleles Programmieren für Systeme mit gemeinsamen Speicher. Grundlegende OpenMP-Konstrukte wurden vorgestellt: Erzeuge parallele Code-Abschnitte (omp parallel) Teile Arbeit (Schleifendurchläufe) auf mehrere Fäden auf (omp for) Lege Sichtbarkeiten für Variablen fest (omp private ) Synchronisiere (omp critical )... 14
Buckup Slides 15
Aufgabe 2: Matrix Multiplication Iterative, Row-oriented Algorithm Series of inner product (dot product) operations
Aufgabe 2: Matrix Multiplication Performance as n Increases :
Aufgabe 2: Matrix Multiplication Reason: Matrix B Gets Too Big for Cache Computing a row of C requires accessing every element of B
Aufgabe 2: Matrix Multiplication Block Matrix Multiplication: Replace scalar multiplication with matrix multiplication Replace scalar addition with matrix addition
Aufgabe 2: Matrix Multiplication Recurse Until B Small Enough :
Aufgabe 2: Matrix Multiplication Comparing Sequential Performance :
Aufgabe 3: Iterative Solvers (1) Iterative solvers: Jacobi vs. Gauß-Seidel for i=2 to n 1 do // Codefragment : Jacobi Algorithm for j=2 to n 1 do a_new [ i ] [ j ]= 1/4(a_old [ i 1] [ j ]+ a_old [ i ] [ j 1]+ a_old [ i +1] [ j ]+a_old [ i ] [ j +1]); end for end for for i=2 to n 1 do // Codefragment : Gauß Seidel Algorithm for j=2 to n 1 do a_new [ i ] [ j ]= ; 1/4( a_new [ i 1] [ j ]+a_new [ i ] [ j 1]+ a_old [ i +1] [ j ]+ a_old [ i ] [ j +1 ]) end for end for
Aufgabe 3: Iterative Solvers (2) Jacobi: new values are stored in a different location; + each thread performs only read operations on the initial matrix; + each thread performs write operations on the destination matrix only in its own space; after the computation the results need to be moved to the initial matrix. Gauß-Seidel: + new values are stored in the same location; many dependencies across and between iterations; + specific traversal rules allow very good parallelisation.