MPI Frage
-
Hallo, ich habe den Fall dass ich zwei
Vektoren X und Y der Länge n habe.
X ist mit Nullen initialisiert.Nun gibt es eine Funktion f(zahl, Vektor): zahl
welche zur Berechnung des Vektors y dient.Aufruf wäre sequentiell:
for i = 1 to n:
y[i] = f(i, x)Nun möchte ich mittels MPI, dass jeder Prozess
einen Teil des Inhalts von y berechnet.
Nehmen wir einfach an, die Vektoren hätten Länge 20 und es gäbe 2 Prozessoren.Nun soll P1 die ersten 10 Werte von seinem Y berechnen und P2 die zweite Hälfte.
SOweit bin ich schon.Aber mit welchem Befehl schaffe ich es, dass nun der Austausch der beiden Hälften stattfindet?
Zur Verdeutlichung:
Vorher: P1: Y: G G G G G _ _ _ _ _ P2: Y: _ _ _ _ _ G G G G G Nachher: P1: Y: G G G G G G G G G G P2: Y: G G G G G G G G G G
Bin für jede Hilfe dankbar
-
MPI_send und MPI_recv sind die Kandidaten, oder wenn du das Ergebnis nur auf einene (root) process brauchst und der Rest Rechenknechte sind, MPI_bcast und MPI_reduce.
Aber mal ehrlich, was issn das für ne Frage ... .
-
Jeder Prozess berechnet aus seinem Rang einen Bereich, den er ausrechnet. Dann macht er ein sendrecv mit den anderen Prozessen, denen er jeweils seine Daten schickt und deren Teile empfängt. Da er die Formel zum Ausrechnen der Bereiche kennt, weiß er, von welchem Prozess er wieviele Elemente für welche Stelle im vector bekommt. Danach haben alle Prozesse den vollständigen Vektor.
Alternativ schicken die Prozesse ihre Daten an einen Mutterprozess, falls nur dieser die Daten benötigt.
Und ich hoffe für dich, dass f() eine sehr sehr sehr teure Funktion ist, sonst hättest du den Nutzen von MPI nicht verstanden.
-
Ich frage mich eben, ob ich bei send oder recv jeden Wert einzeln schicken müsste.
Wenn ich den ganzen Vektor verschicke, woher weiß dann ein anderer Prozess, welchen Teil er davon übernehmen soll?Und wenn ich nur Teile verschicke, muss ich dann per Sender-Rank herausfinden, an welche Stelle die versendeten Daten gehören?
-
Meine Güte, lies ein MPI-Handbuch! Dieses Thema käme ungefähr auf der zweiten Seite.
Eine Idee, wie du das mit den Positionen machen könntest, habe ich dir schon geschrieben. Du darfst auch gerne vorher zwischen den Prozessen ein paar Werte austauschen, wieviele Daten gleich geschickt werden und wo sie hingehören, falls sich die Prozesse das nicht selber zusammenreimen können. In deinem Beispiel könnten sie es jedenfalls.
-
MPI_Allgather würde ich dafür nehmen