summaryrefslogtreecommitdiff
path: root/Simulator/include/modeling
diff options
context:
space:
mode:
authorMDBijman <matthijs@bijman.org>2017-01-24 12:15:26 +0100
committerMDBijman <matthijs@bijman.org>2017-01-24 12:15:26 +0100
commit070ce923574dcc57435cb3fb2dfe86b6a38cd249 (patch)
treeffd69a842ac4ad22aaf7161f923b9f0b47c7147a /Simulator/include/modeling
Initial code commit with organized dependencies
Diffstat (limited to 'Simulator/include/modeling')
-rw-r--r--Simulator/include/modeling/Datacenter.h40
-rw-r--r--Simulator/include/modeling/Entity.h12
-rw-r--r--Simulator/include/modeling/ModelingTypes.h7
-rw-r--r--Simulator/include/modeling/Rack.h33
-rw-r--r--Simulator/include/modeling/Room.h52
-rw-r--r--Simulator/include/modeling/TypeIndex.h9
-rw-r--r--Simulator/include/modeling/machine/CPU.h34
-rw-r--r--Simulator/include/modeling/machine/GPU.h33
-rw-r--r--Simulator/include/modeling/machine/Machine.h112
9 files changed, 332 insertions, 0 deletions
diff --git a/Simulator/include/modeling/Datacenter.h b/Simulator/include/modeling/Datacenter.h
new file mode 100644
index 00000000..a9558f0a
--- /dev/null
+++ b/Simulator/include/modeling/Datacenter.h
@@ -0,0 +1,40 @@
+#pragma once
+#include "modeling/Room.h"
+#include "simulation/schedulers/Scheduler.h"
+#include "modeling/TypeIndex.h"
+
+#include <vector>
+
+namespace Modeling
+{
+ /*
+ The Datacenter class models a datacenter with rooms/entities.
+ */
+ template<typename ...RoomTypes>
+ class Datacenter
+ {
+ public:
+ /*
+ Returns a reference to the vector of rooms in this datacenter.
+ */
+ template<typename RoomType>
+ std::vector<RoomType>& getRoomsOfType()
+ {
+ return std::get<indexOfType<RoomType, RoomTypes...>::value>(rooms);
+ }
+
+ /*
+ Adds a room to this datacenter.
+ */
+ template<typename RoomType>
+ void addRoomOfType(RoomType& room)
+ {
+ std::get<indexOfType<RoomType, RoomTypes...>::value>(rooms).push_back(std::move(room));
+ }
+
+
+ private:
+ // A vector of rooms that are part of this datacenter.
+ std::tuple<std::vector<RoomTypes>...> rooms;
+ };
+}
diff --git a/Simulator/include/modeling/Entity.h b/Simulator/include/modeling/Entity.h
new file mode 100644
index 00000000..c8c5a7cd
--- /dev/null
+++ b/Simulator/include/modeling/Entity.h
@@ -0,0 +1,12 @@
+#pragma once
+namespace Modeling
+{
+ class Entity
+ {
+ public:
+ explicit Entity(int id);
+
+ // The id of this entity in the database
+ int id;
+ };
+}
diff --git a/Simulator/include/modeling/ModelingTypes.h b/Simulator/include/modeling/ModelingTypes.h
new file mode 100644
index 00000000..611a3653
--- /dev/null
+++ b/Simulator/include/modeling/ModelingTypes.h
@@ -0,0 +1,7 @@
+#pragma once
+
+// Define a DefaultDC type, capable of holding server rooms.
+using DefaultDatacenter = Modeling::Datacenter<Modeling::ServerRoom, Modeling::Hallway, Modeling::PowerRoom>;
+
+// Define a type of simulation, capable of simulating the DefaultDC.
+using DefaultSection = Simulation::Section<DefaultDatacenter>; \ No newline at end of file
diff --git a/Simulator/include/modeling/Rack.h b/Simulator/include/modeling/Rack.h
new file mode 100644
index 00000000..7e5638ef
--- /dev/null
+++ b/Simulator/include/modeling/Rack.h
@@ -0,0 +1,33 @@
+#pragma once
+#include "modeling/Entity.h"
+#include "modeling/machine/Machine.h"
+
+#include <unordered_map>
+
+namespace Modeling
+{
+ /*
+ The Rack class models a physical rack. It holds a vector of machines.
+ */
+ class Rack : public Entity
+ {
+ public:
+ /*
+ Initializes the rack with the given machines.
+ */
+ Rack(int id, std::unordered_map<uint32_t, Machine> machines);
+
+ /*
+ Returns all machines in this rack.
+ */
+ std::unordered_map<uint32_t, Machine>& getMachines();
+
+ /*
+ Returns the machine at the given slot.
+ */
+ Machine& getMachineAtSlot(int slot);
+
+ private:
+ std::unordered_map<uint32_t, Machine> machines;
+ };
+}
diff --git a/Simulator/include/modeling/Room.h b/Simulator/include/modeling/Room.h
new file mode 100644
index 00000000..a57b045e
--- /dev/null
+++ b/Simulator/include/modeling/Room.h
@@ -0,0 +1,52 @@
+#pragma once
+#include "modeling/Rack.h"
+#include "modeling/TypeIndex.h"
+
+#include <vector>
+
+namespace Modeling
+{
+ /*
+ The Room class models the rooms that can be created in the simulation. It contains a list of all entities in the room.
+ */
+ template<typename ...EntityTypes>
+ class Room
+ {
+ //static_assert(std::is_base_of<Entity, EntityTypes>..., "Each type must be derived from Entity!");
+ public:
+ /*
+ Initializes the room with the given name.
+ */
+ explicit Room(int id) : id(id) {}
+
+ /*
+ Adds the entity to the list of entities in this room.
+ */
+ template<typename EntityType>
+ void addEntity(EntityType& e)
+ {
+ std::get<indexOfType<EntityType, EntityTypes...>::value>(entities).push_back(e);
+ }
+
+ /*
+ Returns all entities of the given type.
+ */
+ template<typename EntityType>
+ std::vector<EntityType>& getEntitiesOfType()
+ {
+ return std::get<indexOfType<EntityType, EntityTypes...>::value>(entities);
+ }
+
+ // The id of this room corresponding to its id in the database.
+ const int id;
+
+ private:
+ // A vector for each type of entity
+ std::tuple<std::vector<EntityTypes>...> entities;
+ };
+
+ using ServerRoom = Room<Modeling::Rack>;
+ using Hallway = Room<>;
+ using PowerRoom = Room<>;
+
+}
diff --git a/Simulator/include/modeling/TypeIndex.h b/Simulator/include/modeling/TypeIndex.h
new file mode 100644
index 00000000..6fcda550
--- /dev/null
+++ b/Simulator/include/modeling/TypeIndex.h
@@ -0,0 +1,9 @@
+#pragma once
+template<typename T, typename... Ts> struct indexOfType;
+
+template <typename T, typename... Ts>
+struct indexOfType<T, T, Ts...> : std::integral_constant<std::size_t, 0> {};
+
+template <typename T, typename Tail, typename... Ts>
+struct indexOfType<T, Tail, Ts...> : std::integral_constant<std::size_t, 1 + indexOfType<T, Ts...>::value> {};
+
diff --git a/Simulator/include/modeling/machine/CPU.h b/Simulator/include/modeling/machine/CPU.h
new file mode 100644
index 00000000..dce4d2c5
--- /dev/null
+++ b/Simulator/include/modeling/machine/CPU.h
@@ -0,0 +1,34 @@
+#pragma once
+
+namespace Modeling
+{
+ class CPU
+ {
+ public:
+ CPU(int speed, int cores, int energyConsumption, int failureModelId);
+
+ /*
+ Returns the speed of this CPU.
+ */
+ int getSpeed();
+
+ /*
+ Returns the nr of cores of this CPU.
+ */
+ int getCores();
+
+ /*
+ Returns the energy consumed by this CPU.
+ */
+ int getEnergyConsumption();
+
+ /*
+ Returns the failure model id of this CPU.
+ */
+ int getFailureModelId();
+
+
+ private:
+ int speed, cores, energyConsumption, failureModelId;
+ };
+}
diff --git a/Simulator/include/modeling/machine/GPU.h b/Simulator/include/modeling/machine/GPU.h
new file mode 100644
index 00000000..049b928e
--- /dev/null
+++ b/Simulator/include/modeling/machine/GPU.h
@@ -0,0 +1,33 @@
+#pragma once
+
+namespace Modeling
+{
+ class GPU
+ {
+ public:
+ GPU(int speed, int cores, int energyConsumption, int failureModelId);
+
+ /*
+ Returns the speed of this CPU.
+ */
+ int getSpeed();
+
+ /*
+ Returns the nr of cores of this CPU.
+ */
+ int getCores();
+
+ /*
+ Returns the energy consumed by this CPU.
+ */
+ int getEnergyConsumption();
+
+ /*
+ Returns the failure model id of this CPU.
+ */
+ int getFailureModelId();
+
+ private:
+ int speed, cores, energyConsumption, failureModelId;
+ };
+}
diff --git a/Simulator/include/modeling/machine/Machine.h b/Simulator/include/modeling/machine/Machine.h
new file mode 100644
index 00000000..c89d32d1
--- /dev/null
+++ b/Simulator/include/modeling/machine/Machine.h
@@ -0,0 +1,112 @@
+#pragma once
+#include "simulation/workloads/Workload.h"
+#include "modeling/machine/CPU.h"
+#include "modeling/machine/GPU.h"
+
+#include <stdint.h>
+#include <vector>
+#include <memory>
+
+namespace Modeling
+{
+ // Defines the initial temperature of machine
+ constexpr float ROOM_TEMPERATURE_CELCIUS = 23.0f;
+
+ // Defines the usage of memory by the kernel
+ constexpr uint32_t KERNEL_MEMORY_USAGE_MB = 50;
+
+ /*
+ The Machine class models a physical machine in a rack. It has a speed, and can be given a workload on which it will work until finished or interrupted.
+ */
+ class Machine
+ {
+ public:
+ /*
+ Initializes the machine as idle with the given speed.
+ */
+ Machine(int id);
+
+ /*
+ Adds a cpu to the list of this machine.
+ */
+ void addCPU(CPU cpu);
+
+ /*
+ Adds a cpu to the list of this machine.
+ */
+ void addGPU(GPU gpu);
+
+ /*
+ Gives the task to this machine. If the machine is already busy this does nothing.
+ */
+ void giveTask(Simulation::Workload* workload);
+
+ /*
+ Returns true if the machine is busy.
+ */
+ bool isBusy() const;
+
+ /*
+ Does work on the given task and updates temperature and load appropriately.
+ */
+ void work();
+
+ /*
+ Returns the id of the current workload of this machine.
+ */
+ int getWorkloadId() const;
+
+ /*
+ Returns the id of this machine.
+ */
+ int getId() const;
+
+ /*
+ Returns the temperature of this machine.
+ */
+ float getTemperature() const;
+
+ /*
+ Returns the memory used by this machine.
+ */
+ int getMemory() const;
+
+ /*
+ Returns the load fraction on this machine.
+ */
+ float getLoad() const;
+
+ private:
+ // A list of cpus in this machine.
+ std::vector<CPU> cpus;
+
+ // A list of gpus in this machine.
+ std::vector<GPU> gpus;
+
+ // True if the machine is working on a task.
+ bool busy = false;
+
+ // The current workload the machine is working on.
+ Simulation::Workload* currentWorkload;
+
+ // Db id of this machine.
+ int id;
+
+ // Temperature of this machine.
+ float temperature = ROOM_TEMPERATURE_CELCIUS;
+ float maxTemperature = 80.0f;
+ float minTemperature = 0.0f;
+ float temperatureIncrease = 10.f;
+
+ // Memory used by this machine.
+ int memory = KERNEL_MEMORY_USAGE_MB;
+
+ // The fraction of load on this machine.
+ float load = 0.0f;
+
+ /*
+ Returns the speed of the machine.
+ */
+ uint32_t getSpeed();
+ };
+}