170 likes | 274 Views
Parallelisierung Partitionierung Zusammenführung. Softwarepraktikum C++ LEDA. www.schepers.us/swp/index.htm. Quick- Sort. Klassischer Quicksort Alogirithmus auf einem Array und mit einer Partitionierungsfunktion. void quicksort(<int> &array, int begin, int end) { int middle;
E N D
Parallelisierung Partitionierung Zusammenführung SoftwarepraktikumC++ LEDA www.schepers.us/swp/index.htm Herresthal & Schepers
Herresthal & Schepers Quick- Sort • Klassischer Quicksort Alogirithmus • auf einem Array • und mit einer Partitionierungsfunktion void quicksort(<int> &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; }
Herresthal & Schepers • Parallelisierung des Partitionierungsschrittes von Quicksort • Paralleles Vertauschen der sortierten Elemente Aufgabe • Durchführung von Benchmarks
5 2 3 2 9 0 9 5 1 3 9 0 1 6 4 3 Array der Größe 16 Ausgangssituation Herresthal & Schepers
0 2 2 3 2 2 9 3 0 9 1 9 5 3 5 1 3 9 9 9 0 0 1 1 6 3 4 4 6 3 Pivot Pivot Pivot 1. Schritt: Teilen (und herrschen) 2. Schritt: Partitionierung Array der Größe 16 Pivot: 5 Unsortierte Teilfelder Sortierte Teilfelder Herresthal & Schepers
Herresthal & Schepers 9 9 1 3 Pivot Pivot Pivot Pivot Pivot Pivot Pivot 3. Schritt: Zusammenführung Restriktion: Thread_num-1 Vertauschungen (hier 2) Pivot: 5 0 2 2 3 9 1 3 5 9 9 0 1 3 4 6 4 9
Herresthal & Schepers 0 0 2 2 2 2 3 3 1 1 3 3 5 5 6 6 4 4 9 9 9 9 9 9 1 1 3 3 Pivot Pivot Pivot 3. Schritt: Zusammenführung Restriktion: Thread_num-1 Vertauschungen (hier 2) Pivot: 5 5 0 0 Und nun… weiter in der Rekursion
Herresthal & Schepers void qsort(int begin, int end) Wichtige Teilbereiche • - Pivot Element bestimmen (erstes Element) • Ort der Eigentlichen Rekursion • Aufruf der Funktion parallel_partition int parallel_partition(int b, int e) • 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
Herresthal & Schepers 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 & Schepers 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 & Schepers 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
Benchmarks Fragestellung: „Speedup“ bei Nutzung von mehreren Threads Threads Teilproblemgröße 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). Die Zeiteinheit ist Sekunden. Herresthal & Schepers
Benchmarks ? Folgerung: Fragestellung „Speedup“ bei Nutzung von mehreren Threads - Ein Speedup ist zu erkennen Threads Teilproblemgröße 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 & Schepers
Benchmarks Herresthal & Schepers
Herresthal & Schepers Fragen? www.schepers.us/swp/
Herresthal & Schepers Ende Danke für ihre Aufmerksamkeit! www.schepers.us/swp/