diff --git a/DRAMSys/simulator/resources/simulations/sim-batch.xml b/DRAMSys/simulator/resources/simulations/sim-batch.xml
index 1ab6a01e..d8ccba71 100644
--- a/DRAMSys/simulator/resources/simulations/sim-batch.xml
+++ b/DRAMSys/simulator/resources/simulations/sim-batch.xml
@@ -7,15 +7,17 @@
-
+
-
+
+
+
diff --git a/DRAMSys/simulator/simulator.pro b/DRAMSys/simulator/simulator.pro
index 4109ea70..a3c59a0d 100644
--- a/DRAMSys/simulator/simulator.pro
+++ b/DRAMSys/simulator/simulator.pro
@@ -61,6 +61,7 @@ SOURCES += \
src/simulation/Simulation.cpp \
src/simulation/MemoryManager.cpp \
src/simulation/main.cpp \
+ src/simulation/TemperatureController.cpp \
src/controller/scheduler/readwritegrouper.cpp \
src/controller/core/configuration/ConfigurationLoader.cpp \
src/controller/core/powerdown/NoPowerDown.cpp \
@@ -121,6 +122,7 @@ HEADERS += \
src/simulation/StlDataPlayer.h \
src/simulation/TracePlayerListener.h \
src/simulation/TraceGenerator.h \
+ src/simulation/TemperatureController.h \
src/controller/core/powerdown/NoPowerDown.h \
src/controller/Command.h \
src/controller/RowBufferStates.h \
diff --git a/DRAMSys/simulator/src/controller/core/configuration/Configuration.cpp b/DRAMSys/simulator/src/controller/core/configuration/Configuration.cpp
index b8671bbb..bc6107c2 100644
--- a/DRAMSys/simulator/src/controller/core/configuration/Configuration.cpp
+++ b/DRAMSys/simulator/src/controller/core/configuration/Configuration.cpp
@@ -163,6 +163,10 @@ void Configuration::setParameter(std::string name, std::string value)
temperatureSim.powerThresholdsFile = value;
temperatureSim.parsePowerThresholdsFile();
}
+ else if (name == "IceServerIp")
+ temperatureSim.IceServerIp = value;
+ else if (name == "IceServerPort")
+ temperatureSim.IceServerPort = string2int(value);
else
{
SC_REPORT_FATAL("Configuration", ("Parameter " + name + " not defined in Configuration").c_str());
diff --git a/DRAMSys/simulator/src/controller/core/configuration/temperatureSimConfig.h b/DRAMSys/simulator/src/controller/core/configuration/temperatureSimConfig.h
index 47801967..77bf3090 100644
--- a/DRAMSys/simulator/src/controller/core/configuration/temperatureSimConfig.h
+++ b/DRAMSys/simulator/src/controller/core/configuration/temperatureSimConfig.h
@@ -31,6 +31,7 @@
*
* Authors:
* Eder F. Zulian
+ * Matthias Jung
*/
#ifndef TEMPERATURE_SIM_CONFIG_H_
@@ -52,6 +53,8 @@ struct TemperatureSimConfig {
// Dynamic Temeperature Simulation parameters
unsigned int DynTemperatureSimPeriod;
enum sc_time_unit DynTemperatureSimUnit;
+ std::string IceServerIp;
+ unsigned int IceServerPort;
std::string powerThresholdsFile;
std::map cpuPowerThresholds;
@@ -60,7 +63,7 @@ struct TemperatureSimConfig {
void parsePowerThresholdsFile()
{
- printDebugMessage("Power Thresholds File is " + powerThresholdsFile);
+ printDebugMessage("Power Thresholds File: " + powerThresholdsFile);
// Load the XML file into memory and parse it
tinyxml2::XMLDocument xml;
@@ -101,11 +104,11 @@ struct TemperatureSimConfig {
void showTemperatureSimConfig()
{
for (auto e : cpuPowerThresholds)
- printDebugMessage("CPU[" + std::to_string(e.first) + "] threshold is " + std::to_string(e.second));
+ printDebugMessage("CPU[" + std::to_string(e.first) + "] threshold: " + std::to_string(e.second));
for (auto e : gpuPowerThresholds)
- printDebugMessage("GPU[" + std::to_string(e.first) + "] threshold is " + std::to_string(e.second));
+ printDebugMessage("GPU[" + std::to_string(e.first) + "] threshold: " + std::to_string(e.second));
for (auto e : dramPowerThresholds)
- printDebugMessage("DRAM[" + std::to_string(e.first) + "] threshold is " + std::to_string(e.second));
+ printDebugMessage("DRAM[" + std::to_string(e.first) + "] threshold: " + std::to_string(e.second));
}
void printDebugMessage(std::string message)
diff --git a/DRAMSys/simulator/src/error/errormodel.cpp b/DRAMSys/simulator/src/error/errormodel.cpp
index 232554f6..9a9182f0 100644
--- a/DRAMSys/simulator/src/error/errormodel.cpp
+++ b/DRAMSys/simulator/src/error/errormodel.cpp
@@ -35,14 +35,16 @@
#include "errormodel.h"
#include "../common/DebugManager.h"
+#include "../simulation/TemperatureController.h"
+
#include
#include
#include
+
errorModel::errorModel()
{
// Get Configuration parameters:
- dynamicTemepratureSimulation = Configuration::getInstance().DynamicTemperatureSimulation;
busWidth = Configuration::getInstance().Buswidth;
burstLenght = Configuration::getInstance().memSpec.BurstLength;
numberOfColumns = Configuration::getInstance().memSpec.NumberOfColumns;
@@ -103,16 +105,6 @@ errorModel::errorModel()
//weakCells[0].row = 0;
//weakCells[0].dependent = true;
- std::stringstream msg;
- if (dynamicTemepratureSimulation == false) {
- int temperature = Configuration::getInstance().temperatureSim.StaticTemperatureDefaultValue;
- setTemperature(temperature);
- msg << "Static temperature simulation. Temperature set to " << temperature << std::endl;
- } else {
- msg << "Dynamic temperature simulation." << std::endl;
- }
- DebugManager::getInstance().printDebugMessage(name, msg.str());
-
markBitFlips();
}
@@ -501,19 +493,9 @@ unsigned int errorModel::getBit(int row, int column, int byteInColumn, int bitIn
return getBit(key, byteInColumn, bitInByte);
}
-void errorModel::setTemperature(double t)
-{
- temperature = t;
-}
-
double errorModel::getTemperature()
{
- if (dynamicTemepratureSimulation == true) {
- // TODO Get temperature from 3d-ice simulator or other temperature source
- // TODO Check all the criterion before requesting the temperature
- return temperature;
- }
-
+ double temperature = TemperatureController::getInstance().getTemperature();
return temperature;
}
diff --git a/DRAMSys/simulator/src/error/errormodel.h b/DRAMSys/simulator/src/error/errormodel.h
index aac91278..a7950e55 100644
--- a/DRAMSys/simulator/src/error/errormodel.h
+++ b/DRAMSys/simulator/src/error/errormodel.h
@@ -61,13 +61,11 @@ class errorModel
unsigned int numberOfColumns;
unsigned int bytesPerColumn;
unsigned int numberOfRows;
- bool dynamicTemepratureSimulation;
// Name:
std::string name;
// Online Parameters:
- double temperature;
unsigned int numberOfBitErrorEvents;
// Private Methods:
diff --git a/DRAMSys/simulator/src/simulation/Simulation.cpp b/DRAMSys/simulator/src/simulation/Simulation.cpp
index 932a3912..9b84334b 100644
--- a/DRAMSys/simulator/src/simulation/Simulation.cpp
+++ b/DRAMSys/simulator/src/simulation/Simulation.cpp
@@ -48,6 +48,7 @@
#include "../controller/core/configuration/ConfigurationLoader.h"
#include "../common/Utils.h"
#include "../simulation/StlDataPlayer.h"
+#include "../simulation/TemperatureController.h"
using namespace std;
@@ -69,7 +70,6 @@ Simulation::Simulation(sc_module_name __attribute__((unused)) name, string pathT
setupDebugManager(traceName);
}
-
void Simulation::setupDebugManager(const string& traceName)
{
auto& dbg = DebugManager::getInstance();
@@ -79,7 +79,6 @@ void Simulation::setupDebugManager(const string& traceName)
dbg.openDebugFile(traceName + ".txt");
}
-
void Simulation::setupTlmRecorders(const string &traceName, const string &pathToResources, const std::vector &devices)
{
// Create TLM Recorders, one per channel.
@@ -106,6 +105,10 @@ void Simulation::setupTlmRecorders(const string &traceName, const string &pathTo
void Simulation::instantiateModules(const string &traceName, const string &pathToResources, const std::vector &devices)
{
+ // The first call to getInstance() creates the Temperature Controller.
+ // The same instance will can be accessed by all other modules.
+ TemperatureController::getInstance();
+
for (size_t i = 0; i < Configuration::getInstance().NumberOfTracePlayers; i++) {
std::string playerStr = "player" + std::to_string(i);
TracePlayer<> *player;
diff --git a/DRAMSys/simulator/src/simulation/TemperatureController.cpp b/DRAMSys/simulator/src/simulation/TemperatureController.cpp
new file mode 100644
index 00000000..b9a95255
--- /dev/null
+++ b/DRAMSys/simulator/src/simulation/TemperatureController.cpp
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) 2015, University of Kaiserslautern
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Authors:
+ * Eder F. Zulian
+ * Matthias Jung
+ */
+
+#include "TemperatureController.h"
+#include "../controller/core/configuration/Configuration.h"
+
+void TemperatureController::setTemperature(double t)
+{
+ // XXX
+ // mutex for dynamic temperature simulation
+ temperature = t;
+}
+
+double TemperatureController::getTemperature()
+{
+ printDebugMessage("Temperature is " + std::to_string(temperature));
+ return temperature;
+}
+
+void TemperatureController::temperatureThread()
+{
+ unsigned int period = Configuration::getInstance().temperatureSim.DynTemperatureSimPeriod;
+ enum sc_time_unit t_unit = Configuration::getInstance().temperatureSim.DynTemperatureSimUnit;
+
+ std::vector powerValues = {
+ 0, // 1: CPUs
+ 0, // 2: GPU
+ 1, // 3: BASEBAND1
+ 0, // 4: BASEBAND2
+ 0, // 5: LLCACHE
+ 0, // 6: DRAMCTRL1
+ 0, // 7: DRAMCTRL2
+ 0, // 8: TSVs
+ 0, // 9: ACELLERATORS
+ 1, //10: C0
+ 0, //11: C1
+ 0, //12: C2
+ 0, //13: C3
+ 0, //14: TSVs
+ 0, //10: C0
+ 0, //11: C1
+ 0, //12: C2
+ 0, //13: C3
+ 0, //14: TSVs
+ 0, //10: C0
+ 0, //11: C1
+ 0, //12: C2
+ 0, //13: C3
+ 0, //14: TSVs
+ 0, //10: C0
+ 0, //11: C1
+ 0, //12: C2
+ 0, //13: C3
+ 0 //14: TSVs
+ };
+
+ while (true) {
+ std::vector temperatureValues;
+
+ thermalSimulation->sendPowerValues(&powerValues);
+
+ thermalSimulation->simulate();
+
+ thermalSimulation->getTemperature(temperatureValues, TDICE_OUTPUT_INSTANT_SLOT, TDICE_OUTPUT_TYPE_TCELL, TDICE_OUTPUT_QUANTITY_NONE);
+
+ for (auto t : temperatureValues)
+ printDebugMessage("Temperature is " + std::to_string(t));
+
+ // TODO
+ // store temperatures
+ // evaluate thresholds
+ // take a look in all the available getTemperature() options
+
+ wait(sc_time(period, t_unit));
+ }
+}
+
+void TemperatureController::printDebugMessage(std::string message)
+{
+ DebugManager::getInstance().printDebugMessage(name(), message);
+}
+
diff --git a/DRAMSys/simulator/src/simulation/TemperatureController.h b/DRAMSys/simulator/src/simulation/TemperatureController.h
new file mode 100644
index 00000000..1f090260
--- /dev/null
+++ b/DRAMSys/simulator/src/simulation/TemperatureController.h
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) 2015, University of Kaiserslautern
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Authors:
+ * Eder F. Zulian
+ * Matthias Jung
+ */
+
+#ifndef TEMPERATURE_CONTROLLER_H_
+#define TEMPERATURE_CONTROLLER_H_
+
+#include
+#include
+#include
+
+#include "../common/DebugManager.h"
+#include "../common/Utils.h"
+#include "../controller/core/configuration/Configuration.h"
+#include "IceWrapper.h"
+
+SC_MODULE(TemperatureController) {
+public:
+ static inline TemperatureController &getInstance()
+ {
+ static TemperatureController temperaturectrl("TemperatureController");
+ return temperaturectrl;
+ }
+
+ SC_CTOR(TemperatureController)
+ {
+ dynamicTempSimEnabled = Configuration::getInstance().DynamicTemperatureSimulation;
+
+ if (dynamicTempSimEnabled == true) {
+
+ std::string ip = Configuration::getInstance().temperatureSim.IceServerIp;
+ unsigned int port = Configuration::getInstance().temperatureSim.IceServerPort;
+
+ printDebugMessage("Dynamic temperature simulation. Server @ " + ip + ":" + std::to_string(port));
+
+ thermalSimulation = new IceWrapper(ip, port);
+ SC_THREAD(temperatureThread);
+
+ } else {
+ double temperature = Configuration::getInstance().temperatureSim.StaticTemperatureDefaultValue;
+ setTemperature(temperature);
+ printDebugMessage("Static temperature simulation. Temperature set to " + std::to_string(temperature));
+ }
+ }
+
+ // TODO
+ // Implement many signatures for getTemperature():
+ // - by (x,y,z) coordinates
+ // - device average temperature
+ double getTemperature();
+
+private:
+ IceWrapper *thermalSimulation;
+ double temperature;
+ bool dynamicTempSimEnabled;
+
+ void setTemperature(double t);
+ void temperatureThread();
+
+ void printDebugMessage(std::string message);
+};
+
+#endif /* TEMPERATURE_CONTROLLER_H_ */
+