- New section: Configuring the logs from the command line.
- New section: Programming API of logs.
+Fixed bugs (FG#.. -> FramaGit bugs; FG!.. -> FG merge requests)
+ (FG: issues on Framagit; GF: issues on GForge; GH: issues on GitHub)
+- FG#37: Parallel tasks are limited to 1 core per host
+
----------------------------------------------------------------------------
SimGrid (3.26) December 15. 2020
auto* res = new s4u::Host(name);
res->set_netpoint(new NetPoint(name, NetPoint::Type::Host, this));
- surf_cpu_model_pm->create_cpu(res, speed_per_pstate, core_amount);
+ surf_cpu_model_pm->create_cpu(res, speed_per_pstate)->set_core_count(core_amount)->seal();
return res;
}
for (int i = 0; i < physical_host->get_pstate_count(); i++)
speeds.push_back(physical_host->get_pstate_speed(i));
- surf_cpu_model_vm->create_cpu(this, speeds, core_amount);
+ surf_cpu_model_vm->create_cpu(this, speeds)->set_core_count(core_amount)->seal();
if (physical_host->get_pstate() != 0)
set_pstate(physical_host->get_pstate());
surf_cpu_model_pm = nullptr;
}
-Cpu* CpuCas01Model::create_cpu(s4u::Host* host, const std::vector<double>& speed_per_pstate, int core)
+Cpu* CpuCas01Model::create_cpu(s4u::Host* host, const std::vector<double>& speed_per_pstate)
{
- return new CpuCas01(this, host, speed_per_pstate, core);
+ return (new CpuCas01(host, speed_per_pstate))->set_model(this);
}
/************
* Resource *
************/
-CpuCas01::CpuCas01(CpuCas01Model* model, s4u::Host* host, const std::vector<double>& speed_per_pstate, int core)
- : Cpu(host, speed_per_pstate)
-{
- this->set_core_count(core)->set_model(model)->set_constraint(
- model->get_maxmin_system()->constraint_new(this, core * speed_per_pstate.front()));
-}
-
-CpuCas01::~CpuCas01() = default;
-
bool CpuCas01::is_used() const
{
return get_model()->get_maxmin_system()->constraint_used(get_constraint());
CpuCas01Model& operator=(const CpuCas01Model&) = delete;
~CpuCas01Model() override;
- Cpu* create_cpu(s4u::Host* host, const std::vector<double>& speed_per_pstate, int core) override;
+ Cpu* create_cpu(s4u::Host* host, const std::vector<double>& speed_per_pstate) override;
};
/************
class CpuCas01 : public Cpu {
public:
- CpuCas01(CpuCas01Model* model, s4u::Host* host, const std::vector<double>& speed_per_pstate, int core);
+ CpuCas01(s4u::Host* host, const std::vector<double>& speed_per_pstate) : Cpu(host, speed_per_pstate) {}
+ ~CpuCas01() = default;
CpuCas01(const CpuCas01&) = delete;
CpuCas01& operator=(const CpuCas01&) = delete;
- ~CpuCas01() override;
void apply_event(profile::Event* event, double value) override;
CpuAction* execution_start(double size) override;
CpuAction* execution_start(double size, int requested_cores) override;
* 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_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;
}
void Cpu::seal()
{
+ 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();
}
* This ignores any potential external load coming from a trace.
* @param core The number of core of this Cpu
*/
- virtual Cpu* create_cpu(s4u::Host* host, const std::vector<double>& speed_per_pstate, int core) = 0;
+ virtual Cpu* create_cpu(s4u::Host* host, const std::vector<double>& speed_per_pstate) = 0;
void update_actions_state_lazy(double now, double delta) override;
void update_actions_state_full(double now, double delta) override;
surf_cpu_model_pm = nullptr;
}
-Cpu* CpuTiModel::create_cpu(s4u::Host* host, const std::vector<double>& speed_per_pstate, int core)
+Cpu* CpuTiModel::create_cpu(s4u::Host* host, const std::vector<double>& speed_per_pstate)
{
- return new CpuTi(this, host, speed_per_pstate, core);
+ return (new CpuTi(host, speed_per_pstate))->set_model(this);
}
double CpuTiModel::next_occurring_event(double now)
/************
* Resource *
************/
-CpuTi::CpuTi(CpuTiModel* model, s4u::Host* host, const std::vector<double>& speed_per_pstate, int core)
- : Cpu(host, speed_per_pstate)
+CpuTi::CpuTi(s4u::Host* host, const std::vector<double>& speed_per_pstate) : Cpu(host, speed_per_pstate)
{
- xbt_assert(core == 1, "Multi-core not handled by this model yet");
- this->set_model(model);
-
speed_.peak = speed_per_pstate.front();
XBT_DEBUG("CPU create: peak=%f", speed_.peak);
************/
class CpuTi : public Cpu {
public:
- CpuTi(CpuTiModel* model, s4u::Host* host, const std::vector<double>& speed_per_pstate, int core);
+ CpuTi(s4u::Host* host, const std::vector<double>& speed_per_pstate);
CpuTi(const CpuTi&) = delete;
CpuTi& operator&(const CpuTi&) = delete;
~CpuTi() override;
CpuTiModel(const CpuTiModel&) = delete;
CpuTiModel& operator=(const CpuTiModel&) = delete;
~CpuTiModel() override;
- Cpu* create_cpu(s4u::Host* host, const std::vector<double>& speed_per_pstate, int core) override;
+ Cpu* create_cpu(s4u::Host* host, const std::vector<double>& speed_per_pstate) override;
double next_occurring_event(double now) override;
void update_actions_state(double now, double delta) override;
/* Expand it for the CPUs even if there is nothing to compute, to make sure that it gets expended even if there is no
* communication either */
- for (size_t i = 0; i < host_list.size(); i++)
+ double bound = std::numeric_limits<double>::max();
+ for (size_t i = 0; i < host_list.size(); i++) {
model->get_maxmin_system()->expand(host_list[i]->pimpl_cpu->get_constraint(), get_variable(),
(flops_amount == nullptr ? 0.0 : flops_amount[i]));
+ if (flops_amount && flops_amount[i] > 0)
+ bound = std::min(bound, host_list[i]->pimpl_cpu->get_speed(1.0) * host_list[i]->pimpl_cpu->get_speed_ratio() /
+ flops_amount[i]);
+ }
+ if (bound < std::numeric_limits<double>::max())
+ model->get_maxmin_system()->update_variable_bound(get_variable(), bound);
if (bytes_amount != nullptr) {
for (size_t k = 0; k < host_list.size() * host_list.size(); k++) {
return res;
}
-kernel::resource::Cpu* CpuL07Model::create_cpu(s4u::Host* host, const std::vector<double>& speed_per_pstate, int core)
+kernel::resource::Cpu* CpuL07Model::create_cpu(s4u::Host* host, const std::vector<double>& speed_per_pstate)
{
- return new CpuL07(this, host, speed_per_pstate, core);
+ return (new CpuL07(host, speed_per_pstate))->set_model(this);
}
kernel::resource::LinkImpl* NetworkL07Model::create_link(const std::string& name, const std::vector<double>& bandwidths,
* Resource *
************/
-CpuL07::CpuL07(CpuL07Model* model, simgrid::s4u::Host* host, const std::vector<double>& speed_per_pstate, int core)
- : Cpu(host, speed_per_pstate)
-{
- this->set_core_count(core)->set_model(model)->set_constraint(
- model->get_maxmin_system()->constraint_new(this, speed_per_pstate.front()));
-}
-
-CpuL07::~CpuL07()=default;
-
kernel::resource::CpuAction* CpuL07::execution_start(double size)
{
std::vector<s4u::Host*> host_list = {get_iface()};
CpuL07Model& operator=(const CpuL07Model&) = delete;
~CpuL07Model() override;
- kernel::resource::Cpu* create_cpu(s4u::Host* host, const std::vector<double>& speed_per_pstate, int core) override;
+ kernel::resource::Cpu* create_cpu(s4u::Host* host, const std::vector<double>& speed_per_pstate) override;
HostL07Model *hostModel_;
};
class CpuL07 : public kernel::resource::Cpu {
public:
- CpuL07(CpuL07Model* model, s4u::Host* host, const std::vector<double>& speed_per_pstate, int core);
+ CpuL07(s4u::Host* host, const std::vector<double>& speed_per_pstate) : Cpu(host, speed_per_pstate){};
+ ~CpuL07() = default;
CpuL07(const CpuL07&) = delete;
CpuL07& operator=(const CpuL07&) = delete;
- ~CpuL07() override;
+
bool is_used() const override;
void apply_event(kernel::profile::Event* event, double value) override;
kernel::resource::CpuAction* execution_start(double size) override;