diff options
| author | Loic Guegan <manzerbredes@mailbox.org> | 2021-05-06 09:04:35 +0200 |
|---|---|---|
| committer | Loic Guegan <manzerbredes@mailbox.org> | 2021-05-06 09:04:35 +0200 |
| commit | 4b321cfe80f0bbf94f3648a9fc056ae2c19a3436 (patch) | |
| tree | 9e6e8d561a77b9f684d33716b642521d1bce67c0 | |
| parent | e8ad4ccb0979e1118e310d1e514ef3a58275b66f (diff) | |
Improve platform management and allow energy simulation
| -rw-r--r-- | .gitignore | 3 | ||||
| -rw-r--r-- | Makefile | 2 | ||||
| -rw-r--r-- | inputs.cc | 14 | ||||
| -rw-r--r-- | inputs.json | 22 | ||||
| -rw-r--r-- | platform.xml | 17 | ||||
| -rw-r--r-- | simulator.cc | 67 | ||||
| -rw-r--r-- | src/inputs.cc | 50 | ||||
| -rw-r--r-- | src/inputs.hpp (renamed from inputs.hpp) | 5 | ||||
| -rw-r--r-- | src/simulator.cc | 112 |
9 files changed, 186 insertions, 106 deletions
@@ -1,4 +1,5 @@ simulator libs/simgrid libs/rapidjson -compile_commands.json
\ No newline at end of file +compile_commands.json +platform.xml @@ -4,7 +4,7 @@ SG_INC := -I ./libs/simgrid/build/include -I ./libs/simgrid/include -I libs/rapi CC := g++ -lsimgrid $(SG_INC) -L $(SG_LIBS) -$(EXEC): simulator.cc inputs.cc +$(EXEC): src/simulator.cc src/inputs.cc $(CC) $^ -o $@ run: $(EXEC) diff --git a/inputs.cc b/inputs.cc deleted file mode 100644 index 1f90ab6..0000000 --- a/inputs.cc +++ /dev/null @@ -1,14 +0,0 @@ -#include "inputs.hpp" - - - -Inputs::Inputs(std::string node_name){ - FILE* input_file = fopen(INPUTS_FILE, "rb"); - char input_file_buffer[65536]; - rapidjson::FileReadStream is(input_file, input_file_buffer, sizeof(input_file_buffer)); - d.ParseStream(is); - fclose(input_file); - - wake_duration=d[node_name.c_str()]["wake_duration"].GetDouble(); - wake_interval=d[node_name.c_str()]["wake_interval"].GetDouble(); -}
\ No newline at end of file diff --git a/inputs.json b/inputs.json index 84c7e6c..6cf316c 100644 --- a/inputs.json +++ b/inputs.json @@ -1,10 +1,20 @@ { - "ou0":{ - "wake_interval": 10, - "wake_duration": 5 + "on0":{ + "wake_interval": 5, + "is_sender": false, + "wake_duration": 5, + "startup_delay": 0, + "max_attemps" : 1, + "power_off": 0, + "power_on":10 }, - "ou1":{ - "wake_interval": 10, - "wake_duration": 5 + "on1":{ + "wake_interval": 5, + "is_sender": true, + "wake_duration": 5, + "startup_delay": 0, + "max_attemps" : 1, + "power_off": 0, + "power_on":10 } }
\ No newline at end of file diff --git a/platform.xml b/platform.xml deleted file mode 100644 index 7faab20..0000000 --- a/platform.xml +++ /dev/null @@ -1,17 +0,0 @@ -<?xml version='1.0'?> -<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd"> -<platform version="4.1"> -<AS id="AS0" routing="Full"> - -<host id="ou0" speed="100.0Mf,50.0Mf,20.0Mf" pstate="0"></host> - -<host id="ou1" speed="100.0Mf,50.0Mf,20.0Mf" pstate="0"></host> - - -<link id="link" bandwidth="1bps" latency="0ms" sharing_policy="SPLITDUPLEX"></link> - -<route src="ou0" dst="ou1" symmetrical="YES"><link_ctn id="link_UP" /></route> - -</AS> -</platform> - diff --git a/simulator.cc b/simulator.cc deleted file mode 100644 index 508a31a..0000000 --- a/simulator.cc +++ /dev/null @@ -1,67 +0,0 @@ -#include "simgrid/s4u.hpp" -#include <simgrid/s4u/Mailbox.hpp> -#include <string> -#include <sstream> -#include "inputs.hpp" -#include "xbt/log.h" - -XBT_LOG_NEW_DEFAULT_CATEGORY(simulator, "[DAO]"); - -typedef unsigned int u32; -u32 max_attempts=0; - -/// @brief Observation unit code -static void obs_unit(std::vector<std::string> args); - - -int main(int argc, char **argv) { - - // Build engine - simgrid::s4u::Engine engine(&argc, argv); - engine.load_platform("platform.xml"); - - // Parse arguments - max_attempts=std::stoi(argv[1]); - - XBT_INFO("-------------------------------------------------"); - XBT_INFO("Sarting loosely coupled data dissemination experiments"); - XBT_INFO("Number of wake attempts per OU is %d",max_attempts); - XBT_INFO("-------------------------------------------------"); - - u32 nObsUnit=simgrid::s4u::Engine::get_instance()->get_host_count(); - for(u32 i=0;i<nObsUnit;i++){ - std::vector<std::string> args; - std::ostringstream ss; - ss<< "ou" <<i; - simgrid::s4u::Actor::create("Sender", simgrid::s4u::Host::by_name(ss.str()), obs_unit, args); - } - - // Setup/Run simulation - engine.run(); - - XBT_INFO("Simulation took %fs", simgrid::s4u::Engine::get_clock()); - - return (0); -} - - -static void obs_unit(std::vector<std::string> args) { - std::string selfName = simgrid::s4u::this_actor::get_host()->get_name(); - Inputs i(selfName); - simgrid::s4u::Mailbox *m = simgrid::s4u::Mailbox::by_name("medium"); - XBT_INFO("Deploying %s",selfName.c_str()); - - std::string msg("aloha"); - double wake_interval=i.wake_interval; - for(u32 i=0;i<max_attempts;i++){ - try - { - simgrid::s4u::this_actor::sleep_for(wake_interval); - } - catch (...) - { - XBT_INFO("Not send"); - } - } - -}
\ No newline at end of file diff --git a/src/inputs.cc b/src/inputs.cc new file mode 100644 index 0000000..066dcb0 --- /dev/null +++ b/src/inputs.cc @@ -0,0 +1,50 @@ +#include "inputs.hpp" +#include <iostream> +#include <fstream> + + +Inputs::Inputs(std::string node_name){ + FILE* input_file = fopen(INPUTS_FILE, "rb"); + char input_file_buffer[65536]; + rapidjson::FileReadStream is(input_file, input_file_buffer, sizeof(input_file_buffer)); + d.ParseStream(is); + fclose(input_file); + + wake_duration=d[node_name.c_str()]["wake_duration"].GetDouble(); + wake_interval=d[node_name.c_str()]["wake_interval"].GetDouble(); + startup_delay=d[node_name.c_str()]["startup_delay"].GetDouble(); + is_sender=d[node_name.c_str()]["is_sender"].GetBool(); + max_attempts=d[node_name.c_str()]["max_attemps"].GetInt(); + +} + +void Inputs::GeneratePlatform(std::string p){ + FILE* input_file = fopen(INPUTS_FILE, "rb"); + char input_file_buffer[65536]; + rapidjson::FileReadStream is(input_file, input_file_buffer, sizeof(input_file_buffer)); + rapidjson::Document d; + d.ParseStream(is); + fclose(input_file); + + // Write platform file + std::ofstream pf; + pf.open (p); + pf << "<?xml version='1.0'?>\n"; + pf << "<!DOCTYPE platform SYSTEM \"http://simgrid.gforge.inria.fr/simgrid/simgrid.dtd\">\n"; + pf << "<platform version=\"4.1\">\n <AS id=\"AS0\" routing=\"Cluster\">\n"; + pf << " <link id=\"link\" bandwidth=\"1Mbps\" latency=\"0ms\" sharing_policy=\"SHARED\"></link>\n"; + for (Value::ConstMemberIterator itr = d.MemberBegin(); itr != d.MemberEnd(); ++itr) + { + std::string name=itr->name.GetString(); + double power_on=d[itr->name.GetString()]["power_on"].GetDouble(); + double power_off=d[itr->name.GetString()]["power_off"].GetDouble(); + + //db=d[itr->name.GetString()]["wake_interval"].GetDouble(); + pf << " <host id=\""<<name<<"\" speed=\"100.0f,100.0f\" pstate=\"0\">\n"; + pf << " <prop id=\"wattage_per_state\" value=\""<< power_off<<":"<<power_off<<", "<< power_on<<":"<<power_on<<"\" />\n"; + pf << " <prop id=\"wattage_off\" value=\"0\" />\n </host>\n"; + pf << " <host_link id=\""<<name<<"\" up=\"link\" down=\"link\"/>\n"; + } + pf << " </AS>\n</platform>\n"; + pf.close(); +}
\ No newline at end of file diff --git a/inputs.hpp b/src/inputs.hpp index 611df0f..92b9005 100644 --- a/inputs.hpp +++ b/src/inputs.hpp @@ -12,6 +12,11 @@ class Inputs { std::string node_name; public: Inputs(std::string node_name); + static void GeneratePlatform(std::string p); + double wake_duration; double wake_interval; + double startup_delay; + bool is_sender; + int max_attempts; };
\ No newline at end of file diff --git a/src/simulator.cc b/src/simulator.cc new file mode 100644 index 0000000..b1461d5 --- /dev/null +++ b/src/simulator.cc @@ -0,0 +1,112 @@ +#include "simgrid/s4u.hpp" +#include <simgrid/s4u/Mailbox.hpp> +#include <string> +#include <sstream> +#include "inputs.hpp" +#include "simgrid/s4u/Host.hpp" +#include "simgrid/plugins/energy.h" +#include "xbt/log.h" + +#define PLATFORM_FILE "platform.xml" +#define TURN_OFF() simgrid::s4u::this_actor::get_host()->set_pstate(0); +#define TURN_ON() simgrid::s4u::this_actor::get_host()->set_pstate(1); + + +XBT_LOG_NEW_DEFAULT_CATEGORY(simulator, "[DAO]"); + +typedef unsigned int u32; +typedef struct{ + double hint; + bool isHint; +} Payload; + +/// @brief Observation unit code +static void obs_node(std::vector<std::string> args); + + +int main(int argc, char **argv) { + + // Build engine + sg_host_energy_plugin_init(); + simgrid::s4u::Engine engine(&argc, argv); + Inputs::GeneratePlatform(PLATFORM_FILE); + engine.load_platform(PLATFORM_FILE); + + XBT_INFO("-------------------------------------------------"); + XBT_INFO("Sarting loosely coupled data dissemination experiments"); + XBT_INFO("-------------------------------------------------"); + + u32 nObsUnit=simgrid::s4u::Engine::get_instance()->get_host_count(); + for(u32 i=0;i<nObsUnit;i++){ + std::vector<std::string> args; + std::ostringstream ss; + ss<< "on" <<i; + simgrid::s4u::Actor::create("ON", simgrid::s4u::Host::by_name(ss.str()), obs_node, args); + } + + // Setup/Run simulation + engine.run(); + + XBT_INFO("Simulation took %fs", simgrid::s4u::Engine::get_clock()); + + return (0); +} + + +static void obs_node(std::vector<std::string> args) { + std::string selfName = simgrid::s4u::this_actor::get_host()->get_name(); + simgrid::s4u::this_actor::get_host()->turn_on(); + Inputs i(selfName); + simgrid::s4u::Mailbox *m = simgrid::s4u::Mailbox::by_name("medium"); + XBT_INFO("Deploying observation node %s",selfName.c_str()); + + double wake_interval=i.wake_interval; + double wake_duration=i.wake_duration; + double startup_delay=i.startup_delay; + int max_attempts=i.max_attempts; + bool isSender=i.is_sender; + + // Starting node + u32 effectiveAttemps=0; + double effective_wake_duration=wake_duration; + double effective_wake_interval=wake_interval; + simgrid::s4u::this_actor::sleep_for(startup_delay); + Payload p; + for(u32 i=0;i<max_attempts;i++){ + XBT_INFO("%s is spleeping",selfName.c_str()); + simgrid::s4u::this_actor::sleep_for(effective_wake_interval); + XBT_INFO("%s wakes up",selfName.c_str()); + + try + { + if(isSender){ + p.isHint=false; + p.hint=500; + m->put(&p,0,effective_wake_duration); + XBT_INFO("%s send data successfully",selfName.c_str()); + effective_wake_interval=wake_interval; + } + else { + Payload *p=m->get<Payload>(effective_wake_duration); + if(p->isHint){ + XBT_INFO("%s received and hint of %f",selfName.c_str(),p->hint); + effective_wake_interval=p->hint; + } + else{ + XBT_INFO("%s received data successfully",selfName.c_str()); + } + } + } + catch (...) + { + if(isSender) + XBT_INFO("%s failed to send data",selfName.c_str()); + else + XBT_INFO("%s failed to receive data",selfName.c_str()); + } + effectiveAttemps++; + } + + // Done + XBT_INFO("Observation node %s finished (attemps:%d)",selfName.c_str(),effectiveAttemps); +}
\ No newline at end of file |
