www.wikidata.de-de.nina.az
Parallel Quicksort beschreibt Parallelisierungen des sequentiellen Algorithmus Quicksort welcher auf dem Teile und Herrsche Prinzip basiert Wie Quicksort teilt Parallel Quicksort eine Menge von Elementen mithilfe eines Pivotelements in zwei Teilmengen auf sodass die Elemente in der einen Teilmenge kleiner als das Pivot sind und die Elemente in der anderen Teilmenge grosser oder gleich dem Pivot sind Danach werden die neuen Mengen wieder jeweils in Teilmengen unterteilt Dieses Vorgehen kann auf verschiedene Arten parallel implementiert werden Zum einen konnen mehrere Mengen von jeweils einem Prozess in neue Teilmengen aufgeteilt werden 1 Dies hat den Nachteil dass der erste Rekursionslevel nicht parallelisiert ist und der Speedup gegenuber Quicksort auf O log n displaystyle O log n begrenzt ist Zum anderen konnen mehrere Prozesse zusammen arbeiten und gemeinsam eine einzelne Menge aufteilen Dieser Ansatz hat sich in der Praxis als effizienter erwiesen Parallel Quicksort kann im PRAM Modell mit einer Laufzeit von O n p log p log log n log n displaystyle O n p log p log log n log n implementiert werden 2 Inhaltsverzeichnis 1 Naiver Ansatz 1 1 Arbeitsweise 1 1 1 Allokation von Prozessoren 1 2 Laufzeit 2 Parallelisierung von Quicksort auf EREW PRAM 2 1 Arbeitsweise 2 2 Wahl des Pivotelements und Laufzeitberechnung 3 Implementierung von Quicksort in MCSTL 3 1 Arbeitsweise 3 2 Balancierte Lastverteilung 4 EinzelnachweiseNaiver Ansatz BearbeitenArbeitsweise Bearbeiten nbsp Partitionierung von einem Array mit n displaystyle n nbsp Elementen und Pivotelement ki displaystyle k i nbsp Nach der Verarbeitung der Elemente mit Index 1 n displaystyle 1 n nbsp werden die zwei Untermengen 1 k1 1 displaystyle 1 k 1 1 nbsp und k1 1 n displaystyle k 1 1 n nbsp gebildet und das Pivotelement an der Stelle k1 displaystyle k 1 nbsp platziert Danach wird jede davon in zwei neue Untermengen aufgeteilt und weiter partitioniert Bei jedem rekursiven Aufruf von Quicksort wird die Menge der Elemente wiederholt in zwei aufgeteilt Die erste Partitionierung kann nur von einem einzigen Prozessor durchgefuhrt werden Alle weiter erzeugte Untermengen des Arrays die auf der gleichen Stufe der Rekursion sind konnen von zwei weitere Prozessoren parallel ohne Speicherkonflikte verarbeitet werden 1 Die Zuweisung von den Untermengen an den verschiedenen Prozessoren hat einen zusatzlichen Overhead Wenn die zwei Mengen klein genug sind oder weniger Prozessoren zur Verfugung stehen ist es manchmal effizienter einen sequenziellen Sortieralgorithmus anzuwenden anstatt einen neuen rekursiven Aufruf von Quicksort zu machen Es ist dabei moglich dass manche Prozessoren schneller mit der Partitionierung seiner Untermenge fertig sind im Vergleich zu anderen Eine Warteschlange kann dazu benutzt werden wo die Zeiger auf noch nicht partitionierte Untermengen gespeichert werden Bei der Entfernung von der Warteschlange sind die grosseren Untermengen bevorzugt da diese neue kleinere Untermengen erzeugen die wiederum in die Warteschlange kommen Das Ziel dabei ist moglichst viele Untermengen zu haben und dabei die Prozessoren dauerhaft besetzt zu halten nbsp Allokation von Prozessoren bei der Ausfuhrung von Parallel QuicksortAllokation von Prozessoren Bearbeiten Die Reihenfolge bei der Allokation von Prozessoren an Untermengen wird dynamisch angepasst Prozessor 1 partitioniert die Menge der Elemente mit Index 1 n displaystyle 1 n nbsp Die erste entstandene Untermenge 1 k1 1 displaystyle 1 k 1 1 nbsp verarbeitet wieder Prozessor 1 und die zweite k1 1 n displaystyle k 1 1 n nbsp Prozessor 2 Die Menge der Elemente k1 1 n displaystyle k 1 1 n nbsp ist o B d A die kleinere von beiden Daher ist es plausibler dass diese von Prozessor 2 schneller partitioniert wird Prozessor 2 fordert also fruher als Prozessor 1 fur seine Untermengen einen neuen Prozessor an Infolgedessen verarbeitet Prozessor 2 die eine erhaltene Untermenge wahrend Prozessor 3 die andere Wenn Prozessor 1 einen neuen Prozessor anfordert bekommt er Prozessor 4 weil dieser zurzeit frei ist Das folgende Pseudocode skizziert eine Implementierung von Parallel Quicksort M displaystyle M nbsp bezeichnet die maximale Grosse des Array welcher effizienter mit einem sequentiellen Sortieralgorithmus z B Insertionsort zu sortieren ist PROCEDURE QUICKSORT L U IF U L gt M THEN BEGIN PARTITION L U FORK L1 L2 L1 QUICKSORT L K 1 GOTO L3 L2 QUICKSORT K 1 U GOTO L3 L3 JOIN L1 L2 END ELSE IF U L gt 1 THEN INSERTION SORT L U Laufzeit Bearbeiten Dieser Ansatz erreicht eine niedrigere Beschleunigung gegenuber dem sequentiellen Quicksort 3 Um eine n displaystyle n nbsp elementige Menge mit einem Pivotelement aus der gleichen Menge zu partitionieren braucht man n 1 displaystyle n 1 nbsp Vergleiche Es sei angenommen dass ein Vergleich eine Zeiteinheit braucht Weiterhin sei die ursprungliche Grosse des Arrays n 2k 1 displaystyle n 2 k 1 nbsp die Anzahl an Prozessoren p 2m displaystyle p 2 m nbsp mit m lt k displaystyle m lt k nbsp und das ausgewahlte Pivotelement immer der wahre Median von der zu partitionierenden Untermenge Unter diesen Annahmen kann die Anzahl der Vergleiche des sequentiellen Algorithmus durch die folgende Rekurrenzrelation bestimmt werden T n n 1 2Tn 12 falls n 7 15 31 2 falls n 3 displaystyle T n begin cases n 1 2T frac n 1 2 amp text falls n 7 15 31 2 amp text falls n 3 end cases nbsp mit Losung T n n 1 log n 1 2n displaystyle T n n 1 log n 1 2n nbsp Die Laufzeit von Parallel Quicksort kann als die Summe der Laufzeiten von zwei Abschnitten bestimmt werden In dem ersten Abschnitt gibt es mindestens so viele Prozessoren wie Untermengen die zu partitionieren sind Fur die erste Partitionierung wird von alle p displaystyle p nbsp Prozessoren die zur Verfugung stehen nur einen genutzt Die p 1 displaystyle p 1 nbsp weiteren Prozessoren bleiben inaktiv Diese Iteration braucht n 1 displaystyle n 1 nbsp Zeiteinheiten um n 1 displaystyle n 1 nbsp Vergleiche durchzufuhren Bei der zweiten Partitionierung sind nur zwei Prozessoren aktiv und p 2 displaystyle p 2 nbsp warten Wenn p 2 displaystyle p geq 2 nbsp werden n 1 2 1 displaystyle frac n 1 2 1 nbsp Zeiteinheiten fur n 3 displaystyle n 3 nbsp Vergleiche benotigt Die dritte Partitionierung braucht analog bei p 4 displaystyle p geq 4 nbsp mindestens n 1 2 1 2 1 displaystyle frac n 1 2 1 2 1 nbsp Zeiteinheiten fur n 7 displaystyle n 7 nbsp Vergleiche Bei der ersten log p displaystyle log p nbsp Iteration gibt es genug Prozessoren fur jede Partition Die Laufzeit fur diesen Zeitabschnitt kann durch die folgende Formel ausgedruckt werden T1 n 2 n 1 1 1p log p displaystyle T 1 n 2 n 1 1 frac 1 p log p nbsp Die Anzahl der Vergleiche betragt C1 n 1 log p 2 p 1 displaystyle C 1 n 1 log p 2 p 1 nbsp In dem zweiten Abschnitt gibt es mehr Untermengen als Prozessoren verfugbar Wenn es angenommen wird dass jeder Prozessor gleichviele Vergleiche durchfuhrt ist die Laufzeit die Anzahl der Vergleiche dividiert durch p displaystyle p nbsp Daher folgt C2 n T n C1 n displaystyle C 2 n T n C 1 n nbsp T2 n C2 n p displaystyle T 2 n frac C 2 n p nbsp Die erwartete Beschleunigung betragt Beschleunigung T n T1 n T2 n displaystyle text Beschleunigung frac T n T 1 n T 2 n nbsp Die beste Beschleunigung bei z B n 1023 displaystyle n 1023 nbsp und p 8 displaystyle p 8 nbsp ist ca 3 375 displaystyle 3 375 nbsp welche niedrig ist Das Problem ist dass am Anfang nur wenige Prozessoren aktiv sind und es eine Menge Zeit dauert bis alle Prozessoren Arbeit bekommen Parallelisierung von Quicksort auf EREW PRAM BearbeitenIm Jahr 1991 stellen Zhang und Nageswara eine Moglichkeit fur die Parallelisierung von Quicksort auf einer EREW PRAM vor 2 Der Algorithmus sortiert n displaystyle n nbsp Elemente mit p displaystyle p nbsp Prozessoren in O n p log p log n displaystyle O n p log p log n nbsp erwartete Laufzeit und in O n p log p log log n log n displaystyle O n p log p log log n log n nbsp deterministische Laufzeit mit O n displaystyle O n nbsp an Speicherbedarf In dem Fall dass p O n log n displaystyle p O n log n nbsp ist dann sind die Kosten optimal in Bezug auf das Produkt von der Zeit und Anzahl von Prozessoren Arbeitsweise Bearbeiten Der Algorithmus wird in drei Schritten ausgefuhrt Erstens wird die ursprungliche Menge S displaystyle S nbsp von n displaystyle n nbsp Elementen in p displaystyle p nbsp Blocken aufgeteilt sodass jeder Block n p displaystyle lceil n p rceil nbsp Elemente hat ausser der letzte welcher weniger als n p displaystyle lceil n p rceil nbsp Elemente haben kann Jedem Prozessor wird einen Block zugewiesen d h Prozessor i displaystyle i nbsp verarbeitet Block i displaystyle i nbsp Ein Pivotelement a displaystyle a nbsp wird auswahlt und jedem Prozessor mit einem Parallel Broadcasting herausgeschickt In dem zweiten Schritt markiert jeder Prozessor alle Elemente aus seinem Block mit entweder 0 oder 1 abhangig davon ob das Element kleiner oder grosser als das Pivotelement a displaystyle a nbsp ist Mit einem parallelen Prafix Algorithmus kann der Rank von jedem Element innerhalb der Gruppe 0 bzw Gruppe 1 berechnet werden Die Idee ist alle Elemente aus allen Blocken die mit 0 markiert wurden vor alle 1 Elemente aller Blocken in einem weiteren Array B displaystyle B nbsp zu speichern Der Index vom Element in B displaystyle B nbsp wird anhand seines Ranks und der Nummer seines Blocks berechnet So hat man alle Elemente aus der ursprunglichen Menge S displaystyle S nbsp in zwei Teile aufgeteilt die Menge S1 displaystyle S 1 nbsp mit allen 0 Elementen und S2 displaystyle S 2 nbsp mit allen 1 Elementen Der dritte Schritt besteht aus der Uberprufung der Lange von S1 displaystyle S 1 nbsp und S2 displaystyle S 2 nbsp und wenn diese mehr als ein Element enthalten folgt ein rekursiver Aufruf von Schritt eins auf beide Wahl des Pivotelements und Laufzeitberechnung Bearbeiten Nur ein zusatzliches Array B displaystyle B nbsp mit Lange n displaystyle n nbsp und konstanten Bedarf an weiteren Hilfsvariablen werden benotigt Bei dem Rekursionsaufruf kann das ursprungliche Array A displaystyle A nbsp wiederverwendet werden und beim nachsten Aufruf andersrum Daher bleibt der zusatzliche Speicherbedarf in O n displaystyle O n nbsp Die Laufzeit von dem Algorithmus hangt von der Wahl des Pivotelements Eine Moglichkeit ist ein zufalliges Element als Pivot zu nehmen Annehmend kann ein Prozessor eine zufallige ganze Zahl k displaystyle k nbsp von dem Bereich 1 2 n displaystyle 1 2 n nbsp in konstante Zeit generieren dann entspricht die Partitionierung mit Pivotelement das Element mit Index k displaystyle k nbsp einem Random Binary Search Die Analyse 4 besagt dass fur die Hohe Hn displaystyle H n nbsp von einem Random Binary Search Tree mit n displaystyle n nbsp Elementen gilt limn Hnln n 4 31107 displaystyle lim n to infty H n ln n 4 31107 nbsp Daher liegt die Tiefe der Rekursion bei O log n displaystyle O log n nbsp Das Pivotelement muss zusatzlich noch verschickt werden Dies erfolgt in O log p displaystyle O log p nbsp 5 Jeder Prozessor muss dann die Elemente in seinem Block markieren die Prafix Summe muss berechnet werden 6 und die Elemente verschoben werden Dies braucht gesamt O n p log p displaystyle O n p log p nbsp Anschliessend berechnet man die Gesamtlaufzeit fur diesen Fall diese ist O n p log p log n displaystyle O n p log p log n nbsp erwartet In dem Fall dass das Pivotelement nicht zufallig gewahlt wurde hangt die Laufzeit des Algorithmus von der Rekursionstiefe und damit auch von dem Verhaltnis der Grossen S1 displaystyle S 1 nbsp und S2 displaystyle S 2 nbsp ab Die Rekursionstiefe vom Algorithmus kann auf O log n displaystyle O log n nbsp begrenzt werden wenn S1 displaystyle S 1 nbsp und S2 displaystyle S 2 nbsp ungefahr gleich sind Dies kann gewahrleistet werden indem die Auswahl des Pivotelements mit dem Parallel Median Finding Algorithm von Akl auf eine EREW PRAM in O log log n displaystyle O log log n nbsp Zeit 7 erfolgt Das Markieren die Prafix Summe und das Verschieben der Elemente erfolgt analog zu dem anderen Fall Mit dem Brent Verfahren kann folglich der Algorithmus in O n p log p log log n log n displaystyle O n p log p log log n log n nbsp deterministisch implementiert werden Implementierung von Quicksort in MCSTL BearbeitenEine parallele Implementierung fur Quicksort ist in der MCSTL Bibliothek 8 zu finden Die zwei Funktionen parallel sort qsb displaystyle parallel sort qsb nbsp und parallel sort qs displaystyle parallel sort qs nbsp stehen zur Verfugung Der Hauptunterschied bei parallel sort qs displaystyle parallel sort qs nbsp liegt bei der durch Work stealing realisierten balancierten Lastverteilung Bei beiden Funktionen ist die Pivotwahl von einem Prozessor und die Partitionierung parallel von mehreren Prozessoren durchgefuhrt Die gewunschte Anzahl von Threads die benutzt werden mussen wird als Parameter an dem Algorithmus gegeben Arbeitsweise Bearbeiten Zuerst wird das Pivotelement gewahlt Dieses ist der Median mehrerer Elementen aus dem Array Die Partitionierungsphase fangt mit der Aufteilung der Elemente in kleinere Gruppen auch Chunks genannt an Anschliessend erhalt jeder Thread zwei Chunks zur Verarbeitung Existieren nicht genugend Chunks um diese Bedingung zu erfullen werden weniger Threads als angefordert benutzt Jeder Thread sortiert seine Elemente sodass in seinem linken Chunk nur Elemente kleiner als das Pivotelement liegen bzw nur grossere im rechten Dann reserviert jeder Thread parallel Platz fur seine zwei Chunks Die linken Chunks jedes Threads werden an den Anfang dieses Arrays geschrieben die rechten Chunks am Ende Damit ist die Partitionierung beendet Balancierte Lastverteilung Bearbeiten In dem ersten Schritt arbeiten alle Prozessoren gemeinsam an der Partitionierung des Arrays Den zwei erhaltenen partitionierten Teilmengen wird jeweils die Halfte aller Prozessoren zugewiesen Im Laufe des Algorithmus wird es zu dem Punkt kommen in dem jeder Prozessor eine Teilmenge mit mehreren Elementen zu bearbeiten hat Es kann sein dass diese Teilmengen verschiedene Langen haben und unterschiedlich lang bearbeitet werden Infolgedessen haben manche Prozessoren ihre Teilmengen schon partitioniert wahrend andere noch nicht damit fertig sind Dabei entsteht Inaktivitat von Prozessoren Die Losung in MCSTL displaystyle MCSTL nbsp besteht aus Prozessor lokalen Warteschlangen Wenn ein Prozessor zwei Untermengen nach einer Partitionierung bekommt dann macht er mit der Partitionierung der grosseren weiter wahrend die kleinere in seine Warteschlange eingefugt wird Falls die Warteschlange eines Prozessors leer wird kann dieser Arbeit von der Warteschlange der anderen Prozessoren entnehmen Einzelnachweise Bearbeiten a b D J Evans R C Dunbar The parallel quicksort algorithm part i run time analysis In International Journal of Computer Mathematics Band 12 Nr 1 Januar 1982 ISSN 0020 7160 S 19 55 doi 10 1080 00207168208803323 a b Weixiong Zhang Nageswara S V Rao Optimal parallel quicksort on EREW PRAM In BIT Band 31 Nr 1 Marz 1991 ISSN 0006 3835 S 69 74 doi 10 1007 bf01952784 Quinn Michael J Michael Jay Instructor s manual to accompany Designing efficient algorithms for parallel computers McGraw Hill Book Co 1987 ISBN 0 07 051072 5 Luc Devroye A note on the height of binary search trees In Journal of the ACM Band 33 Nr 3 1 Mai 1986 ISSN 0004 5411 S 489 498 doi 10 1145 5925 5930 Vishkin U Synchronous parallel computation a survey Courant Institute of Mathematical Sciences New York University April 1983 OCLC 1085604497 Richard Cole Uzi Vishkin Approximate and exact parallel scheduling with applications to list tree and graph problems In 27th Annual Symposium on Foundations of Computer Science sfcs 1986 IEEE 1986 ISBN 0 8186 0740 8 doi 10 1109 sfcs 1986 10 Akl S G Parallel Selection in O log log n Time Using O n log log n Processors Technical Report 88 221 Department of Computing and Information Science Queen s University Kingston Ontario 1988 Putze Felix MCSTL the multi core standard template library ACM 2007 OCLC 854741854 Abgerufen von https de wikipedia org w index php title Parallel Quicksort amp oldid 240791111