From 40752d52b1b436f20b9a9c7111ed80031c110f5e Mon Sep 17 00:00:00 2001 From: Augustin Degomme Date: Wed, 9 Jan 2013 17:53:27 +0100 Subject: [PATCH] add smpi/os and smpi/or parameters to handle timings to inject into small-sized MPI comms --- src/simgrid/sg_config.c | 16 +++++- src/smpi/smpi_base.c | 114 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 128 insertions(+), 2 deletions(-) diff --git a/src/simgrid/sg_config.c b/src/simgrid/sg_config.c index ccf75d13a3..3d853d4482 100644 --- a/src/simgrid/sg_config.c +++ b/src/simgrid/sg_config.c @@ -679,7 +679,21 @@ void sg_config_init(int *argc, char **argv) xbt_cfgelm_string, NULL, 1, 1, NULL, NULL); xbt_cfg_setdefault_string(_sg_cfg_set, "smpi/lat_factor", "65472:11.6436;15424:3.48845;9376:2.59299;5776:2.18796;3484:1.88101;1426:1.61075;732:1.9503;257:1.95341;0:2.01467"); -//END SMPI + + xbt_cfg_register(&_sg_cfg_set, "smpi/os", + "Small messages timings (MPI_Isend/Send minimum time for small messages)", + xbt_cfgelm_string, NULL, 1, 1, NULL, + NULL); + xbt_cfg_setdefault_string(_sg_cfg_set, "smpi/os", "1:0:0:0:0"); + + xbt_cfg_register(&_sg_cfg_set, "smpi/or", + "Small messages timings (MPI_Recv minimum time for small messages)", + xbt_cfgelm_string, NULL, 1, 1, NULL, + NULL); + xbt_cfg_setdefault_string(_sg_cfg_set, "smpi/or", "1:0:0:0:0"); + + + //END SMPI if (!surf_path) { diff --git a/src/smpi/smpi_base.c b/src/smpi/smpi_base.c index 2c99064110..b79f349d34 100644 --- a/src/smpi/smpi_base.c +++ b/src/smpi/smpi_base.c @@ -59,6 +59,107 @@ static int match_send(void* a, void* b,smx_action_t ignored) { } else return 0; } + +typedef struct s_smpi_factor *smpi_factor_t; +typedef struct s_smpi_factor { + long factor; + int nb_values; + double values[4];//arbitrary set to 4 +} s_smpi_factor_t; +xbt_dynar_t smpi_os_values = NULL; +xbt_dynar_t smpi_or_values = NULL; + + +// Methods used to parse and store the values for timing injections in smpi +// These are taken from surf/network.c and generalized to have more factors +// These methods should be merged with those in surf/network.c (moved somewhere in xbt ?) + +static int factor_cmp(const void *pa, const void *pb) +{ + return (((s_smpi_factor_t*)pa)->factor > ((s_smpi_factor_t*)pb)->factor); +} + + +static xbt_dynar_t parse_factor(const char *smpi_coef_string) +{ + char *value = NULL; + unsigned int iter = 0; + s_smpi_factor_t fact; + int i=0; + xbt_dynar_t smpi_factor, radical_elements, radical_elements2 = NULL; + + smpi_factor = xbt_dynar_new(sizeof(s_smpi_factor_t), NULL); + radical_elements = xbt_str_split(smpi_coef_string, ";"); + xbt_dynar_foreach(radical_elements, iter, value) { + fact.nb_values=0; + radical_elements2 = xbt_str_split(value, ":"); + if (xbt_dynar_length(radical_elements2) <2 || xbt_dynar_length(radical_elements2) > 5) + xbt_die("Malformed radical for smpi factor!"); + for(i =0; i %ld return %f", size, fact.factor, current); + + return current; +} + +static double smpi_or(double size) +{ + if (!smpi_or_values) + smpi_or_values = + parse_factor(sg_cfg_get_string("smpi/or")); + + unsigned int iter = 0; + s_smpi_factor_t fact; + double current=0.0; + xbt_dynar_foreach(smpi_or_values, iter, fact) { + if (size <= fact.factor) { + XBT_VERB("or : %lf <= %ld return %f", size, fact.factor, current); + return current; + }else + current=fact.values[0]+fact.values[1]*size; + } + XBT_VERB("or : %lf > %ld return %f", size, fact.factor, current); + + return current; +} + static MPI_Request build_request(void *buf, int count, MPI_Datatype datatype, int src, int dst, int tag, MPI_Comm comm, unsigned flags) @@ -191,6 +292,13 @@ void smpi_mpi_start(MPI_Request request) request->real_size=request->size; smpi_datatype_use(request->old_type); request->action = simcall_comm_irecv(mailbox, request->buf, &request->real_size, &match_recv, request); + + double sleeptime = smpi_or(request->size); + if(sleeptime!=0.0){ + simcall_process_sleep(sleeptime); + XBT_VERB("receiving size of %ld : sleep %lf ", request->size, smpi_or(request->size)); + } + } else { int receiver = smpi_group_index(smpi_comm_group(request->comm), request->dst); @@ -221,7 +329,11 @@ void smpi_mpi_start(MPI_Request request) // we make a copy here, as the size is modified by simix, and we may reuse the request in another receive later request->real_size=request->size; smpi_datatype_use(request->old_type); - + double sleeptime = smpi_os(request->size); + if(sleeptime!=0.0){ + simcall_process_sleep(sleeptime); + XBT_VERB("sending size of %ld : sleep %lf ", request->size, smpi_os(request->size)); + } request->action = simcall_comm_isend(mailbox, request->size, -1.0, request->buf, request->real_size, -- 2.20.1