#include "src/surf/surf_interface.hpp"
#include "surf/surf.hpp"
+#include <algorithm>
+
constexpr double EPSILON = 0.000000001;
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(surf_cpu_ti, surf_cpu, "Logging specific to the SURF CPU TRACE INTEGRATION module");
namespace simgrid {
-namespace surf {
+namespace kernel {
+namespace resource {
/*********
* Trace *
*********/
-CpuTiProfile::CpuTiProfile(kernel::profile::Profile* profile)
+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);
}
/**
{
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],
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]));
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_;
}
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) {
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);
/**
* @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<double>& 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;
}
/*********
* Model *
*********/
-namespace simgrid {
-namespace surf {
void CpuTiModel::create_pm_vm_models()
{
xbt_assert(surf_cpu_model_pm == nullptr, "CPU model already initialized. This should not happen.");
xbt_assert(surf_cpu_model_vm == nullptr, "CPU model already initialized. This should not happen.");
- surf_cpu_model_pm = new simgrid::surf::CpuTiModel();
- surf_cpu_model_vm = new simgrid::surf::CpuTiModel();
+ surf_cpu_model_pm = new simgrid::kernel::resource::CpuTiModel();
+ surf_cpu_model_vm = new simgrid::kernel::resource::CpuTiModel();
}
CpuTiModel::CpuTiModel() : CpuModel(Model::UpdateAlgo::FULL)
return get_remains_no_update();
}
-}
-}
+} // namespace resource
+} // namespace kernel
+} // namespace simgrid