A
lgorithmique
N
umérique
D
istribuée
Public GIT Repository
projects
/
simgrid.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[sonar] Remove variadic functions.
[simgrid.git]
/
src
/
plugins
/
host_dvfs.cpp
diff --git
a/src/plugins/host_dvfs.cpp
b/src/plugins/host_dvfs.cpp
index
ab8d054
..
04d3738
100644
(file)
--- a/
src/plugins/host_dvfs.cpp
+++ b/
src/plugins/host_dvfs.cpp
@@
-1,4
+1,4
@@
-/* Copyright (c) 2010-201
8
. The SimGrid Team. All rights reserved. */
+/* Copyright (c) 2010-201
9
. The SimGrid Team. All rights reserved. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
/* This program is free software; you can redistribute it and/or modify it
* under the terms of the license (GNU LGPL) which comes with this package. */
@@
-6,12
+6,18
@@
#include "simgrid/plugins/dvfs.h"
#include "simgrid/plugins/load.h"
#include "simgrid/s4u/Engine.hpp"
#include "simgrid/plugins/dvfs.h"
#include "simgrid/plugins/load.h"
#include "simgrid/s4u/Engine.hpp"
+#include "src/internal_config.h" // HAVE_SMPI
#include "src/kernel/activity/ExecImpl.hpp"
#include "src/plugins/vm/VirtualMachineImpl.hpp"
#include "src/kernel/activity/ExecImpl.hpp"
#include "src/plugins/vm/VirtualMachineImpl.hpp"
+#if HAVE_SMPI
#include "src/smpi/plugins/ampi/ampi.hpp"
#include "src/smpi/plugins/ampi/ampi.hpp"
+#endif
#include <xbt/config.hpp>
#include <boost/algorithm/string.hpp>
#include <xbt/config.hpp>
#include <boost/algorithm/string.hpp>
+#if HAVE_SMPI
+#include "src/smpi/include/smpi_request.hpp"
+#endif
SIMGRID_REGISTER_PLUGIN(host_dvfs, "Dvfs support", &sg_host_dvfs_plugin_init)
SIMGRID_REGISTER_PLUGIN(host_dvfs, "Dvfs support", &sg_host_dvfs_plugin_init)
@@
-23,7
+29,9
@@
static simgrid::config::Flag<std::string> cfg_governor("plugin/dvfs/governor",
"Which Governor should be used that adapts the CPU frequency?", "performance",
std::map<std::string, std::string>({
"Which Governor should be used that adapts the CPU frequency?", "performance",
std::map<std::string, std::string>({
+#if HAVE_SMPI
{"adagio", "TODO: Doc"},
{"adagio", "TODO: Doc"},
+#endif
{"conservative", "TODO: Doc"},
{"ondemand", "TODO: Doc"},
{"performance", "TODO: Doc"},
{"conservative", "TODO: Doc"},
{"ondemand", "TODO: Doc"},
{"performance", "TODO: Doc"},
@@
-77,8
+85,8
@@
class Governor {
private:
simgrid::s4u::Host* const host_;
double sampling_rate_;
private:
simgrid::s4u::Host* const host_;
double sampling_rate_;
- int min_pstate;
- int max_pstate;
+ int min_pstate;
//< Never use a pstate less than this one
+ int max_pstate;
//< Never use a pstate larger than this one
public:
explicit Governor(simgrid::s4u::Host* ptr)
public:
explicit Governor(simgrid::s4u::Host* ptr)
@@
-91,6
+99,8
@@
public:
virtual ~Governor() = default;
virtual std::string get_name() const = 0;
simgrid::s4u::Host* get_host() const { return host_; }
virtual ~Governor() = default;
virtual std::string get_name() const = 0;
simgrid::s4u::Host* get_host() const { return host_; }
+ int get_min_pstate() const { return min_pstate; }
+ int get_max_pstate() const { return max_pstate; }
void init()
{
void init()
{
@@
-133,7
+143,7
@@
public:
explicit Performance(simgrid::s4u::Host* ptr) : Governor(ptr) {}
std::string get_name() const override { return "Performance"; }
explicit Performance(simgrid::s4u::Host* ptr) : Governor(ptr) {}
std::string get_name() const override { return "Performance"; }
- void update() override { get_host()->set_pstate(
min_pstate
); }
+ void update() override { get_host()->set_pstate(
get_min_pstate()
); }
};
/**
};
/**
@@
-151,7
+161,7
@@
public:
explicit Powersave(simgrid::s4u::Host* ptr) : Governor(ptr) {}
std::string get_name() const override { return "Powersave"; }
explicit Powersave(simgrid::s4u::Host* ptr) : Governor(ptr) {}
std::string get_name() const override { return "Powersave"; }
- void update() override { get_host()->set_pstate(
max_pstate
); }
+ void update() override { get_host()->set_pstate(
get_max_pstate()
); }
};
/**
};
/**
@@
-180,8
+190,8
@@
public:
sg_host_load_reset(get_host()); // Only consider the period between two calls to this method!
if (load > freq_up_threshold_) {
sg_host_load_reset(get_host()); // Only consider the period between two calls to this method!
if (load > freq_up_threshold_) {
- get_host()->set_pstate(
min_pstate
); /* Run at max. performance! */
- XBT_INFO("Load: %f > threshold: %f --> changed to pstate %i", load, freq_up_threshold_,
min_pstate
);
+ get_host()->set_pstate(
get_min_pstate()
); /* Run at max. performance! */
+ XBT_INFO("Load: %f > threshold: %f --> changed to pstate %i", load, freq_up_threshold_,
get_min_pstate()
);
} else {
/* The actual implementation uses a formula here: (See Kernel file cpufreq_ondemand.c:158)
*
} else {
/* The actual implementation uses a formula here: (See Kernel file cpufreq_ondemand.c:158)
*
@@
-200,7
+210,6
@@
public:
XBT_DEBUG("Load: %f < threshold: %f --> changed to pstate %i", load, freq_up_threshold_, new_pstate);
}
}
XBT_DEBUG("Load: %f < threshold: %f --> changed to pstate %i", load, freq_up_threshold_, new_pstate);
}
}
-
};
/**
};
/**
@@
-230,7
+239,7
@@
public:
sg_host_load_reset(get_host()); // Only consider the period between two calls to this method!
if (load > freq_up_threshold_) {
sg_host_load_reset(get_host()); // Only consider the period between two calls to this method!
if (load > freq_up_threshold_) {
- if (pstate !=
min_pstate
) {
+ if (pstate !=
get_min_pstate()
) {
get_host()->set_pstate(pstate - 1);
XBT_INFO("Load: %f > threshold: %f -> increasing performance to pstate %d", load, freq_up_threshold_,
pstate - 1);
get_host()->set_pstate(pstate - 1);
XBT_INFO("Load: %f > threshold: %f -> increasing performance to pstate %d", load, freq_up_threshold_,
pstate - 1);
@@
-239,7
+248,7
@@
public:
freq_up_threshold_, pstate);
}
} else if (load < freq_down_threshold_) {
freq_up_threshold_, pstate);
}
} else if (load < freq_down_threshold_) {
- if (pstate !=
max_pstate
) { // Are we in the slowest pstate already?
+ if (pstate !=
get_max_pstate()
) { // Are we in the slowest pstate already?
get_host()->set_pstate(pstate + 1);
XBT_INFO("Load: %f < threshold: %f -> slowing down to pstate %d", load, freq_down_threshold_, pstate + 1);
} else {
get_host()->set_pstate(pstate + 1);
XBT_INFO("Load: %f < threshold: %f -> slowing down to pstate %d", load, freq_down_threshold_, pstate + 1);
} else {
@@
-250,6
+259,7
@@
public:
}
};
}
};
+#if HAVE_SMPI
class Adagio : public Governor {
private:
int best_pstate = 0;
class Adagio : public Governor {
private:
int best_pstate = 0;
@@
-257,14
+267,14
@@
private:
double comp_counter = 0;
double comp_timer = 0;
double comp_counter = 0;
double comp_timer = 0;
- std::vector<std::vector<double>> rates;
+ std::vector<std::vector<double>> rates;
// Each host + all frequencies of that host
unsigned int task_id = 0;
bool iteration_running = false; /*< Are we currently between iteration_in and iteration_out calls? */
public:
explicit Adagio(simgrid::s4u::Host* ptr)
unsigned int task_id = 0;
bool iteration_running = false; /*< Are we currently between iteration_in and iteration_out calls? */
public:
explicit Adagio(simgrid::s4u::Host* ptr)
- : Governor(ptr), rates(100, std::vector<double>(
host_
->get_pstate_count(), 0.0))
+ : Governor(ptr), rates(100, std::vector<double>(
ptr
->get_pstate_count(), 0.0))
{
simgrid::smpi::plugin::ampi::on_iteration_in.connect([this](simgrid::s4u::ActorPtr actor) {
// Every instance of this class subscribes to this event, so one per host
{
simgrid::smpi::plugin::ampi::on_iteration_in.connect([this](simgrid::s4u::ActorPtr actor) {
// Every instance of this class subscribes to this event, so one per host
@@
-292,6
+302,8
@@
public:
comp_timer += activity->surf_action_->get_finish_time() - activity->surf_action_->get_start_time();
}
});
comp_timer += activity->surf_action_->get_finish_time() - activity->surf_action_->get_start_time();
}
});
+ // FIXME I think that this fires at the same time for all hosts, so when the src sends something,
+ // the dst will be notified even though it didn't even arrive at the recv yet
simgrid::s4u::Link::on_communicate.connect(
[this](kernel::resource::NetworkAction* action, s4u::Host* src, s4u::Host* dst) {
if ((get_host() == src || get_host() == dst) && iteration_running) {
simgrid::s4u::Link::on_communicate.connect(
[this](kernel::resource::NetworkAction* action, s4u::Host* src, s4u::Host* dst) {
if ((get_host() == src || get_host() == dst) && iteration_running) {
@@
-304,21
+316,21
@@
public:
void pre_task()
{
void pre_task()
{
- sg_host_load_reset(
host_
);
- comp_counter = sg_host_get_computed_flops(
host_
); // Should be 0 because of the reset
+ sg_host_load_reset(
get_host()
);
+ comp_counter = sg_host_get_computed_flops(
get_host()
); // Should be 0 because of the reset
comp_timer = 0;
start_time = simgrid::s4u::Engine::get_clock();
if (rates.size() <= task_id)
comp_timer = 0;
start_time = simgrid::s4u::Engine::get_clock();
if (rates.size() <= task_id)
- rates.resize(task_id + 5, std::vector<double>(
host_
->get_pstate_count(), 0.0));
+ rates.resize(task_id + 5, std::vector<double>(
get_host()
->get_pstate_count(), 0.0));
if (rates[task_id][best_pstate] == 0)
best_pstate = 0;
if (rates[task_id][best_pstate] == 0)
best_pstate = 0;
-
host_
->set_pstate(best_pstate); // Load our schedule
+
get_host()
->set_pstate(best_pstate); // Load our schedule
XBT_DEBUG("Set pstate to %i", best_pstate);
}
void post_task()
{
XBT_DEBUG("Set pstate to %i", best_pstate);
}
void post_task()
{
- double computed_flops = sg_host_get_computed_flops(
host_
) - comp_counter;
+ double computed_flops = sg_host_get_computed_flops(
get_host()
) - comp_counter;
double target_time = (simgrid::s4u::Engine::get_clock() - start_time);
target_time =
target_time *
double target_time = (simgrid::s4u::Engine::get_clock() - start_time);
target_time =
target_time *
@@
-327,13
+339,12
@@
public:
bool is_initialized = rates[task_id][best_pstate] != 0;
rates[task_id][best_pstate] = computed_flops / comp_timer;
if (not is_initialized) {
bool is_initialized = rates[task_id][best_pstate] != 0;
rates[task_id][best_pstate] = computed_flops / comp_timer;
if (not is_initialized) {
- for (int i = 1; i <
host_
->get_pstate_count(); i++) {
- rates[task_id][i] = rates[task_id][0] * (
host_->get_pstate_speed(i) / host_
->get_speed());
+ for (int i = 1; i <
get_host()
->get_pstate_count(); i++) {
+ rates[task_id][i] = rates[task_id][0] * (
get_host()->get_pstate_speed(i) / get_host()
->get_speed());
}
}
- is_initialized = true;
}
}
- for (int pstate =
host_
->get_pstate_count() - 1; pstate >= 0; pstate--) {
+ for (int pstate =
get_host()
->get_pstate_count() - 1; pstate >= 0; pstate--) {
if (computed_flops / rates[task_id][pstate] <= target_time) {
// We just found the pstate we want to use!
best_pstate = pstate;
if (computed_flops / rates[task_id][pstate] <= target_time) {
// We just found the pstate we want to use!
best_pstate = pstate;
@@
-345,6
+356,7
@@
public:
virtual void update() override {}
};
virtual void update() override {}
};
+#endif
} // namespace dvfs
} // namespace plugin
} // namespace simgrid
} // namespace dvfs
} // namespace plugin
} // namespace simgrid
@@
-383,10
+395,14
@@
static void on_host_added(simgrid::s4u::Host& host)
} else if (dvfs_governor == "ondemand") {
return std::unique_ptr<simgrid::plugin::dvfs::Governor>(
new simgrid::plugin::dvfs::OnDemand(daemon_proc->get_host()));
} else if (dvfs_governor == "ondemand") {
return std::unique_ptr<simgrid::plugin::dvfs::Governor>(
new simgrid::plugin::dvfs::OnDemand(daemon_proc->get_host()));
- } else if (dvfs_governor == "adagio") {
+ }
+#if HAVE_SMPI
+ else if (dvfs_governor == "adagio") {
return std::unique_ptr<simgrid::plugin::dvfs::Governor>(
new simgrid::plugin::dvfs::Adagio(daemon_proc->get_host()));
return std::unique_ptr<simgrid::plugin::dvfs::Governor>(
new simgrid::plugin::dvfs::Adagio(daemon_proc->get_host()));
- } else if (dvfs_governor == "performance") {
+ }
+#endif
+ else if (dvfs_governor == "performance") {
return std::unique_ptr<simgrid::plugin::dvfs::Governor>(
new simgrid::plugin::dvfs::Performance(daemon_proc->get_host()));
} else if (dvfs_governor == "powersave") {
return std::unique_ptr<simgrid::plugin::dvfs::Governor>(
new simgrid::plugin::dvfs::Performance(daemon_proc->get_host()));
} else if (dvfs_governor == "powersave") {