X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/22b2c593b45953ab140619d064cc5574fa9d9615..b51da37243dc16575499f4cb7729fe8bdd7fa514:/src/smpi/smpi_base.cpp diff --git a/src/smpi/smpi_base.cpp b/src/smpi/smpi_base.cpp index fb4314d342..d60b2bff16 100644 --- a/src/smpi/smpi_base.cpp +++ b/src/smpi/smpi_base.cpp @@ -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,17 +127,21 @@ 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; @@ -154,7 +152,7 @@ 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(size_t 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 : %zu <= %ld return %.10f", 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,7 +168,7 @@ static double smpi_os(size_t size) current = fact.values[0]+fact.values[1]*size; } } - XBT_DEBUG("Searching for smpi/os: %zu 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; } @@ -180,13 +178,13 @@ 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 : %zu <= %ld return %.10f", 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,7 +192,7 @@ static double smpi_ois(size_t size) current = fact.values[0]+fact.values[1]*size; } } - XBT_DEBUG("Searching for smpi/ois: %zu 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; } @@ -204,14 +202,16 @@ 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 : %zu <= %ld return %.10f", 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(size_t size) current=fact.values[0]+fact.values[1]*size; } } - XBT_DEBUG("smpi_or: %zu 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,16 +773,18 @@ 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 flag = 0; *index = MPI_UNDEFINED; - comms = xbt_dynar_new(sizeof(smx_synchro_t), nullptr); + 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); + comms.push_back(requests[i]->action); map.push_back(i); } } @@ -792,7 +794,7 @@ int smpi_mpi_testany(int count, MPI_Request requests[], int *index, MPI_Status * if(smpi_test_sleep > 0) simcall_process_sleep(nsleeps*smpi_test_sleep); - i = simcall_comm_testany(comms); // The i-th element in comms matches! + 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); @@ -809,7 +811,6 @@ int smpi_mpi_testany(int count, MPI_Request requests[], int *index, MPI_Status * flag = 1; smpi_empty_status(status); } - xbt_dynar_free(&comms); return flag; } @@ -945,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) {