From 5d4b25519741e970fee6b144f8061fcf13f8bf4e Mon Sep 17 00:00:00 2001 From: Iron Prando da Silva Date: Wed, 8 Dec 2021 14:44:35 +0100 Subject: [PATCH] Began adding base algorithm for dependency calculations. --- DRAMSys/traceAnalyzer/CMakeLists.txt | 1 + .../phasedependenciestracker.cpp | 134 ++++++++++++++++++ .../phasedependenciestracker.h | 45 ++++++ .../businessObjects/phases/phasedependency.h | 4 +- DRAMSys/traceAnalyzer/data/tracedb.cpp | 12 +- DRAMSys/traceAnalyzer/data/tracedb.h | 3 + DRAMSys/traceAnalyzer/tracefiletab.cpp | 39 +++-- DRAMSys/traceAnalyzer/tracefiletab.h | 1 + DRAMSys/traceAnalyzer/tracefiletab.ui | 9 ++ 9 files changed, 218 insertions(+), 30 deletions(-) create mode 100644 DRAMSys/traceAnalyzer/businessObjects/phasedependenciestracker.cpp create mode 100644 DRAMSys/traceAnalyzer/businessObjects/phasedependenciestracker.h diff --git a/DRAMSys/traceAnalyzer/CMakeLists.txt b/DRAMSys/traceAnalyzer/CMakeLists.txt index 74b5e4c9..e21f2ff0 100644 --- a/DRAMSys/traceAnalyzer/CMakeLists.txt +++ b/DRAMSys/traceAnalyzer/CMakeLists.txt @@ -99,6 +99,7 @@ add_executable(TraceAnalyzer businessObjects/pythoncaller.cpp businessObjects/tracetestresults.cpp presentation/tracemetrictreewidget.cpp + businessObjects/phasedependenciestracker.cpp businessObjects/phases/phase.cpp businessObjects/phases/phasedependency.cpp businessObjects/phases/dependencyinfos.cpp diff --git a/DRAMSys/traceAnalyzer/businessObjects/phasedependenciestracker.cpp b/DRAMSys/traceAnalyzer/businessObjects/phasedependenciestracker.cpp new file mode 100644 index 00000000..715eed86 --- /dev/null +++ b/DRAMSys/traceAnalyzer/businessObjects/phasedependenciestracker.cpp @@ -0,0 +1,134 @@ + +#include "phasedependenciestracker.h" + +void +PhaseDependenciesTracker::calculateDependencies(TraceDB& tdb, const std::vector& commands) { + mDropTable(tdb); + mCreateTable(tdb); + + auto& phases = mGetAllPhases(tdb, commands); + + auto& entries = mCalculateDependencies(phases); + + mInsertIntoTable(tdb, entries); + +} + +void PhaseDependenciesTracker::mDropTable(TraceDB& tdb) { + QString command = "DROP TABLE DirectDependencies; "; + + auto query = mExecuteQuery(tdb, command); + query.finish(); +} + +void PhaseDependenciesTracker::mCreateTable(TraceDB& tdb) { + QString command = "CREATE TABLE DirectDependencies( DelayedPhaseID, DelayedPhaseName, DependencyType, TimeDependency, DependencyPhaseID, DependencyPhaseName ); "; + + auto query = mExecuteQuery(tdb, command); + query.finish(); +} + +void PhaseDependenciesTracker::mInsertIntoTable(TraceDB& tdb, const std::vector& entries) { + auto numberOfEntries = entries.size(); + size_t bulkInsertionSize = 1000; + + QString command; + size_t counter = 0; + for (auto& entry : entries) { + if (counter == 0) { + // TODO Reset command string and add first command + command = ""; + + } else if (counter == bulkInsertionSize) { + // TODO Write last command and submit + + counter = 0; + + } else { + // TODO + + counter++; + + } + + } + + if (counter != 0) { + // TODO Submit command string + } + +} + +const std::vector> +PhaseDependenciesTracker::mGetAllPhases(TraceDB& tdb, const std::vector& commands) { + std::vector> phases; + + QString queryStr = "SELECT Phases.*, Transactions.TBank, Transactions.TRank " + " FROM Phases " + " INNER JOIN Transactions " + " ON Phases.Transact=Transactions.ID " + " WHERE PhaseName IN ("; + + for (auto cmd : commands) { + queryStr += '\"' + QString::fromStdString(cmd + "\","); + } + queryStr.back() = ')'; + queryStr += " ORDER BY PhaseBegin "; + + auto query = mExecuteQuery(tdb, queryStr); + + if (!query.last()) { + throw sqlException( ("Query:\n " + tdb.queryToString(query) + "\n failed. Error: \n" + "Could not retrieve number of rows\n").toStdString(), + tdb.pathToDB.toStdString()); + } + + size_t nrows = query.at() + 1; + + if (!query.first()) { + throw sqlException( ("Query:\n " + tdb.queryToString(query) + "\n failed. Error: \n" + "Could not safely retrieve number of rows\n").toStdString(), + tdb.pathToDB.toStdString()); + } + + phases.resize(nrows); + + size_t rowIt = 0; + do { + DBPhaseEntry phase; + phase.id = query.value(0).toLongLong(); + phase.phaseName = query.value(1).toString(); + phase.phaseBegin = query.value(2).toLongLong(); + phase.phaseEnd = query.value(3).toLongLong(); + phase.transact = query.value(4).toLongLong(); + phase.tBank = query.value(5).toLongLong(); + phase.tRank = query.value(6).toLongLong(); + + phases[rowIt] = std::make_shared(phase); + ++rowIt; + } while (query.next()); + + if (rowIt != nrows) { + throw std::runtime_error("An error occurred while fetching phases in 'PhaseDependenciesTracker::mGetAllPhases': expected " + std::to_string(nrows) + " rows, but found " + std::to_string(rowIt) + "\n"); + } + + return phases; +} + +const std::vector +PhaseDependenciesTracker::mCalculateDependencies(const std::vector>& transactions) { + std::vector entries; + + // TODO Get dependency object for specific trace + // TODO Main dependency calculation loop + + return entries; +} + +QSqlQuery PhaseDependenciesTracker::mExecuteQuery(TraceDB& tdb, const QString queryStr) { + QSqlQuery query(tdb.getDatabase()); + query.prepare(queryStr); + tdb.executeQuery(query); + + return query; +} diff --git a/DRAMSys/traceAnalyzer/businessObjects/phasedependenciestracker.h b/DRAMSys/traceAnalyzer/businessObjects/phasedependenciestracker.h new file mode 100644 index 00000000..fcfe7021 --- /dev/null +++ b/DRAMSys/traceAnalyzer/businessObjects/phasedependenciestracker.h @@ -0,0 +1,45 @@ + +#pragma once + +#include +#include +#include + +#include "data/tracedb.h" + +struct DBPhaseEntry { + size_t id; + QString phaseName; + size_t phaseBegin; + size_t phaseEnd; + size_t transact; + size_t tBank; + size_t tRank; +}; + +struct DBDependencyEntry { + size_t delayedPhaseID; + QString delayedPhaseName; + QString dependencyType; + QString timeDependency; + size_t dependencyPhaseID; + QString dependencyPhaseName; +}; + +class PhaseDependenciesTracker { +public: + static void calculateDependencies(TraceDB& tdb, const std::vector& commands); + +private: + static void mDropTable(TraceDB& tdb); + static void mCreateTable(TraceDB& tdb); + static void mInsertIntoTable(TraceDB& tdb, const std::vector& entries); + + static const std::vector> mGetAllPhases(TraceDB& tdb, const std::vector& commands); + static const std::vector mCalculateDependencies(const std::vector>& phases); + + static QSqlQuery mExecuteQuery(TraceDB& tdb, const QString queryStr); + + PhaseDependenciesTracker() = delete; + ~PhaseDependenciesTracker() = delete; +}; diff --git a/DRAMSys/traceAnalyzer/businessObjects/phases/phasedependency.h b/DRAMSys/traceAnalyzer/businessObjects/phases/phasedependency.h index 41be1c1e..fa203556 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/phases/phasedependency.h +++ b/DRAMSys/traceAnalyzer/businessObjects/phases/phasedependency.h @@ -48,8 +48,8 @@ class Phase; enum DependencyType { - Bank, - Rank, + IntraBank, + IntraRank, InterRank }; diff --git a/DRAMSys/traceAnalyzer/data/tracedb.cpp b/DRAMSys/traceAnalyzer/data/tracedb.cpp index 6d79a2c8..75c0f133 100644 --- a/DRAMSys/traceAnalyzer/data/tracedb.cpp +++ b/DRAMSys/traceAnalyzer/data/tracedb.cpp @@ -151,10 +151,12 @@ std::vector> TraceDB::getTransactionsInTimespan(con bool TraceDB::checkDependencyTableExists() { executeQuery(checkDependenciesExist); - if (checkDependenciesExist.next() && checkDependenciesExist.value(0).toInt() == 1) - return true; - return false; + bool exists = checkDependenciesExist.next() && checkDependenciesExist.value(0).toInt() == 1; + + checkDependenciesExist.finish(); + + return exists; } void TraceDB::updateDependenciesInTimespan(const Timespan &span) @@ -577,11 +579,11 @@ void TraceDB::mUpdateDependenciesFromQuery(QSqlQuery &query) QString dependencyTypeStr = query.value(2).toString(); if (dependencyTypeStr == "bank") { - type = DependencyType::Bank; + type = DependencyType::IntraBank; } else if (dependencyTypeStr == "rank") { - type = DependencyType::Rank; + type = DependencyType::IntraRank; } else if (dependencyTypeStr == "interRank") { diff --git a/DRAMSys/traceAnalyzer/data/tracedb.h b/DRAMSys/traceAnalyzer/data/tracedb.h index 0ee3e3cb..67ca4d8c 100644 --- a/DRAMSys/traceAnalyzer/data/tracedb.h +++ b/DRAMSys/traceAnalyzer/data/tracedb.h @@ -151,6 +151,9 @@ private: QVariant getParameterFromTable(const std::string& parameter, const std::string& table); std::map> _visiblePhases; // Updated at parseTransactionsFromQuery + + // At businessObjects/phasedependenciestracker.h + friend class PhaseDependenciesTracker; }; diff --git a/DRAMSys/traceAnalyzer/tracefiletab.cpp b/DRAMSys/traceAnalyzer/tracefiletab.cpp index bd6e72cb..ba09aa33 100644 --- a/DRAMSys/traceAnalyzer/tracefiletab.cpp +++ b/DRAMSys/traceAnalyzer/tracefiletab.cpp @@ -42,7 +42,7 @@ #include "businessObjects/commentmodel.h" #include "businessObjects/configmodels.h" #include "businessObjects/pythoncaller.h" -#include "businessObjects/tracetime.h" +#include "businessObjects/phasedependenciestracker.h" #include "presentation/traceselector.h" #include "qmessagebox.h" #include "queryeditor.h" @@ -310,30 +310,23 @@ void TraceFileTab::on_latencyTreeView_doubleClicked(const QModelIndex &index) } } -bool TraceFileTab::eventFilter(QObject *object, QEvent *event) -{ - if (auto canvas = qobject_cast(object)) - { - if (event->type() == QEvent::MouseButtonDblClick) - { - QMouseEvent *mouseEvent = static_cast(event); +void TraceFileTab::on_calculateDependencies_clicked() { + // TODO - anything else? Update view maybe? + // TODO - For now fixed, but must be selectable + std::vector commands = { + "ACT", + "PRE", + "RD", + "RDA", + "WR", + "WRA", + "PDE", + "PDX", + "PREA" + }; - if (mouseEvent->button() != Qt::LeftButton) - return false; + PhaseDependenciesTracker::calculateDependencies(navigator->TraceFile(), commands); - QwtPlot *plot = canvas->plot(); - - double realTime = plot->invTransform(QwtPlot::xBottom, mouseEvent->x()); - - // Convert from seconds to picoseconds - traceTime time = realTime * 1000 * 1000 * 1000 * 1000; - - navigator->navigateToTime(time); - return true; - } - } - - return QWidget::eventFilter(object, event); } void TraceFileTab::on_startLatencyAnalysis_clicked() diff --git a/DRAMSys/traceAnalyzer/tracefiletab.h b/DRAMSys/traceAnalyzer/tracefiletab.h index a345bbc1..cd36887f 100644 --- a/DRAMSys/traceAnalyzer/tracefiletab.h +++ b/DRAMSys/traceAnalyzer/tracefiletab.h @@ -117,6 +117,7 @@ Q_SIGNALS: private Q_SLOTS: void on_latencyTreeView_doubleClicked(const QModelIndex &index); + void on_calculateDependencies_clicked(); void on_startLatencyAnalysis_clicked(); void on_startPowerAnalysis_clicked(); }; diff --git a/DRAMSys/traceAnalyzer/tracefiletab.ui b/DRAMSys/traceAnalyzer/tracefiletab.ui index 22a0a210..f2cac71d 100644 --- a/DRAMSys/traceAnalyzer/tracefiletab.ui +++ b/DRAMSys/traceAnalyzer/tracefiletab.ui @@ -208,6 +208,13 @@ Dependency Information + + + + Calculate Dependencies + + + @@ -247,6 +254,7 @@ + @@ -295,6 +303,7 @@ + true