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

intel threading building blocks tbb
SMART_READER_LITE
LIVE PREVIEW

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


slide-1
SLIDE 1

Intel Threading Building Blocks (TBB)

Julius Adorf 26.10.2009 Seminar: Semantics of C++ TU M¨ unchen

slide-2
SLIDE 2

Tejas und Jayhawk?

slide-3
SLIDE 3

Intel Threading Building Blocks (TBB)

◮ Parallelisierung f¨

ur C++

◮ eine Bibliothek ◮ mittlerweile Open Source

Bildnachweis: tbb01

slide-4
SLIDE 4

Shared-Memory

◮ TBB sind f¨

ur Shared-Memory-Architektur ausgelegt

slide-5
SLIDE 5

¨ Uberblick

◮ Konzeptuelles ◮ Schleifen parallel ◮ Quicksort parallel ◮ Mergesort parallel

slide-6
SLIDE 6

Abstraktionsebene

Verwirklichung der Parallelisierung ...

◮ mittels Threads

Bildnachweis: srt01

slide-7
SLIDE 7

Abstraktionsebene

Parallelisierung aus Anwendersicht ...

◮ oberhalb der Thread-Ebene ◮ unterhalb der Compiler-Ebene

Bildnachweis: srt02

slide-8
SLIDE 8

Eine Problemstellung

◮ Quadratzahlen berechnen ◮ einfache sequentielle L¨

  • sung

◮ parallele L¨

  • sung?
slide-9
SLIDE 9

Hauptdarsteller

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

slide-10
SLIDE 10

Eingabebereich

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

slide-11
SLIDE 11

Aufgabe

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

slide-12
SLIDE 12

Algorithmus

◮ sorgt f¨

ur die parallele Ausf¨ uhrung

◮ nimmt Eingabedaten, Aufgabe, und Eingabebereich ◮ bereitgestellt von TBB

slide-13
SLIDE 13

¨ Uberblick

◮ Konzeptuelles ◮ Schleifen parallel ◮ Quicksort parallel ◮ Mergesort parallel

slide-14
SLIDE 14

Parallelisieren mit parallel for - L¨

  • sungsansatz

◮ Datensatz partitionieren ◮ Lastverteilung durch work stealing

slide-15
SLIDE 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 ;

slide-16
SLIDE 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 }

slide-17
SLIDE 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

  • perator ( ) ( 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 };

slide-18
SLIDE 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 }

slide-19
SLIDE 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

slide-20
SLIDE 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

slide-21
SLIDE 21

¨ Uberblick

◮ Konzeptuelles ◮ Schleifen parallel ◮ Quicksort parallel ◮ Mergesort parallel

slide-22
SLIDE 22

Quicksort parallelisieren

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

slide-23
SLIDE 23

Quicksort parallelisieren

◮ Arbeit beim rekursiven Abstieg ◮ Rekursiv partitionieren - eigene Range-Klasse einf¨

uhren

◮ Teilbereiche sequentiell sortieren - Aufgabe definieren

slide-24
SLIDE 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 };

slide-25
SLIDE 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 ,

  • r i g . begin+o r i g . s i z e ) ;

40

  • 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 }

slide-26
SLIDE 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

  • perator ( ) (

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 };

slide-27
SLIDE 27

¨ Uberblick

◮ Konzeptuelles ◮ Schleifen parallel ◮ Quicksort parallel ◮ Mergesort parallel

slide-28
SLIDE 28

Mergesort parallel

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

slide-29
SLIDE 29

Mergesort direkt mit Tasks

◮ Task sind kleinste Arbeitspakete ◮ Anordnung der Tasks in einem Baum ◮ Abarbeitung mit Tiefensuche

slide-30
SLIDE 30

Mergesort mit Tasks

slide-31
SLIDE 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 }

slide-32
SLIDE 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 }

slide-33
SLIDE 33

Mergesort parallel - Demo

slide-34
SLIDE 34

Bilanz

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

slide-35
SLIDE 35

Fazit

◮ Verschachtelung von parallelen Abschnitten m¨

  • glich

◮ Gut auch f¨

ur nachtr¨ agliche Parallelisierung

◮ Programmierer beh¨

alt Kontrolle

◮ Syntax gew¨

  • hnungsbed¨

urftig

◮ Recht gute Dokumentation, viele Beispiele

Bildnachweis: tbb01

slide-36
SLIDE 36
slide-37
SLIDE 37

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¨

  • tter: 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/

slide-38
SLIDE 38

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)

slide-39
SLIDE 39

Zus¨ atzliches Material

slide-40
SLIDE 40

Benchmark

◮ Suche nach Substring ◮ Rechner mit Dual-Core-Prozessor

slide-41
SLIDE 41

Benchmark

◮ Suche nach Substring ◮ Rechner mit Dual-Core-Prozessor