Minimal Example (Blocking Reconfiguration) =========================================== The following C example demonstrates a blocking reconfiguration using the Dyn_PSets library. Copy and adapt for quick experimentation. .. code-block:: c int main(){ MPI_Session session; dyn_pset_state_t *dyn_pset_state; int terminate, reconfigured = 0; char msg[256]; /* Initialize a Session so we can create MPI_Info objects before dyn_pset_init */ MPI_Session_init(MPI_INFO_NULL, MPI_ERRORS_ARE_FATAL, &session); /* Set DynPSet verbosity and stdout as outputstream dyn_pset_set_output(NULL, 0); // Increase to print DynPset debug output */ /* Initialize the DynPSet state */ dyn_pset_state = dyn_pset_init("mpi://WORLD", NULL, MPI_INFO_NULL, NULL, NULL, NULL, NULL); /* In the general case an expansion might be canceled, so we check for it here */ if (NULL == dyn_pset_state){ MPI_Session_finalize(&session); return 0; } /* Code path for dynamically added processes */ if(dyn_pset_state->dynamic_process){ /* Receive and print message from existing processes before terminating*/ MPI_Bcast(msg, 256, MPI_CHAR, 0, dyn_pset_state->mpicomm); printf("NEW PROCESS: rank %d/%d received message '%s' from original processes\n", dyn_pset_state->mpirank, dyn_pset_state->mpisize, msg); /* Code path for original processes */ }else{ printf("ORIGINAL PROCESS: == BEFORE reconfiguration: Rank %d/%d\n", dyn_pset_state->mpirank, dyn_pset_state->mpisize); /* Set the optimization information for the DynPSet state */ MPI_Info_create(&info); MPI_Info_set(info, "mpi_num_procs_add", "2"); dyn_pset_set_info(dyn_pset_state, info); MPI_Info_free(&info); /* Reconfigure the DyPSet state */ dyn_pset_adapt(dyn_pset_state, &terminate, &reconfigured); printf("ORIGINAL PROCESS: == AFTER reconfiguration: Rank %d/%d\n", dyn_pset_state->mpirank, dyn_pset_state->mpisize); strcpy(msg, "Hello, new processes!"); MPI_Bcast(msg, 256, MPI_CHAR, 0, dyn_pset_state->mpicomm); } /* Finalize the DynPSet state */ dyn_pset_finalize(&dyn_pset_state, NULL); /* Finalize our MPI Session */ MPI_Session_finalize(&session); return 0; }