Multiprozessfähiger Code



  • Hallo, besserer Titel ist mir nicht eingefallen :p

    Ich möchte (zum Spass) ein Programm schreiben was im Endeffekt eine überdimensionierte Rechnung lösen soll indem sich mehrere Rechner an dem Prozess beteiligen.

    Mein Ziel ist erst mal so definiert: Der 'Host' legt die Zahlen fest, z.B. 7,8,9. Nun soll mit Hilfe von Pcs die sich verbinden und mit beteiligen 7(89) berechnet werden. Zum testen würd ja mal 2(22) oder so reichen, da das andere wohl je nach Rechneranzahl relativ lange geht.

    Hat jemand eine gute Idee wie man den Rechenprozess aufteilen könnte?

    Ich nehme zuerst einmal an dass alle Clients "brav" sind und mir nicht absichtlich falsche Werte liefern.

    Gruß



  • Du kannst deine Rechnung ja in Teile zerlegen.
    Den inhalt der klammer schickst du (vll. als string?) an einen client.
    Der rechnet sie aus und schickt dir das ergebnis zurück (diesmal als zahl).
    Mit dieser Zahl rechnet der Server weiter oder (je nach größe der Rechnung)
    schickt die zahl mit dem nächsten Teil an einen weiteren client.

    So in etwa...
    Wissen musst du wie man eine Netzwerkverbindung herstellt, aten sendet und empfängt.
    Irgendwelche Prozessorbefehle zu versenden geht glaub ich nicht.

    Das ganze lohnt sich natürlich erst bei umfangreichen Berechnungen
    (ich bin mir nichtmal sicher ob sich das überhaupt lohnen kann)



  • Ich bin mir sicher, dass sich das bei 999 schon sehr gut lohnt, wenn man es wirklich ohne runden berechnet. 😃



  • ---



  • Ok aber wie kann ich z.B. a1a2...^an sinnvoll in m Prozesse zerlegen mit dem Ziel sowenig Daten zwischen Client und Server austauschen zu müssen?

    Mir fehlt da irgendwie ein Anhaltspunkt 😞



  • Verwende doch VS2005 und OpenMP.



  • deine berechnungen sind sehr aufeinander aufbauend, dürfte nicht so einfach sein sie zu parallelisieren.



  • Such dir eine andere Aufgabe die leichter zu parallelisiren ist, wenig Datenaustausch zwischen den einzeln Rechnern benötigt und viel Rechenkapazität braucht. Was mir da einfallen würde ist der Primzahlentest. Was auch eine Möglichkeit wäre ist das Ausrechnen von Determinanten riesiger Matrizen, wobei man hier zwar nicht andauernd Matrizen hin und her schieben darf da dies den Performancevorteil zu nischten machen könnte.



  • Das müsste doch ganz gut aufteilbar sein! mal am Beispiel von 999:

    999=9(387420489)=9(38742*10000+489)=(938742)10000)*9^489=...
    Das lässt sich beliebig runterformieren bis es sinvoll lösbare aufgaben sind. Es müssen nur die Potenzgesetze angewand werden.



  • Man könnte aber auch einefach geschickter zerlegen:

    9^9 = (94)2 * 9 = (92)2 * 9, macht also 2mal quadrieren, einmal multiplizieren. Ich denke nicht, daß das viel bringt, das zu parallelisieren, dazu ist die Aufgabe zu gut in aufeinander aufbauende Schritte zerlegbar. Zudem ist die Berechnung von a^n in log(n) Laufzeit möglich. Es ist also ein wirklich schnell lösbares Problem. Allein zu versuchen, die Aufgabe in Teile zu zerlegen (also Teiler des Exponenten zu suchen) dürfte aufwändiger sein, als einfach den Standard-Square-and-Multiply-Algo durchzuziehen. Von der Implementierung will ich mal garnicht reden.

    MfG Jester



  • Ok das mit Primzahltest klingt interessant, werd ich mal zum Spass umsetzen. Geht mir eigentlich nicht um die Aufgabe sondern um die Verteilung auf mehrere Pcs.


Anmelden zum Antworten