* under the terms of the license (GNU LGPL) which comes with this package. */
#include "cpu_ti.hpp"
-#include "src/kernel/resource/profile/trace_mgr.hpp"
+#include "src/kernel/resource/profile/Event.hpp"
+#include "src/kernel/resource/profile/Profile.hpp"
#include "src/surf/surf_interface.hpp"
#include "surf/surf.hpp"
{
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, nb_points_);
+ 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, nb_points_);
+ 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, profile_->nb_points_);
+ 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);
* It returns the last point of the interval in which "a" is.
* @param array Array
* @param a Value to search
- * @param size Size of the array
* @return Index of point
*/
-int CpuTiProfile::binary_search(double* array, double a, int size)
+int CpuTiProfile::binary_search(const std::vector<double>& array, double a)
{
- xbt_assert(size > 0, "Wrong parameters: empty array");
if (array[0] > a)
return 0;
- auto pos = std::upper_bound(array, array + size, a);
- return std::distance(array, pos) - 1;
+ auto pos = std::upper_bound(begin(array), end(array), a);
+ return std::distance(begin(array), pos) - 1;
}
/*********
return new CpuTi(this, host, speed_per_pstate, core);
}
-double CpuTiModel::next_occuring_event(double now)
+double CpuTiModel::next_occurring_event(double now)
{
double min_action_duration = -1;
void CpuTiModel::update_actions_state(double now, double /*delta*/)
{
while (not get_action_heap().empty() && double_equals(get_action_heap().top_date(), now, sg_surf_precision)) {
- CpuTiAction* action = static_cast<CpuTiAction*>(get_action_heap().pop());
+ auto* action = static_cast<CpuTiAction*>(get_action_heap().pop());
XBT_DEBUG("Action %p: finish", action);
action->finish(kernel::resource::Action::State::FINISHED);
/* update remaining amount of all actions */
if (profile && profile->event_list.size() > 1) {
kernel::profile::DatedValue val = profile->event_list.back();
if (val.date_ < 1e-12) {
- simgrid::kernel::profile::Profile* prof = new simgrid::kernel::profile::Profile();
- speed_.event = prof->schedule(&future_evt_set, this);
+ auto* prof = new simgrid::kernel::profile::Profile();
+ speed_.event = prof->schedule(&profile::future_evt_set, this);
}
}
}
continue;
/* bogus priority, skip it */
- if (action.get_priority() <= 0)
+ if (action.get_sharing_penalty() <= 0)
continue;
/* action suspended, skip it */
if (not action.is_running())
continue;
- sum_priority_ += 1.0 / action.get_priority();
+ sum_priority_ += 1.0 / action.get_sharing_penalty();
}
for (CpuTiAction& action : action_set_) {
continue;
/* verify if the action is really running on cpu */
- if (action.is_running() && action.get_priority() > 0) {
+ if (action.is_running() && action.get_sharing_penalty() > 0) {
/* total area needed to finish the action. Used in trace integration */
- double total_area = (action.get_remains() * sum_priority_ * action.get_priority()) / speed_.peak;
+ double total_area = (action.get_remains() * sum_priority_ * action.get_sharing_penalty()) / speed_.peak;
action.set_finish_time(speed_integrated_trace_->solve(now, total_area));
/* verify which event will happen before (max_duration or finish time) */
continue;
/* bogus priority, skip it */
- if (action.get_priority() <= 0)
+ if (action.get_sharing_penalty() <= 0)
continue;
/* action suspended, skip it */
continue;
/* update remaining */
- action.update_remains(area_total / (sum_priority_ * action.get_priority()));
+ action.update_remains(area_total / (sum_priority_ * action.get_sharing_penalty()));
XBT_DEBUG("Update remaining action(%p) remaining %f", &action, action.get_remains_no_update());
}
last_update_ = now;
kernel::resource::CpuAction* CpuTi::execution_start(double size)
{
XBT_IN("(%s,%g)", get_cname(), size);
- CpuTiAction* action = new CpuTiAction(this, size);
+ auto* action = new CpuTiAction(this, size);
action_set_.push_back(*action); // Actually start the action
duration = std::max(duration, sg_surf_precision);
XBT_IN("(%s,%g)", get_cname(), duration);
- CpuTiAction* action = new CpuTiAction(this, 1.0);
+ auto* action = new CpuTiAction(this, 1.0);
action->set_max_duration(duration);
action->set_suspend_state(kernel::resource::Action::SuspendStates::SLEEPING);
XBT_OUT();
}
-void CpuTiAction::set_priority(double priority)
+void CpuTiAction::set_sharing_penalty(double sharing_penalty)
{
- XBT_IN("(%p,%g)", this, priority);
- set_priority_no_update(priority);
+ XBT_IN("(%p,%g)", this, sharing_penalty);
+ set_sharing_penalty_no_update(sharing_penalty);
cpu_->set_modified(true);
XBT_OUT();
}