Warum ist mein paralleler Löser langsamer als mein sequenzieller Löser?


14

Ich habe mit PETSc herumgespielt und festgestellt, dass mein Programm, wenn ich es mit mehr als einem Prozess über MPI ausführe, noch langsamer zu laufen scheint ! Wie kann ich überprüfen, was los ist?


Dies nicht als Antwort zu posten, da es sich eigentlich um ein "Was" und nicht um ein "Wie" handelt, aber ich hatte in der Vergangenheit ähnliche Probleme, die durch einen mutexgeschützten Codeabschnitt verursacht wurden, auf den von mehreren Threads aus zugegriffen wurde. Manchmal müssen Sie im Hintergrund überprüfen, ob freigegebene Ressourcen gesperrt sind.
David Z

Antworten:


13

Dies kann durch architektonische Faktoren verursacht werden:

Steht für einen oder mehrere Prozesse dieselbe Speicherbandbreite zur Verfügung, ist kaum eine Beschleunigung zu verzeichnen, da die Speicherbandbreite für SpMV- und verwandte lineare Algebra-Operationen begrenzt ist.

Es kann auch vorkommen, dass der Kommunikationsaufwand Ihre lokale Berechnung überfordert. Zum Beispiel empfehlen wir bei linear iterativen Methoden, mindestens 10.000 Unbekannte pro Prozess zu haben.

oder numerische Faktoren:

Parallele Vorkonditionierer sind oft schwächer als ihre seriellen Gegenstücke. Beispielsweise wird Block Jacobi schwächer, je mehr Blöcke Sie verwenden. Daher müssen Sie zusätzliche Zeit für zusätzliche lineare Iterationen berücksichtigen. Nichtlineare Bedingungen funktionieren im Allgemeinen nicht so, sodass Newton-Iterationen häufig konstant sind.


8

Wenn Sie versuchen, ein Programm zu parallelisieren, müssen Sie eine Reihe von Kosten ausgleichen, aber in erster Linie gibt es diese

  • Die Kosten für die Ausführung jeder Berechnung
  • Die Kosten für jegliche Kommunikation zwischen diesen Berechnungen
  • Die Kosten für die Verwaltung dieser Berechnungen

Wenn Ihre Berechnungen peinlich parallel sind, sind die Kommunikationskosten sehr niedrig (nur Eingabe und Ausgabe) und die Verwaltungskosten sollten sehr niedrig sein.

Wenn Sie Abhängigkeiten zwischen den Berechnungen haben, können die Kommunikationskosten erheblich steigen. Wenn Sie einen komplexen Algorithmus haben, dessen Ausführung für eine bestimmte Berechnung unterschiedliche Zeit benötigt, steigt die Verwaltungskomplexität, da Sie versuchen, die vorhandenen Ressourcen effizient zu nutzen.

Wie bei jeder Form der Optimierung ist das Benchmarking der Schlüssel. Sehen Sie sich an, wie es ohne MPI funktioniert, wie es mit MPI und einem Prozess funktioniert und wie es skaliert.

Wenn Sie mit CUDA spielen, geben Sie ihm viel mehr Daten. Ein Test hier ergab eine negative Beschleunigung. Wir gaben ihm 1000-mal mehr Daten und die GP-GPU-Version wurde fast in der gleichen Zeit fertiggestellt, während die auf der Haupt-CPU ausgeführte Version 1000-mal länger dauerte.


3

Ich würde empfehlen, dass Sie Folgendes tun:

  • Erstellen Sie ein Profil der zeitlichen Ausführung Ihres Codes mit und ohne Parallelisierung. Wenn Sie Zweifel haben, wie das geht, können wir Ihnen helfen, wenn Sie Ihren Code besser beschreiben.

  • Sie können sich jetzt auf die Teile konzentrieren, die parallel langsamer laufen. Beachten Sie, dass die Kommunikation zwischen Prozessen möglicherweise langsam ist. Wie Mark und Sean betonten, bedeutet es nicht, dass dies effizient ist, nur weil ein Problem in Threads unterteilt werden kann. Man muss sich eingehender damit befassen. Wenn Sie jedoch Ihren Code profilieren, kann es Ihnen helfen, vorhandene Fehler zu finden. Meine zwei Cent.

Wenn Sie genauer erklären, was Sie tun, z. B. in einem Workflow, kann Ihnen möglicherweise jemand eine bessere Erklärung geben.


@ketch: du hast recht. Entschuldigung und danke, dass du es bemerkt hast. Bearbeitet den Text.
Jbcolmenares
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.