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