4. Parallelprogrammierung

Ähnliche Dokumente
4. Parallelprogrammierung

4. Parallelprogrammierung. AlDaBi Praktikum

4. Parallelprogrammierung AlDaBi Prak4kum

1. Einführung in OpenMP

Parallele Programmierung mit OpenMP

Systeme 1. Kapitel 6. Nebenläufigkeit und wechselseitiger Ausschluss

Zählen von Objekten einer bestimmten Klasse

OpenMP am Beispiel der Matrizenmultiplikation

Klausur in Programmieren

Einführung in die Programmierung

Softwarelösungen: Versuch 4

Hochschule München, FK 03 FA SS Ingenieurinformatik

Modellierung und Programmierung 1

Übungen zu Einführung in die Informatik: Programmierung und Software-Entwicklung: Lösungsvorschlag

Einführung in die Programmierung (EPR)

Beispiel: Schleifenparallelisierung

1 Vom Problem zum Programm

1. Übung zu "Numerik partieller Differentialgleichungen"

Propädeutikum. Dipl.-Inf. Frank Güttler

Objektorientierte Programmierung

Lehrer: Einschreibemethoden

Monitore. Klicken bearbeiten

Einführung in die C++ Programmierung für Ingenieure

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

C++ Grundlagen. ++ bedeutet Erweiterung zum Ansi C Standard. Hier wird eine Funktion eingeleitet

MPI-Programmierung unter Windows mit MPICH2. Installieren von MPICH2, Übersetzen, Ausführen und Debuggen von MPI-Programmen. Christian Terboven

Programmierung in C. Grundlagen. Stefan Kallerhoff

Einige Grundlagen zu OpenMP

Automatisierung ( Fernsteuerung ) von Excel unter Microsoft Windows Tilman Küpper (tilman.kuepper@hm.edu)

Wir arbeiten mit Zufallszahlen

Klausur in Programmieren

Funktionale Programmierung mit Haskell

Tutorium Rechnerorganisation

Matrix42. Use Case - Sicherung und Rücksicherung persönlicher Einstellungen über Personal Backup. Version September

Informatik Repetitorium SS Volker Jaedicke

Grundlagen verteilter Systeme

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom b

Projektseminar Parallele Programmierung

Einführung in die C-Programmierung

Programmierkurs Java

Outlook. sysplus.ch outlook - mail-grundlagen Seite 1/8. Mail-Grundlagen. Posteingang

5 DATEN Variablen. Variablen können beliebige Werte zugewiesen und im Gegensatz zu

Erwin Grüner

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Anlegen eines Speicherbereichs mit DB, DW eleganter in Kombination mit EQU, Timer-Interrupt

Würfelt man dabei je genau 10 - mal eine 1, 2, 3, 4, 5 und 6, so beträgt die Anzahl. der verschiedenen Reihenfolgen, in denen man dies tun kann, 60!.

Kurze Einführung in die Programmiersprache C++ und in Root

Einführung in wxwidgets & wxdev-c++

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung:

1 Einleitung. Lernziele. automatische Antworten bei Abwesenheit senden. Einstellungen für automatische Antworten Lerndauer. 4 Minuten.

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 18

Felder, Rückblick Mehrdimensionale Felder. Programmieren in C

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Architektur Verteilter Systeme Teil 2: Prozesse und Threads

Kontrollstrukturen und Funktionen in C

Einführung in die Programmierung

Einführung in PHP. (mit Aufgaben)

In vergleichsbasierten Suchbäumen wird nicht in Schlüssel hineingeschaut.

Modul CTO Barcode für Windows Seite 1

Zwischenablage (Bilder, Texte,...)

Arbeiten mit UMLed und Delphi

Wie man Registrationen und Styles von Style/Registration Floppy Disketten auf die TYROS-Festplatte kopieren kann.

Mikrocontroller Grundlagen. Markus Koch April 2011

1) Farbsteuergerät in der Nikobus-Software unter Modul zufügen hinzufügen.

Allgemeines. Verschiedene Sprachkonzepte C-Sprachfamilie C-ähnliche Programmiersprachen Allgemeines zu C. #include <stdio.h>

MORE Profile. Pass- und Lizenzverwaltungssystem. Stand: MORE Projects GmbH

Microcontroller Kurs Microcontroller Kurs/Johannes Fuchs 1

Die Programmiersprache C99: Zusammenfassung

Professionelle Seminare im Bereich MS-Office

Anleitung über den Umgang mit Schildern

OECD Programme for International Student Assessment PISA Lösungen der Beispielaufgaben aus dem Mathematiktest. Deutschland

Stornierungsbedingungen und weitere Voraussetzungen

Bedienungsanleitung Anlassteilnehmer (Vereinslisten)

OpenMP - Threading- Spracherweiterung für C/C++ Matthias Klein, Michael Pötz Systemprogrammierung 15. Juni 2009

PROGRAMMIEREN MIT UNIX/LINUX-SYSTEMAUFRUFEN

Anleitung für die Teilnahme an den Platzvergaben "Studio II, Studio IV und Studio VI" im Studiengang Bachelor Architektur SS15

Übung: Verwendung von Java-Threads

5. Tutorium zu Programmieren

Dynamic Ressource Management

Ingenieurinformatik Diplom-FA (C-Programmierung)

WinVetpro im Betriebsmodus Laptop

Einführung in die Programmierung

Schnellanleitung: Verbuchung von Studien- und Prüfungsleistungen

OpenMP. Viktor Styrbul

Das erste Programm soll einen Text zum Bildschirm schicken. Es kann mit jedem beliebigen Texteditor erstellt werden.

Die Java Stream API. Funktionale Programmierung mit der Stream API des JDK 1.8. Prof. Dr. Nikolaus Wulff

Gezielt über Folien hinweg springen

Game Engine Architecture and Development. Platform Unabhängiger Code Multi Threading in Game Engines Profiling

Feiertage in Marvin hinterlegen

Laborübung - Task Manager (Verwalten von Prozessen) in Windows XP

Objektorientiertes Programmieren mit Suse Linux

Lizenzierung von SharePoint Server 2013

Dokumentenverwaltung im Internet

Klausur in Programmieren

Transkript:

4. Parallelprogrammierung AlDaBi Prak4kum David Weese 2010/11 Enrico Siragusa WS 2011/12

Inhalt Einführung in Parallelität OpenMP Bemerkungen zur P- Aufgabe

EINFÜHRUNG IN PARALLELITÄT Folien z.t. aus VL Programmierung von Hardwarebeschleunigern von Alexander Reinefeld und Thomas Steinke, WS09

Was ist Parallelität? Parallelität ist eine OpWmierungstechnik um die Laufzeit zu reduzieren Dazu wurden benutzt mehrere Prozessoren (CPUs oder Cores) 1 CPU 4 CPUs Time Time Parallelisierung Die parallele Laufzeit sollte am besten ¼ der serielle Laufzeit, wenn 4 CPUs benutzt würden

Parallele Pla^ormen Gemeinsamer Speicher (shared memory) Verteilter Speicher (distributed memory) CPU CPU CPU CPU CPU CPU Cache Cache Cache Cache Cache Cache Gemeinsamer Bus RAM RAM RAM RAM I/O Netzwerk

ProzesskommunikaWon Gemeinsamer Speicher (shared memory)... über gemeinsame Speicherbereich Schreiben/Lesen im RAM SynchronisaWon über gegenseiwgen Ausschluss Verteilter Speicher (distributed memory)... über Nachrichtenaustausch (message passing) Senden/Empfangen von Nachrichten Nur lokale (private) Variablen Prozess A Prozess B sendet Nachricht empfängt schreibt liest RAM Prozess A Prozess B

Process VS Thread Prozess Laufende Instanz eines Programms Besteht aus eigenem Adressraum Für Stack, Heap, Programmcode,... Ist dadurch vor anderen Prozessen geschützt Kann Resourcen reservieren Hat einen oder mehrere Threads, die den Code ausführen Thread Ausführungseinheit des Prozess Bestehen aus eigenem Stack und CPU- Registerzustand Haben den Adressraum des zugehörigen Prozesses Threads desselben Prozesses sind nicht voreinander geschützt Beispiel: Auf mehrere Threads verteilte for- Schleife eines Programms

Prozesslayout Thread A Process Thread B Data Data Data Code Code Code Heap Heap Heap Stack Stack A Stack B Stack

Fork & Join Modell

Fallstricke KriWscher Wehlauf (Race CondiWon) SituaWonen, in denen das Wehrennen (race) der Prozesse beim Zugriff auf gemeinsame Ressourcen Auswirkungen auf das Ergebnis eines Programmlaufs hat Beispiel: 2 Threads schreiben in dieselbe Speicherstelle Verklemmung (Deadlock) Threads warten gegenseiwg auf die Resourcen der anderen Aushungern (StarvaWon) Ressource wechselt unfairerweise nur innerhalb einer Gruppe von Threads Threads außerhalb der Gruppe erhalten die Resource nie

KriWscher Wehlauf Write V = 0 Master Thread Thread A Thread B Time Read V = 0 Write V +=1 Read V = 0 Write V +=1 Read V = 1

Lösung SynchronisaWon Mutex (Mutual Exclusion) Kann von mehreren Threads verlangt werden (lock), aber nur einer besitzt sie bis er sie freigibt (unlock) Semaphore Kann von mehreren Threads verlangt werden, ist aber immer nur in Besitz von höchstens k Threads Mutex ist Semaphore mit k=1 Barrier Eine Gruppe von Threads hält solange an einer Barriere an, bis alle angekommen sind, danach laufen alle weiter

Verklemmung Philosophenproblem Algorithmus: Denk bis die linke Gabel ist verfügbar Denk bis die rechte Gabel ist verfügbar Iss Lieg die rechte Gabel ab Lieg die linke Gabel ab Wiederhole Verklemmung Jeder nimmt die linke Gabel auf und wartet auf die rechte Lösung Eine Mutex für den ganzen Tisch zum Prüfen und Aufnehmen zweier Gabeln Semaphore mit k=4

OPEN MULTI- PROCESSING Folien z.t. aus VL Parallele Programmierung von Nicolas Maillard und Marcus Rih, TU Berlin

Einführung OpenMP stellt eine Programmierschnihstelle (API) für C/C++ (und Fortran) zur Verfügung Erweiterung der Programmiersprache durch #pragma- DirekWven Eine DirekWve besteht aus einem Namen und einer Klauselliste: #pragma omp direcwve [clause list] BibliotheksfunkWonen #include <omp.h> Nur für Pla^ormen mit gemeinsamen Speicher (shared memory) Nützliche Links OpenMP Homepage - hhp://www.openmp.org/ OpenMP Tutorial - hhp://compuwng.llnl.gov/tutorials/openmp/ Kurzübersicht - hhp://www.openmp.org/mp- documents/openmp3.0- SummarySpec.pdf

Verfügbarkeit Compiler OpenMP Unterstützung Compiler Schalter g++ GCC 4.2: OpenMP 2.5 GCC 4.4: OpenMP 3.0 -fopenmp! Visual C++ VS 2005-2010: OpenMP 2.0 /openmp! In der IDE* Intel C++ V9: OpenMP 2.5 V11: OpenMP 3.0 Windows: /Qopenmp! Linux: -openmp! Sun Studio V12: OpenMP 2.5 V12 U1: OpenMP 3.0 -xopenmp! OpenMP akwvieren in Visual Studio 2005 oder später: Öffne ProperWes des Projektes und gehe zu: Configuration Properties -> C/C++ -> Language! Setze OpenMP Support auf yes! Achtung: Visual Studio 2005 Express EdiWon unterstüzt kein OpenMP, obwohl der Schalter exiswert

Überblick

OpenMP Beispiel Einfaches Beispielprogramm in OpenMP: #include <cstdio>! #include <omp.h>! int main(int, char*[])! {!!#pragma omp parallel!!printf("hello, world.\n");!!return 0;! }! Ausgabe auf Intel Core 2 Duo: Hello, world.! Hello, world.!

OpenMP Beispiel (II) Unterscheidung der Threads: #include <cstdio>! #include <omp.h>! int main(int, char*[])! {!!#pragma omp parallel!!printf("i'm thread %i of %i.\n",!!!omp_get_thread_num(),!!!omp_get_num_threads());! }!!return 0;! Ausgabe: I'm thread 0 of 2.! I'm thread 1 of 2.!

Programmiermodell Parallelität lässt sich schrihweise erzeugen Ein serielles Programm wird zu einem parallelen Serielle Version weiterhin nutzbar DirekWve parallel startet ein Team Aktueller Thread ist Master Alle Threads bearbeiten den folgenden Abschnih DirekWve for teilt IteraWonen auf Team- Mitglieder auf Jeder Thread bearbeitet einen Teil Ende des parallelen Blocks Implizite SynchronisaWon (barrier) Nur Master läuy weiter Master Thread Parallele Regionen

Von seriell zu parallel Serielles Programm: double A[10000];! for (int i = 0; i < 10000; ++i)!!a[i] = langwierige_berechnung(i);! Die berechnungen sind unabhängig langwierige_berechnung braucht nur i Die Schleife ist sehr einfach parallelisierbar

parallel Parallele Ausführung mit parallel Folgender Block wird von allen Threads parallel ausgeführt Programmierer verteilt die Arbeit Entweder manuell Oder mit weiteren DirekWven, bspw. for, secwons,... double A[10000];! int cnt = omp_get_num_threads();! #pragma omp parallel! {!!int id = omp_get_thread_num();!!int i_start = 10000 * id / cnt;!!int i_end = 10000 * (id+1) / cnt;!!langwierige_berechnung(a, i_start, i_end);! }!

for Auyeilung von SchleifeniteraWon mit for OpenMP teilt IteraWonen den einzelnen Threads zu Nur for- Schleifen mit beswmmter Syntax double A[elemente];! #pragma omp parallel for! for (int i = 0; i < 10000; ++i)! A[i] = langwierige_berechnung(i);! Seit OpenMP 3.0 sind auch Iterator- Schleifen parallelisierbar: vector<int> v(10000);! typedef vector<int>::iterator iter;! #pragma omp parallel for! for (iter i = v.begin(); i < v.end(); ++i)! langwierige_berechnung(*i);!

for (II) Einschränkungen Nur ganzzahlige Schleifenvariablen (mit oder ohne Vorzeichen) Test nur mit <, <=, >, >= Schleifenvariable verändern: nur einfache Ausdrücke Operatoren ++, - -, +, +=, - = Obere und untere Grenze unabhängig von Schleifendurchlauf Ausdrücke sind möglich AutomaWsche SynchronisaWon nach for mit Barriere kann mit nowait unterdrückt werden

for (III) Verschiedene Arten, den Indexraum auf Threads zu verteilen Auswahl erfolgt mit schedule schedule(stawc[,k]) Indexraum wird in Blöcke der Größe k zerlegt und den Threads reihum zugewiesen k=1: 012012012...0 k=5: 000001111122222000001111122222...00000 schedule(dynamic[,k]) Indexraum wird in Blöcke der Größe k zerlegt und den Threads nach Bedarf zugewiesen schedule(guided[,k]) Indexraum wird in Blöcke propor4onal zur Restarbeit auf Threads aufgeteilt und nach Bedarf zugewiesen; k = minimale IteraWonszahl schedule(auto) ImplemenWerung- spezifisch (Standard, wenn keine Angabe) schedule(runwme) Entscheidung zur Laufzeit (omp_set_schedule, omp_get_schedule, OMP_SCHEDULE)

Klauseln Festlegen der Anzahl der Threads: double A[10000];! #pragma omp parallel for num_threads(4)! for (int i = 0; i < 10000; ++i)!!a[i] = langwierige_berechnung(i);! AlternaWv ginge auch omp_set_num_threads(4);! Oder über Umgebungsvariable export OMP_NUM_THREADS=4! Bedingte Parallelisierung: double A[elemente];! #pragma omp parallel for if (elemente > 100)! for (int i = 0; i < elemente; ++i)!!a[i] = langwierige_berechnung(i);!

Mehrdimensionale Schleifen Zusammenfassung von Schleifen for- DirekWve wirkt nur auf nächste Schleife collapse(k) kombiniert Indexraum der folgenden k Schleifen Beispiel: MatrixmulWplikaWon #pragma omp parallel for collapse(3)! for (int i = 0; i < dim1; ++i)!!for (int j = 0; j < dim2; ++j)!!!for (int k = 0; k < dim3; ++k)!!! C[i][j] = A[i][k]*B[k][j];!

secwons Parallelisierung ohne Schleifen mit Abschnihen Jedem Abschnih wird ein Thread zugewiesen Nur stawsche Parallelität möglich: Abschnih gilt für ganzes Team #pragma omp parallel! #pragma omp sections! {! #pragma omp section! arbeit1();! #pragma omp section! arbeit2();! #pragma omp section! arbeit3();! }!

secwons (II) Rekursionen sind mit sec4ons sehr einfach parallelisierbar Beispiel: Quicksort mit verschachtelten Teams: void quicksort(int a[], int l, int r)! {!!if (l < r)!!{!!!int i = partition(a, l, r);!!!#pragma omp parallel sections!!!{!!!!#pragma omp section!!!!quicksort(a, l, i - 1);!!!!#pragma omp section!!!!quicksort(a, i + 1, r);!!!}!!}! }!

task Parallelisierung ohne Schleifen mit Tasks (OpenMP 3.0) Jeder Task wird (reihum) einem Thread zugewiesen Unterschied zu secwons DefiniWon eines Tasks an beliebiger Stelle von beliebigem Thread im Team Ein Thread im Team führt den Task aus void quicksort(int a[], int l, int r)! {! if (l < r)! {! int i = partition(a, l, r);! #pragma omp task! quicksort(a, l, i - 1);! quicksort(a, i + 1, r);! }! }! int main()! {! #pragma omp parallel! {! #pragma omp single! quicksort(a, 1, 99);! }! }!

SynchronisaWon Block der nur von einem / dem Master Thread im Team ausgeführt werden soll #pragma omp single / #pragma omp master Beispiel: Datei einlesen, Textausgabe auf der Konsole Block der von jedem Thread einzeln (seriell) ausgeführt werden soll #pragma omp cri4cal Analog zur Mutex, entspricht dem Bereich zwischen lock und unlock Beispiel: Zugriff auf gemeinsame Datenstruktur / Resource Atomares Schreiben ( kleiner kriwscher Abschnih ) #pragma omp atomic Beispiel: InkremenWeren eines globalen Zählers SynchronisaWon aller Threads mit Barriere #pragma omp barrier

master, barrier int main()! {!!int a[5];!!#pragma omp parallel!!{!!!#pragma omp for!!!for (int i = 0; i < 5; i++) a[i] = i * i;! }!!!#pragma omp master!!!for (int i = 0; i < 5; i++)!!!!std::cout << a[i] << std::endl;!!!#pragma omp barrier!!!#pragma omp for!!!for (int i = 0; i < 5; i++) a[i] += i;!!}!

atomic, criwcal void max_zeros(int *a, int size)! {!!int max = a[0]; int zeros = 0;!!#pragma omp parallel for num_threads(4)!!for (int i = 0; i < size; i++)!!{!!!if (a[i] == 0)!!!!#pragma omp atomic!!!!zeros++;!!!if (a[i] > max)!!!#pragma omp critical!!!{!!!!if (a[i] > max) max = a[i];!!!}!!}! }!!std::cout << max << zeros << std::endl;!

Speicherklauseln für Variablen shared Daten sind für alle Threads sichtbar/änderbar. Standard in Schleifen. private Jeder Thread hat eigene Kopie. Daten werden nicht iniwalisiert. Sind außerhalb des parallelen Abschnihs nicht bekannt. firstprivate private Daten. IniWalisierung mit letztem Wert vor parallelem Abschnih lastprivate private Daten. Der Thread, der die letzte IteraWon ausführt, übergibt den Wert aus dem parallelen Abschnih an das Hauptprogramm. threadprivate globale Daten, die im parallelen Programmabschnih jedoch als privat behandelt werden. Der globale Wert wird über den parallelen Abschnih hinweg bewahrt. reduc4on private Daten, werden am Ende auf einen globalen Wert zusammengefasst.

BEMERKUNGEN ZUR P- AUFGABE

Bemerkungen zu Aufgabe 3 Typischer Fehler: Variable- length Arrays sind nicht Teil des C++ Standards int rows = 5;! int cols = 10;! int matrix [rows][cols];! int rows = 5;! int cols = 10;! vector<int> matrix(rows*cols);! delete anstah delete[] int *matrix = new int[rows*cols];! //...! delete matrix;! int *matrix = new int[rows*cols];! //...! delete[] matrix;!

Bemerkungen zu Aufgabe 3 (II) Mögliche Verbesserungen: Auf die Traceback- Matrix kann auch verzichtet werden Traceback- Matrix speichert Richtung, aus der das Maximum kam AlternaWv kann man die Richtung des Traceback während des Zurückverfolgens berechnet werden FunkWonen wie score oder max als inline definieren Eine Matrix- Klasse programmieren hhps://svn.mi.fu- berlin.de/agbio/aldabi/ws11/documents/aufgabe3/matrix.h

Hinweise zu Aufgabe 4 Was passiert, wenn der Text einfach nur in nichtüberlappende Teile zerlegt wird? Matches, die halb in beiden Teilen liegen, werden nicht gefunden what! ever! whateve! r! Wie muss der Text aufgeteilt werden, damit Alle Matches gefunden werden Keine Matches doppelt ausgegeben werden Wie verhindert man, dass 2 Threads gleichzeiwg den vector mit Matches beschreiben