[JAVA] Nebenläufige Workunits

q3tempest

Lieutenant
Registriert
Sep. 2002
Beiträge
595
Google sagt zu Workunits nur über SETI, BIONIC, Einstein, Protein Folding etc..

Gibt es Mustern oder Leitfaden, wie man ein Problem in effiziente Workunits (Runnables, Callables) zerlegen kann?
(d.h. zu kleine WU -> overhead, zu gross -> wenig Parallelität etc.)
Sagen wir mal, z.B für Windows XP, Java JRE 1.5.x

Temp

P.S. Es ist keine Hausaufgeben! ;)
 
Zuletzt bearbeitet:
Gibts kein SDK oder sowas für BOINC? Das ist nämlich ein Framework dafür, wenn ich mich nicht recht täusche!

Gruss,
David
 
Nein, nein, ich will nichts mit BONIC und co.

Ich möchte ein alte Berechnungsverfahren (von mein Vorgänger, C++ Single Thread)
in neue umschreiben (JAVA, Multithread).
Konkreter zur Berechnung, es geht um Gasdynamik in mehreren Räumen.

Temp
 
Überlege doch erst mal ob sich das Problem überhaupt in getrennten Schritten lösen lässt.

Lächerliches Beispiel, das aber zeigt, was ich meine:
Du willst die Summe der Zahlen 1, 4, 9, 21, 67, 23, 91, 3 berechnen.
Jetzt könntest du ja die Summe der ersten Hälfte der Zahlen als ein Arbeitspaket summieren und die Summe der anderen Hälfte in einem zweiten Paket.
Am Schluss werden die beiden Ergebnisse summiert und schon hast du das Gesamtergebnis.

Im Gegensatz dazu lässt sich das Newton-Verfahren zur Berechnung von Nullstellen (http://www.arndt-bruenner.de/mathe/java/newton.htm) kaum zerlegen, weil jeder Arbeitsschritt vom Ergebnis des vorherigen Schrittes abhängig ist.
Es muss also streng sequentiell gearbeitet werden. Parallel geht nicht (so weit ich weiß).

Kannst du dein Problem zerlegen?
Kannst du die Arbeitspakete einzeln mit dem selben Verfahren berechnen?
Kann aus den Einzelergebnissen ein "Gesamtergebnis" errechnet werden?

Das sind die Fragen die dich beschäftigen sollten.
Leitfäden dazu gibt es nicht. Höchstens noch in Form von fundiertem mathematischem Verständnis.

In welcher Sprache du das dann schreibst ist noch völlig uninteressant.
 
Erstmals danke, für den ersten Antwort :D

>Kannst du die Arbeitspakete einzeln mit dem selben Verfahren berechnen?
Ja, sonst macht es ja keinen Sinn, ne?

>Kann aus den Einzelergebnissen ein "Gesamtergebnis" errechnet werden?
Ja.

>Kannst du dein Problem zerlegen?
Wie bei vielen Problem, teilweise. Die Frage ist, wie fein/grob die Zerlegung
effizient auf bestimmte Menge von Computer abbildet.
Z.B. bei meinen Problem kann man schon intuitiv in eine Teilschritt der Simulation
einzelne Räume getrennt berechnen. Es ist halt nicht die Extremen, wie bei Summenberechnung
oder Newton-Verfahren, wo eine oder andere in eine Richtung tendieren.
Mein Ansatz war, versuche so viel wie möglich zu Zerlegen (in Runnables/Callables).
Dann abhängig vom System gegebenen Fall die Pakete zusammen bündeln.
Ich suche eine Art "Strategie"-Muster für Nebenläufigkeit.

>Form von fundiertem mathematischem Verständnis.
Würde ich als schmalspur Informatiker interessieren.
Unter welchen Stickwörter soll ich bei google nachfragen?

Temp
 
Ah, der Mann redet von "Entwurfsmustern" :). Sehr fein.
Aber für solche Sachen gibt es meinem Wissen nach keine bekannten Muster.

Ich würde da einfach mal naiv an die Sache rangehen.
Klassische Aufgabe für Mehrprozessorsysteme halt :).
Wie lange brauchen alle Daten um in einem Paket vom eigenen Rechner berechnet zu werden.
Wie lange braucht der eigene Rechner um in zwei Threads je die Hälfte der Daten zu verwurschteln.
Das selbe würde ich dann ich dann mal auf andweren Rechnern auprobieren (Freunde, Bekannte). Zusätzlich kannst du ja messen wie es bei drei, vier oder noch mehr Threads aussieht (bei Programmstart konfigurierbar machen).

So kannst du rausfinden, wie die Leistung der Systeme mit der Anzahl der Workunits skaliert. Das ist jetzt nicht sehr wissenschaftlich, aber "Versuch und Irrtum" ist immer ganz nett.
Außerdem weißt du ja wie "groß" dann die Workunits waren und kannst dich so an eine vernünftige/ausgewogene Größe herantasten.

Naiver Ansatz: Ausprobieren!
 
Zurück
Oben