Ich versuche, Haufen von erzeugten Prozessen in einem einzigen intracomm einzurichten. Ich muss separate Prozesse in eindeutigen Arbeitsverzeichnissen erzeugen, da diese Teilprozesse eine Reihe von Dateien ausschreiben. Nachdem alle Prozesse in der Absicht entstanden sind, sie zu einem einzigen Intra-Kommunikator zusammenzuführen. Um das auszuprobieren, habe ich ein einfaches Testprogramm eingerichtet.MPI verschmelzen mehrere Intercoms zu einem einzigen intracomm
int main(int argc, const char * argv[]) {
int rank, size;
const int num_children = 5;
int error_codes;
MPI_Init(&argc, (char ***)&argv);
MPI_Comm parentcomm;
MPI_Comm childcomm;
MPI_Comm intracomm;
MPI_Comm_get_parent(&parentcomm);
if (parentcomm == MPI_COMM_NULL) {
printf("Current Command %s\n", argv[0]);
for (size_t i = 0; i < num_children; i++) {
MPI_Comm_spawn(argv[0], MPI_ARGV_NULL, 1, MPI_INFO_NULL, 0, MPI_COMM_WORLD, &childcomm, &error_codes);
MPI_Intercomm_merge(childcomm, 0, &intracomm);
MPI_Barrier(childcomm);
}
} else {
MPI_Intercomm_merge(parentcomm, 1, &intracomm);
MPI_Barrier(parentcomm);
}
printf("Test\n");
MPI_Barrier(intracomm);
printf("Test2\n");
MPI_Comm_rank(intracomm, &rank);
MPI_Comm_size(intracomm, &size);
printf("Rank %d of %d\n", rank + 1, size);
MPI_Barrier(intracomm);
MPI_Finalize();
return 0;
}
Als ich das laufen bekomme ich alle 6 Prozesse aber mein IntraComm nur zwischen dem Elternteil und dem letzten Kind hervorgebracht zu sprechen. Die resultierende Ausgabe ist
Test
Test
Test
Test
Test
Test
Test2
Rank 1 of 2
Test2
Rank 2 of 2
Gibt es eine Möglichkeit, mehrere Kommunikatoren in einem einzigen Kommunikator zusammenzuführen? Beachten Sie auch, dass ich diese nacheinander spawne, da ich jeden Teilprozess in einem eindeutigen Arbeitsverzeichnis ausführen muss.
Also Sie sagen Prozess 1 Spawns 2, dann 2 Spawns 3, etc ... Ich habe versucht, 'MPI_Comm_spawn_multiple' zu vermeiden, so dass ich konnte vermeiden Sie das Durcheinander, indem Sie Arrays von Befehlen, Informationen usw. einrichten, da ich letztendlich in Fortran das tun werde. – user1139069
Nein, 0 Spawns 1, dann 0 & 1 Spawn 2 usw. –