4. Parallelprogrammierung

Ähnliche Dokumente
4. Parallelprogrammierung

4. Parallelprogrammierung. AlDaBi Praktikum

4. Parallelprogrammierung AlDaBi Prak4kum

1. Einführung in OpenMP

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

Einige Grundlagen zu OpenMP

OpenMP. Viktor Styrbul

Threads und OpenMP. Frank Mietke Cluster- & Gridcomputing Frank Mietke 7/4/04

Parallele Programmierung mit OpenMP

Praktikum: Paralleles Programmieren für Geowissenschaftler

Parallele Programmierung mit OpenMP

Parallel Regions und Work-Sharing Konstrukte

Parallele Programmierung mit OpenMP

Universität Karlsruhe (TH)

Parallel Processing in a Nutshell OpenMP & MPI kurz vorgestellt

Programmieren mit OpenMP

OpenMP am Beispiel der Matrizenmultiplikation

PThreads. Pthreads. Jeder Hersteller hatte eine eigene Implementierung von Threads oder light weight processes

Parallele Systeme. 1 Einführung Durchführung der erweiterten Übung OpenMP... 3

Anleitung für zwei C++ - Openmp - Beispiele auf der NWZSuperdome

Universität Karlsruhe (TH)

Projektseminar Parallele Programmierung


Multicore Parallelismus! in modernen CPUs

Shared-Memory Parallelisierung von C++ Programmen

Einleitung Entwicklung in C Hello-World! Konstrukte in C Zusammenfassung Literatur. Grundlagen von C. Jonas Gresens

0. Einführung & Motivation

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

MSDN Webcast: Parallelprogrammierung mit der Task Parallel Library für.net (Teil 1) Presenter: Bernd Marquardt

Repetitorium Informatik (Java)

Grundlagen der Parallelisierung

1. Übung zu "Numerik partieller Differentialgleichungen"

Welche Informatik-Kenntnisse bringen Sie mit?

Einführung in die Programmiersprache C

(allgemeine) OOP in C++ Klassen und header-files Konstruktorn / Destruktoren Speicherverwaltung C++ Standard Library / SLT

CUDA. Jürgen Pröll. Multi-Core Architectures and Programming. Friedrich-Alexander-Universität Erlangen-Nürnberg Jürgen Pröll 1

I Grundlagen der parallelen Programmierung 1

6 Speicherorganisation

Zeiger, Arrays und Strings in C und C++

Einführung in die Programmierung

Praxiseinheit: Realisierung einer hardwarebeschleunigten Disparitätenberechnung zur automatischen Auswertung von Stereobildern

Paralleles Rechnen. (Architektur verteilter Systeme) von Thomas Offermann Philipp Tommek Dominik Pich

Übersicht. Einführung in die Programmierung. main. main. main. main. Speicherverwaltung. Definition nach ANSI C:

Betriebssysteme Übung 2. Tutorium System Calls & Multiprogramming

OpenCL Implementierung von OpenCV Funktionen

Computergrundlagen Programmieren in C

Parallele Programmierung mit OpenMP und MPI

Übersicht. Race Conditions Buffer Overflows Heap Overflows Exkurs: Stackaufbau bei Intel x86 Exkurs: Shellcode Stack Overflows

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

Der Goopax Compiler GPU-Programmierung in C++ ZKI AK-Supercomputing, Münster, , Ingo Josopait

Warum parallele Programmierung?

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

Effizientes Memory Debugging in C/C++

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

Microsoft Visual C++ 6.0

Rechnerorganisation Tutorium Nr. 1

Einführung in die C-Programmierung

5. Parallelprogrammierung II und q-gram Indizes. AlDaBi Prak:kum

Intel Cluster Studio. Michael Burger FG Scientific Computing TU Darmstadt

Tutorium Rechnerorganisation

Einführung in das parallele Programmieren mit MPI und Java

Parallele Prozesse. Prozeß wartet

Nutzung paralleler Prozesse bei der Umweltsimulation

Architektur paralleler Rechnersysteme - Effiziente HPC Systeme -

IT-Infrastruktur, WS 2014/15, Hans-Georg Eßer

Systemprogrammierung: Erste Schritte (P) Das Manpage-System (P) Versionsverwaltung mit Subversion (P)

Klausur C-Programmierung / / Klingebiel / 60 Minuten / 60 Punkte

Informatik I (D-MAVT)

C allgemein. C wurde unter und für Unix entwickelt. Vorläufer sind BCPL und B.

6. Tutorium zu Softwaretechnik I

C++ Kurs Teil 1. Architektur, Anwendungsspektrum, primitive Datentypen, Funktionsaufrufe, Referenzen, Klassen

Kurz: Stimme meinen Vorrednern zu: Angenehme Atmosphäre. Eher ein Fachgespräch als eine Prüfung. Eindeutig zu empfehlen

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

Programmieren in C++ Arrays, Strings und Zeigerarithmetik

Grundlagen. Die Komponenten eines C Programms. Das erste Programm

9 Multithreading. 1 Idee des Multithreading

Paralleles Programmieren mit MPI und OpenMP

Algorithmen zur Datenanalyse in C++

Dr. Monika Meiler. Inhalt

Computergrundlagen Programmieren in C

Linux Prinzipien und Programmierung

Programmierkurs C++ Grundlagen. Prof. Dr. Stefan Fischer Institut für Telematik, Universität zu Lübeck

Computergrafik 1 Übung, Wintersemester Eclipse Hands-On. C++ Projektsetup mit OpenGL und GLUT unter Eclipse für Windows

Programmieren I. Die Programmiersprache Java. Institut für Angewandte Informatik

leave: mov flag, 0 ; 0 in flag speichern: Lock freigeben ret

Inhaltsverzeichnis. Carsten Vogt. Nebenläufige Programmierung. Ein Arbeitsbuch mit UNIX/Linux und Java ISBN:

Vergleich verschiedener OO-Programmiersprachen

High Performance Computing

Programmierung mit C Zeiger

WS Parallele Prozesse. Prof. Hannelore Frank. Parallele Prozesse. PetriNetze. Synchronisation UNIX. Wettbewerb PC Krit.Abschnitt Spinlocks

Einleitung. Informationsquellen: - Webseite zur Vorlesung, Abschnitt Informationen zu C und C++ Kurzeinführung in C/C++

Einheit Lexikalische Grundlagen der Programmiersprache C Lexikalische Einheiten

Moderne Betriebssysteme. Kapitel 8. Kapitel 8. Folie: 1. Multiprozessorsysteme. Autor: Andrew S. Tanenbaum

Übung zu Grundlagen der Betriebssysteme. 3. Übung

Fachhochschule Wiesbaden - Fachbereich DCSM. Skriptsprachen. Moderne, objekt-orientierte Skriptsprachen mit Betonung auf Ruby

PROGRAMMIEREN MIT C. }, wird kompiliert mit dem Befehl. (-o steht für output) und ausgeführt mit dem Befehl

Grundlagen C und C++ Einheit 03: Grundlagen in C++ Lorenz Schauer Lehrstuhl für Mobile und Verteilte Systeme

Rechnerarchitektur und Betriebssysteme (CS201): Semaphor, Monitor, Deadlocks, Re-Entrance

U6-1 Organisatories. U6-2 Motivation von Threads. U6-3 Vergleich von Thread-Konzepten. Organisatorisches

Transkript:

4. Parallelprogrammierung AlDaBi Prak4kum David Weese 2010/11 René Rahn WS 2014/15

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 David Weese 2010/11 René Rahn WS 2014/15

Voraussetzungen Es werden Mechanismen benözgt, um Parallelität zu erzeugen Prozesse voneinander unterscheiden zu können zwischen Prozessen kommunizieren zu können Für die Formulierung paralleler Programme: Datenparallele Programmiermodelle HPF Kontrollparallele Programmiermodelle MPI, OpenMP, CUDA Beides VHDL, MitrionC

Parallelprogrammierung durch... Direkten Zugriff auf das Netzwerk eines Clusters Effizient, aber nicht portabel Unterprogrammbibliotheken Beispiele: PThreads, fork(), MPI,... Erweiterung einer Programmiersprache durch Compiler- DirekZven Beispiel: OpenMP Eigenständige parallele Programmiersprache Großer Aufwand: Einarbeitung, neue Compiler, etc. Beispiele: OCCAM, parallele Fortran- Varianten (HPF), MitrionC,...

Parallele Plagormen 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

ProzesskommunikaZon Gemeinsamer Speicher (shared memory)... über gemeinsamen Speicherbereich Schreiben/Lesen im RAM SynchronisaZon über gegenseizgen 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

Begriffe Prozess 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 Beispiel: Thread Programm Gehören zu einem 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

Fallstricke Race CondiZons SituaZonen, in denen das Wejrennen (race) der Prozesse beim Zugriff auf gemeinsame Ressourcen Auswirkungen auf das Ergebnis eines Programmlaufs hat Beispiel: 2 Threads schreiben in dieselbe Speicherstelle Lösung SynchronisaZon Mutex (Mutual Exclusion) kann von mehreren Threads verlangt werden (lock), aber nur einer besitzt sie bis er sie freigibt (unlock) Semaphore Barrier kann von mehreren Threads verlangt werden, ist aber immer nur in Besitz von höchstens k Threads Mutex ist Semaphore mit k=1 Eine Gruppe von Threads hält solange an einer Barriere an, bis alle angekommen sind, danach laufen alle weiter

Fallstricke (II) Bei unpassender SynchronisaZon entstehen: Verklemmung (dead locks) Threads warten gegenseizg auf die Resourcen der anderen Aushungern (starvazon) Resource wechselt (unfairerweise) nur innerhalb einer Gruppe von Threads Threads außerhalb der Gruppe erhalten die Resource nie Beispiel: Philosophenproblem Philosophen essen und denken Zum Essen braucht jeder 2 Gabeln Jeder kann gleichzeizg nur eine Gabel auneben 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

OPEN MULTI- PROCESSING Folien z.t. aus VL Parallele Programmierung von Nicolas Maillard und Marcus Rij, TU Berlin David Weese 2010/11 René Rahn WS 2014/15

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

Einführung OpenMP stellt eine Programmierschnijstelle (API) für C/C++ (und Fortran) zur Verfügung Erweiterung der Programmiersprache durch #pragma- DirekZven Eine DirekZve besteht aus einem Namen und einer Klauselliste: #pragma omp direczve [clause list] BibliotheksfunkZonen #include <omp.h> Nur für Plagormen mit gemeinsamen Speicher (shared memory) Nützliche Links OpenMP Homepage - hjp://www.openmp.org/ OpenMP Tutorial - hjp://compuzng.llnl.gov/tutorials/openmp/ Kurzübersicht - hjp://www.openmp.org/mp- documents/openmp3.0- SummarySpec.pdf

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

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.

Von seriell zu parallel Serielles Programm: double A[10000]; for (int i = 0; i < 10000; ++i) A[i] = langwierige_berechnung(i); Parallelisiert mit OpenMP: double A[10000]; #pragma omp parallel for for (int i = 0; i < 10000; ++i) A[i] = langwierige_berechnung(i); Serielle Version weiterhin nutzbar #pragma omp wird ignoriert von Compilern ohne OpenMP- Unterstützung

DirekZven Parallele Regionen omp parallel Klauseln zur DefiniZon gemeinsamer und privater Daten omp shared, private, Auxeilung von Schleifen omp for SynchronisaZon omp atomic, critical, barrier, BibliotheksfunkZonen und Umgebungsvariablen omp_set_num_threads(), omp_set_lock(), OMP_SCHEDULE, OMP_NUM_THREADS,

parallel Parallele Ausführung mit parallel Folgender Block wird von allen Threads parallel ausgeführt Programmierer verteilt die Arbeit Entweder manuell Oder mit weiteren DirekZven, bspw. for, seczons,... 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 Auxeilung von SchleifeniteraZon mit for OpenMP teilt IteraZonen den einzelnen Threads zu Nur for- Schleifen mit beszmmter Syntax double A[elemente]; #pragma omp parallel #pragma omp 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 #pragma omp 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 AutomaZsche SynchronisaZon nach for mit Barriere kann mit nowait unterdrückt werden Kurzform: #pragma omp parallel for

for (III) Verschiedene Arten, den Indexraum auf Threads zu verteilen Auswahl erfolgt mit schedule schedule(stazc[,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 IteraZonszahl schedule(auto) ImplemenZerungs- spezifisch (Standard, wenn keine Angabe) schedule(runzme) 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); AlternaZv 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- DirekZve wirkt nur auf nächste Schleife collapse(k) kombiniert Indexraum der folgenden k Schleifen Beispiel: MatrixmulZplikaZon #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];

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

seczons (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 seczons DefiniZon 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); } }

SynchronisaZon 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 krizscher Abschnij ) #pragma omp atomic Beispiel: InkremenZeren eines globalen Zählers SynchronisaZon aller Threads mit Barriere #pragma omp barrier

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 inizalisiert. Sind außerhalb des parallelen Abschnijs nicht bekannt. firstprivate private Daten. IniZalisierung mit letztem Wert vor parallelem Abschnij lastprivate private Daten. Der Thread, der die letzte IteraZon ausführt, übergibt den Wert aus dem parallelen Abschnij an das Hauptprogramm. threadprivate globale Daten, die im parallelen Programmabschnij jedoch als privat behandelt werden. Der globale Wert wird über den parallelen Abschnij hinweg bewahrt. reduc4on private Daten, werden am Ende auf einen globalen Wert zusammengefasst.

BEMERKUNGEN ZUR P- AUFGABE David Weese 2010/11 René Rahn WS 2014/15

Bemerkungen zu Aufgabe 4 Aufgabenstellung Neighborhood GeneraZon (w, t, S) Einfachste Lösung - > Rekursive FunkZon die alle Strings der Länge w enumeriert und anhand (w, t, S) Nachbarschax beszmmt Parallelisieren! void genneighborhood(std::string query, const ScoreMatrix &matrix, unsigned wordsize, int threshold) { // Iteriere alle überlappenden Wörter // Bestimme Nachbarschaft rekursiv. // Gebe Nachbarschaft aus }

Bemerkungen zu Aufgabe 4 (II) Score- Matritzen Blosum PAM a4_uzl.h - > HelferfunkZonen zum Einlesen der Scoring- Matrix. #include <iostream> #include../material/material_a4/a4_util.h void genneighborhood(std::string query, const ScoreMatrix &matrix, unsigned wordsize, int threshold) {... } int main(int argc, const char** argv) {... genneighborhood(...); return 0; }

Bemerkungen zu Aufgabe 5 Aufgabe 5 ist die Weihnachtsaufgabe Ausgabe: 15.12.2013 Abgabe: 19.01.2014 5 Wochen Thema: Read Mapping Deutlich mehr Aufwand als bisherige Aufgaben Kein Tutorium dazu in diesem Jahr Besuch der P- VL am 18.12. zu empfehlen Zusatztutorium am 6.01.