2012-04-11 8 views
0

Ich hätte gerne das gleiche Array namens hist(1:1000) auf verschiedenen Prozessoren mit OpenMPI, so dass, wenn ein Prozessor hist ändert diese Modifikation in den Rest der Prozessoren aktualisiert wird.Wie benutze ich das gleiche Array auf verschiedenen Prozessoren mit MPI

Ich habe einen Code geschrieben und erklärte hist(1:1000) aber das Problem ist, dass hist auf jedem Prozessor unabhängig aktualisiert wird, dann, was ich bin es, die Daten an einen „Master-Knoten“ zu senden, um ein weiteres Histogramm zu aktualisieren basierend auf den Informationen von den Sklaven, aber das ist was ich nicht will. Ich möchte das gleiche Histogramm auf jedem der Prozessoren aktualisiert haben.

Ist dies mit OpenMPI möglich?

+0

Haben Sie versucht, hist als eine gemeinsame Variable zu deklarieren? – Neo

+0

wie könnte ich das tun? Grüße. – armando

+0

Hoppla .. Mein Fehler .. Ich habe es als OpenMP falsch gelesen .. Gerade bemerkt, dass es openmpI ist .. Wie mgilson in der Antwort unten angegeben, wenn Sie OpenMP verwenden können, können Sie eine gemeinsame Variable haben. OpenMP beeinflusst jedoch die Skalierbarkeit. Wenn Sie also mit MPI fortfahren möchten, müssen Sie Sammelvorgänge wie MPI_Gather verwenden. Es gibt keinen anderen Weg! – Neo

Antwort

6

Das ist meines Wissens mit MPI nicht möglich. Der Zweck von MPI besteht darin, die Nachrichtenübergabe von einem Prozess zu einem anderen zu implementieren (daher der Name - Message Passing Interface). Wenn Sie Shared Memory verwenden möchten, ist es am besten, etwas wie OpenMP zu verwenden (ich denke, dass es dort möglich ist), das zumindest von gcc/gfortran und wahrscheinlich einer Vielzahl anderer Compiler unterstützt wird. Sie könnten Threads verwenden ... Aber letztlich skaliert keiner von diesen zu 1000 von Prozessoren wie MPI. Je nachdem, was Sie tun, könnten Sie die gemeinsamen Operationen von MPI ausprobieren - Wie Sie bereits erwähnt haben, speichert hist ein Histogramm, also möchten Sie wahrscheinlich nur die Summe aller von Ihnen verwendeten Häufigkeitslisten, von denen Ihre Berechnung nicht abhängt Hist. MPI für Sie alle Arrays zusammenzufassen, nachdem sie geändert haben ...

dies siehe zum Beispiel

http://mpi.deino.net/mpi_functions/MPI_Allreduce.html

(Der Betrieb Sie wollen, ist wahrscheinlich MPI_SUM)

1

I don‘ Wenn Sie Ihre Anwendung genau kennen, aber möglicherweise an der Funktion MPI_Bcast interessiert sind, sendet sie ein Array an alle Ihre Prozessoren. Es ist jedoch normalerweise keine gute Idee, viel MPI_Bcast zu verwenden, da eine lange Zeit für die Kommunikation und nicht für die Verarbeitung verwendet wird.

+0

MPI_Allreduce kann als eine MPI_Reduce gefolgt von einer MPI_Bcast gedacht werden (obwohl ich erwarten würde, dass es effizienter implementiert wird) – mgilson

0

Sie können ein Array in einem Prozess für andere mit Hilfe der one-sided Kommunikation freigeben. Dies wird jedoch von vielen als eine suboptimale Lösung angesehen. Vielleicht wärst du besser dran, überlegst deinen Algorithmus und versuchst, ihn mehr nach dem Message-Passing-Paradigma zu formulieren.

+0

defekten Link "einseitig". –

+0

@ bogdan.rusu danke, repariert es. – haraldkl