diff --git a/DRAMSys/traceAnalyzer/CMakeLists.txt b/DRAMSys/traceAnalyzer/CMakeLists.txt index 361f8553..38de4eea 100644 --- a/DRAMSys/traceAnalyzer/CMakeLists.txt +++ b/DRAMSys/traceAnalyzer/CMakeLists.txt @@ -91,6 +91,7 @@ add_executable(TraceAnalyzer presentation/tracemetrictreewidget.cpp businessObjects/phases/phase.cpp businessObjects/phases/phasedependency.cpp + businessObjects/phases/dependencyinfos.cpp presentation/tracedrawingproperties.cpp presentation/util/traceplotline.cpp presentation/util/traceplotlinecache.cpp diff --git a/DRAMSys/traceAnalyzer/businessObjects/phases/dependencyinfos.cpp b/DRAMSys/traceAnalyzer/businessObjects/phases/dependencyinfos.cpp new file mode 100644 index 00000000..1b5c2e54 --- /dev/null +++ b/DRAMSys/traceAnalyzer/businessObjects/phases/dependencyinfos.cpp @@ -0,0 +1,19 @@ + +#include "dependencyinfos.h" + +DependencyInfos::DependencyInfos(Type type) + : mType(type) +{} + +DependencyInfos::DependencyInfos() +{ + mType = DependencyType; +} + +DependencyInfos::~DependencyInfos() +{} + +void DependencyInfos::addInfo(DependencyInfo info) +{ + mInfos.push_back(info); +} diff --git a/DRAMSys/traceAnalyzer/businessObjects/phases/dependencyinfos.h b/DRAMSys/traceAnalyzer/businessObjects/phases/dependencyinfos.h new file mode 100644 index 00000000..7c70ec52 --- /dev/null +++ b/DRAMSys/traceAnalyzer/businessObjects/phases/dependencyinfos.h @@ -0,0 +1,36 @@ +#pragma once + +#include + +#include + +struct DependencyInfo { + QString id; + float value; +}; + +class DependencyInfos +{ + public: + enum Type { + DependencyType, + TimeDependency, + DelayedPhase, + DependencyPhase + }; + + public: + DependencyInfos(Type); + DependencyInfos(); + ~DependencyInfos(); + + void setType(Type type) { mType = type; } + void addInfo(DependencyInfo); + + const std::vector& getInfos() const { return mInfos; } + + private: + Type mType; + std::vector mInfos; + +}; diff --git a/DRAMSys/traceAnalyzer/businessObjects/phases/phase.cpp b/DRAMSys/traceAnalyzer/businessObjects/phases/phase.cpp index 73c63ead..488a6287 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/phases/phase.cpp +++ b/DRAMSys/traceAnalyzer/businessObjects/phases/phase.cpp @@ -73,7 +73,6 @@ void Phase::draw(QPainter *painter, const QwtScaleMap &xMap, if (getGranularity() == Granularity::Bankwise) { - bool drawDependencyText = true; DependencyOptions drawDependenciesOptions = drawingProperties.drawDependenciesOption; if (drawDependenciesOptions.draw == DependencyOption::All || (drawDependenciesOptions.draw == DependencyOption::Selected && highlight)) diff --git a/DRAMSys/traceAnalyzer/data/QueryTexts.h b/DRAMSys/traceAnalyzer/data/QueryTexts.h index 9ff3d2a5..dda28293 100644 --- a/DRAMSys/traceAnalyzer/data/QueryTexts.h +++ b/DRAMSys/traceAnalyzer/data/QueryTexts.h @@ -43,6 +43,7 @@ struct TransactionQueryTexts { QString queryHead; QString selectTransactionsByTimespan, selectTransactionById; QString checkDependenciesExist, selectDependenciesByTimespan; + QString selectDependencyTypePercentages, selectTimeDependencyPercentages, selectDelayedPhasePercentages, selectDependencyPhasePercentages; TransactionQueryTexts() { @@ -61,6 +62,62 @@ struct TransactionQueryTexts { " ON DirectDependencies.DelayedPhaseID = timespanTransactions.PhaseID )"; + // For some reason I could not use a parameter for these below + selectDependencyTypePercentages = "WITH TotalDeps (total) AS ( " + "SELECT COUNT(*) FROM DirectDependencies " + "), " + "DependencyTypeDeps (param, ndeps) AS ( " + "SELECT " + "DependencyType, " + "COUNT(*) " + "FROM DirectDependencies " + "GROUP BY \"DependencyType\" " + ") " + "SELECT param, ROUND(ndeps*100.0 / (SELECT total FROM TotalDeps), 3) as percentage " + "FROM DependencyTypeDeps " + "ORDER BY percentage DESC "; + + selectTimeDependencyPercentages = "WITH TotalDeps (total) AS ( " + "SELECT COUNT(*) FROM DirectDependencies " + "), " + "DependencyTypeDeps (param, ndeps) AS ( " + "SELECT " + "TimeDependency, " + "COUNT(*) " + "FROM DirectDependencies " + "GROUP BY \"TimeDependency\" " + ") " + "SELECT param, ROUND(ndeps*100.0 / (SELECT total FROM TotalDeps), 3) as percentage " + "FROM DependencyTypeDeps " + "ORDER BY percentage DESC "; + + selectDelayedPhasePercentages = "WITH TotalDeps (total) AS ( " + "SELECT COUNT(*) FROM DirectDependencies " + "), " + "DependencyTypeDeps (param, ndeps) AS ( " + "SELECT " + "DelayedPhaseName, " + "COUNT(*) " + "FROM DirectDependencies " + "GROUP BY \"DelayedPhaseName\" " + ") " + "SELECT param, ROUND(ndeps*100.0 / (SELECT total FROM TotalDeps), 3) as percentage " + "FROM DependencyTypeDeps " + "ORDER BY percentage DESC "; + + selectDependencyPhasePercentages = "WITH TotalDeps (total) AS ( " + "SELECT COUNT(*) FROM DirectDependencies " + "), " + "DependencyTypeDeps (param, ndeps) AS ( " + "SELECT " + "DependencyPhaseName, " + "COUNT(*) " + "FROM DirectDependencies " + "GROUP BY \"DependencyPhaseName\" " + ") " + "SELECT param, ROUND(ndeps*100.0 / (SELECT total FROM TotalDeps), 3) as percentage " + "FROM DependencyTypeDeps " + "ORDER BY percentage DESC "; } }; diff --git a/DRAMSys/traceAnalyzer/data/tracedb.cpp b/DRAMSys/traceAnalyzer/data/tracedb.cpp index 2a3ace91..f7f85123 100644 --- a/DRAMSys/traceAnalyzer/data/tracedb.cpp +++ b/DRAMSys/traceAnalyzer/data/tracedb.cpp @@ -91,11 +91,18 @@ void TraceDB::prepareQueries() selectDependenciesByTimespan = QSqlQuery(database); selectDependenciesByTimespan.prepare(queryTexts.selectDependenciesByTimespan); + selectDependencyTypePercentages = QSqlQuery(database); + selectDependencyTypePercentages.prepare(queryTexts.selectDependencyTypePercentages); + selectTimeDependencyPercentages = QSqlQuery(database); + selectTimeDependencyPercentages.prepare(queryTexts.selectTimeDependencyPercentages); + selectDelayedPhasePercentages = QSqlQuery(database); + selectDelayedPhasePercentages.prepare(queryTexts.selectDelayedPhasePercentages); + selectDependencyPhasePercentages = QSqlQuery(database); + selectDependencyPhasePercentages.prepare(queryTexts.selectDependencyPhasePercentages); } void TraceDB::updateComments(const std::vector &comments) { - QSqlQuery query(database); query.prepare("DELETE FROM Comments"); executeQuery(query); @@ -381,6 +388,36 @@ vector TraceDB::getDebugMessagesInTimespan(const Timespan return parseCommentsFromQuery(selectDebugMessagesByTimespanWithLimit); } +DependencyInfos TraceDB::getDependencyInfos(DependencyInfos::Type infoType) +{ + DependencyInfos dummy; + executeQuery(checkDependenciesExist); + if (!checkDependenciesExist.next() || checkDependenciesExist.value(0).toInt() != 1) { + return dummy; + } + + switch(infoType) { + case DependencyInfos::Type::DependencyType: + executeQuery(selectDependencyTypePercentages); + return parseDependencyInfos(selectDependencyTypePercentages, infoType); + + case DependencyInfos::Type::TimeDependency: + executeQuery(selectTimeDependencyPercentages); + return parseDependencyInfos(selectTimeDependencyPercentages, infoType); + + case DependencyInfos::Type::DelayedPhase: + executeQuery(selectDelayedPhasePercentages); + return parseDependencyInfos(selectDelayedPhasePercentages, infoType); + + case DependencyInfos::Type::DependencyPhase: + executeQuery(selectDependencyPhasePercentages); + return parseDependencyInfos(selectDependencyPhasePercentages, infoType); + + } + + return dummy; +} + QSqlDatabase TraceDB::getDatabase() const { return database; @@ -515,6 +552,17 @@ vector TraceDB::parseCommentsFromQuery(QSqlQuery &query) return result; } +DependencyInfos TraceDB::parseDependencyInfos(QSqlQuery & query, const DependencyInfos::Type infoType) +{ + DependencyInfos infos(infoType); + + while(query.next()) { + infos.addInfo({query.value(0).toString(), query.value(1).toFloat()}); + } + + return infos; +} + void TraceDB::executeQuery(QSqlQuery query) { diff --git a/DRAMSys/traceAnalyzer/data/tracedb.h b/DRAMSys/traceAnalyzer/data/tracedb.h index ef9a8454..c81599a9 100644 --- a/DRAMSys/traceAnalyzer/data/tracedb.h +++ b/DRAMSys/traceAnalyzer/data/tracedb.h @@ -51,6 +51,7 @@ #include "businessObjects/generalinfo.h" #include "businessObjects/commandlengths.h" #include "businessObjects/phases/phasefactory.h" +#include "businessObjects/phases/dependencyinfos.h" #include "businessObjects/commentmodel.h" #include "QueryTexts.h" @@ -106,6 +107,9 @@ public: std::vector getDebugMessagesInTimespan(const Timespan &span, unsigned int limit); + // TODO + DependencyInfos getDependencyInfos(DependencyInfos::Type infoType); + QSqlDatabase getDatabase() const; private: @@ -122,6 +126,10 @@ private: QSqlQuery selectDebugMessagesByTimespanWithLimit; QSqlQuery checkDependenciesExist; QSqlQuery selectDependenciesByTimespan; + QSqlQuery selectDependencyTypePercentages; + QSqlQuery selectTimeDependencyPercentages; + QSqlQuery selectDelayedPhasePercentages; + QSqlQuery selectDependencyPhasePercentages; TransactionQueryTexts queryTexts; void prepareQueries(); @@ -133,6 +141,8 @@ private: bool updateVisiblePhases = false); std::vector parseCommentsFromQuery(QSqlQuery &query); + DependencyInfos parseDependencyInfos(QSqlQuery & query, const DependencyInfos::Type infoType); + void executeScriptFile(QString fileName); void dropAndCreateTables();