From ebd53cac243186b83457179668123ae1ddbd47a2 Mon Sep 17 00:00:00 2001 From: mquinson Date: Tue, 23 Jun 2009 15:06:33 +0000 Subject: [PATCH] SMPI: cleanup the initialization process by moving stuff done by first process in smpi_process_init to smpi_global_init (WIP) git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@6331 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- ChangeLog | 3 +++ src/smpi/private.h | 2 +- src/smpi/smpi_base.c | 45 ++++----------------------------------- src/smpi/smpi_global.c | 48 +++++++++++++++++++++++++++++++++++++----- src/smpi/smpi_mpi.c | 2 +- 5 files changed, 52 insertions(+), 48 deletions(-) diff --git a/ChangeLog b/ChangeLog index b68913001e..e2640d3f38 100644 --- a/ChangeLog +++ b/ChangeLog @@ -50,6 +50,9 @@ SimGrid (3.4-svn) unstable; urgency=high * xbt_ex_display(): do not free the exception after displaying This allows to do more with the given exception afterward. Users should call xbt_ex_free() themselves. + + SMPI: + * Cleanup the initialization process Build Chain: * Do not require doxygen in maintainer mode diff --git a/src/smpi/private.h b/src/smpi/private.h index 1b214f344d..3c57388dcb 100644 --- a/src/smpi/private.h +++ b/src/smpi/private.h @@ -130,7 +130,7 @@ typedef struct smpi_host_data_t { typedef struct smpi_host_data_t *smpi_host_data_t; // function prototypes -void smpi_mpi_init(void); +void smpi_init_process(void); void smpi_mpi_finalize(void); int smpi_mpi_comm_rank(smpi_mpi_communicator_t comm); diff --git a/src/smpi/smpi_base.c b/src/smpi/smpi_base.c index 98992b99ae..11439cce88 100644 --- a/src/smpi/smpi_base.c +++ b/src/smpi/smpi_base.c @@ -46,11 +46,9 @@ int smpi_mpi_comm_rank(smpi_mpi_communicator_t comm) return comm->index_to_rank_map[smpi_host_index()]; } -void smpi_mpi_init() +void smpi_init_process() { smx_host_t host; - smx_host_t *hosts; - int host_count; int i; smpi_host_data_t hdata; @@ -60,12 +58,10 @@ void smpi_mpi_init() // initialize some local variables host = SIMIX_host_self(); - hosts = SIMIX_host_get_table(); - host_count = SIMIX_host_get_number(); hdata = xbt_new(s_smpi_host_data_t, 1); - for (i = 0; i < host_count && host != hosts[i]; i++); + for (i = 0; i < smpi_global->host_count && host != smpi_global->hosts[i]; i++); hdata->index = i; hdata->mutex = SIMIX_mutex_init(); @@ -76,39 +72,6 @@ void smpi_mpi_init() // node 0 sets the globals if (0 == i) { - smpi_global->hosts = hosts; - smpi_global->host_count = host_count; - - smpi_mpi_global = xbt_new(s_smpi_mpi_global_t, 1); - - // global communicator - smpi_mpi_global->mpi_comm_world = xbt_new(s_smpi_mpi_communicator_t, 1); - smpi_mpi_global->mpi_comm_world->size = host_count; - smpi_mpi_global->mpi_comm_world->barrier_count = 0; - smpi_mpi_global->mpi_comm_world->barrier_mutex = SIMIX_mutex_init(); - smpi_mpi_global->mpi_comm_world->barrier_cond = SIMIX_cond_init(); - smpi_mpi_global->mpi_comm_world->rank_to_index_map = - xbt_new(int, host_count); - smpi_mpi_global->mpi_comm_world->index_to_rank_map = - xbt_new(int, host_count); - for (i = 0; i < host_count; i++) { - smpi_mpi_global->mpi_comm_world->rank_to_index_map[i] = i; - smpi_mpi_global->mpi_comm_world->index_to_rank_map[i] = i; - } - - // mpi datatypes - smpi_mpi_global->mpi_byte = xbt_new(s_smpi_mpi_datatype_t, 1); - smpi_mpi_global->mpi_byte->size = (size_t) 1; - smpi_mpi_global->mpi_int = xbt_new(s_smpi_mpi_datatype_t, 1); - smpi_mpi_global->mpi_int->size = sizeof(int); - smpi_mpi_global->mpi_double = xbt_new(s_smpi_mpi_datatype_t, 1); - smpi_mpi_global->mpi_double->size = sizeof(double); - - // mpi operations - smpi_mpi_global->mpi_land = xbt_new(s_smpi_mpi_op_t, 1); - smpi_mpi_global->mpi_land->func = smpi_mpi_land_func; - smpi_mpi_global->mpi_sum = xbt_new(s_smpi_mpi_op_t, 1); - smpi_mpi_global->mpi_sum->func = smpi_mpi_sum_func; // signal all nodes to perform initialization SIMIX_mutex_lock(smpi_global->start_stop_mutex); @@ -131,10 +94,10 @@ void smpi_mpi_init() // wait for all nodes to signal initializatin complete SIMIX_mutex_lock(smpi_global->start_stop_mutex); smpi_global->ready_process_count++; - if (smpi_global->ready_process_count >= 3 * host_count) { + if (smpi_global->ready_process_count >= 3 * smpi_global->host_count) { SIMIX_cond_broadcast(smpi_global->start_stop_cond); } - while (smpi_global->ready_process_count < 3 * host_count) { + while (smpi_global->ready_process_count < 3 * smpi_global->host_count) { SIMIX_cond_wait(smpi_global->start_stop_cond, smpi_global->start_stop_mutex); } diff --git a/src/smpi/smpi_global.c b/src/smpi/smpi_global.c index 710353d8f8..4dac16053e 100644 --- a/src/smpi/smpi_global.c +++ b/src/smpi/smpi_global.c @@ -120,6 +120,11 @@ int smpi_create_request(void *buf, int count, smpi_mpi_datatype_t datatype, } return retval; } +/* FIXME: understand what they do and put the prototypes in a header file (live in smpi_base.c) */ +void smpi_mpi_land_func(void *a, void *b, int *length, + MPI_Datatype * datatype); +void smpi_mpi_sum_func(void *a, void *b, int *length, + MPI_Datatype * datatype); void smpi_global_init() { @@ -198,6 +203,40 @@ void smpi_global_init() smpi_global->received_message_queues_mutexes[i] = SIMIX_mutex_init(); } + smpi_global->hosts = SIMIX_host_get_table(); + smpi_global->host_count = SIMIX_host_get_number(); + + smpi_mpi_global = xbt_new(s_smpi_mpi_global_t, 1); + + // global communicator + smpi_mpi_global->mpi_comm_world = xbt_new(s_smpi_mpi_communicator_t, 1); + smpi_mpi_global->mpi_comm_world->size = smpi_global->host_count; + smpi_mpi_global->mpi_comm_world->barrier_count = 0; + smpi_mpi_global->mpi_comm_world->barrier_mutex = SIMIX_mutex_init(); + smpi_mpi_global->mpi_comm_world->barrier_cond = SIMIX_cond_init(); + smpi_mpi_global->mpi_comm_world->rank_to_index_map = + xbt_new(int, smpi_global->host_count); + smpi_mpi_global->mpi_comm_world->index_to_rank_map = + xbt_new(int, smpi_global->host_count); + for (i = 0; i < smpi_global->host_count; i++) { + smpi_mpi_global->mpi_comm_world->rank_to_index_map[i] = i; + smpi_mpi_global->mpi_comm_world->index_to_rank_map[i] = i; + } + + // mpi datatypes + smpi_mpi_global->mpi_byte = xbt_new(s_smpi_mpi_datatype_t, 1); + smpi_mpi_global->mpi_byte->size = (size_t) 1; + smpi_mpi_global->mpi_int = xbt_new(s_smpi_mpi_datatype_t, 1); + smpi_mpi_global->mpi_int->size = sizeof(int); + smpi_mpi_global->mpi_double = xbt_new(s_smpi_mpi_datatype_t, 1); + smpi_mpi_global->mpi_double->size = sizeof(double); + + // mpi operations + smpi_mpi_global->mpi_land = xbt_new(s_smpi_mpi_op_t, 1); + smpi_mpi_global->mpi_land->func = smpi_mpi_land_func; + smpi_mpi_global->mpi_sum = xbt_new(s_smpi_mpi_op_t, 1); + smpi_mpi_global->mpi_sum->func = smpi_mpi_sum_func; + } void smpi_global_destroy() @@ -289,18 +328,17 @@ int smpi_run_simulation(int *argc, char **argv) SIMIX_global_init(argc, argv); + // parse the platform file: get the host list + SIMIX_create_environment(argv[1]); + SIMIX_function_register("smpi_simulated_main", smpi_simulated_main); SIMIX_function_register("smpi_sender", smpi_sender); SIMIX_function_register("smpi_receiver", smpi_receiver); - - // FIXME: ought to verify these files... - SIMIX_create_environment(argv[1]); + SIMIX_launch_application(argv[2]); // must initialize globals between creating environment and launching app.... smpi_global_init(); - SIMIX_launch_application(argv[2]); - /* Prepare to display some more info when dying on Ctrl-C pressing */ // FIXME: doesn't work //signal(SIGINT, inthandler); diff --git a/src/smpi/smpi_mpi.c b/src/smpi/smpi_mpi.c index fd643e4b6c..672b2ca229 100644 --- a/src/smpi/smpi_mpi.c +++ b/src/smpi/smpi_mpi.c @@ -5,7 +5,7 @@ XBT_LOG_NEW_DEFAULT_SUBCATEGORY(smpi_mpi, smpi, int SMPI_MPI_Init(int *argc, char ***argv) { - smpi_mpi_init(); + smpi_init_process(); smpi_bench_begin(); return MPI_SUCCESS; } -- 2.20.1