PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Paralleles Programmieren


pajofego
2006-08-05, 22:24:48
Hallo miteinander,

ich spiele z.Zt. mit dem Gedanken mich mit dem Thema paralleles Programmieren zu beschäftigen. Der Grund ist, dass wir ein num. Programm haben, dass sich parallelisieren ließe. Also dachte ich mir, es wäre doch sinnvoll - da die Rechenzeit sehr hoch ist - das ganze auf verschiedenen Maschinen gleichzeitig zum laufen zu bringen. Uns stehen 3 Opteron Dual Core Dual Processor Server zur Verfügung. D.h. wir hätten rein rechnerisch 12 CPU verteilt auf 3 Maschinen. Wenn ich nur auf einer bleiben würde mit 4 Kernen könnte ich einfach mit Hilfe der Posix Lib 4 Threads starten...so zumindestens meine Überlegung.

Um aber auch noch die anderen Maschinen benutzen zu können müsste ich diese übers Netzwerk ansprechen...am besten über MPI, oder?

Wie würdet ihr so eine Aufgabe sinnvoller angehen? Welche Aufgaben würdet ihr zuerst angehen bzw. wie würdet ihr von der Struktur her so ein Programm aufbauen?

Danke für eure Hilfe,

Gruß

pajofego

Gast
2006-08-05, 22:25:35
Hast du eine cost of ownership vs. return on investment Analyse gemacht?

pajofego
2006-08-05, 22:29:54
Hast du eine cost of ownership vs. return on investment Analyse gemacht?

was meinst du damit?

Kabelsalat
2006-08-05, 22:37:18
Hört sich so an, als meine er eine Kosten-Nutzen Rechnung.

Ansonsten kann ich außer dem Hinweis auf C'T 15/06, die sich ab Seite 214 diesem Thema widmet, leider nichts zum Thema beitragen. Gelesen habe ich den Artikel leider auch nicht, daher kann ich zu dessen Qualität keine Stellung nehmen. Einzeln sind die Artikel online im Heise Kiosk zu erwerben: http://www.heise.de/kiosk/archiv/ct/2006/15

Stone2001
2006-08-05, 22:38:20
Ob du mit OpenMP / PThreads oder MPI / PVM oder einer Kombination aus beidem parallelisieren sollst / kannst, hängt stark von deinem Problem bzw. den zugehörigen Algorithmen ab.

Kannst du dein Problem in relativ große Blöcke unterteilen, die nur selten miteinander kommunizieren, dann ist MPI wohl die beste Wahl. Bei relativ starker Kopplung ist OpenMP besser, aber wenn du Pech hast, ist deine Kopplung zu stark und du erhältst selbst mit OpenMP keinen SpeedUp. (dieser Fall hab ich im Augenblick... dann wird der Overhead durch den Speicherzugriff und Threadmanagement zu groß)

Bei den drei Maschinen würde ich zuerst mal eine Parallelisierung mittels OpenMP anstreben und vielleicht anschließend das Ganze nochmal mit MPI parallelisieren. Aber wie gesagt, hängt viel vom Algorithmus und den Daten ab. Unter numerischen Programm kann man sich ja recht viel vorstellen, von Strömungssimulationen bis hin zu PI-Berechnung kann da ja alles dabei sein. Aber dieser Bereich läßt sich im Allgemeinen recht gut parallelisieren.

Stone2001
2006-08-05, 22:40:49
Hört sich so an, als meine er eine Kosten-Nutzen Rechnung.

Ansonsten kann ich außer dem Hinweis auf C'T 15/06, die sich ab Seite 214 diesem Thema widmet, leider nichts zum Thema beitragen. Gelesen habe ich den Artikel leider auch nicht, daher kann ich zu dessen Qualität keine Stellung nehmen. Einzeln sind die Artikel online im Heise Kiosk zu erwerben: http://www.heise.de/kiosk/archiv/ct/2006/15
Der Artikel ist nicht schlecht und liefert eine sehr kompakte Einführung in OpenMP. In der aktuellen Ausgabe wird Pthreads angesprochen und in der nächsten Ausgabe wird MPI vorgestellt.

pajofego
2006-08-05, 23:00:09
Zum Problem selbst:

Das num. Problem stellt sich insofern, dass in einer Schleife ein Vektor durchiteriert wird. Eigentlich könnte ich diesen Datenvektor in n-Teile teilen, sprich in der Anzahl der mir zur verfügung stehenden Recheneinheiten.

Die Artikelserie aus der ct kenne ich. Mir war aber eins stets nicht klar. Die o.g. große Iterationschleife könnte ich bei 2 Kernen einfach mittels OpenMP oder Pthreads parallelisieren. Aber sobald ich auf andere Rechner zugreifen möchte, um die Rechenleistung auf weitere Kerne zu verteilen, muss ich dann auf welche Technik zugreifen? MPI? Sofern ich die Thematik verstanden habe, gingen die bisherigen Artikel nur auf das Parallelisieren auf einen Rechner mit mehreren Kernen. Sobald ich über ein Netzwerk kommunizieren muss geht das doch nicht oder?

Gruß

pajofego

Stone2001
2006-08-05, 23:30:10
Zum Problem selbst:

Das num. Problem stellt sich insofern, dass in einer Schleife ein Vektor durchiteriert wird. Eigentlich könnte ich diesen Datenvektor in n-Teile teilen, sprich in der Anzahl der mir zur verfügung stehenden Recheneinheiten.

Yup, wenn die einzelnen Iterationen von einander unabhängig sind, ist die Parallelisierung ja geradezu trivial. Die for-Schleife kannst du recht einfach mittels

#pragma omp parallel for
parallelisieren.

Aber sobald ich auf andere Rechner zugreifen möchte, um die Rechenleistung auf weitere Kerne zu verteilen, muss ich dann auf welche Technik zugreifen? MPI? Sofern ich die Thematik verstanden habe, gingen die bisherigen Artikel nur auf das Parallelisieren auf einen Rechner mit mehreren Kernen. Sobald ich über ein Netzwerk kommunizieren muss geht das doch nicht oder?

Im Normalfall ja. Also bei lose gekoppelten Workstations (wie in deinem Fall) bleibt dir nur eine MPI-Umgebung einzurichten und das Programm dann mittels MPI zu parallelisieren.
Auf Supercomputern (Cluster), die ein Distributed Shared Memory (DSM-) System bilden kann man auch über 'Rechner' hinweg mittels OpenMP parallelisieren.

PrakashKC
2006-08-05, 23:55:22
*delete me*

PrakashKC
2006-08-05, 23:58:39
Evtl wäre es auch sinnvoller, ein frei verfügbares load-balancing framework zu verwenden. Da muß man sich nicht zwangsweise mit MPI/OpenMP etc beschäftigen, sondern läßt es die lib machen. Man muß nur lernen wie man diese benutzen kann. Und wenn das load-balancing dynamisch arbeitet und du eine gute Lastschätzfunkt. angibst, kannst du auch ein heterogenes Cluster (oder ein teilweise unter Last befindliches hom. Cluster) effizient nutzen.

pajofego
2006-08-06, 00:25:45
Ich denke, dass ich erst einmal mit OpenMP spielen könnte. Erschien mit laut ct Artikel als "recht" einfach. Ich muss die gnu compiler benutzen und laut dem Artikel sind die noch nicht soweit wie die Kollegen aus Redmond und Intel. Leider steht mir zum ausprobieren noch kein Linux Rechner zur Verfügung, s.d. ich auch nicht in den Genuß der letzten Releases komme. Bei mingw verstehe ich die Version nr. vergabe nicht ganz. Sind eigentlich die gcc -v Versionnr. der MinGW compiler vergleichbar mit denen auf der gnucc, sprich habe ich überhaupt eine Chance mit den MinGW Compiler OpenMP auszuprobieren?