Message Passing Interface: MPI

Ähnliche Dokumente
Parallel Processing in a Nutshell OpenMP & MPI kurz vorgestellt

Parallel Programming: Message-Passing-Interface

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

Einführung in das parallele Programmieren mit MPI und Java

Klausur zu High Performance Computing 7. Februar 2014

Parallelverarbeitung

Paralleles Programmieren mit MPI und OpenMP

Parallele Programmierung mit MPI

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

CORBA. Systemprogrammierung WS

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

Einführung in die Programmierung mit VBA

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

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

Deklarationen in C. Prof. Dr. Margarita Esponda

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

Objektbasierte Entwicklung

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

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

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

Modellierung und Programmierung

Einführung in den Einsatz von Objekt-Orientierung mit C++ I

Einführung in die C-Programmierung

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

CEN1112 Labor Software-Entwicklung

Modellierung und Programmierung 1

Die Programmiersprache C

Übungen zur Vorlesung EidP (WS 2015/16) Blatt 6

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

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

Welche Informatik-Kenntnisse bringen Sie mit?

Tutoraufgabe 1 (Zweierkomplement): Lösung: Programmierung WS16/17 Lösung - Übung 2

5.4 Klassen und Objekte

Klausur zu Objektorientierter Softwareentwicklung in C++ 4. Februar 2003 (WS 2002/2003) Beispiellösung

C-Probeklausur (Informatik 1; Umfang: C, Teil 1; SS07)

2 MPI MESSAGE-PASSING INTERFACE

Zeiger, Arrays und Strings in C und C++

Effizientes und effektives Testen von Embedded SW mit Google Test. Michael Bernhard

Programmieren in C. Macros, Funktionen und modulare Programmstruktur. Prof. Dr. Nikolaus Wulff

DAP2-Programmierpraktikum Einführung in C++ (Teil 1)

Dynamische Speicherverwaltung

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

Einführung in die Programmiersprache C

OpenCL Implementierung von OpenCV Funktionen

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

Microcontroller Kurs Programmieren Microcontroller Kurs/Johannes Fuchs 1

Microsoft Visual C++ 6.0

Advanced Programming in C

FHZ. K20 Arrays. Lernziele. Hochschule Technik+Architektur Luzern Abteilung Informatik, Fach Programmieren. Inhalt

Kapitel 3: Variablen

Einige Grundlagen zu OpenMP

Klausur in Programmieren

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

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

Informatik I. Übung 2 : Programmieren in Eclipse. 5. März Daniel Hentzen

Computergrundlagen Programmieren in C

Praktikum Betriebssysteme 1. Aufgabe (1)

Javaprogrammierung mit NetBeans. Variablen, Datentypen, Methoden

EndTermTest PROGALGO WS1516 A

Übung zur Vorlesung Echtzeitsysteme

Elementare Datentypen in C++

Adressauflösung. IP Adresse Physikalische Adresse :FF:AA:36:AB: :48:A4:28:AA:18

Errata-Liste zum Kurs: Einführung in die Programmiersprache C++ (9. Auflage)

Programmierbeispiele und Implementierung. Name: Michel Steuwer

FH München, FB 03 FA WS 06/07. Ingenieurinformatik. Name Vorname Matrikelnummer Sem.Gr.: Hörsaal Platz

Primitive Datentypen

Zeichendarstellung. Zeichen sind Zahlen (in C) Zeichen und switch

Programmieren in C / C++ Grundlagen C 2

Rechnerorganisation Tutorium Nr. 1

Kommunikation. Björn und Georg

Short Introduction to C# C# (C SHARP) Microsofts Antwort auf Java

Anhang A - Weitere Bibliotheken. Die Bibliothek Mail_02.lib ermöglicht das Versenden von s mit dem Ethernet-Controller

Universität Augsburg, Institut für Informatik Sommersemester 2005 Prof. Dr. Werner Kießling 15. Oktober 2005 Dr. Alfons Huhn, Timotheus Preisinger

SS Björn Berezowski B.Sc. Marco Münch B.Sc. Michael Roth B.Sc. Repetitorium PG 1. Übungsblatt. 1 Übung - Probeklausur SS 2010 Typ Prof.

Primitive Datentypen und Felder (Arrays)

Kommunikationsnetze. 2. Direkte TCP/IP-Verbindungen 2.1 Höhere Programmiersprachen

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005

Brainfuck. 1 Brainfuck. 1.1 Brainfuck Geschichte und Umfeld. 1.2 Esoterische Programmiersprachen

Institut für Programmierung und Reaktive Systeme 25. August Programmier-Labor Übungsblatt. int binarysearch(int[] a, int x),

Zusammenfassung des Handzettels für Programmieren in C

Tutorium Rechnerorganisation

Aufgabenstellung und Zielsetzung

Programmieren in C/C++ und MATLAB

Programmieren in C. Felder, Schleifen und Fließkommaarithmetik. Prof. Dr. Nikolaus Wulff

Informatik Repetitorium SS Volker Jaedicke

Informatik I (D-MAVT)

Datenstrukturen, Alignment Stack Prozeduraufruf, Parameterübergabe und -rückgabe (Calling Conventions) Leaf procedures

Hello world. Sebastian Dyroff. 21. September 2009

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

Kontrollstrukturen und Funktionen in C

Algorithmen zur Datenanalyse in C++

Transkript:

Message Passing Interface: MPI Geschichte: Erster MPI Standard Etwa 60 Personen, von 40 Institutionen (29-30 April 1992) MPI 1 im November 1993 MPI 1.1 im Juni 1995 MPI 1.2 Juli 1997 (Nur Ergänzung zu MPI 1.1) MPI 2.0 Standard, Juli 1997 (Compiler in Entwicklung) Ziele: Source Code portability Effiziente Umsetzung Unterstützung für heterogene Architekturen Sprachenunabhängig (C bzw. Fortran) Verschiedenes: Dokumentation: MPI Standard (http://www-unix.mcs.anl.gov/mpi/) Freie Implementation: MPICH (http://www-unix.mcs.anl.gov/mpi/mpich/) MPI 1

Message Passing Interface: MPI Voraussetzungen: Compiler muß MPI verstehen Linken mit: -lmpi Im Programm: #include <mpi.h> Das einfachste Programm: #include <mpi.h> main(int argc, char **argv) { MPI_Init(&argc, &argv); printf("hallo:\n"); MPI_Finalize(); } Ausführen: mpirun -np 4 a.out Single Program Multiple Data: SPMD Jeder Prozeß führt denselben Code aus Prozesse werden durch den sog. Rank unterschieden All Prozesse gehören dem Communicator MPI COMM WORLD an. MPI 2

Message Passing Interface: MPI Informationen über die Umgebung: MPI Comm rank(mpi Comm comm, int *rank): Wer bin ich? MPI Comm size(mpi Comm comm, int *size): Wie viele sind wir? Beispiel: Schreibe ein Programm, bei dem jeder Prozeß seine ID ausgibt, und wieviele Prozesse es gibt? Modifiziere das Programm so, daß nur der Prozeß mit dem höchsten Rank die Anzahl der Prozesse ausgibt. MPI 3

Datentypen und Nachrichten Einige (intrinsische) MPI Datentypen: MPI CHAR MPI INT MPI LONG MPI FLOAT MPI DOUBLE MPI LONG DOUBLE Nachrichten-Typen: signed char signed int signed long int float double long double Synchronous send: MPI Ssend Ist beendet wenn der Empfänger empfangen hat. Buffered Send: MPI Bsend Initiiert den Send, gibt dann die Kontrolle zurück, unabhänging vom Status des Empfängers Standard Send: MPI Send Abhängig von der Implementation Receive: MPI Recv Gibt die Kontrolle zurück, wenn die Nachricht empfangen wurde Aufruf: int MPI Send(void *buf, int cnt, MPI Typ typ, int dest, int tag, Comm comm) int MPI Recv(void *buf, int cnt, MPI Typ typ, int src, int tag, Comm comm, MPI Status *status): status.mpi TAG,.MPI SOURCE,.MPI ERROR MPI 4

Beispiel: Nachrichten #include <mpi.h> #include <stdio.h> main(int argc, char **argv) { int myrank,size; double number=0; MPI_Status status; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myrank); MPI_Comm_size(MPI_COMM_WORLD, &size); } if (myrank == 0){number = 3.; MPI_Ssend(&number,1,MPI_DOUBLE,1,1,MPI_COMM_WORLD); } if (myrank == 1){ MPI_Recv(&number,1,MPI_DOUBLE,0,1,MPI_COMM_WORLD, &status); printf("wert: %f \n",number); } MPI_Finalize(); MPI 5

Nachrichten Aufgaben: Schreibe ein Programm Ping Pong, bei dem 2 Prozesse eine Nachricht hinund her schicken. Wie hängt die benötigte Zeit von der Größe der Nachricht ab? Benutze dazu double MPI Wtime() Schreibe ein Programm, das eine Nachricht (mehrmals) im Kreis herum schickt Schreibe ein Programm zur Matrizenmultiplikation: C = A B Dabei soll jeder Prozeß einen Streifen der Matrix C berechnen. Wie ist das Verhältins Kommunikation/Rechenzeit? MPI 6

Non-Blocking Communication Unterschied: Blocking: Gibt Kontrolle zurück wenn der Buffer wieder benutzt werden kann. Non-Blocking: Initiiert die Kommunikation, gibt Kontrolle sofort zurück. Aufruf: MPI Isend(void* buf, int cnt, MPI Datatype type, int dest, int tag, COMM com, MPI Request *request) MPI Issend( : : : ) MPI Ibsend( : : : ) MPI Irecv(void* buf, int cnt, MPI Datatype type, int src, int tag, COMM com, MPI Request *request) Fertig? Kann Buffer benutzt werden und nicht ist Nachricht empfangen? MPI Wait(MPI Request *request, MPI Status *status) MPI Test(MPI Request *request, int *flag, MPI Status *status) flag = true oder false? MPI Waitall(int cnt, MPI Request *array of requests, MPI Status *array of status) MPI 7

Beispiel Wie kann die Kommunikation im Beispiel der Matrizenmultiplikation optimiert werden? Implementiere folgendes Schema: Prozeß 0 schickt alle Nachrichten Non-Blocking weg Prozeß 0 geht in Empfangsbereitschaft Prozeß 0 startet seine Rechnung Prozeß 0 wartet bis alle Ergebnisse da sind Ist der Performance-Gewinn meßbar? Hat sich das Verhältins Kommunikation/Rechenzeit spürbar verbessert? MPI 8

Derived Datatypes Problem: Versand einer Var. die nicht kont. im Speicher liegt General Datatype: Sequenz von Basic datatypes + Sequence of integer displacements MPI Type contignuous(int count, MPI Datatype old, MPI Datatype new) MPI Type vector(int cnt, int blocklength, int stride, MPI Datatype old, MPI Datatype new) MPI Type struct(...), der allgemeinste Ansatz MPI Type vector: MPI Type struct: Freigabe eines Datentyps: MPI Type commit(mpi Datatype *new) MPI 9

Warum? Virtuelle Topologien Vereinfachen die Benennung der Prozesse ermöglicht (einfachere) Bindung der Prozesses an CPU s Bequem Verschiedene Topologien: MPI Graph create(...): allg Graph MPI Cart create(mpi Comm old, int ndims, int *dims, int * periods, int reorder, MPI Comm *new) old: der alte Communicator ndims: Wieviele Dimensionen soll der neue haben? *dims: Array mit der Länge in den ndims Dimensionen *periods: Periodisch? 0 oder 1 reorder: Sollen die ranks in der neuen Topologie umgeordnet werden? *new: Neuer Communicator MPI Dims create(int nnodes,int ndims, int *dims) nnodes: Wieviele Prozesse ndims: Kartesische Komponenten *dims: Wieviele Prozesse in welcher Richtung MPI Cart rank bzw. MPI Cart coords, vermittelt zw. Koordinaten MPI Cart Coords brechnet die eigenen Koordinaten, MPI Cart shift die von Nachbarn und rank MPI 10

Examples? Kollektive Kommunikation MPI Barrier(MPI Comm comm): Alle Prozesse warten aufeinander MPI Bcast(void* buffer, int cnt, MPI Datatype datatype, int root, MPI Comm comm) Scatter, Gather,... siehe MPI Standard Seite 92 MPI Reduce(void *sendbuf, void* recvbuf, int cnt, MPI Datatype type, MPI Op op, int root, MPI comm comm): Nimmt die Elemente in sendbuf, wendet MPI Op darauf an und kopiert Ergebnis in recvbuf des Prozesses mit rank=root MPI MAX, MPI MIN MPI SUM,MPI PROD..., können auch selbst definiert werden. MPI 11

Derived Datatypes Beispiel Schreibe ein Programm, das eine 10x10 Matrix in 4 Blöcke aufteilt und die Blöcke nacheinander an einen 2ten Prozess schickt, der die Blöcke ausgibt. Virtuelle Topologien Schreibe ein Programm, das eine Kartesische 2x3 Topologie definiert. Jeder Prozeß soll seinen rank und seine Koordinaten ausgeben. Modifiziere das Programm so, daß ein 2 dimensionales Koordinaten System angelegt wird, dessen Ausdehnung in den einzelnen Richtungen selbstständig abhängig von der Anzahl der Prozessoren bestimmt wird. Modifiziere das Programm so, daß ein 2 dim Koord.-System mit periodischen Randbedingungen angelegt wird, und jeder Prozeß den rank seiner 4 Nachbarn ausgibt. Collective Communication: Schreibe ein Programm, das MPI Reduce verwendet um eine Summe über Werte, die nur den einzelnen Prozessen bekannt sind berechnet. MPI 12

Das Ising Modell Case Study 2 dimensionales 2 Zustandsmodell P (z.bsp. Spin P System) mit Werten +/- 1 Hamilton Operator: H = J S hi;ji js j B S i i, mit: B: externel Magn. Feld, : magn. Dipolmoment J > 0: Ferromagnet J < 0: Antiferromagnet kanonische Zustandssumme: Z = Trfe H g Magnetisierung: hm i = 1 Z TrfMe H g Problem: Zuviele Zustände ( 2 N ) Der Metropolis Algorithmus Idee: Monte Carlo Integration, mit Zufallszahlen der Verteilung e H Vorgehen: Gehe das Gitter durch und wechsle den Zustand mit Wahrscheinlichkeit p p = 1, wenn H(flip) < H(jetzt) p = e (H(jetzt) H(flip)) sonst Konkret: B = 0, d.h. kein externes Feld, J > 0, d.h. Ferromagnet, J wird in Einheiten von = 1=(kT ) gemessen Tip: Benutze das Template ising.c :-) Ziel: Möglichst effiziente Implementation (Speedup Graph), Berechne die Magnetisierung in Abhängigkeit von J 2 [0; 1] MPI 13