MPI Bcast oder Scatter zu bestimmten Rängen

Ich habe ein paar Daten. Was ich versuchte zu tun, ist so:

Verwenden Sie Rang 0, um Daten auf 50 Knoten zu senden. Jeder Knoten hat 1 mpi Prozess auf ihm mit 16 Kerne, die zu diesem Prozess vorhanden sind. Dann wird jeder mpi-Prozess python multiprocessing aufrufen. Einige Berechnungen werden durchgeführt, dann speichert der mpi-Prozess die Daten, die mit Multiprocessing berechnet wurden. Der mpi-Prozess ändert dann etwas Variable und läuft erneut Multiprocessing. Etc.

So müssen die Knoten neben dem ersten Start nicht miteinander kommunizieren, in dem sie alle Daten erhalten.

Das Multiprocessing funktioniert nicht so gut. So jetzt will ich alle MPI verwenden.

Wie kann ich (oder ist es nicht möglich) ein Array von ganzen Zahlen verwenden, die sich auf MPI-Ränge für Bcast oder Scatter beziehen. Zum Beispiel zählt 1-1000, der Knoten hat 12 Kerne. Also jeden 12. Rang möchte ich die Daten brennen. Dann auf jedem 12. Rang, ich möchte, dass es Daten auf 12 + 1 bis 12 + 12 Ränge streuen.

Dies erfordert die erste bcast, um mit totalrank / 12 zu kommunizieren, dann ist jeder Rang verantwortlich für das Senden von Daten in Ränge auf dem gleichen Knoten, dann sammeln die Ergebnisse, speichern sie und dann senden mehr Daten in Ränge auf dem gleichen Knoten.

One Solution collect form web for “MPI Bcast oder Scatter zu bestimmten Rängen”

Ich weiß nicht genug von mpi4py in der Lage sein, Ihnen ein Codebeispiel mit ihm zu geben, aber hier ist, was eine Lösung in C ++ sein könnte. Ich bin sicher, Sie können einen Python-Code aus ihm leicht ableiten.

#include <mpi.h> #include <iostream> #include <cstdlib> /// for abs #include <zlib.h> /// for crc32 using namespace std; int main( int argc, char *argv[] ) { MPI_Init( &argc, &argv ); // get size and rank int rank, size; MPI_Comm_rank( MPI_COMM_WORLD, &rank ); MPI_Comm_size( MPI_COMM_WORLD, &size ); // get the compute node name char name[MPI_MAX_PROCESSOR_NAME]; int len; MPI_Get_processor_name( name, &len ); // get an unique positive int from each node names // using crc32 from zlib (just a possible solution) uLong crc = crc32( 0L, Z_NULL, 0 ); int color = crc32( crc, ( const unsigned char* )name, len ); color = abs( color ); // split the communicator into processes of the same node MPI_Comm nodeComm; MPI_Comm_split( MPI_COMM_WORLD, color, rank, &nodeComm ); // get the rank on the node int nodeRank; MPI_Comm_rank( nodeComm, &nodeRank ); // create comms of processes of the same local ranks MPI_Comm peersComm; MPI_Comm_split( MPI_COMM_WORLD, nodeRank, rank, &peersComm ); // now, masters are all the processes of nodeRank 0 // they can communicate among them with the peersComm // and with their local slaves with the nodeComm int worktoDo = 0; if ( rank == 0 ) worktoDo = 1000; cout << "Initially [" << rank << "] on node " << name << " has " << worktoDo << endl; MPI_Bcast( &worktoDo, 1, MPI_INT, 0, peersComm ); cout << "After first Bcast [" << rank << "] on node " << name << " has " << worktoDo << endl; if ( nodeRank == 0 ) worktoDo += rank; MPI_Bcast( &worktoDo, 1, MPI_INT, 0, nodeComm ); cout << "After second Bcast [" << rank << "] on node " << name << " has " << worktoDo << endl; // cleaning up MPI_Comm_free( &peersComm ); MPI_Comm_free( &nodeComm ); MPI_Finalize(); return 0; } 

Wie Sie sehen können, erstellen Sie zunächst Kommunikatoren mit Prozessen auf demselben Knoten. Dann erstellen Sie Peer-Kommunikatoren mit allen Prozessen des gleichen lokalen Ranges auf jedem Knoten. Von als, Ihr Master-Prozess der globalen Rang 0 wird Daten an die lokalen Meister senden. Und sie verteilen die Arbeit an dem Knoten, für den sie verantwortlich sind.

Python ist die beste Programmiersprache der Welt.