Multi-threaded Programming with Cilk Hobli Taffame Institut für Informatik Ruprecht-Karls Universität Heidelberg 3. Juli 2013 1 / 27
Inhaltsverzeichnis 1 Einleitung Warum Multithreading? Ziele 2 Was ist Cilk? Cilk für Multithreading Wie funktioniert Cilk? Multithreaded Computation 3 Performance Work, Span, Speedup 4 Scheduler und Work-stealing Scheduler Work-stealing 5 Zusammenfassung 2 / 27
Einleitung Warum Multithreading? Warum Multi-Core? Abbildung: Graphik zur Belegung des mooreschen Gesetzes Quelle:http://de.wikipedia.org/wiki/Mooresches_Gesetz 3 / 27
Einleitung Warum Multithreading? Warum Multi-Core? Bis zum Jahr 2005 Erhöhung der Leistungsfähigkeit von Rechnern durch den Einsatz von mehreren Single-Core-CPUs Möglich durch die Erhöhung der Taktfrequenz ABER: Höhere Taktfrequenzen verursachen Abwärme Kühlmaßnahmen Energieverbrauch und Lärm Lösung: Keine Steigerung der Taktfrequenz sondern Multi-Core! Mehrere Kerne in einem Prozessor mehrere Recheneinheiten Vorteile: Geringerer Takt Weniger Energieverbrauch pro Kern Weniger Stromverbrauch 4 / 27
Einleitung Warum Multithreading? Warum Multi-Core? Bis zum Jahr 2005 Erhöhung der Leistungsfähigkeit von Rechnern durch den Einsatz von mehreren Single-Core-CPUs Möglich durch die Erhöhung der Taktfrequenz ABER: Höhere Taktfrequenzen verursachen Abwärme Kühlmaßnahmen Energieverbrauch und Lärm Lösung: Keine Steigerung der Taktfrequenz sondern Multi-Core! Mehrere Kerne in einem Prozessor mehrere Recheneinheiten Vorteile: Geringerer Takt Weniger Energieverbrauch pro Kern Weniger Stromverbrauch 4 / 27
Einleitung Warum Multithreading? Multithreading ABER: Optimale Leistung nur durch Beschäftigung aller Prozessorkerne Unterstützung des Betriebssystems Bis jetzt überwiegend sequentielle Programmierung Multithreading: Gleichzeitiges Abarbeiten von mehreren Threads innerhalb eines Prozesses Zwei Parallelisierungsstrategien: Message Passing Shared Memory 5 / 27
Einleitung Warum Multithreading? Multithreading ABER: Optimale Leistung nur durch Beschäftigung aller Prozessorkerne Unterstützung des Betriebssystems Bis jetzt überwiegend sequentielle Programmierung Multithreading: Gleichzeitiges Abarbeiten von mehreren Threads innerhalb eines Prozesses Zwei Parallelisierungsstrategien: Message Passing Shared Memory 5 / 27
Einleitung Warum Multithreading? Multithreading in Shared Memory Parallelisierung durch Compiler-Optionen oder Parallelisierungsanweisungen Schnelle Kommunikation über gemeinsamen Speicher (Pointer) Shared-Memory Parallelrechner überall (Smartphones, Tablets, Laptops,...) Ansätze: PThreads, OpenMP, Intel TBB, Cilk Abbildung: Verallgemeinerung von Programm, Prozess und Threads 6 / 27
Einleitung Ziele Was sollen wir mitnehmen? Was ist Cilk? Wie funktioniert Cilk? Cilk vs OpenMP 7 / 27
Was ist Cilk? Cilk für Multithreading Was ist Cilk? Erweiterung für C/C++ 1994: Veröffentlichung der 1. Version von Cilk (C-basiert) durch Prof. Charles E. Leiserson und Kollegen von MIT-CSAIL 1 Socrates, Socrates 2.0, Cilkchess: Cilk Schachprogramme mit Preisen bei Computer Schachweltmeisterschaften Cilk / Cilk++ / Cilk Plus 2 Weiterentwicklung von Cilk durch Intel läuft auf Linux, Unix, MS Windows Compilers: GCC, ICC, Clang/LLVM 1 Massachussetts Institute of Technology - Computer Science And Artificial Intelligence Laboratory 2 http://www.cilkplus.org 8 / 27
Was ist Cilk? Wie funktioniert Cilk? Programmieren in Cilk Gleiche Syntax wie in C/C++ Gleiche Datentypen wie in C/C++: float, double, int,... Unterschied von Cilk- und C-Quellcode durch weinige Schlüsselwörter (cilk, spawn, sync, inlet, abort) serial/c elision Neuere Schlüsselwörter in Cilk Plus: cilk_spawn, cilk_sync, cilk_for Parallelisierung von sequentiellen Codes einfacher Gute Unterstützung für tiefe Rekursionen und Arrays 9 / 27
Was ist Cilk? Wie funktioniert Cilk? Beispiel: Fibonacci in Cilk und C 1 c i l k i n t f i b ( i n t n ) 2 { 3 i f ( n < 2) return n ; 4 e l s e 5 { 6 i n t x, y ; 7 x = spawn f i b ( n 1); 8 y = spawn f i b ( n 2); 9 sync ; 10 return ( x+y ) ; 11 } 12 } 1 i n t f i b ( i n t n ) 2 { 3 i f ( n < 2) return n ; 4 e l s e 5 { 6 i n t x, y ; 7 x = f i b ( n 1); 8 y = f i b ( n 2); 9 10 return ( x+y ) ; 11 } 12 } 10 / 27
Was ist Cilk? Wie funktioniert Cilk? Keywords in Cilk cilk: Funktion als Cilk Prozess definieren parallele Ausführung möglich spawn: Ausführung des Kindprozesses auf weiterem Prozessor sync: Sicherstellen, dass alle Kindprozesse Ergebnisse zurückgeliefert haben inlet: Bei weiterer Operation mit dem Rückgabewert einen neuen Thread starten ( Bsp: z = add(spawn fib(x)) ) abort: Kindprozess innerhalb einer inlet-funktion abbrechen 11 / 27
Was ist Cilk? Wie funktioniert Cilk? Keywords in Cilk cilk: Funktion als Cilk Prozess definieren parallele Ausführung möglich spawn: Ausführung des Kindprozesses auf weiterem Prozessor sync: Sicherstellen, dass alle Kindprozesse Ergebnisse zurückgeliefert haben inlet: Bei weiterer Operation mit dem Rückgabewert einen neuen Thread starten ( Bsp: z = add(spawn fib(x)) ) abort: Kindprozess innerhalb einer inlet-funktion abbrechen 11 / 27
Was ist Cilk? Wie funktioniert Cilk? Beispiel für inlet und abort Berechne das Produkt: p = n i=0 A i 1 i n t p r oduct ( i n t A, i n t n ){ 2 i n t i, p=1; 3 f o r ( i =0; i <n ; i ++){ 4 p = A[ i ] ; 5 i f ( p == 0) break ; 6 } 7 return p ; 8 } 12 / 27
Was ist Cilk? Wie funktioniert Cilk? Beispiel für inlet und abort 1 c i l k i n t p r o d u c t ( i n t A, i n t n ){ 2 i n t p = 1 ; 3 i n l e t v o i d m u l t i p l y ( i n t x ){ 4 p = x ; 5 i f ( p == 0){ 6 a b o r t ; 7 } 8 r e t u r n ; 9 } 10 i f ( n == 1){ 11 r e t u r n A [ 0 ] ; 12 } e l s e { 13 m u l t i p l y ( spawn p r o d u c t (A, n /2) ) ; 14 m u l t i p l y ( spawn p r o d u c t (A+n /2, n n /2) ) ; 15 sync ; 16 r e t u r n p ; 17 } 18 } 13 / 27
Was ist Cilk? Multithreaded Computation Dynamisches Multithreading: DAG Darstellung der Ausführung des Cilk Programms als DAG (Directed Acyclic Graph) G = (V,E) jeder Knoten v V = thread Es gibt immer: initial thread und final thread jede Kante e E ist entweder: spawn edge (nach unten) return edge (nach oben) oder continuation edge (waagerecht) 14 / 27
Was ist Cilk? Multithreaded Computation Dynamisches Multithreading: DAG Abbildung: DAG für die Berechnung von fib(3). Threads (Kreise) der gleichen Prozedur sind mit einem abgerundeten Rechteck umrandet. 15 / 27
Performance Wie sieht die Performance von Cilk aus? Work - Span - Speedup 16 / 27
Performance Work, Span, Speedup Work und span Zwei Maßeinheiten für die Messung der Leistung: T P Laufzeit für die Ausführung aller Operationen auf P Prozessoren work ( T 1 ): Ausführungszeit aller Anweisungen auf P = 1 Abbildung: work von fib(3) T P = 9 17 / 27
Performance Work, Span, Speedup Work und span span oder critical-path length (T ): Ausführungszeit aller Operationen des längsten Pfades Abbildung: span von fib(3) T = 6 18 / 27
Performance Work, Span, Speedup Speedup speedup = T 1 /T P T 1 /T P = P linear speedup T 1 /T = Parallelisierung Beispiel: Work: T 1 = 9 Span: T = 6 T 1 /T = 1.5 Performance von work-stealing auf P Prozessoren: T P T 1 /P + T 19 / 27
Scheduler und Work-stealing Wie wird die Performance von Cilk erreicht? Scheduler - Work-stealing 20 / 27
Scheduler und Work-stealing Scheduler Der Scheduler Effiziente Einplanung des Ablaufs Beachtung der Abhängigkeiten zwischen den Threads Zuweisung von Threads zu Prozessoren nach den Reihenfolgen der Abhängigkeiten Work-stealing effizient einsetzen 21 / 27
Scheduler und Work-stealing Work-stealing Work-stealing: Dequeue Threads als Queue von Aufgaben verwalten: Beispiel: spawn A; spawn B;... spawn F; 22 / 27
Scheduler und Work-stealing Work-stealing Work-stealing: Steal I Bearbeitung von unten nach oben: return B; return D; 23 / 27
Scheduler und Work-stealing Work-stealing Work-stealing: Steal II Anwendung von Work-stealing für eine bessere Effizienz Work-stealing nur wenn Thread nicht in Ausführung! 24 / 27
Zusammenfassung Zusammenfassung I Multi-Core Rechner überall Optimale und effiziente Nutzung durch Multithreading Motivation zur Implementierung von Multi-Threading-Anwendungen Cilk Eigenschaften von Cilk: Erweiterung von C/C++ durch cilk, spawn, sync Umwandlung von sequentiellen Codes zu parallelen Codes einfach Parallelisierung von Vektoren bietet Leistungsgarantie Scheduler: plant, kommuniziert sorgfältig verwaltet Jobs als Dequeue erlaubt Work-stealing für eine optimale Effizienz 25 / 27
Zusammenfassung Zusammenfassung II Einige Merkmale von Cilk und OpenMP: Cilk C/C++ Einfache Parallelisierung des Codes Low-level-Verwaltung der Parallelisierung Keywords Tiefe Rekursionen, Parallelisierung von Vektoren Cilk view, Cilk screen OpenMP Fortran, C/C++ einfacheres Modell als Message- Passing High-level API Compiler-Direktiven Parallelisierungsprobleme von großen, vorhersehbaren Datenmengen einfacher als Thread-Library 26 / 27
Zusammenfassung Literatur [1] Robert D. Blumofe and Christopher F. Joerg and Bradley C. Kuszmaul and Charles E. Leiserson and Keith H. Randall and Yuli Zhou. Journal of Parallel and Distributed Computing. Pages 55 69. Cilk: An Efficient Multithreaded Runtime System, 1996. ftp://theory.lcs.mit.edu/pub/cilk/cilkjpdc96.ps.gz [2] Wikipedia. Cilk. 2013. http://en.wikipedia.org/w/index. php?title=cilk&oldid=541192075 [3] Charles E. Leiserson and Harald Prokop. A Minicourse on Multithreaded Programming. 1998. http://supertech.csail.mit.edu/cilk/minicourse.pdf. [4] Charles E. Leiserson. Multithreaded Programming in Cilk. 2006. http://supertech.csail.mit.edu/cilk/. [5] OpenMP Tutorial. 2013. https://computing.llnl.gov/tutorials/openmp/ 27 / 27