* under the terms of the license (GNU LGPL) which comes with this package. */
#include "cpu_interface.hpp"
+#include "cpu_ti.hpp"
#include "src/kernel/resource/profile/Profile.hpp"
#include "src/surf/surf_interface.hpp"
#include "surf/surf.hpp"
XBT_LOG_NEW_DEFAULT_SUBCATEGORY(res_cpu, ker_resource, "CPU resource, fueling execution activites");
-simgrid::kernel::resource::CpuModel* surf_cpu_model_pm;
-simgrid::kernel::resource::CpuModel* surf_cpu_model_vm;
-
namespace simgrid {
namespace kernel {
namespace resource {
Cpu::Cpu(s4u::Host* host, const std::vector<double>& speed_per_pstate)
: Resource_T(host->get_cname()), piface_(host), speed_per_pstate_(speed_per_pstate)
{
- speed_.scale = 1;
+ speed_.scale = 1;
speed_.peak = speed_per_pstate_.front();
host->pimpl_cpu = this;
}
this->speed_per_pstate_.assign(that->speed_per_pstate_.begin(), that->speed_per_pstate_.end());
}
-void Cpu::set_pstate(int pstate_index)
+Cpu* Cpu::set_pstate(int pstate_index)
{
xbt_assert(pstate_index <= static_cast<int>(speed_per_pstate_.size()),
"Invalid parameters for CPU %s (pstate %d > length of pstates %d). Please fix your platform file, or your "
get_cname(), pstate_index, static_cast<int>(speed_per_pstate_.size()));
double new_peak_speed = speed_per_pstate_[pstate_index];
- pstate_ = pstate_index;
- speed_.peak = new_peak_speed;
+ pstate_ = pstate_index;
+ speed_.peak = new_peak_speed;
on_speed_change();
+ return this;
+}
+
+Cpu* Cpu::set_pstate_speed(const std::vector<double>& speed_per_state)
+{
+ xbt_assert(speed_per_state.size() > 0, "CPU %s: processor speed vector cannot be empty", get_cname());
+ xbt_assert(not is_sealed(), "CPU %s: processor speed cannot be changed once CPU has been sealed", get_cname());
+ speed_per_pstate_ = speed_per_state;
+ speed_.peak = speed_per_pstate_.front();
+ return this;
}
double Cpu::get_pstate_peak_speed(int pstate_index) const
{
xbt_assert(not is_sealed(), "Core count cannot be changed once CPU has been sealed");
xbt_assert(core_count > 0, "Host %s must have at least one core, not 0.", piface_->get_cname());
+ if (dynamic_cast<CpuTiModel*>(get_model()) != nullptr)
+ xbt_assert(core_count == 1, "Multi-core not handled by this model yet");
+
core_count_ = core_count;
return this;
}
return core_count_;
}
-void Cpu::set_speed_profile(kernel::profile::Profile* profile)
+Cpu* Cpu::set_speed_profile(kernel::profile::Profile* profile)
{
- xbt_assert(speed_.event == nullptr, "Cannot set a second speed trace to Host %s", piface_->get_cname());
-
- speed_.event = profile->schedule(&profile::future_evt_set, this);
+ if (profile) {
+ xbt_assert(speed_.event == nullptr, "Cannot set a second speed trace to Host %s", piface_->get_cname());
+ speed_.event = profile->schedule(&profile::future_evt_set, this);
+ }
+ return this;
}
void Cpu::seal()
{
+ if (is_sealed()) {
+ return;
+ }
+ lmm::System* lmm = get_model()->get_maxmin_system();
+ if (dynamic_cast<CpuTiModel*>(get_model()) == nullptr)
+ this->set_constraint(lmm->constraint_new(this, core_count_ * speed_per_pstate_.front()));
Resource::seal();
}
xbt::signal<void(CpuAction const&, Action::State)> CpuAction::on_state_change;
-void CpuAction::suspend(){
+void CpuAction::suspend()
+{
Action::State previous = get_state();
on_state_change(*this, previous);
Action::suspend();
}
-void CpuAction::resume(){
+void CpuAction::resume()
+{
Action::State previous = get_state();
on_state_change(*this, previous);
Action::resume();