X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/e8e45482e5bc7f26685b40e12884e8bab8f0fab8..3d04e86369329fc50278341b47224953f0095a2a:/src/smpi/SmpiHost.cpp diff --git a/src/smpi/SmpiHost.cpp b/src/smpi/SmpiHost.cpp index 962ea77cb6..79ea6b199d 100644 --- a/src/smpi/SmpiHost.cpp +++ b/src/smpi/SmpiHost.cpp @@ -1,7 +1,6 @@ #include "smpi/smpi_utils.hpp" #include "src/smpi/SmpiHost.hpp" -#include "src/surf/virtual_machine.hpp" - +#include #include #include @@ -14,17 +13,9 @@ simgrid::xbt::Extension SmpiHost::EXTENSION_ID; double SmpiHost::orecv(size_t size) { - if (orecv_parsed_values.empty()) { - if (orecv_.empty()) { - std::string test = xbt_cfg_get_string("smpi/or"); - orecv_parsed_values = parse_factor(xbt_cfg_get_string("smpi/or")); - } - else - 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! @@ -43,32 +34,89 @@ 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 - simgrid::surf::HostImpl* surf_host = host.extension(); - if (dynamic_cast(surf_host)) + if (dynamic_cast(&host)) return; }