X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/fdab189916cad1bf47afa4f3c272c8ba26c36ed1..cc79d648c6fd0e8fc281e263c24fe72adbe59769:/src/surf/cpu_ti.cpp diff --git a/src/surf/cpu_ti.cpp b/src/surf/cpu_ti.cpp index 46872d2340..997b716ae3 100644 --- a/src/surf/cpu_ti.cpp +++ b/src/surf/cpu_ti.cpp @@ -8,6 +8,8 @@ #include "src/surf/surf_interface.hpp" #include "surf/surf.hpp" +#include + constexpr double EPSILON = 0.000000001; XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_cpu_ti, surf_cpu, "Logging specific to the SURF CPU TRACE INTEGRATION module"); @@ -24,30 +26,17 @@ CpuTiProfile::CpuTiProfile(profile::Profile* profile) { double integral = 0; double time = 0; - int i = 0; - nb_points_ = profile->event_list.size() + 1; - time_points_ = new double[nb_points_]; - integral_ = new double[nb_points_]; + unsigned nb_points = profile->event_list.size() + 1; + time_points_.reserve(nb_points); + integral_.reserve(nb_points); for (auto const& val : profile->event_list) { - time_points_[i] = time; - integral_[i] = integral; - integral += val.date_ * val.value_; + time_points_.push_back(time); + integral_.push_back(integral); time += val.date_; - i++; + integral += val.date_ * val.value_; } - time_points_[i] = time; - integral_[i] = integral; -} - -CpuTiProfile::~CpuTiProfile() -{ - delete[] time_points_; - delete [] integral_; -} - -CpuTiTmgr::~CpuTiTmgr() -{ - delete profile_; + time_points_.push_back(time); + integral_.push_back(integral); } /** @@ -113,7 +102,7 @@ double CpuTiProfile::integrate_simple_point(double a) { double integral = 0; double a_aux = a; - int ind = binary_search(time_points_, a, 0, nb_points_ - 1); + int ind = binary_search(time_points_, a); integral += integral_[ind]; XBT_DEBUG("a %f ind %d integral %f ind + 1 %f ind %f time +1 %f time %f", a, ind, integral, integral_[ind + 1], @@ -195,7 +184,7 @@ double CpuTiTmgr::solve(double a, double amount) double CpuTiProfile::solve_simple(double a, double amount) { double integral_a = integrate_simple_point(a); - int ind = binary_search(integral_, integral_a + amount, 0, nb_points_ - 1); + int ind = binary_search(integral_, integral_a + amount); double time = time_points_[ind]; time += (integral_a + amount - integral_[ind]) / ((integral_[ind + 1] - integral_[ind]) / (time_points_[ind + 1] - time_points_[ind])); @@ -213,7 +202,7 @@ double CpuTiProfile::solve_simple(double a, double amount) double CpuTiTmgr::get_power_scale(double a) { double reduced_a = a - floor(a / last_time_) * last_time_; - int point = profile_->binary_search(profile_->time_points_, reduced_a, 0, profile_->nb_points_ - 1); + int point = CpuTiProfile::binary_search(profile_->time_points_, reduced_a); kernel::profile::DatedValue val = speed_profile_->event_list.at(point); return val.value_; } @@ -228,7 +217,7 @@ double CpuTiTmgr::get_power_scale(double a) CpuTiTmgr::CpuTiTmgr(kernel::profile::Profile* speed_profile, double value) : speed_profile_(speed_profile) { double total_time = 0.0; - profile_ = 0; + profile_.reset(nullptr); /* no availability file, fixed trace */ if (not speed_profile) { @@ -251,7 +240,7 @@ CpuTiTmgr::CpuTiTmgr(kernel::profile::Profile* speed_profile, double value) : sp for (auto const& val : speed_profile->event_list) total_time += val.date_; - profile_ = new CpuTiProfile(speed_profile); + profile_.reset(new CpuTiProfile(speed_profile)); last_time_ = total_time; total_ = profile_->integrate_simple(0, total_time); @@ -260,29 +249,17 @@ CpuTiTmgr::CpuTiTmgr(kernel::profile::Profile* speed_profile, double value) : sp /** * @brief Binary search in array. - * It returns the first point of the interval in which "a" is. + * It returns the last point of the interval in which "a" is. * @param array Array * @param a Value to search - * @param low Low bound to search in array - * @param high Upper bound to search in array * @return Index of point */ -int CpuTiProfile::binary_search(double* array, double a, int low, int high) +int CpuTiProfile::binary_search(const std::vector& array, double a) { - xbt_assert(low < high, "Wrong parameters: low (%d) should be smaller than high (%d)", low, high); - - do { - int mid = low + (high - low) / 2; - XBT_DEBUG("a %f low %d high %d mid %d value %f", a, low, high, mid, array[mid]); - - if (array[mid] > a) - high = mid; - else - low = mid; - } - while (low < high - 1); - - return low; + if (array[0] > a) + return 0; + auto pos = std::upper_bound(begin(array), end(array), a); + return std::distance(begin(array), pos) - 1; } /*********