261 Beispiel: Schleifenparallelisierung for (i = 0; i<m; i++) { low = a[i]; high = b[i]; if (low > high) { printf (Exiting during iteration %d\n,i); break;

Slides:



Advertisements
Ähnliche Präsentationen
Matrixmultiplikation
Advertisements

Funktionen und Module Einführung anhand des Beispiels Wörter sortieren Timm Grams Fachhochschule Fulda Fachbereich Elektrotechnik und Informationstechnik.
Agenda Sitzung 2 für den Programmaufbau
1 low:=low-Q 2 high:=high-Q 2 low:=low-Q 1 high:=high-Q 1.
6. Der OpenMP Standard Direktiven-basiertes API zur Programmierung von Parallelrechnern mit gemeinsamem Speicher für FORTRAN, C und C++
Doris Kocher, PH Freiburg
Grundlagen der Analyse von Sprachdatenbanken
FH-Hof Verwaltung von Zeichenketten Richard Göbel.
SWITCH - Anweisung.
REKURSION + ITERATION.
Funktionen.
WHILE - Anweisung.
FOR Anweisung.
DO...WHILE Anweisung.
Query Reformulation Seminar Multimedia-Datenbanken Sommersemester 2002 Marcus Denecke.
.MPG .MOV .AVI Digitales Video
Thema : „ Are you experienced ?“ Spin - Offs in Dänemark.
Messagepriorisierung Dr. Stefan Klose B2B by Practice - Funktionsbeschreibung.
Unwanted Beam Observations at ELBE
ROLE-PLAY HIGHER Youre talking to a German friend about what you did for your work experience To see the teachers card, click herehere Arbeitspraktikum.
Die Nonne Katrin McKean. Position in der Gesellschaft, Alltägliche Leben und Eigentum Meine Leben war sehr diszipliniert. Ich gelebt zu Gott und Christentum.
[Ro] Assigment 4 [Bridge 2007] Altinger Harald, Marsalek Alexander, Pilgram Felix, Poeschko Jan,
IT-Zertifikat Allgemeine Informationstechnologien I Dozentin: Susanne Kurz, MA Referentin: Carolin Blefgen.
Präsentation C Tutorium von Daniel J. Nowak Folie 1 C Tutorium.
AC V Seminarvortrag Bayreuth, den
Die Zählschleife int s = 0 for (int k=1; k
Mein Alltag 1) Ich verlasse das Haus 2) Ich esse Toast/Müsli
University of Applied Sciences Übung Objektorientierte Programmierung II Dipl.-Inf. (FH) Markus Vogler.
Elektronischer Würfel
Liquid Crystal Display
Projektarbeit von Felix Bucella und
Eine Powerpointpräsentation
Starten der Entwicklungsumgebung (IDE)
Transkriptionsbeispiel
Hochschule Fulda – FB ET Sommersemester 2014
Opticial Transducers: Photodetectors Photodetectors Eidgenössische Technische Hochschule Zürich – 15 th December 2004.
SFZ Sj 13/14 GZG FN W.Seyboldt 1 SFZ FN Sj. 13/14 Python Grundlagen.
SFZ FN Sj. 13/14 Python Grundlagen InfK12 Sj 13/14 GZG FN W.Seyboldt.
KIT – die Kooperation von Forschungszentrum Karlsruhe GmbH und Universität Karlsruhe (TH) The dependence of convection-related parameters on surface and.
Institut für Angewandte Mikroelektronik und Datentechnik Course and contest Results of Phase 3 Vincent Wiese Selected Topics in VLSI Design (Module 24513)
1IWF/ÖAW GRAZ Data Combination David Fischer, Rumi Nakamura (IWF/OeAW)  Fluxgate: noise + distortion gets worse than the searchcoil at ~ 6 Hz.  Searchcoil:
Software Engineering Struktogramme
Von Kieana Shirzadeh Semsar
Einführendes Beispiel
Österr.Kardiol.Gesellschaft 1990 Arbeitsgruppe Intervent. Kardiologie n H. Mlczoch n W.Klein(+) n P.Probst n F.Leisch n V.Mühlberger Monitor (Auditor)
Managing Internationalisation Patricia Adam © UVK Verlagsgesellschaft mbH, Konstanz und München Slides Chapter 5 Patricia Adam Managing Internationalisation.
Tropical Circulation.
Fallunterscheidung und Iteration Programmierung I Prof. Dr. Michael Löwe.
October 26 th -30 th. German I – Warm-Ups Montag – According to the Los geht’s!, what item for school does Lars buy? Diesntag – How many breaks do German.
Money rules the medicine?! A presentation by Jan Peter Hoffmann European healthcare systems in comparison.
Technische Universität München In-situ Synchrotron and Neutron Diffraction studies on phase transformation in Austempered Ductile Iron (ADI) Xiaohu Li.
ESP Tutorium Studienassistent: Ewald Moitzi Gruppe 1.
Softwaretechnologie für Fortgeschrittene Teil Thaller Stunde III: Bildverarbeitung III Köln 5. Dezember 2013.
Idea No Solar-Photovoltaik Schiebendach als zusätzliche Stromversorgung von PKW’s / LKW’s Solar-Photovoltaik Sunroof as additional electrical.
Zeitschrift für Evidenz, Fortbildung und Qualität im Gesundheitswesen
t t t.
Syntax: while ( BEDINGUNG ) { // Anweisungen die so lange immer wieder ausgeführt // werden, wie die Bedingung zutrifft } for (INITIALISIERUNG; BEDINGUNG;
Actual participation index of lower and higher social groups over time
René Zechel Kai Nowakowski
Unterschiedliche Arten von Kontrollstrukturen
מבוא למערכות מחשב ואסמבלי
Energy E Lowest Unoccupied Molecular Orbital (LUMO) Absorption
Zeitlich veränderliche Ströme
Practical Exercises and Theory
Coming on the clouds with fire The whole earth shakes
High und Low – Kontext Kulturen
Verlauf der Serumparathormonspie- gel unter der Wachstumshormonthe- rapie. Bei Patienten, die initial einen erhöhten Knochenumsatz (high bone turnover)
IDI (A) and NRI (B) scores obtained by adding the PlGF-to-sEng ratio to a logistic regression model for preeclampsia containing established risk factors.
 Präsentation transkript:

261 Beispiel: Schleifenparallelisierung for (i = 0; i<m; i++) { low = a[i]; high = b[i]; if (low > high) { printf (Exiting during iteration %d\n,i); break; } for (j=low;j<high;j++) c[j] = (c[j] – a[i]) / b[i]; } Wegen break ist die äußere Schleife nicht parallelisierbar. Die innere Schleife wäre parallelisierbar, aber fork/join pro Iteration von äußerer Schleife soll vermieden werden.

262 Beispiel: Lösungsansatz # pragma omp parallel private (i,j) for (i = 0; i<m; i++) { low = a[i]; high = b[i]; if (low > high) { printf (Exiting during iteration %d\n,i); break; } #pragma omp for for (j=low;j<high;j++) c[j] = (c[j] – a[i]) / b[i]; } Aber die Fehlermeldung wird von jedem Thread ausgegeben.

263 Pragma single Das Pragma #pragma omp single weist den Compiler an, dass der nachfolgende Codeblock nur von einem Thread ausgeführt werden soll. #pragma omp parallel private (i,j) for (i = 0; i<m; i++) { low = a[i]; high = b[i]; if (low > high) { #pragma omp single printf (Exiting during iteration %d\n,i); break; } #pragma omp for for (j=low;j<high;j++) c[j] = (c[j] – a[i]) / b[i]; }

264 Klausel nowait Die Klausel nowait lässt den Compiler die implizite Barrierensynchronisation am Ende einer Schleife aufheben. #pragma omp parallel private (i,j, low, high) for (i = 0; i<m; i++) { low = a[i]; high = b[i]; if (low > high) { #pragma omp single printf (Exiting during iteration %d\n,i); break; } #pragma omp for nowait for (j=low;j<high;j++) c[j] = (c[j] – a[i]) / b[i]; }

265 Arbeit aufteilende Direktiven Parallelisierung von Schleifen Die for Direktive dient der Aufteilung von Schleifendurchläufen auf mehrere Threads: #pragma omp for [clause list] /* for loop */ Mögliche Klauseln sind dabei: private, firstprivate, lastprivate, reduction, schedule, nowait. Parallele statische Abschnitte Eine Menge voneinander unabhängiger Codeblöcke ( sections ) wird auf die Threads eines Teams aufgeteilt und von diesen nichtiterativ parallel ausgeführt.

266 Die sections Direktive OpenMP unterstützt nicht-iterative Parallelisierungen mittels der sections Direktive. allgemeine Form: #pragma omp sections [clause list] { [#pragma omp section /* structured block */ ] [#pragma omp section /* structured block */ ]... }

267 Beispiel #pragma omp parallel { #pragma omp sections { #pragma omp section { taskA(); } #pragma omp section { taskB(); } #pragma omp section { taskC(); } #pragma omp parallel sections

268 Synchronisationskonstrukte in OpenMP #pragma omp barrier explizite Barriere #pragma omp single [clause list] Ausführung durch structured block einzelnen Thread #pragma omp master Ausführung durch structured block Master Thread (keine implizite Barriere) #pragma omp critical [(name)] kritischer Abschnitt mit structured block globalem Namen -> wechselseitiger Ausschluss in allen kritischen Abschnitten gleichen Namens #pragma omp atomic atomare Zuweisung assignment

269 OpenMP Bibliotheksfunktionen /* Thread- und Prozessorzaehler */ void omp_set_num_threads (int num_threads); int omp_get_num_threads (); int omp_get_max_threads (); int omp_get_thread_num (); int omp_get_num_procs (); int omp_in_parallel();

270 OpenMP Bibliotheksfunktionen /* Dynamische Threadanzahl / Geschachtelte Par. */ void omp_set_dynamic (int dynamic_threads); int omp_get_dynamic (); void omp_set_nested (int nested); int omp_get_nested (); /* mutual exclusion */ void omp_init_lock (omp_lock_t *lock); void omp_destroy_lock (omp_lock_t *lock); void omp_set_lock (omp_lock_t *lock); void omp_unset_lock (omp_lock_t *lock); int omp_test_lock (omp_lock_t *lock); Alle lock Routinen haben ein Gegenstück (_nest_lock) für rekursive Mutexe.

271 Umgebungsvariablen in OpenMP OMP_NUM_THREADS Festlegung der Standardanzahl zu erzeugender Threads OMP_SET_DYNAMIC Festlegung, ob die Threadanzahl dynamisch geändert werden kann OMP_NESTED Ermöglichung geschachtelter Parallelität OMP_SCHEDULE Scheduling von for-Schleifen falls die Klausel runtime festlegt

272 Explizite Threads (PThreads) vs Direktiven (OpenMP) Direktiven vereinfachen viele Aufgaben, wie zum Beispiel: Initialisierung von Attributobjekten für Threads Argumentzuweisung an Threads Parallelisierung von Schleifen etc. Es gibt aber auch Nachteile: versteckter Mehraufwand durch impliziten Datenaustausch Explizite Threads bieten ein umfangreicheres API, zum Beispiel condition waits verschiedene Sperrmechanismen (locks) Explizite Threads bieten mehr Flexibilität zur Definition eigener Synchronisationsoperationen.

273 Beispielprogramm: Berechnung von pi /* *************************************************** An OpenMP version of a threaded program to compute PI. ***************************************************** */ sum=0; sample_points_per_thread = sample_points / num_threads; #pragma omp parallel \ private(rand_no_x, rand_no_y, seed, i) \ shared(sample_points, sample_points_per_thread) \ reduction(+: sum) num_threads(num_threads) {seed = omp_get_thread_num(); for (i = 0; i < sample_points_per_thread; i++) { rand_no_x =(double)(rand_r(&seed))/(double)((2<<30)-1); rand_no_y =(double)(rand_r(&seed))/(double)((2<<30)-1); if (((rand_no_x - 0.5) * (rand_no_x - 0.5) + (rand_no_y - 0.5) * (rand_no_y - 0.5)) < 0.25) sum ++; } }

274 Beispiel: Berechnung von pi mit Schleifenparallelisierung sum = 0; #pragma omp parallel private(rand_no_x, rand_no_y, seed) \ shared(sample_points)reduction(+:sum) \ num_threads(num_threads) { num_threads = omp_get_num_threads(); seed = omp_get_thread_num(); #pragma omp for for (i = 0; i < sample_points; i++) { rand_no_x =(double)(rand_r(&seed))/(double)((2<<30)-1); rand_no_y =(double)(rand_r(&seed))/(double)((2<<30)-1); if (((rand_no_x - 0.5) * (rand_no_x - 0.5) + (rand_no_y - 0.5) * (rand_no_y - 0.5)) < 0.25) sum ++; } }