Projektseminar Parallele Programmierung

Ähnliche Dokumente
Projektseminar Parallele Programmierung

Trend der letzten Jahre in der Parallelrechentechnik

Hochleistungsrechnen Hybride Parallele Programmierung. Prof. Dr. Thomas Ludwig Universität Hamburg Informatik Wissenschaftliches Rechnen

Einige Grundlagen zu OpenMP

OpenMP. Viktor Styrbul

Compute Unified Device Architecture CUDA

Parallel Processing in a Nutshell OpenMP & MPI kurz vorgestellt

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

Parallele und verteilte Programmierung

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

Parallele Programmierung mit OpenMP

Einführung in das parallele Programmieren mit MPI und Java

Programmierung von Multicore-Rechnern

Parallel Programming: Message-Passing-Interface

4. Parallelprogrammierung

Praktikum: Paralleles Programmieren für Geowissenschaftler

1. Einführung in OpenMP

Nutzung paralleler Prozesse bei der Umweltsimulation

Multicore Herausforderungen an das Software-Engineering. Prof. Dr.-Ing. Michael Uelschen Hochschule Osnabrück

Zum Aufwärmen nocheinmal grundlegende Tatsachen zum Rechnen mit reelen Zahlen auf dem Computer. Das Rechnen mit Gleitkommazahlen wird durch den IEEE

Masterpraktikum Scientific Computing

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

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

Paralleles Programmieren mit MPI und OpenMP

Grundlagen der Parallelisierung

Wie groß ist die Page Table?

Klausur zu High Performance Computing 09. Juli 2011, SS 2011

Yilmaz, Tolga MatNr: Mesaud, Elias MatNr:

Systeme I: Betriebssysteme Kapitel 4 Prozesse. Wolfram Burgard

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

2 Rechnerarchitekturen

Vorlesung "Verteilte Systeme" Sommersemester Verteilte Systeme. Adreßraum. Rechner. Verteilte Systeme, Sommersemester 1999 Folie 19.

MPI Prozessgruppen, Topologien, kollektive Kommunikation

Virtueller Speicher. SS 2012 Grundlagen der Rechnerarchitektur Speicher 44

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

Systeme I: Betriebssysteme Kapitel 4 Prozesse. Maren Bennewitz

Games with Cellular Automata auf Parallelen Rechnerarchitekturen

High Performance Computing

Linux-Cluster mit Raspberry Pi. Dr. René Richter Sächsische Studienakademie Dresden

2. Der ParaNut-Prozessor "Parallel and more than just another CPU core"

Vorlesung Parallelrechner und Parallelprogrammierung, SoSe 2016

General Purpose Computation on GPUs

Programmierbeispiele und Implementierung. Name: Michel Steuwer

Shared-Memory Parallelisierung von C++ Programmen

OpenCL Implementierung von OpenCV Funktionen

Programmieren in C/C++ und MATLAB

Parallele Programmierung mit OpenMP

Einführung. GPU-Versuch. Andreas Schäfer Friedrich-Alexander-Universität Erlangen-Nürnberg

Leistungskurs C++ Einführung

Parallele Programmierung mit OpenMP und MPI

Parallelverarbeitung

Vertiefungsrichtung Rechnerarchitektur

Linker: Adreßräume verknüpfen. Informationen über einen Prozeß. Prozeß-Erzeugung: Verwandtschaft

OpenMP am Beispiel der Matrizenmultiplikation

Sequentielle Programm- / Funktionsausführung innerhalb eines Prozesses ( thread = Ausführungsfaden )

2Binden 3. und Bibliotheken

Echtzeitbetriebssysteme

RST-Labor WS06/07 GPGPU. General Purpose Computation On Graphics Processing Units. (Grafikkarten-Programmierung) Von: Marc Blunck

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

GPGPU-Programming. Constantin Timm Informatik 12 TU Dortmund 2012/04/09. technische universität dortmund. fakultät für informatik informatik 12

Anleitung für zwei Fortran-Openmp-Beispiele auf der NWZSuperdome

Klausurvorbereitung VS1 (Prof. Brecht) (B0rg Edition)

4. Parallelprogrammierung. AlDaBi Praktikum

Moderne parallele Rechnerarchitekturen

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

Systeme I: Betriebssysteme Kapitel 8 Speicherverwaltung

C++ Teil 5. Sven Groß. 13. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 18

GPGPU-Architekturen CUDA Programmiermodell Beispielprogramm. Einführung CUDA. Ralf Seidler. Friedrich-Alexander-Universität Erlangen-Nürnberg

Rechnernutzung in der Physik. Betriebssysteme

Systemprogrammierung

OpenCL. Seminar Programmiersprachen im Multicore-Zeitalter Universität Siegen Tim Wiersdörfer

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

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

Übersicht. Nebenläufige Programmierung. Praxis und Semantik. Einleitung. Sequentielle und nebenläufige Programmierung. Warum ist. interessant?

Klausur zu High Performance Computing 7. Februar 2014

Einführung in die Parallele Programmierung

Grundlagen Rechnerarchitektur und Betriebssysteme

Bibliotheks-basierte Virtualisierung

Softwaresysteme I Übungen Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2007 U9.fm

Staff. Tim Conrad. Zeitplan. Blockseminar: Verteiltes Rechnen und Parallelprogrammierung. Sommer Semester Tim Conrad

Parallele Programmierung

Kommunikationsmodelle

1. Übung zu "Numerik partieller Differentialgleichungen"

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

Protected User-Level DMA in SCI Shared Memory Umgebungen

Gliederung. Was ist CUDA? CPU GPU/GPGPU CUDA Anwendungsbereiche Wirtschaftlichkeit Beispielvideo

Programmieren mit OpenMP

Entwicklung algorithmischer Skelette für CUDA am Beispiel von Affintiy Propagation

Programmierung von Graphikkarten

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

Betriebssysteme G: Parallele Prozesse (Teil A: Grundlagen)

Transkript:

HTW Dresden WS 2016/2017

Organisatorisches Praktikum, 4 SWS Do. 15:10-18:30 Uhr, Z136c, 2 Doppelstunden Labor Z 136c ist Montag und Donnerstag 15:10-18:30 reserviert, gemeinsam mit anderen Projektseminaren Selbständige Arbeiten können gern auch zu anderen Zeiten erfolgen

Aufgabenstellungen und Leistungsnachweis Aufgabenstellung: Individuelle Aufgabenstellungen oder für 2er-Gruppen Auch Einzelarbeiten möglich Eintragung für ein Thema in Einschreibliste zu meiner Information Leistungsnachweis: Vorführung des Programms innerhalb des Projektseminars Kurzvortrag (ca. 20 min) der Gruppe mit Präsentation Schriftliche Praktikumsdokumentation der Gruppe, ca. 10-20 Seiten Auf das Praktikum wird eine individuelle Note vergeben.

Genutzte Rechnerinfrastruktur PC, 4-Core CPU, NVidia Quadro 600 Grafikkarte, OpenSuse-LINUX, OpenMP, CUDA (inkl. OpenCL) o.g. PC-System ist im Labor Z136c installiert und ist aus dem HTW-Netz erreichbar Linux-PCs im Rechnerlabor Z136c und Z146a als virtueller Parallelrechner mit MPI, LINUX, ssh-login, ssh -X Programmierung in C, C++, JavaScript und verwandten Sprachen

Multi- und Manycore Prozessoren Vorhersagen: Ende 2008: 8 cores 2011: 32 cores 2014: >128 cores Bildquelle: Intel roadmap Begriffe: Multicore: 20 Manycore:> 20 cores Andere Quellen: many = hundreds of cores Paralleles Programmieren auch für gewöhnliche Rechner

Multi- und Manycore Prozessoren Struktur: P 0 P 1 P 2 P 3 P (p 1) Cache Cache Cache Cache Cache Communication Network MEM MEM MEM MEM MEM Koordination und Kooperation über gemeinsame Variable Auf MPS kann eine einzelne Instanz eines Betriebssystems ausgeführt werden. D.h. das System kann wie ein einzelner Rechner benutzt werden. Architekturmodell zum Teil für GPUs zutreffend, ohne Betriebssystem, ohne Cache

Nutzung des gemeinsamem Speichers Optionen aus Sicht des Programmierers: Multiprocessing: Mehrere Prozesse (durch fork()) und Kommunikation via Shmem-Segmente. Multithreading: Mehrere Threads innerhalb eines Prozesskontexts, direkte Abstraktion des Systems mit gemeinsamem Speicher. Expliziter Nachrichtenaustausch: mehrere Prozesse mit Kommunikation über Pipes oder Sockets, Kommunikationsbibliotheken MPI, PVM OpenMP: Compiler-Direktiven zur Steuerung mehrfädiger Ausführung (Multithreading) bei gemeinsamen Speicher OpenCL und CUDA: Datenparallele Ausführung s.g. Kernel-Funktionen

MPS mit verteiltem Speicher (1) Struktur: MEM MEM MEM MEM MEM Cache Cache Cache Cache Cache P 0 P 1 P 2 P 3 P (p 1) Communication Network Koordination und Kooperation nur durch Nachrichten-Austausch Adressräume getrennt, d.h. eine gleiche Adresse verweist bei unterschiedlichen Knoten auf unterschiedliche Speicherinhalte Keine Speicher- und Cache-Konsistenz Problematik

MPS mit verteiltem Speicher Jeder Knoten führt eine eigene Instanz des Betriebssystems aus, ggf. reduziert auf Mikrokern Abstraktion durch verschiedene UNIX-Prozesse (im Gegensatz zu Threads bei gemeinsamem Speicher) Zum Nachrichtenaustausch stehen auf Betriebssystem-Ebene Socket-Verbindungen zur Verfügung (TCP/IP) Bibliotheken zur Erzeugung und Verwaltung verteilter Prozesse und zur Kommunikation, MPI

OpenMP Parallelisierung für speichergekoppelte Systeme Parallelarbeit wird durch Multithreading erreicht Direktiven im sonst sequentiellen Code

OpenMP (1) Satz von Compilerdirektiven und Subroutinen für Programmierung unter gemeinsamen Speicher Zur leichten Erzeugung von mehrfädigen (mutli-threaded) Programmen Für C, C++ und FORTRAN Fork-Join-Parallelität, die dem Programm inkrementell zugefügt wird.

OpenMP (2) Typischer Anwendungsfall: Schleifenparallelisierung for (i=0;i<256;i++) #pragma omp parallel for for (j=0;j<256;j++) { img[i,j] = img[i,j]-minpix;m img[i,j] = (int) ( (float)img[i,j]*(float)maxval/ (float)(maxpix-minpix)); } Für Beispiel gilt: Innere Schleife wird von verschiedenen Threads bearbeitet Sehr gutwillige Struktur, da keine gemeinsam benutzten Daten, keine Zugriffskonflikte

OpenMP (3) Schrittweise Parallelisierung: Parallele Regionen werden mit parallel und end parallel gekennzeichnet. Es wird dann eine Menge von Threads erzeugt, die den Code redundant bearbeiten, soweit nicht anders angegeben. Aufteilung der Arbeit erfolgt, wenn Schleifen betreten werden Fortran: do und end do C/C++: for(i=0;i<max;i++) Anzahl der gemeinsamen Schleifendurchläufe muss vorab bekannt sein. Direktive barrier zur Synchronisation

OpenMP (4) Koordination des Zugriffs auf Daten: exklusiver Zugriff auf gemeinsam genutzte Daten durch critical und end critical erreichbar. Variable können als shared (einmal vorhanden, gemeinsam genutzt) oder private (mehrfach vorhanden, exclusive Kopie) deklariert werden reduction-klausel kann konkurrierenden Zugriff auf gemeinsame Variable ausdrücken (siehe Beispiel)

OpenMP (5) Beispiel: Pi-Berechnung h = ((double)1.0)/(double)n; sum = 0.0; # pragma omp parallel private (i,x,sum_local) { sum_local = 0.0; # pragma omp for for(i=1;i<=n;i++) { x = h*((double)i-(double)0.5); sum_local = +f(x); } # pragma omp critical sum += sum_local; } pi = h* sum; Autor: Dieter an May, Rechenzentrum RWTH Aachen

OpenMP (6) Beispiel: Pi-Berechnung, jetzt mit Reduction-Klausel h = ((double)1.0)/(double)n; sum = 0.0; # pragma omp parallel private (i,x) { sum_local = 0.0; # pragma omp for reduction(+:sum) for(i=1;i<=n;i++) { x = h*((double)i-(double)0.5); sum = +f(x); } } pi = h* sum; Autor: Dieter an May, Rechenzentrum RWTH Aachen

MPI (1) MPI - Message Passing Interface Standard für Laufzeitumgebung und Kommunikationsbibliothek (MPI-Forum) Funktionalität ähnlich PVM Unterschied zu PVM: Prozesse werden per Kommando (mpirun oder mpiexec) mehrfach auf verschiedenen Prozessoren gestartet. Beispiel: mpirun -np32 myprogramm keine Prozesserzeugungen im MPI-Programm erforderlich. Direkte Umsetzung des SPMD-Prinzips, statische Prozessgruppe formiert bei Start der MPI-Anwendung. Ablaufprinzip galt bisher als zu statisch, MPI-2 mit dynamischer Prozesserzeugung und Threads

MPI (2) Wichtigste Funktionen: MPI_Init( int *argc,char ***argv) // System initialisiert, jeder Knoten mit eindeutige Nummer // und die MPI-Funktionen koennen benutzt werden int MPI_Comm_size ( MPI_Comm comm, int *size ) int MPI_Comm_rank ( MPI_Comm comm, int *rank ) int MPI_Send( void *buf, int count, MPI_DATATYPE datatype, int dest, int tag, MPI_Comm comm ) int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status status ) MPI_Finalize(); Weitere Funktionen wie z.b. Scatter, Gather, Barrier

MPI-Beispiel main(int argc, char **argv) { int rank, size;... MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD,&size); MPI_Comm_rank(MPI_COMM_WORLD,&rank); if (rank%2==0) /* gerade Prozess-Id */ { if (rank+1<size) { sprintf(msg,"nachricht [%d --> %d]\n",rank,rank+1); MPI_Send(msg,STRLEN,MPI_BYTE,rank+1,0,MPI_COMM_WORLD); } } else /* ungerade Prozess-Id */ { if (rank>0) { MPI_Recv(msg, STRLEN,MPI_BYTE,rank-1,0,MPI_COMM_WORLD,&st printf("empfangen: %s",msg); } } MPI_Finalize();

MPI-2 (1) Fortschreibung des MPI-Standards auf MPI-2 Neue Funktionen: Dynamische Prozesserzeugung: Ähnlich wie bei PVM können zur Laufzeit neue Prozesse erzeugt werden. Kollektive Operation:MPI_Comm_Spawn() Die Größe der Maschine wird durch MPI_UNIVERSE_SIZE abgefragt. Nach Spawn werden in einem Kommunikator (MPI_COMM_SPAWN) alte und neue Prozesse in unterschiedliche Gruppen eingeteilt. Dabei sind Prozesse sind durch (rank:group) identifiziert.

MPI-2 (2) Neue Funktionen (Fortsetzung): Socket-ähnlicher Aufbau von C/S-Systemen MPI_Open_Port(), MPI_Comm_Accept(), MPI_Comm_Connect()

MPI-2 (3) Neue Funktionen (Fortsetzung): Thread-Unterstützung Ein MPI Prozess kann aus mehreren Threads bestehen, die MPI-Funktionen ausführen. Funktion: MPI_Init_Thread(...,int required, int *provided) Die Werte required und provided stehen für verschiedene Thread-Unterstützungslevel: MPI_THREAD_SINGLE - nur ein einzelner Thread je Prozess MPI_THREAD_FUNNELED - multithreaded, aber nur ein Thread nutzt MPI-Funktionen MPI_THREAD_SERIALIZED - Threads werden bzgl. MPI-Aufrufen serialisiert MPI_THREAD_MULTIPLE - ohne Restriktionen

MPI-2 (4) Neue Funktionen (Fortsetzung): Einseitige Kommunikationsfunktionen Für Maschinen mit remote memory access, z.b. Cray T3D/T3E, Cluster mit SCI und Infiniband Netzen Funktionen: MPI_Put(), MPI_Get(), MPI_Accumulate()

CUDA für Grafikkarten CUDA Beispiel // Kernel definition global void VecAdd(float* A, float* B, float* C) { int i = threadidx.x; C[i] = A[i] + B[i]; } int main() {... // Kernel invocation with N threads VecAdd<<<1, N>>>(A, B, C);... }

Aufgaben Thema 1: Atomic Multicast mehrere Server die Nachrichten von Clients empfangen (RecvFromAny) mehrere Clients ein Client sendet eine Nachricht immer per Multicast an eine Teilmenge der Server Gefordert: Atomicy, Consistent Order, Fault-tolerance Programmiermodell: Verteilter Speicher mit Nachrichtenaustausch, d.h. mehrere PC s+netzwerk Programmiersprache: C,C++, MPI, oder JavaScript (NodeJS)

Aufgaben Thema 2: Verteilte Hashmap für Distributed Memory Hashmap, Speicherbereich über mehrere Adressbereiche gespreizt Paralleles Einfügen und paralleles Auslesen Plattform: Vernetzte Linux-PCs, Distributed Memory, MPI Varianten: 2-sided (send/recv), 1-sided (put/get)

Aufgaben Thema 3: Parallele Hashmap auf GPU Hashmap-Datenstruktur im Speicher der GPU Nutzung der Parallelität bei Eintragen und Ausgabe von Einträgen mehrere Kernel-Aufrufe in Folge zum Entragen, Austragen Programmierung in C/C++, Gemeinsamer Speicher, CUDA

Aufgaben Thema 4: Paralleles Text-Retrieval mit dem Vector-Space-Model Dokumente werden über die Häufigkeiten der möglichen Worte Worte indiziert Anfrage: Suchanfage wird über alle Dokumente bewertet. Ergebnis ist Rangliste der besten passenden Dokumente Schritt 1: Parallele Suche für eine Anfrage Schritt 2: Parallele Suche für mehrere Anfragen Schritt 3: Paralleles Indizieren Programmierung in C/C++, Verteilter Speicher, MPI

Wie gehts weiter? Einschreibung für ein Thema: Thema 1 - Atomic Multicast Thema 2 - Verteilte Hashmap, Rechnercluster, MPI Thema 3 - Parallele Hashmap auf Grafikkarte Thema 4 - Paralleles Text-Retrieval, MPI Weitere Treffen: Login-Zuteilung, Einweisung in Rechner Kick-Off Besprechungen mit einzelnen Gruppen Materialausgabe