Began adding base algorithm for dependency calculations.

This commit is contained in:
Iron Prando da Silva
2021-12-08 14:44:35 +01:00
parent b5dc20ad73
commit 5d4b255197
9 changed files with 218 additions and 30 deletions

View File

@@ -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

View File

@@ -0,0 +1,134 @@
#include "phasedependenciestracker.h"
void
PhaseDependenciesTracker::calculateDependencies(TraceDB& tdb, const std::vector<std::string>& 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<DBDependencyEntry>& 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<std::shared_ptr<DBPhaseEntry>>
PhaseDependenciesTracker::mGetAllPhases(TraceDB& tdb, const std::vector<std::string>& commands) {
std::vector<std::shared_ptr<DBPhaseEntry>> 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<DBPhaseEntry>(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<DBDependencyEntry>
PhaseDependenciesTracker::mCalculateDependencies(const std::vector<std::shared_ptr<DBPhaseEntry>>& transactions) {
std::vector<DBDependencyEntry> 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;
}

View File

@@ -0,0 +1,45 @@
#pragma once
#include <vector>
#include <string>
#include <QString>
#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<std::string>& commands);
private:
static void mDropTable(TraceDB& tdb);
static void mCreateTable(TraceDB& tdb);
static void mInsertIntoTable(TraceDB& tdb, const std::vector<DBDependencyEntry>& entries);
static const std::vector<std::shared_ptr<DBPhaseEntry>> mGetAllPhases(TraceDB& tdb, const std::vector<std::string>& commands);
static const std::vector<DBDependencyEntry> mCalculateDependencies(const std::vector<std::shared_ptr<DBPhaseEntry>>& phases);
static QSqlQuery mExecuteQuery(TraceDB& tdb, const QString queryStr);
PhaseDependenciesTracker() = delete;
~PhaseDependenciesTracker() = delete;
};

View File

@@ -48,8 +48,8 @@ class Phase;
enum DependencyType
{
Bank,
Rank,
IntraBank,
IntraRank,
InterRank
};

View File

@@ -151,10 +151,12 @@ std::vector<std::shared_ptr<Transaction>> 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")
{

View File

@@ -151,6 +151,9 @@ private:
QVariant getParameterFromTable(const std::string& parameter, const std::string& table);
std::map<unsigned int, std::shared_ptr<Phase>> _visiblePhases; // Updated at parseTransactionsFromQuery
// At businessObjects/phasedependenciestracker.h
friend class PhaseDependenciesTracker;
};

View File

@@ -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<QwtPlotCanvas *>(object))
{
if (event->type() == QEvent::MouseButtonDblClick)
{
QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event);
void TraceFileTab::on_calculateDependencies_clicked() {
// TODO - anything else? Update view maybe?
// TODO - For now fixed, but must be selectable
std::vector<std::string> 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()

View File

@@ -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();
};

View File

@@ -208,6 +208,13 @@
<string>Dependency Information</string>
</attribute>
<layout class="QVBoxLayout" name="verticalLayout_depInfos">
<item>
<widget class="QPushButton" name="calculateDependencies">
<property name="text">
<string>Calculate Dependencies</string>
</property>
</widget>
</item>
<item>
<widget class="QTreeView" name="depInfosView">
<property name="uniformRowHeights">
@@ -247,6 +254,7 @@
</item>
</layout>
</widget>
<widget class="QWidget" name="tabLatencyAnalysis">
<property name="sizePolicy">
<sizepolicy hsizetype="Ignored" vsizetype="Ignored">
@@ -295,6 +303,7 @@
</item>
</layout>
</widget>
<widget class="QWidget" name="tabPowerAnalysis">
<property name="enabled">
<bool>true</bool>