Began adding base algorithm for dependency calculations.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
};
|
||||
@@ -48,8 +48,8 @@ class Phase;
|
||||
|
||||
enum DependencyType
|
||||
{
|
||||
Bank,
|
||||
Rank,
|
||||
IntraBank,
|
||||
IntraRank,
|
||||
InterRank
|
||||
};
|
||||
|
||||
|
||||
@@ -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")
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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();
|
||||
};
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user