X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/4f76738343f7a677f81f5ab26a15234a3045ec8d..b51da37243dc16575499f4cb7729fe8bdd7fa514:/src/smpi/smpi_base.cpp diff --git a/src/smpi/smpi_base.cpp b/src/smpi/smpi_base.cpp index 3b4cdb9019..d60b2bff16 100644 --- a/src/smpi/smpi_base.cpp +++ b/src/smpi/smpi_base.cpp @@ -73,8 +73,8 @@ static int match_send(void* a, void* b,smx_synchro_t ignored) { // These are taken from surf/network.c and generalized to have more values for each factor typedef struct s_smpi_factor_multival *smpi_os_factor_multival_t; typedef struct s_smpi_factor_multival { // FIXME: this should be merged (deduplicated) with s_smpi_factor defined in network_smpi.c - long factor=0; - std::vector values; /** We allocate arbitrarily 4 elements **/ + size_t factor=0; + std::vector values; } s_smpi_factor_multival_t; std::vector smpi_os_values; @@ -90,16 +90,9 @@ static simgrid::config::Flag smpi_iprobe_sleep( static simgrid::config::Flag smpi_test_sleep( "smpi/test", "Minimum time to inject inside a call to MPI_Test", 1e-4); -static int factor_cmp(const s_smpi_factor_multival_t& pa, const s_smpi_factor_multival_t& pb) -{ - return (pa.factor > pb.factor) ? 1 : - (pa.factor < pb.factor) ? -1 : 0; -} - static std::vector parse_factor(const char *smpi_coef_string) { std::vector smpi_factor; - s_smpi_factor_multival_t fact; /** Setup the tokenizer that parses the string **/ typedef boost::tokenizer> Tokenizer; @@ -117,8 +110,9 @@ static std::vector parse_factor(const char *smpi_coef_ */ for (Tokenizer::iterator token_iter = tokens.begin(); token_iter != tokens.end(); token_iter++) { +XBT_DEBUG("token : %s", token_iter->c_str()); Tokenizer factor_values(*token_iter, factor_separator); - + s_smpi_factor_multival_t fact; if (factor_values.begin() == factor_values.end()) { xbt_die("Malformed radical for smpi factor: '%s'", smpi_coef_string); } @@ -133,28 +127,32 @@ static std::vector parse_factor(const char *smpi_coef_ } else { errmsg = bprintf("Invalid factor value %d in chunk #%zu: %%s", iteration, smpi_factor.size()+1); - fact.values.push_back(xbt_str_parse_double((*factor_iter).c_str(), errmsg)); + fact.values.push_back(xbt_str_parse_double(factor_iter->c_str(), errmsg)); } xbt_free(errmsg); } smpi_factor.push_back(fact); - XBT_DEBUG("smpi_factor:\t%ld : %zu values, first: %f", fact.factor, smpi_factor.size(), fact.values[0]); + XBT_DEBUG("smpi_factor:\t%zu : %zu values, first: %f", fact.factor, smpi_factor.size(), fact.values[0]); } - std::sort(smpi_factor.begin(), smpi_factor.end(), &factor_cmp); + std::sort(smpi_factor.begin(), smpi_factor.end(), + [](const s_smpi_factor_multival_t &pa, + const s_smpi_factor_multival_t &pb) { + return (pa.factor < pb.factor); + }); for (auto& fact : smpi_factor) { - XBT_DEBUG("smpi_factor:\t%ld : %zu values, first: %f", fact.factor, smpi_factor.size() ,fact.values[0]); + XBT_DEBUG("smpi_factor:\t%zu : %zu values, first: %f", fact.factor, smpi_factor.size() ,fact.values[0]); } return smpi_factor; } -static double smpi_os(double size) +static double smpi_os(size_t size) { if (smpi_os_values.empty()) { smpi_os_values = parse_factor(xbt_cfg_get_string("smpi/os")); } - double current=0.0; + double current=smpi_os_values.empty()?0.0:smpi_os_values[0].values[0]+smpi_os_values[0].values[1]*size; // Iterate over all the sections that were specified and find the right // value. (fact.factor represents the interval sizes; we want to find the // section that has fact.factor <= size and no other such fact.factor <= size) @@ -162,7 +160,7 @@ static double smpi_os(double size) for (auto& fact : smpi_os_values) { if (size <= fact.factor) { // Values already too large, use the previously // computed value of current! - XBT_DEBUG("os : %f <= %ld return %f", size, fact.factor, current); + XBT_DEBUG("os : %zu <= %zu return %.10f", size, fact.factor, current); return current; }else{ // If the next section is too large, the current section must be used. @@ -170,23 +168,23 @@ static double smpi_os(double size) current = fact.values[0]+fact.values[1]*size; } } - XBT_DEBUG("Searching for smpi/os: %f is larger than the largest boundary, return %f", size, current); + XBT_DEBUG("Searching for smpi/os: %zu is larger than the largest boundary, return %.10f", size, current); return current; } -static double smpi_ois(double size) +static double smpi_ois(size_t size) { if (smpi_ois_values.empty()) { smpi_ois_values = parse_factor(xbt_cfg_get_string("smpi/ois")); } - double current=0.0; + double current=smpi_ois_values.empty()?0.0:smpi_ois_values[0].values[0]+smpi_ois_values[0].values[1]*size; // Iterate over all the sections that were specified and find the right value. (fact.factor represents the interval // sizes; we want to find the section that has fact.factor <= size and no other such fact.factor <= size) // Note: parse_factor() (used before) already sorts the dynar we iterate over! for (auto& fact : smpi_ois_values) { if (size <= fact.factor) { // Values already too large, use the previously computed value of current! - XBT_DEBUG("ois : %f <= %ld return %f", size, fact.factor, current); + XBT_DEBUG("ois : %zu <= %zu return %.10f", size, fact.factor, current); return current; }else{ // If the next section is too large, the current section must be used. @@ -194,24 +192,26 @@ static double smpi_ois(double size) current = fact.values[0]+fact.values[1]*size; } } - XBT_DEBUG("Searching for smpi/ois: %f is larger than the largest boundary, return %f", size, current); + XBT_DEBUG("Searching for smpi/ois: %zu is larger than the largest boundary, return %.10f", size, current); return current; } -static double smpi_or(double size) +static double smpi_or(size_t size) { if (smpi_or_values.empty()) { smpi_or_values = parse_factor(xbt_cfg_get_string("smpi/or")); } - double current=0.0; + + double current=smpi_or_values.empty()?0.0:smpi_or_values.front().values[0]+smpi_or_values.front().values[1]*size; + // Iterate over all the sections that were specified and find the right value. (fact.factor represents the interval // sizes; we want to find the section that has fact.factor <= size and no other such fact.factor <= size) // Note: parse_factor() (used before) already sorts the dynar we iterate over! for (auto fact : smpi_or_values) { if (size <= fact.factor) { // Values already too large, use the previously // computed value of current! - XBT_DEBUG("or : %f <= %ld return %f", size, fact.factor, current); + XBT_DEBUG("or : %zu <= %zu return %.10f", size, fact.factor, current); return current; } else { // If the next section is too large, the current section must be used. @@ -219,7 +219,7 @@ static double smpi_or(double size) current=fact.values[0]+fact.values[1]*size; } } - XBT_DEBUG("smpi_or: %f is larger than largest boundary, return %f", size, current); + XBT_DEBUG("smpi_or: %zu is larger than largest boundary, return %.10f", size, current); return current; } @@ -773,47 +773,44 @@ int smpi_mpi_test(MPI_Request * request, MPI_Status * status) { int smpi_mpi_testany(int count, MPI_Request requests[], int *index, MPI_Status * status) { - xbt_dynar_t comms; + std::vector comms; + comms.reserve(count); + int i; - int* map; int flag = 0; - int size = 0; *index = MPI_UNDEFINED; - comms = xbt_dynar_new(sizeof(smx_synchro_t), nullptr); - map = xbt_new(int, count); + + std::vector map; /** Maps all matching comms back to their location in requests **/ for(i = 0; i < count; i++) { if ((requests[i] != MPI_REQUEST_NULL) && requests[i]->action && !(requests[i]->flags & PREPARED)) { - xbt_dynar_push(comms, &requests[i]->action); - map[size] = i; - size++; + comms.push_back(requests[i]->action); + map.push_back(i); } } - if(size > 0) { + if(!map.empty()) { //multiplier to the sleeptime, to increase speed of execution, each failed testany will increase it static int nsleeps = 1; if(smpi_test_sleep > 0) simcall_process_sleep(nsleeps*smpi_test_sleep); - i = simcall_comm_testany(comms); - // not MPI_UNDEFINED, as this is a simix return code - if(i != -1) { - *index = map[i]; + i = simcall_comm_testany(comms.data(), comms.size()); // The i-th element in comms matches! + if (i != -1) { // -1 is not MPI_UNDEFINED but a SIMIX return code. (nothing matches) + *index = map[i]; finish_wait(&requests[*index], status); - if (requests[*index] != MPI_REQUEST_NULL && (requests[*index]->flags & NON_PERSISTENT)) - requests[*index] = MPI_REQUEST_NULL; flag = 1; nsleeps = 1; - }else{ + if (requests[*index] != MPI_REQUEST_NULL && (requests[*index]->flags & NON_PERSISTENT)) { + requests[*index] = MPI_REQUEST_NULL; + } + } else { nsleeps++; } - }else{ + } else { //all requests are null or inactive, return true - flag=1; + flag = 1; smpi_empty_status(status); } - xbt_free(map); - xbt_dynar_free(&comms); return flag; } @@ -949,7 +946,7 @@ int smpi_mpi_waitany(int count, MPI_Request requests[], MPI_Status * status) } } if(size > 0) { - i = simcall_comm_waitany(comms); + i = simcall_comm_waitany(comms, -1); // not MPI_UNDEFINED, as this is a simix return code if (i != -1) {