Ho provato a impostare un gruppo di processi generati in un unico intracomm. Ho bisogno di generare processi separati in directory di lavoro uniche poiché questi sottoprocessi scriveranno un sacco di file. Dopo che tutti i processi sono stati generati, si desidera unirli in un unico comunicatore intra. Per provarlo, ho creato un semplice programma di test.MPI unire più intercom in un unico 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;
}
Quando eseguo questo ottengo tutti i 6 processi, ma la mia IntraComm sta parlando solo tra il genitore e l'ultimo figlio generato. L'output risultante è
Test
Test
Test
Test
Test
Test
Test2
Rank 1 of 2
Test2
Rank 2 of 2
C'è un modo per unire più comunicatori in un singolo comunicatore? Si noti inoltre che sto generando questi uno alla volta poiché ho bisogno che ogni sottoprocesso venga eseguito in una directory di lavoro univoca.
Quindi il processo dicendo 1 depone le uova 2, poi 2 depone le uova 3, ecc ... stavo cercando di evitare di 'MPI_Comm_spawn_multiple' in modo che potessi evitare il caos di configurare matrici di comandi, informazioni, ecc. poiché alla fine finirò per farlo in Fortran. – user1139069
No, 0 spawn 1, quindi 0 e 1 spawn 2, ecc. –