Frage

Im Moment habe ich eine Anwendung, die 100s von benutzerdefinierten Formeln enthalten. Derzeit verwende ich umgekehrte polnische Notation die Berechnungen durchzuführen (Werte und Variablen auf einen Stapel schieben und sie dann von dem Stapel knallte und Auswertung). Was wäre der beste Weg, zu parallelisieren, diesen Prozess zu beginnen? Soll ich in einer funktionalen Sprache suchen werden?

Die Berechnungen basieren auf Arrays von Zahlen durchgeführt, so zum Beispiel ein einfacher A + B tatsächlich 100s von Ergänzungen bedeuten könnte. Ich bin derzeit mit Delphi, aber dies ist keine Voraussetzung für die Zukunft. Ich werde das Werkzeug am besten geeignet, um den Job verwenden. Formeln können auch so, voneinander abhängig sein, die wir eine Formel C = A + B und ein zweiten D = C + A beispielsweise haben können.

War es hilfreich?

Lösung

Lassen Sie uns Ihre Formeln annehmen (Gleichungen) sind nicht zyklisch, da sonst können Sie nicht „nur“ bewerten. Wenn Sie wie ein vektorisiert Gleichungen = B + C, wobei A, B und C-Arrays sind, lassen Sie uns spalten sie vom Konzept her in die Gleichungen für die Komponenten, so dass, wenn die Array-Größe 5 ist, diese Gleichung in

aufgeteilt
a1 = b1 + c1
a2 = b2 + c2
...
a5 = b5 + c5

Nun ist diese Annahme, Sie haben eine große Menge von Gleichungen auf einfache Mengen (ob ganz, rationale oder etwas anderes).

Wenn Sie zwei Gleichungen E und F haben, lassen Sie uns sagen, dass F depends_on E, wenn die rechte Seite von F auf der linken Seite des E erwähnt, zum Beispiel

E: a = b + c
F: q = 2*a + y

Nun, um in Richtung, wie dies zu berechnen, können Sie immer randomisierten Iteration verwenden könnten dies (das ist nur ein Zwischenschritt in der Erklärung), nach diesem Algorithmus zu lösen:

1 while (there is at least one equation which has not been computed yet)
2   select one such pending equation E so that:
3     for every equation D such that E depends_on D:
4       D has been already computed
5   calculate the left-hand side of E

beendet Dieser Prozess mit der richtigen Antwort, unabhängig, wie Sie Ihre Auswahl treffen auf Linie // 2. Nun ist die kühle Sache ist, dass es leicht auch parallelisiert. Sie können es in einer beliebigen Anzahl von Threads laufen! Was Sie brauchen, ist eine Gleichzeitigkeit sichere Warteschlange, die diese Gleichungen, deren Voraussetzungen (die die Gleichungen hängen von) berechnet wurden, die aber haben sich bisher noch nicht hält berechnet. Jeder Thread herausspringt (thread-sicher) eine Gleichung aus dieser Warteschlange zu einer Zeit, berechnet die Antwort, und dann überprüft, ob es nun neue Gleichungen, so dass alle ihrer Voraussetzungen berechnet wurden, und fügt dann die Gleichungen (thread-sicher) in der Arbeitswarteschlange. Fertig.

Andere Tipps

Ohne mehr zu wissen, würde ich vorschlagen, einen SIMD-Stil Ansatz, wenn möglich. Das heißt, alle Fäden erstellen Formeln für einen einzelnen Datensatz zu berechnen. Der Versuch, die Berechnung von Formeln zu teilen, sie zu parallelisieren wäre viel Verbesserung der Geschwindigkeit, wie die Logik erforderlich, um in der Lage zu spalten, die Berechnungen in diskrete Einheiten geeignet zum Einfädeln richtig wäre schwer zu schreiben und schwieriger zu bekommen nicht nachgeben, würde der Aufwand abbrechen aus jeder Geschwindigkeit gewinnt. Es wäre auch schnell von abnehmenden Erträge leiden.

Nun, wenn Sie eine Reihe von Formeln haben, die dann die Parallelisierung zu viele Sätze von Daten angewandt werden wird einfacher und würde besser skalieren. Jeder Thread führt alle Berechnungen für einen Satz von Daten. Erstellen einen Thread pro CPU-Kern und stellen seine Affinität zu jedem Kern. Jeder Thread instanziiert eine Instanz der Formel Bewertungscode. Erstellen Sie einen Supervisor, die einen einzelnen Datensatz geladen und übergibt sie einen Leerlauf-Thread. Wenn keine Threads im Ruhezustand befinden, für den ersten Thread warten, um die Verarbeitung ihrer Daten zu beenden. Wenn alle Datensätze verarbeitet und alle Threads abgeschlossen haben, dann beenden. Mit dieser Methode gibt es keinen Vorteil mehr Fäden, als es auf der CPU-Kerne als Fadenschalt langsam ist und sich negativ auf die Gesamtgeschwindigkeit haben.

Wenn Sie haben nur einen Datensatz, dann ist es keine triviale Aufgabe. Es würde erfordern die Auswertung Baum Zweige ohne Abhängigkeiten von anderen Zweigen und Landwirtschaft, diese Zweige Parsen Fäden trennen auf jedem Kern laufen und warten auf die Ergebnisse. Sie erhalten dann Probleme, die die Synchronisierung von Daten und Datenkohärenz zu gewährleisten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top