X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/908f43d575e3b19014f39ba209da997ab6e3fa2c..51f94e1d38869bd7a057c58ff4978fdff170a6e6:/src/smpi/smpi_global.c diff --git a/src/smpi/smpi_global.c b/src/smpi/smpi_global.c index 5b05cfe912..7cf9d544e4 100644 --- a/src/smpi/smpi_global.c +++ b/src/smpi/smpi_global.c @@ -35,6 +35,7 @@ static smpi_process_data_t *process_data = NULL; static int process_count = 0; MPI_Comm MPI_COMM_WORLD = MPI_COMM_NULL; +int MPI_UNIVERSE_SIZE; MPI_Errhandler* MPI_ERRORS_RETURN = NULL; MPI_Errhandler* MPI_ERRORS_ARE_FATAL = NULL; @@ -79,7 +80,7 @@ void smpi_process_init(int *argc, char ***argv) void smpi_process_destroy(void) { int index = smpi_process_index(); - + process_data[index]->index=-100; XBT_DEBUG("<%d> Process left the game", index); } @@ -94,6 +95,16 @@ void smpi_process_finalize(void) } } +/** + * @brief Check if a process is finalized + */ +int smpi_process_finalized() +{ + return (smpi_process_index()==-100); + // If finalized, this value has been set to -100; +} + + #ifdef SMPI_F2C int smpi_process_argc(void) { smpi_process_data_t data = smpi_process_data(); @@ -160,8 +171,8 @@ int smpi_process_count(void) int smpi_process_index(void) { smpi_process_data_t data = smpi_process_data(); - - return data->index; + //return -1 if not initialized + return data? data->index : MPI_UNDEFINED; } smx_rdv_t smpi_process_mailbox(void) { @@ -257,6 +268,7 @@ void smpi_global_init(void) } group = smpi_group_new(process_count); MPI_COMM_WORLD = smpi_comm_new(group); + MPI_UNIVERSE_SIZE = smpi_comm_size(MPI_COMM_WORLD); for (i = 0; i < process_count; i++) { smpi_group_set_mapping(group, i, i); } @@ -268,11 +280,11 @@ void smpi_global_destroy(void) int i; smpi_bench_destroy(); - smpi_group_destroy(smpi_comm_group(MPI_COMM_WORLD)); + smpi_group_unuse(smpi_comm_group(MPI_COMM_WORLD)); smpi_comm_destroy(MPI_COMM_WORLD); MPI_COMM_WORLD = MPI_COMM_NULL; for (i = 0; i < count; i++) { - smpi_group_destroy(smpi_comm_group(process_data[i]->comm_self)); + smpi_group_unuse(smpi_comm_group(process_data[i]->comm_self)); smpi_comm_destroy(process_data[i]->comm_self); xbt_os_timer_free(process_data[i]->timer); simcall_rdv_destroy(process_data[i]->mailbox); @@ -413,6 +425,19 @@ int smpi_main(int (*realmain) (int argc, char *argv[]),int argc, char *argv[]) mpi_coll_reduce_scatter_fun = (int (*)(void *sbuf, void *rbuf, int *rcounts,\ MPI_Datatype dtype,MPI_Op op,MPI_Comm comm)) mpi_coll_reduce_scatter_description[reduce_scatter_id].coll; + + int scatter_id = find_coll_description(mpi_coll_scatter_description, + sg_cfg_get_string("smpi/scatter")); + mpi_coll_scatter_fun = (int (*)(void *sendbuf, int sendcount, MPI_Datatype sendtype,\ + void *recvbuf, int recvcount, MPI_Datatype recvtype,\ + int root, MPI_Comm comm)) + mpi_coll_scatter_description[scatter_id].coll; + + int barrier_id = find_coll_description(mpi_coll_barrier_description, + sg_cfg_get_string("smpi/barrier")); + mpi_coll_barrier_fun = (int (*)(MPI_Comm comm)) + mpi_coll_barrier_description[barrier_id].coll; + smpi_global_init(); /* Clean IO before the run */