it-swarm.com.de

Wann sollte DAG (Directed Acyclic Graph) in der Programmierung verwendet werden?

Ich habe kürzlich ein Framework namens ecto gefunden.

In diesem Rahmen kann eine Grundkomponente mit dem Namen "Plasma" , die das ecto Directed Acyclic Graph ist. In ecto kann das Plasma vom ecto Scheduler betrieben werden.

Ich frage mich, was der Vorteil dieses Mechanismus ist und in welchen anderen Situationen können wir das Konzept der DAG nutzen?

38
Po-Jen Lai

Schöne Frage.

  • Der Code kann durch eine DAG dargestellt werden, die die Ein- und Ausgänge jeder der im Code ausgeführten arithmetischen Operationen beschreibt; Diese Darstellung ermöglicht es dem Compiler, die Eliminierung gemeinsamer Unterausdrücke effizient durchzuführen.
  • Die meisten Versionsverwaltungssysteme implementieren die Überarbeitungen als DAG.
  • Mehrere Programmiersprachen beschreiben Wertesysteme, die durch einen gerichteten azyklischen Graphen miteinander verbunden sind. Wenn sich ein Wert ändert, werden seine Nachfolger neu berechnet. Jeder Wert wird in Abhängigkeit von seinen Vorgängern in der DAG ausgewertet.
  • DAG ist praktisch, um Deadlocks zu erkennen, da sie die Abhängigkeiten zwischen einer Reihe von Prozessen und Ressourcen veranschaulichen.
  • In vielen randomisierten Algorithmen in der Berechnungsgeometrie behält der Algorithmus eine Verlaufs-DAG bei, die Merkmale einiger geometrischer Konstruktionen darstellt, die durch spätere Merkmale mit feinerem Maßstab ersetzt wurden. Punktlokalisierungsabfragen können wie für die obigen zwei Datenstrukturen durch Folgen von Pfaden in dieser DAG beantwortet werden.
  • Sobald wir die DAG im Speicher haben, können wir Algorithmen schreiben, um die maximale Ausführungszeit des gesamten Satzes zu berechnen.
  • Beim Programmieren von Tabellenkalkulationssystemen muss das Abhängigkeitsdiagramm, das eine Zelle mit einer anderen verbindet, wenn die erste Zelle eine Formel speichert, die den Wert in der zweiten Zelle verwendet, ein gerichtetes azyklisches Diagramm sein. Abhängigkeitszyklen sind nicht zulässig, da sie dazu führen, dass die am Zyklus beteiligten Zellen keinen genau definierten Wert haben. Wenn die Abhängigkeiten azyklisch sein müssen, kann außerdem eine topologische Reihenfolge verwendet werden, um die Neuberechnungen von Zellwerten zu planen, wenn die Tabelle geändert wird.
  • Mit DAG können wir Algorithmen schreiben, um die Berechnungen in der richtigen Reihenfolge auszuwerten.

BEARBEITEN:

  • Die Reihenfolge der Auswertung von Formelzellen bei der Neuberechnung von Formelwerten in Tabellenkalkulationen kann mithilfe von DAGs erfolgen
  • Git verwendet DAGs für die Speicherung von Inhalten, Referenzzeiger für Köpfe, die Darstellung von Objektmodellen und das Remote-Protokoll.
  • DAGs werden bei der Ablaufverfolgungsplanung verwendet: Als erster praktischer Ansatz für die globale Zeitplanung versucht die Ablaufverfolgungsplanung, den am häufigsten ausgeführten Kontrollflusspfad zu optimieren.
  • Ecto ist ein Verarbeitungsframework und verwendet DAG, um Verarbeitungsgraphen so zu modellieren, dass die Graphen eine geordnete synchrone Ausführung ausführen. Plasm in Ecto ist die DAG und Scheduler arbeitet daran.
  • DAGs werden beim Software-Pipelining verwendet, einer Technik, mit der Schleifen auf eine Weise optimiert werden, die dem Hardware-Pipelining entspricht.

Gute Ressourcen:

30

Die Antwort ist, dass es nicht viel mit Programmierung zu tun hat. Es hat mit Problemlösung zu tun.

So wie verknüpfte Listen Datenstrukturen sind, die für bestimmte Problemklassen verwendet werden, sind Diagramme zur Darstellung bestimmter Beziehungen nützlich. Verknüpfte Listen, Bäume, Diagramme und andere abstrakte Strukturen haben nur eine Verbindung zur Programmierung, indem Sie sie in Code implementieren können. Sie existieren auf einer höheren Abstraktionsebene. Es geht nicht um Programmierung, sondern um die Anwendung von Datenstrukturen bei der Lösung von Problemen.

Wenn Sie dennoch eine Beziehung zur Programmierung haben möchten, beachten Sie bitte folgende Punkte:

  • DAG (bekannt als Wait-For-Graphs - more technische Details ) ist nützlich, um Deadlocks zu erkennen, da sie die Abhängigkeiten zwischen einer Reihe von Prozessen und Ressourcen veranschaulichen (beide sind Knoten in die DAG). Ein Deadlock würde auftreten, wenn ein Zyklus erkannt wird.
  • Sobald Sie die DAG im Speicher haben, können Sie Algorithmen schreiben an:
    • stellen Sie sicher, dass die Berechnungen in der richtigen Reihenfolge ausgewertet werden ( topologische Sortierung )
    • wenn Berechnungen parallel durchgeführt werden können, aber jede Berechnung eine maximale Ausführungszeit hat, können Sie die maximale Ausführungszeit des gesamten Satzes berechnen
13
Vaibhav Agarwal

Andere Leute haben DAG auf Daten angewendet, aber ich denke, es ist mindestens genauso anwendbar (wenn nicht mehr) auf Code. Mahbubur R Aaman erwähnt dies, also ist dies eher ein Nachtrag zu seiner Antwort als eine vollständige Antwort für sich.

Es fällt mir ein als jedes zwingende Computerprogramm das frei von Endlosschleifen ist (danke @AndresF.) Ist ein Directed Acyclic Graph (DAG). Dies bedeutet, dass die möglichen Ausführungspfade des Codes gerichtet sind (zuerst dies, dann das) und azyklisch (keine Endlosschleifen bilden). Sie sind ein Diagramm, da der Pfad durch einen wichtigen Code selten so einfach ist wie eine Liste oder ein Baum.

Ich habe vielleicht 4 Jahre in XSLT gearbeitet. Ich hatte eine schreckliche Zeit damit zu erklären, warum es keine gute Allzweck-Programmiersprache war, aber DAG ist der Grund. Insbesondere ist XSLT eine datengesteuerte Sprache. Sie definieren Funktionen (ja, im Sinne der Funktionsprogrammierung), rufen diese Funktionen jedoch nicht unbedingt aus Ihrem Code auf. Vielmehr richtet XSLT eine Kombination aus Auswahl und Iteration der Knoten eines XML-Eingabedokuments ein. Auf diese Weise kann die Struktur der Eingabedaten bestimmen, welche Funktionen in welcher Reihenfolge aufgerufen werden.

Dies war sehr interessant und sehr cool, bis Ihr Programm auf eine Datenbedingung stieß, auf die Sie um 2:30 Uhr nicht getestet haben und die Sie aufwachen und beheben mussten. Wenn Sie die Daten die DAG definieren lassen, wird die Definition der DAG zu allen möglichen Eingabebedingungen - die für jede nicht triviale Geschäftsanwendung nicht kalkulierbar sind. Sie sind unvorstellbar.

Zuerst dachte ich, dass funktionale Programmierung möglicherweise keine DAG ist, da die Ausführungsreihenfolge manchmal nicht klar ist oder sogar vom Programmierer bedacht wird. Ein Funktionsprogramm definiert jedoch Abhängigkeiten. Tatsächlich könnte man sich vorstellen, dass der deklarative Charakter der funktionalen Programmierung nur Abhängigkeiten definiert (a ^ 2 = b ^ 2 + c ^ 2), ohne die Ausführungsreihenfolge anzugeben (es spielt keine Rolle, ob 'b' oder 'c' zuerst quadriert wird , solange beide quadratisch sind, bevor sie addiert werden).

Während die funktionale Programmierung in Bezug auf die Reihenfolge der Operationen auf einer detaillierten Ebene absichtlich vage sein kann, ist sie in Bezug auf Abhängigkeiten äußerst klar. Dies sind genau die Funktionen, die es für die Parallelität so zugänglich machen. In jedem Fall gibt es immer noch ein Diagramm mit Pfaden durch den Code, und dieses Diagramm ist immer noch gerichtet (Abhängigkeiten müssen vor abhängigen Aufgaben ausgewertet werden), daher denke ich, dass DAG auch dort gilt.

Schöne Frage - danke fürs posten!

7
GlenPeterson

Derzeit wird die DAG in der Programmierung unterschätzt. Historisch gesehen wurden viele Dinge im Zusammenhang mit der Entwicklung mit Bäumen und Hierarchien gemacht, weil es für unser Gehirn praktisch ist, etwas in einer Box zu bewegen, um komplexe Dinge einfacher zu verwalten. Wenn Sie sich jedoch Ereignisse ansehen und wie sie von anderen Ereignissen und Zuständen abhängen, erhalten Sie DAG, da alles in unserem Leben und im Programm von irgendetwas in der Vergangenheit abhängen kann, aber nicht in der Zukunft, sodass Sie perfekt "azyklisch" werden. Beziehungen, die auf das DAG-Konzept anwendbar sind. Obwohl dies in der Entwicklung selten explizit verwendet wird, würde dies helfen, die Dinge besser zu verstehen

6
Maksee

Ich frage mich, was der Vorteil von Plasm in Ecto ist ...

DAG kann verwendet werden, um eine Sammlung von Aufgaben in einer Sequenz mit der Einschränkung zu modellieren, dass bestimmte Aufgaben vor den anderen ausgeführt werden müssen. Ecto ist ein Verarbeitungsframework und verwendet DAG, um Verarbeitungsgraphen so zu modellieren, dass die Graphen eine geordnete synchrone Ausführung ausführen. Plasm in Ecto ist die DAG und Scheduler arbeitet daran.

in welchen anderen Situationen können wir das Konzept der DAG nutzen?

  • DAWG ist eine Datenstruktur, die eine Reihe von Zeichenfolgen darstellt und a zulässt Abfrageoperation, die testet, ob eine bestimmte Zeichenfolge proportional zu ihrer Länge zur festgelegten Zeit gehört.
  • Git verwendet DAGs für die Speicherung von Inhalten, Referenzzeiger für Köpfe, Objektmodelldarstellung und Remote-Protokoll.
3
theD

Als Beispiel aus der Praxis ähnelt unsere Software einer IDE), bei der der Endbenutzer eine Reihe von Vorgängen definieren kann, die an einem Bild ausgeführt werden sollen (Bildverarbeitungsprüfung). Diese Prüfungen können Abhängigkeiten von haben andere Inspektionen oder möglicherweise davon abhängige Inspektionen. Da dies alles vom Endbenutzer konfiguriert werden kann, können wir keine Optimierungen für die parallele Verarbeitung zur Entwurfszeit vornehmen. Indem wir diese Inspektionen und Abhängigkeiten als DAG darstellen, können wir die Parallelität der Gesamtinspektion optimieren für maximale Leistung zur Laufzeit.

0
Dave Nay