C++ LEDA SWP SS 08Herresthal & Schepers1 Softwarepraktikum C++ LEDA Parallelisierung - Partitionierung - Zusammenführung
Herresthal & Schepers2 C++ LEDA SWP SS 08 Quick- Sort void quicksort( &array, int begin, int end) { int middle; if (begin < end) { middle = partition(array, begin, end); quicksort(array, begin, middle); quicksort(array, middle+1, end); } return; } Klassischer Quicksort Alogirithmus - auf einem Array - und mit einer Partitionierungsfunktion
Herresthal & Schepers3 C++ LEDA SWP SS 08 Aufgabe Parallelisierung des Partitionierungsschrittes von Quicksort Paralleles Vertauschen der sortierten Elemente Durchführung von Benchmarks
Herresthal & Schepers4 C++ LEDA SWP SS 08 Array der Größe Ausgangssituation
Herresthal & Schepers5 C++ LEDA SWP SS Schritt: Teilen (und herrschen) Array der Größe Pivot: Unsortierte Teilfelder Sortierte Teilfelder Pivot 2. Schritt: Partitionierung
Herresthal & Schepers6 C++ LEDA SWP SS Schritt: Zusammenführung Restriktion: Thread_num-1 Vertauschungen (hier 2) Pivot Pivot:5
Herresthal & Schepers7 C++ LEDA SWP SS Schritt: Zusammenführung Restriktion: Thread_num-1 Vertauschungen (hier 2) Pivot Pivot: Und nun… weiter in der Rekursion
Herresthal & Schepers8 C++ LEDA SWP SS 08 void qsort(int begin, int end) - Pivot Element bestimmen (erstes Element) - Ort der Eigentlichen Rekursion - Aufruf der Funktion parallel_partition - Berechnung der Teilfelder (Ablage der Parameter in eigene Klasse) - Anlegen und Aufrufen der Threads (Nach Beendigung der Threads) -sequentielle Berechnung der Zusammenführung - Aufrufen von n-1 Threads mit der Swap Funktion int parallel_partition(int b, int e) Wichtige Teilbereiche
Herresthal & Schepers9 C++ LEDA SWP SS 08 Class par Die Klasse par (Parameter) besteht aus folgenden public int Werten: Werte die Partitionierungsfunktion wichtig sind: int l; => linkes Element der Partition int r;=> rechtes Element der Partition int i;=> Rückgabewert (Position des Pivot Elementes)
Herresthal & Schepers10 C++ LEDA SWP SS 08 Class par Werte die für die swap Funktion wichtig sind int l_swap;=> Beginn des linken Intervalls int r_swap;=> Beginn des rechten Intervalls int swap_amount; => Anzahl der zu tauschenden Elemente
Herresthal & Schepers11 C++ LEDA SWP SS 08 void partition(void par) Klassische Partitionierungsfunktion von Quicksort Besonderheit: Übergabe der Parameter durch einen eigenen Datentyp void swap(void par) Vertauscht intern sequentiell Besonderheit: Übergabe der Parameter durch einen eigenen Datentyp
Herresthal & Schepers12 C++ LEDA SWP SS 08 Thread 1…..Thread n-1Thread n void partition(void p) Thread 1…..Thread n-1 void Swap(void p)
Herresthal & Schepers13 C++ LEDA SWP SS 08 Fragestellung: Speedup bei Nutzung von mehreren Threads Benchmarks Das Testsystem ist ein Quadcore - Xeon Prozessot, 8 Gb Ram, ubuntu 64-bit, das Program ist kompiliert mit gcc 4.1. Teilproblemgröße ^41,645871,515951,393141, ^50,958710,662180,618550, ^60,001830,001120,001110,00113 Threads Das Array [10^7] besteht aus Integer (Zufallszahlen). Die Zeiteinheit ist Sekunden.
Herresthal & Schepers14 C++ LEDA SWP SS 08 Teilproblemgröße ^41,6458s1,0851,1841,135 10^50,9587s1,4471,5491,156 10^60,0018s1,6331,6481,619 Threads Benchmarks Speedup bei Nutzung von mehreren Threads Folgerung: Fragestellung ? - Ein Speedup ist zu erkennen Das Testsystem ist ein Quadcore - Xeon Prozessot, 8 Gb Ram, ubuntu 64-bit, das Program ist kompiliert mit gcc 4.1. Das Array [10^7] besteht aus Integer (Zufallszahlen).
Herresthal & Schepers15 C++ LEDA SWP SS 08 Benchmarks
Herresthal & Schepers16 C++ LEDA SWP SS 08 Fragen?
Herresthal & Schepers17 C++ LEDA SWP SS 08 Ende Danke für ihre Aufmerksamkeit!