intel threading building blocks tbb
play

Intel Threading Building Blocks (TBB) Julius Adorf 26.10.2009 - PowerPoint PPT Presentation

Intel Threading Building Blocks (TBB) Julius Adorf 26.10.2009 Seminar: Semantics of C++ TU M unchen Tejas und Jayhawk? Intel Threading Building Blocks (TBB) Parallelisierung f ur C++ eine Bibliothek mittlerweile Open Source


  1. Intel Threading Building Blocks (TBB) Julius Adorf 26.10.2009 Seminar: Semantics of C++ TU M¨ unchen

  2. Tejas und Jayhawk?

  3. Intel Threading Building Blocks (TBB) ◮ Parallelisierung f¨ ur C++ ◮ eine Bibliothek ◮ mittlerweile Open Source Bildnachweis: tbb01

  4. Shared-Memory ◮ TBB sind f¨ ur Shared-Memory-Architektur ausgelegt

  5. ¨ Uberblick ◮ Konzeptuelles ◮ Schleifen parallel ◮ Quicksort parallel ◮ Mergesort parallel

  6. Abstraktionsebene Verwirklichung der Parallelisierung ... ◮ mittels Threads Bildnachweis: srt01

  7. Abstraktionsebene Parallelisierung aus Anwendersicht ... ◮ oberhalb der Thread-Ebene ◮ unterhalb der Compiler-Ebene Bildnachweis: srt02

  8. Eine Problemstellung ◮ Quadratzahlen berechnen ◮ einfache sequentielle L¨ osung ◮ parallele L¨ osung?

  9. Hauptdarsteller ◮ Eingabebereich (= range) ◮ Aufgabe (= task) ◮ Algorithmus zur Parallelisierung (= algorithm)

  10. Eingabebereich ◮ z.B. blocked range (ein Intervall) ◮ kann rekursiv geteilt werden ◮ eventuell selbst definieren

  11. Aufgabe ◮ Aufgabe des Programmierers ◮ arbeitet sequentiell ◮ verarbeitet Eingabedaten in bestimmten Eingabebereich

  12. Algorithmus ◮ sorgt f¨ ur die parallele Ausf¨ uhrung ◮ nimmt Eingabedaten, Aufgabe, und Eingabebereich ◮ bereitgestellt von TBB

  13. ¨ Uberblick ◮ Konzeptuelles ◮ Schleifen parallel ◮ Quicksort parallel ◮ Mergesort parallel

  14. Parallelisieren mit parallel for - L¨ osungsansatz ◮ Datensatz partitionieren ◮ Lastverteilung durch work stealing

  15. parallel for - Vorbereitung 1 #i n c l u d e < iostream > 2 #i n c l u d e ” tbb / t a s k s c h e d u l e r i n i t . h” 3 #i n c l u d e ” tbb / p a r a l l e l f o r . h” 4 #i n c l u d e ” tbb / blocked range . h” 5 6 using namespace std ; 7 using namespace tbb ;

  16. parallel for - Berechnung 9 void p r i n t s q u a r e ( i n t n) { 10 i n t n squared = n ∗ n ; 11 p r i n t f ( ”%3i squared i s %3i \ r \ n” , n , n squared ) ; 12 }

  17. parallel for - Aufgabe 14 c l a s s CalculateSquares { 15 16 i n t ∗ const input ; 17 18 p u b l i c : 19 void operator ( ) ( const blocked range < s i z e t > & r ) const { 20 f o r ( s i z e t i = r . begin ( ) ; i != r . end ( ) ; i++) { 21 p r i n t s q u a r e ( input [ i ] ) ; 22 } 23 } 24 25 CalculateSquares ( i n t input [ ] ) : input ( input ) { } 26 } ;

  18. parallel for - Aufruf 27 28 i n t main () { 29 t a s k s c h e d u l e r i n i t i n i t ; // p r i o r to v2 .1 30 const i n t n = 10; 31 i n t input [ n ] = { 0 , 1 , 2 , 3 , 4 , 10 , 11 , 12 , 13 , 21 } ; 32 p a r a l l e l f o r ( 33 blocked range < s i z e t > (0 , n ) , 34 CalculateSquares ( input ) ) ; 35 }

  19. TBB mit Lambda-Funktionen 14 // . . . d e f i n e p r i n t s q u a r e , i n c l u d e headers . . . 15 i n t main () { 16 t a s k s c h e d u l e r i n i t i n i t ( ) ; // p r i o r to v2 .1 17 const i n t n = 10; 18 i n t input [ n ] = { 0 , 1 , 2 , 3 , 4 , 10 , 11 , 12 , 13 , 21 } ; 19 p a r a l l e l f o r ( 20 blocked range < s i z e t > (0 , n ) , 21 [=]( const blocked range < s i z e t > & r ) { 22 f o r ( s i z e t i = r . begin ( ) ; i != r . end ( ) ; i++) 23 p r i n t s q u a r e ( input [ i ] ) ; 24 } ) ; 25 } ◮ kommen 2010 mit C++0x-Standard ◮ Lambda-Funktionen unterst¨ utzt ab GCC 4.5

  20. Algorithmen ◮ parallel for - Map parallel, Rekursion, Schleifenparallelit¨ at ◮ parallel reduce - Reduce parallel ◮ parallel scan - Pr¨ afix-Scan parallel ◮ parallel do - Map auf sequentiellem Iterator ◮ pipelining - Fließband parallel

  21. ¨ Uberblick ◮ Konzeptuelles ◮ Schleifen parallel ◮ Quicksort parallel ◮ Mergesort parallel

  22. Quicksort parallelisieren ◮ Quicksort mit parallel for ◮ left, right = partition(array) ◮ quicksort(left); quicksort(right)

  23. Quicksort parallelisieren ◮ Arbeit beim rekursiven Abstieg ◮ Rekursiv partitionieren - eigene Range-Klasse einf¨ uhren ◮ Teilbereiche sequentiell sortieren - Aufgabe definieren

  24. Quicksort - eigene Range-Klasse einf¨ uhren 7 template < typename RandomAccessIterator , 8 typename Compare > 9 s t r u c t QuicksortRange { 10 11 RandomAccessIterator begin ; 12 s i z e t s i z e ; 13 const Compare &comp ; 14 15 bool empty () const ; 16 bool i s d i v i s i b l e () const ; 17 QuicksortRange ( QuicksortRange &, s p l i t ) ; 18 QuicksortRange ( RandomAccessIterator begin , 19 s i z e t s i z e , 20 Compare &comp ) ; 21 22 } ;

  25. Quicksort - der Split-Konstruktor 37 // pseudo − C++ 38 QuicksortRange ( QuicksortRange& orig , s p l i t ) { 39 i n t p = p a r t i t i o n ( o r i g . begin , o r i g . begin+o r i g . s i z e ) ; 40 o r i g . s i z e = p ; 41 begin = o r i g . begin + p + 1; 42 s i z e = o r i g . s i z e − p − 1; 43 comp = o r i g . comp ; 44 }

  26. Quicksort - Aufgabe definieren 23 24 template < typename RandomAccessIterator , 25 typename Compare > 26 s t r u c t q u i c k s o r t { 27 28 void operator ( ) ( 29 const QuicksortRange < RandomAccessIterator , 30 Compare > & r ) const { 31 s o r t ( r . begin , r . begin + r . si ze , r . comp ) ; 32 } 33 34 } ;

  27. ¨ Uberblick ◮ Konzeptuelles ◮ Schleifen parallel ◮ Quicksort parallel ◮ Mergesort parallel

  28. Mergesort parallel ◮ Typisch Divide-and-Conquer ◮ Arbeit beim rekursiven Aufstieg ◮ Geht weder mit parallel for noch mit parallel reduce

  29. Mergesort direkt mit Tasks ◮ Task sind kleinste Arbeitspakete ◮ Anordnung der Tasks in einem Baum ◮ Abarbeitung mit Tiefensuche

  30. Mergesort mit Tasks

  31. 9 s t r u c t SortTask : p u b l i c task { 10 i n t ∗ begin , ∗ end ; 11 12 SortTask ( i n t ∗ begin , i n t ∗ end ) : 13 begin ( begin ) , end ( end ) { / ∗ nop ∗ / } 14 15 task ∗ execute () { 16 s i z e t s i z e = end − begin ; 17 i f ( s i z e < = 32) { 18 std : : s o r t ( begin , end ) ; 19 } e l s e { 20 i n t ∗ median = begin + s i z e / 2; 21 SortTask& s o r t l e f t = ∗ new( a l l o c a t e c h i l d ( ) ) 22 SortTask ( begin , median ) ; 23 SortTask& s o r t r i g h t = ∗ new( a l l o c a t e c h i l d ( ) ) 24 SortTask ( median , end ) ; 25 s e t r e f c o u n t ( 3 ) ; 26 spawn ( s o r t l e f t ) ; 27 s p a w n a n d w a i t f o r a l l ( s o r t r i g h t ) ; 28 inplace merge ( begin , median , end ) ; 29 } 30 r e t u r n NULL; 31 }

  32. Mergesort parallel 33 34 void mergesort ( i n t ∗ begin , i n t ∗ end ) { 35 SortTask& s o r t = ∗ new( task : : a l l o c a t e r o o t ( ) ) 36 SortTask ( begin , end ) ; 37 task : : spawn root and wait ( s o r t ) ; 38 }

  33. Mergesort parallel - Demo

  34. Bilanz ◮ Schleifen parallelisiert ◮ Quicksort parallelisiert ◮ Mergesort parallelisiert ◮ angekratzt: parallel reduce, parallel do, parallel scan, pipeline

  35. Fazit ◮ Verschachtelung von parallelen Abschnitten m¨ oglich ◮ Gut auch f¨ ur nachtr¨ agliche Parallelisierung ◮ Programmierer beh¨ alt Kontrolle ◮ Syntax gew¨ ohnungsbed¨ urftig ◮ Recht gute Dokumentation, viele Beispiele Bildnachweis: tbb01

  36. Quellenangaben - Intel Threading Building Blocks ◮ James Reinders: Intel Threading Building Block, O’Reilly, 2007 ◮ Deilmann, Mario and Willhalm, Thomas: Intel Threading Building Blocks - ein templatebasiertes Programmiermodell f¨ ur moderne Mehrkehrnarchitekturen, LinuxMagazin, Mai 2007 ◮ Popovici, Nicolae und Willhalm, Thomas: Putting Intel Threading Building Blocks to Work, Proceedings of the 1st international workshop on Multicore software engineering, http://portal.acm.org/citation.cfm?id=1370085, 2008 ◮ Helmut Erlenk¨ otter: C++, Rowohlt, 2005 ◮ http://software.intel.com/en-us/blogs/author/kevin-farnham/ ◮ http://entwickler.de/zonen/portale/psecom,id,99,news,37123,p,0.html ◮ http://gcc.gnu.org/projects/cxx0x.html ◮ http://software.intel.com/en-us/blogs/2007/11/21/parallel do-a-new-threading-building-blocks- component/ ◮ http://software.intel.com/en-us/blogs/2009/08/03/parallel for-is-easier-with-lambdas-intel-threading- building-blocks/ ◮ http://software.intel.com/en-us/blogs/2009/08/03/hello-lambdas-c-0x-a-quick-guide-to-lambdas-in-c/ ◮ http://software.intel.com/en-us/articles/intel-threading-building-blocks-openmp-or-native-threads/ ◮ http://www.research.att.com/˜bs/dne.html ◮ http://www.threadingbuildingblocks.org/

  37. Quellenangaben - Grafiken Alle Grafiken, die hier nicht in den Angaben auftauchen, sind selbst erstellt oder stehen zur freien Verf¨ ugung. tbb01 Ausschnitt der Seite http://www.threadingbuildingblocks.org/ (August 2009) srt01 von Schrottie http://www.flickr.com/photos/schrottie/3755566450/ srt02 von Schrottie http://www.flickr.com/photos/schrottie/3755566450/ (auf dieser Seite angepasst)

  38. Zus¨ atzliches Material

  39. Benchmark ◮ Suche nach Substring ◮ Rechner mit Dual-Core-Prozessor

  40. Benchmark ◮ Suche nach Substring ◮ Rechner mit Dual-Core-Prozessor

Recommend


More recommend