From: Christian Heinrich Date: Wed, 12 Apr 2017 09:48:31 +0000 (+0200) Subject: [SMPI] Updated the SmpiHost class X-Git-Tag: v3.16~360^2 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/12c9c99ef8dd3707619940a88776a13d143942ba [SMPI] Updated the SmpiHost class - Now supports oisend, osend, orecv values on a per-host basis - Removed cruft --- diff --git a/src/smpi/SmpiHost.cpp b/src/smpi/SmpiHost.cpp index cc1ec29b3f..79ea6b199d 100644 --- a/src/smpi/SmpiHost.cpp +++ b/src/smpi/SmpiHost.cpp @@ -13,17 +13,9 @@ simgrid::xbt::Extension SmpiHost::EXTENSION_ID; double SmpiHost::orecv(size_t size) { - if (orecv_parsed_values.empty()) { - if (orecv_.empty()) { /* This is currently always true since orecv_ is not really used yet. */ - /* Get global value */ - orecv_parsed_values = parse_factor(xbt_cfg_get_string("smpi/or")); - } - else /* Can currently not be reached, see above */ - orecv_parsed_values = parse_factor(orecv_.c_str()); - } - - double current=orecv_parsed_values.empty()?0.0:orecv_parsed_values.front().values[0]+orecv_parsed_values.front().values[1]*size; - + double current = orecv_parsed_values.empty() ? 0.0 : orecv_parsed_values.front().values[0] + + orecv_parsed_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 vector we iterate over! @@ -42,29 +34,87 @@ double SmpiHost::orecv(size_t size) return current; } +double SmpiHost::osend(size_t size) +{ + double current = + osend_parsed_values.empty() ? 0.0 : osend_parsed_values[0].values[0] + osend_parsed_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 vector we iterate over! + for (auto& fact : osend_parsed_values) { + if (size <= fact.factor) { // Values already too large, use the previously computed value of 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. + // Hence, save the cost, as we might have to use it. + current = fact.values[0] + fact.values[1] * size; + } + } + XBT_DEBUG("Searching for smpi/os: %zu is larger than the largest boundary, return %.10f", size, current); + + return current; +} + +double SmpiHost::oisend(size_t size) +{ + double current = + oisend_parsed_values.empty() ? 0.0 : oisend_parsed_values[0].values[0] + oisend_parsed_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 vector we iterate over! + for (auto& fact : oisend_parsed_values) { + if (size <= fact.factor) { // Values already too large, use the previously computed value of 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. + // Hence, save the cost, as we might have to use it. + current = fact.values[0] + fact.values[1] * size; + } + } + XBT_DEBUG("Searching for smpi/ois: %zu is larger than the largest boundary, return %.10f", size, current); + + return current; +} + SmpiHost::SmpiHost(simgrid::s4u::Host *ptr) : host(ptr) { if (!SmpiHost::EXTENSION_ID.valid()) SmpiHost::EXTENSION_ID = simgrid::s4u::Host::extension_create(); - // if (host->properties() != nullptr) { - // char* off_power_str = (char*)xbt_dict_get_or_null(host->properties(), "watt_off"); - // if (off_power_str != nullptr) { - // char *msg = bprintf("Invalid value for property watt_off of host %s: %%s",host->name().c_str()); - // watts_off = xbt_str_parse_double(off_power_str, msg); - // xbt_free(msg); - // } - // else - // watts_off = 0; - // } + const char* orecv_string = host->property("smpi/or"); + if (orecv_string != nullptr) { + orecv_parsed_values = parse_factor(orecv_string); + } else { + orecv_parsed_values = parse_factor(xbt_cfg_get_string("smpi/or")); + } + + const char* osend_string = host->property("smpi/os"); + if (osend_string != nullptr) { + osend_parsed_values = parse_factor(osend_string); + } else { + osend_parsed_values = parse_factor(xbt_cfg_get_string("smpi/os")); + } + + const char* oisend_string = host->property("smpi/ois"); + if (oisend_string != nullptr) { + oisend_parsed_values = parse_factor(oisend_string); + } else { + oisend_parsed_values = parse_factor(xbt_cfg_get_string("smpi/ois")); + } } SmpiHost::~SmpiHost()=default; -static void onCreation(simgrid::s4u::Host& host) { +static void onCreation(simgrid::s4u::Host& host) +{ } -static void onHostDestruction(simgrid::s4u::Host& host) { +static void onHostDestruction(simgrid::s4u::Host& host) +{ // Ignore virtual machines if (dynamic_cast(&host)) return; diff --git a/src/smpi/SmpiHost.hpp b/src/smpi/SmpiHost.hpp index fe810d3747..d746dd305f 100644 --- a/src/smpi/SmpiHost.hpp +++ b/src/smpi/SmpiHost.hpp @@ -22,6 +22,8 @@ class SmpiHost { private: std::vector orecv_parsed_values; + std::vector osend_parsed_values; + std::vector oisend_parsed_values; simgrid::s4u::Host *host = nullptr; public: @@ -30,12 +32,9 @@ class SmpiHost { explicit SmpiHost(simgrid::s4u::Host *ptr); ~SmpiHost(); - double wtime; - double osend; - double oisend; - std::string orecv_; double orecv(size_t size); - + double osend(size_t size); + double oisend(size_t size); }; } diff --git a/src/smpi/smpi_request.cpp b/src/smpi/smpi_request.cpp index f7ca04bc9f..3cb606554a 100644 --- a/src/smpi/smpi_request.cpp +++ b/src/smpi/smpi_request.cpp @@ -22,87 +22,10 @@ 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); -std::vector smpi_os_values; -std::vector smpi_or_values; std::vector smpi_ois_values; extern void (*smpi_comm_copy_data_callback) (smx_activity_t, void*, size_t); -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=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) - // Note: parse_factor() (used before) already sorts the vector we iterate over! - 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 <= %zu return %.10f", size, fact.factor, current); - return current; - }else{ - // If the next section is too large, the current section must be used. - // Hence, save the cost, as we might have to use it. - current = fact.values[0]+fact.values[1]*size; - } - } - XBT_DEBUG("Searching for smpi/os: %zu is larger than the largest boundary, return %.10f", size, current); - - return current; -} - -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=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 vector 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 <= %zu return %.10f", size, fact.factor, current); - return current; - }else{ - // If the next section is too large, the current section must be used. - // Hence, save the cost, as we might have to use it. - current = fact.values[0]+fact.values[1]*size; - } - } - XBT_DEBUG("Searching for smpi/ois: %zu is larger than the largest boundary, return %.10f", size, current); - - return current; -} - -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=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 vector 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 <= %zu return %.10f", size, fact.factor, current); - return current; - } else { - // If the next section is too large, the current section must be used. - // Hence, save the cost, as we might have to use it. - current=fact.values[0]+fact.values[1]*size; - } - } - XBT_DEBUG("smpi_or: %zu is larger than largest boundary, return %.10f", size, current); - - return current; -} - namespace simgrid{ namespace smpi{ @@ -473,7 +396,7 @@ void Request::start() if(!(old_type_->flags() & DT_FLAG_DERIVED)){ oldbuf = buf_; if (!process->replaying() && oldbuf != nullptr && size_!=0){ - if((smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP) + if((smpi_privatize_global_variables != 0) && (static_cast(buf_) >= smpi_start_data_exe) && (static_cast(buf_) < smpi_start_data_exe + smpi_size_data_exe )){ XBT_DEBUG("Privatization : We are sending from a zone inside global memory. Switch data segment "); @@ -488,9 +411,11 @@ void Request::start() //if we are giving back the control to the user without waiting for completion, we have to inject timings double sleeptime = 0.0; - if(detached_ != 0 || ((flags_ & (ISEND|SSEND)) != 0)){// issend should be treated as isend - //isend and send timings may be different - sleeptime = ((flags_ & ISEND) != 0) ? smpi_ois(size_) : smpi_os(size_); + if (detached_ != 0 || ((flags_ & (ISEND | SSEND)) != 0)) { // issend should be treated as isend + // isend and send timings may be different + sleeptime = ((flags_ & ISEND) != 0) + ? simgrid::s4u::Actor::self()->host()->extension()->oisend(size_) + : simgrid::s4u::Actor::self()->host()->extension()->osend(size_); } if(sleeptime > 0.0){ @@ -767,7 +692,7 @@ void Request::finish_wait(MPI_Request* request, MPI_Status * status) if((((req->flags_ & ACCUMULATE) != 0) || (datatype->flags() & DT_FLAG_DERIVED)) && (!smpi_is_shared(req->old_buf_))){ if (!smpi_process()->replaying()){ - if( smpi_privatize_global_variables == SMPI_PRIVATIZE_MMAP && (static_cast(req->old_buf_) >= smpi_start_data_exe) + if( smpi_privatize_global_variables != 0 && (static_cast(req->old_buf_) >= smpi_start_data_exe) && ((char*)req->old_buf_ < smpi_start_data_exe + smpi_size_data_exe )){ XBT_VERB("Privatization : We are unserializing to a zone in global memory Switch data segment "); smpi_switch_data_segment(smpi_process()->index());