As a followup to my problem, I tested this sample code with LAM/MPI and it worked perfectly without any segmentation faults. Has any one tried this and faced this isue? Any help will be appreciated.
Regards, Rajesh ---------- Forwarded message ---------- From: Rajesh Sudarsan <rsudar...@gmail.com> List-Post: users@lists.open-mpi.org Date: Jan 15, 2008 12:33 AM Subject: MPI_Finalize segmentation fault with MPI_Intercomm_merge To: Open MPI Users <us...@open-mpi.org> Hi, I am trying to write a simple code which does the following - A master process running on 1 processor spawn 4 processes using the MPI_Comm_spawn_multiple command. After spawning, the intercommunicator between the master and the spawned processes are merged using MPI_Intercomm_merge to create a new common intracommunicator for the expanded set of processes. These new set of processes call MPI_Comm_spawn to create more processes and merged together to get a new intracomm. These steps are repeated over a loop. Now the problem is whenI call MPI_Finalize at the end of the loop, I get a segmentation fault. I do not get segmentation fault if I run the loop only once and call MPI_Intercomm_merge only once. Is there something wrong with my program or is it a known issue with MPI_Intercomm_merge when called multiple times? I have pasted the sample code below. It has 3 files - master.c, spawn.c, hello.c. I will be glad to clarify if anything looks confusing. Any help will be appreciated. /****************************************************************************************/ Master function. This function calls MPI_Comm_spawn_multiple the first time. ( master.c) /*****************************************************************************************/ /*Global variables*/ MPI_Comm grid_comm; /*new global communicator after spawning*/ int loop=0; /*number of iterations*/ int newprocess = -1; /* Variable to identify whether the current process is an old process or a spawned process.*/ int main (int argc, char ** argv) { int size,rank; MPI_Init(&argc, &argv); grid_comm=MPI_COMM_WORLD; newprocess=0; for( ;loop < 2; loop++){ fprintf(stdout,"\n\nLOOP in main =%d\n",loop); mpicomm_spawn(); /*Broacasting the loop value to spawned processes so that the new processes join the next iteration with the correct loop value.*/ MPI_Bcast(&loop,1,MPI_INT,0,grid_comm); MPI_Comm_size(grid_comm, &size); MPI_Comm_rank(grid_comm, &rank); } fprintf(stdout,"Exiting...main..rank=%d\n",rank); fflush(stdout); MPI_Barrier(grid_comm); MPI_Comm_free(&grid_comm); MPI_Finalize(); } /**********************/ Spawning function (spawn.c) /********************/ extern MPI_Comm grid_comm; int mpicomm_spawn() { MPI_Comm parent, intercomm; int rank, nprocs=4, size,nspawned; MPI_Info info[4]; char *host = (char *) "host"; /*String to be stored as a key in MPI_Info*/ char *commands[4]; /*Stores the array of executable names to be spawned*/ int maxprocs[4]; /*maximum number of processes that can be spawned on each process.*/ char ***args=NULL; /*array of arguments for each executable*/ int i; /*loop counter*/ char nodenames[4][50]; MPI_Comm_get_parent(&parent); if(newprocess==0) { /*Master processes*/ strcpy(nodenames[0],"n1009"); strcpy(nodenames[1],"n1010"); strcpy(nodenames[2],"n1011"); strcpy(nodenames[3],"n1012"); for(i=0;i<4;i++) { commands[i]=(char*)malloc(sizeof(char)*50); strcpy(commands[i],"./hello"); maxprocs[i]=1; MPI_Info_create (&info[i]); MPI_Info_set (info[i], host, nodenames[i]); } nspawned = MPI_Comm_spawn_multiple(nprocs, commands, args, maxprocs, info, 0, grid_comm, &intercomm, MPI_ERRCODES_IGNORE); MPI_Intercomm_merge(intercomm, 0, &grid_comm); } else { /* This part of the code is executed by the newly spawned process*/ newprocess=0; MPI_Intercomm_merge(parent, 1, &grid_comm); } } /*******************************************************/ Function that needs to be called while spawning (hello.c) /********************************************************/ /*Global variables*/ MPI_Comm grid_comm; /*new global communicator after spawning*/ int loop=0; /*number of iterations*/ int newprocess = -1; /* Variable to identify whether the current process is an old process or a spawned process.*/ int main (int argc, char **argv) { int myrank,size; MPI_Init(&argc, &argv); while(loop<2){ if(newprocess!=0){ newprocess=1; mpicomm_spawn(); } else mpicomm_spawn(); MPI_Comm_rank(grid_comm, &myrank); MPI_Bcast(&loop,1,MPI_INT,0,grid_comm); fprintf(stdout,"\n\n<<<<<<<<<<LOOP in hello = %d..Myrank=%d\n",loop,myrank); MPI_Comm_size(grid_comm, &size); loop++; } MPI_Comm_rank(grid_comm, &myrank); fprintf(stdout,"Exiting worker..rank=%d\n",myrank);fflush(stdout); MPI_Barrier(grid_comm); MPI_Comm_free(&grid_comm); MPI_Finalize(); } Thanks. Regarads, Rajesh