Parallele Binäre Suche
Ich bin gerade erst anfangen zu lernen, parallele Programmierung, und ich bin auf der Suche bei der binären Suche.
Dies kann nicht wirklich optimiert werden, indem werfen mehr Prozessoren auf it-Recht? Ich weiß, es ist angeblich teilen und zu erobern, aber Sie sind wirklich "ab und erobern" (aus Wikipedia).
Oder könnten Sie vielleicht parallelisieren die Vergleiche? (wenn X
ist weniger als array[mid]
, die Suche von low
zu mid - 1
; else if X
größer ist als array[mid]
Suche von mid + 1
zu high
else return mid
der index der X
)
Oder wie über Sie geben, die Hälfte des Arrays zu einem einzelnen Prozessor zu tun binäre Suche auf, und die andere Hälfte in die andere? Wäre das nicht verschwenderisch sein obwohl? Weil es ab und zu erobern, statt sich einfach teilen und zu erobern? Gedanken?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie ganz einfach mit Parallelität.
Für
k
ist weniger alsn
Prozessoren, teilen Sie das array inn/k
Gruppen und zuweisen zu einem Prozessor je Gruppe.Laufen binäre Suche auf diese Gruppe.
Nun ist die Zeit log(n/k).
Gibt es auch ein crew-Methode, die logn/log(k+1).
Ich würde denken, dass es sicher qualifiziert für die Parallelisierung. Zumindest in zwei threads. Ein thread machen eine Tiefe-zuerst-Suche und die anderen machen eine Breite-zuerst-Suche. Der Gewinner ist der Algorithmus ausführt, die die schnellsten, die sich von Datensatz zu Datensatz.
Ich habe nicht viel Erfahrung in der parallelen Programmierung, aber ich bezweifle, dass dies ein guter Kandidat für die parallele Verarbeitung. Jeder Schritt des Algorithmus hängt von einem Vergleich, und dann fortfahren nach unten eine Gruppe "Pfad" basierend auf diesem Vergleich (Sie entweder gefunden, Ihren Wert, oder jetzt haben, weiter zu suchen, in einem Satz "Richtung", basierend auf dem Vergleich.) Zwei separate threads, die die gleiche Vergleich wird nicht bekommen Sie überall schneller, und separate threads wird, müssen beide setzen auf die gleiche Vergleich, um zu entscheiden, was als Nächstes zu tun, so können Sie nicht wirklich nützlich, gliedert sich die Arbeit auf Ihrem eigenen.
So weit wie Ihre Idee der Aufspaltung der array, ich denke, Sie sind gerade die Negation der Vorteil der binären Suche in diesem Fall. Ihr Wert (vorausgesetzt es ist in deinem array), werden entweder in der oberen oder der unteren Hälfte der Elemente in einem array. Der erste Vergleich (in der Mitte) in eine binäre Suche wird Ihnen sagen, die Hälfte, die Sie suchen sollten in. Wenn man mal noch weiter überlegen, ob du ein array mit N Elementen in N verschiedene binäre Suche (ein naiver Versuch, der parallel-ize). Jetzt machst du N Vergleiche, wenn Sie nicht brauchen, um. Sie verlieren die macht der binären Suche, in, dass jeder Vergleich wird Ihre Suche einzugrenzen, um die entsprechende Teilmenge.
Hoffe, das hilft. Kommentare willkommen.
Ja, im klassischen Sinne der Parallelisierung (multi-core), binäre Suche und der BST sind nicht viel besser.
Gibt es Techniken, wie mehrere Kopien der BST auf der L1-cache für jeden Prozessor. Nur ein Prozessor aktiv ist, aber die Gewinne aus, die mehrere L1-caches können groß sein (4-Zyklen für die L1 vs 14 Zyklen für L2).
In der realen Welt Probleme, die Sie oft suchen mehrere Tasten zur gleichen Zeit.
Nun, es ist eine andere Art der Parallelisierung, die helfen können: SIMD! Check out "Schnelle Architektur empfindlich Baum Suche auf modernen CPUs und GPUs" von einem team von Intel/UCSC/Oracle (SIGMOD 2010). Es ist sehr cool. BTW ich bin stützen meine aktuellen Forschungsprojekt zu diesem sehr Papier.
Parallele Implementierung beschleunigen kann eine binäre Suche, aber die Verbesserung ist nicht besonders bedeutend. Schlimmsten Fall ist der zeitliche Aufwand für binäre Suche ist
log_2(n)
won
ist die Anzahl der Elemente in der Liste. Eine einfache parallele Implementierung bricht der master-Liste ink
sub-Listen zu bin-gesucht durch parallele threads. Die resultierende worst-case-Zeit für die binäre Suche istlog_2(n/k)
Realisierung einer theoretischen Abnahme in der Zeit der Suche.Beispiel:
Eine Liste der
1024
Einträge nimmt sich so viele wie10
Zyklen zur binären Suche mit einem einzelnen thread. Mit4
threads, jeder thread nur würde die nur nehmen8
Zyklen zum abschließen der Suche. Und mit8
threads, jeder thread braucht7
Zyklen. So ein8
Gewinde parallele binäre Suche könnte bis zu30%
schneller als die single-threaded-Modell.Jedoch seine speed-up sollte nicht verwechselt werden mit einer Verbesserung in der Effizienz: Die
8
Gewinde Modell tatsächlich führt8 * 7 = 56
Vergleiche abzuschließen, die Suche im Vergleich zu den10
Vergleiche ausgeführt, indem die single-threaded binäre Suche. Es liegt im Ermessen des Programmierers, ob der marginale Gewinn an Geschwindigkeit einer parallelen Anwendung der binären Suche ist angemessen oder vorteilhaft für Ihre Anwendung.Ich bin ziemlich sicher, dass die binäre Suche kann beschleunigt werden, indem ein Faktor von log (M) wobei M die Anzahl der Prozessoren. log(n/M) = log(n) - log(M) > log(n)/log(M) für eine Konstante M. ich habe nicht einen Beweis für eine enge untere Schranke, aber wenn M=n, ist die Ausführungszeit ist O(1), die kann nicht besser sein. Ein Algorithmus Skizze folgt.
Parallel_Binary_Search(sorted_arraylist)