5

Meine bisherigen Erfahrungen haben gezeigt, dass selbst bei Multi-Core-Prozessoren die Parallelisierung eines Algorithmus nicht immer zu einer deutlichen Beschleunigung führt. Tatsächlich kann es manchmal die Dinge verlangsamen. Was sind einige gute Hinweise, dass ein Algorithmus erheblich beschleunigt werden kann, indem er parallelisiert wird?Was sind einige Hinweise, dass ein Algorithmus parallelisiert werden sollte?

(Natürlich die Einsprüche mit vorzeitige Optimierung und deren Korrelation zum Bösen gegeben)

Antwort

5

den größten Nutzen aus Parallelisierung zu gewinnen, sollte eine Aufgabe der Lage sein, in similiar große Kurs Korn Brocken gebrochen werden, die unabhängig sind (oder meistens) und erfordern wenig Kommunikation von Daten oder Synchronisation zwischen den Chunks.

Feinkörnige Parallelisierung leidet fast immer unter erhöhtem Overhead und hat unabhängig von der Anzahl der verfügbaren physischen Kerne eine endliche Beschleunigung.

[Der Vorbehalt zu diesem, ist diese Architekturen, die eine sehr große Nr. Haben. von "Kernen" (wie die Verbindungsmaschinen 64.000 Kerne). Diese sind gut für Berechnungen geeignet, die in relativ einfache Aktionen aufgeteilt werden können, die einer bestimmten Topologie (wie einem rechteckigen Netz) zugeordnet sind.]

0

Nun, wenn Sie viele Sperren benötigen, um zu funktionieren, dann ist es wahrscheinlich einer davon schwierige Algorithmen, die sich nicht gut parallelisieren. Gibt es einen Teil des Algorithmus, der in separate Teile aufgeteilt werden kann, die sich nicht berühren müssen?

2

Zuerst lesen Sie in diesem Papier von dem verstorbenen Jim Gray:

Distributed Computing Economics

Eigentlich wird dies einige Missverständnisse klären auf, was Sie in der Frage geschrieben. Offensichtlich ist es umso schwieriger, wenn das Problem, das weniger problematisch ist, darin besteht, diskretisiert zu werden.

3

Wenn Sie die Arbeit in unabhängige Teile aufteilen können, dann kann es gut parallelisiert werden.

Erinnern Sie sich auch an Amdahl's Law das ist eine ernüchternde Erinnerung daran, wie wenig wir in Bezug auf Leistungssteigerungen durch Hinzufügen von mehr Kernen zu den meisten Programmen erwarten können.

+0

Ich stimme hier definitiv zu. Eine Sache zu beachten, dass ich denke, Atwood vermisst die ganze Zeit in seinem Blog, ist, dass Ihr Programm in der Regel mit anderen nicht verwandten Prozessen konkurriert, können Sie auch von mehreren Kernen hier zu gewinnen. Aber die meiste Zeit wird in den langsamsten Teilen des Codes verbracht. :) – BobbyShaftoe

2

Jedes Mal, wenn Sie Berechnungen haben, die von vorherigen Berechnungen abhängen, ist es kein paralleles Problem. Dinge wie lineare Bildverarbeitung, Brute-Force-Methoden und genetische Algorithmen können leicht parallelisiert werden.

Eine gute Analogie ist, woran könntest du arbeiten, dass du einen Haufen Freunde dazu bringst, verschiedene Teile auf einmal zu machen? Zum Beispiel kann das Zusammenstellen von Ikea-Möbeln parallelisiert werden, wenn verschiedene Personen an verschiedenen Abschnitten arbeiten können, aber rollendes Hintergrundbild ist möglicherweise nicht notwendig, weil Sie Wände nacheinander ausführen müssen.

1

Wenn Sie große Matrixberechnungen durchführen, z. B. Simulationen mit Finite-Elemente-Modellen, können diese auf einfache Weise in kleinere Teile zerlegt werden. Matrix-Vektor-Multiplikationen können von der Parallelisierung profitieren, wenn Sie mit sehr großen Matrizen arbeiten. Wenn es keinen echten Leistungsengpass gibt, der dazu führt, dass Code langsam ausgeführt wird, ist es wahrscheinlich nicht notwendig, mit der parallelen Verarbeitung zu kämpfen.

+0

Ich kann deine Logik sehen. Dies ist für eine Schulaufgabe.Ich denke, wenn ich Zeit habe, spiele ich mit einer Parallelisierung herum, wenn es einfach ist und eine deutliche Geschwindigkeitssteigerung bringt. Selbst wenn ich keinen finde, kann ich gut aussehen, wenn ich sage: "Hier ist noch etwas, das ich ausprobiert habe, das nicht funktioniert hat." –