From 2d310789f1fc31a5eda2d25e1448f3d2b8e701c8 Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Fri, 1 Apr 2022 13:17:59 +0200 Subject: [PATCH] Seperated Data Bus for PseudoChannelMode --- DRAMSys/library/src/common/TlmRecorder.cpp | 16 +++- DRAMSys/library/src/common/TlmRecorder.h | 3 +- .../businessObjects/generalinfo.h | 5 +- .../businessObjects/phases/phase.cpp | 91 +++++++++++++------ .../businessObjects/traceplotlinemodel.cpp | 35 +++++-- .../businessObjects/traceplotlinemodel.h | 10 ++ DRAMSys/traceAnalyzer/data/tracedb.cpp | 4 +- 7 files changed, 124 insertions(+), 40 deletions(-) diff --git a/DRAMSys/library/src/common/TlmRecorder.cpp b/DRAMSys/library/src/common/TlmRecorder.cpp index d847d761..eccdc527 100644 --- a/DRAMSys/library/src/common/TlmRecorder.cpp +++ b/DRAMSys/library/src/common/TlmRecorder.cpp @@ -308,7 +308,7 @@ void TlmRecorder::prepareSqlStatements() "INSERT INTO GeneralInfo VALUES" "(:numberOfTransactions, :end, :numberOfRanks, :numberOfBankGroups, :numberOfBanks, :clk, :unitOfTime, " ":mcconfig, :memspec, :traces, :windowSize, :refreshMaxPostponed, :refreshMaxPulledin, :controllerThread, " - ":maxBufferDepth, :per2BankOffset, :rowColumnCommandBus)"; + ":maxBufferDepth, :per2BankOffset, :rowColumnCommandBus, :pseudoChannelMode)"; insertCommandLengthsString = "INSERT INTO CommandLengths VALUES" "(:command, :length)"; @@ -366,7 +366,8 @@ void TlmRecorder::insertGeneralInfo() sqlite3_bind_int(insertGeneralInfoStatement, 16, static_cast(Configuration::getInstance().memSpec->getPer2BankOffset())); - const auto memoryType = Configuration::getInstance().memSpec->memoryType; + const auto memSpec = Configuration::getInstance().memSpec; + const auto memoryType = memSpec->memoryType; bool rowColumnCommandBus = [memoryType]() -> bool { if (memoryType == MemSpec::MemoryType::HBM2) return true; @@ -374,7 +375,18 @@ void TlmRecorder::insertGeneralInfo() return false; }(); + bool pseudoChannelMode = [memSpec, memoryType]() -> bool { + if (memoryType != MemSpec::MemoryType::HBM2) + return false; + + if (memSpec->numberOfRanks != 1) + return true; + else + return false; + }(); + sqlite3_bind_int(insertGeneralInfoStatement, 17, static_cast(rowColumnCommandBus)); + sqlite3_bind_int(insertGeneralInfoStatement, 18, static_cast(pseudoChannelMode)); executeSqlStatement(insertGeneralInfoStatement); } diff --git a/DRAMSys/library/src/common/TlmRecorder.h b/DRAMSys/library/src/common/TlmRecorder.h index 31688112..a440fe8a 100644 --- a/DRAMSys/library/src/common/TlmRecorder.h +++ b/DRAMSys/library/src/common/TlmRecorder.h @@ -190,7 +190,8 @@ private: " ControllerThread INTEGER, \n" " MaxBufferDepth INTEGER, \n" " Per2BankOffset INTEGER, \n" - " RowColumnCommandBus BOOL \n" + " RowColumnCommandBus BOOL, \n" + " PseudoChannelMode BOOL \n" "); \n" " \n" "CREATE TABLE CommandLengths( \n" diff --git a/DRAMSys/traceAnalyzer/businessObjects/generalinfo.h b/DRAMSys/traceAnalyzer/businessObjects/generalinfo.h index f4f74ebf..4f5ef2a6 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/generalinfo.h +++ b/DRAMSys/traceAnalyzer/businessObjects/generalinfo.h @@ -63,13 +63,14 @@ struct GeneralInfo unsigned int maxBufferDepth = 8; unsigned int per2BankOffset = 1; bool rowColumnCommandBus = false; + bool pseudoChannelMode = false; GeneralInfo() = default; GeneralInfo(uint64_t numberOfTransactions, uint64_t numberOfPhases, Timespan span, unsigned int numberOfRanks, unsigned int numberOfBankgroups, unsigned int numberOfBanks, QString description, QString unitOfTime, uint64_t clkPeriod, uint64_t windowSize, unsigned int refreshMaxPostponed, unsigned int refreshMaxPulledin, uint64_t controllerThread, unsigned int maxBufferDepth, - unsigned int per2BankOffset, bool rowColumnCommandBus) + unsigned int per2BankOffset, bool rowColumnCommandBus, bool pseudoChannelMode) : numberOfTransactions(numberOfTransactions), numberOfPhases(numberOfPhases), span(span), numberOfRanks(numberOfRanks), numberOfBankGroups(numberOfBankgroups), numberOfBanks(numberOfBanks), banksPerRank(numberOfBanks / numberOfRanks), groupsPerRank(numberOfBankgroups / numberOfRanks), @@ -77,7 +78,7 @@ struct GeneralInfo unitOfTime(std::move(unitOfTime)), clkPeriod(clkPeriod), windowSize(windowSize), refreshMaxPostponed(refreshMaxPostponed), refreshMaxPulledin(refreshMaxPulledin), controllerThread(controllerThread), maxBufferDepth(maxBufferDepth), per2BankOffset(per2BankOffset), - rowColumnCommandBus(rowColumnCommandBus) + rowColumnCommandBus(rowColumnCommandBus), pseudoChannelMode(pseudoChannelMode) { } }; diff --git a/DRAMSys/traceAnalyzer/businessObjects/phases/phase.cpp b/DRAMSys/traceAnalyzer/businessObjects/phases/phase.cpp index 2c5c35f8..0cd31fd7 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/phases/phase.cpp +++ b/DRAMSys/traceAnalyzer/businessObjects/phases/phase.cpp @@ -44,22 +44,25 @@ #include -void Phase::draw(QPainter *painter, const QwtScaleMap &xMap, - const QwtScaleMap &yMap, const QRectF &canvasRect, bool highlight, - const TraceDrawingProperties &drawingProperties) const +void Phase::draw(QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRectF &canvasRect, + bool highlight, const TraceDrawingProperties &drawingProperties) const { Q_UNUSED(canvasRect); QColor color = getColor(drawingProperties); painter->setBrush(QBrush(getColor(drawingProperties), getBrushStyle())); - if (!drawingProperties.drawBorder) { + if (!drawingProperties.drawBorder) + { painter->setPen(color); - } else { + } + else + { painter->setPen(Qt::black); } - if (highlight) { + if (highlight) + { QPen pen(Qt::red); pen.setWidth(3); painter->setPen(pen); @@ -98,8 +101,8 @@ void Phase::draw(QPainter *painter, const QwtScaleMap &xMap, else if (line->data.type != AbstractTracePlotLineModel::CommandBusLine) continue; - drawPhaseSymbol(span.Begin(), span.End(), line->data.yVal, false, PhaseSymbol::Hexagon, painter, xMap, - yMap, drawingProperties.textColor); + drawPhaseSymbol(span.Begin(), span.End(), line->data.yVal, false, PhaseSymbol::Hexagon, painter, xMap, yMap, + drawingProperties.textColor); } } @@ -107,7 +110,17 @@ void Phase::draw(QPainter *painter, const QwtScaleMap &xMap, { for (const auto &line : drawingProperties.getTracePlotLines()) { - if (line->data.type != AbstractTracePlotLineModel::DataBusLine) + if (line->data.type == AbstractTracePlotLineModel::PseudoChannel0Line) + { + if (transaction.lock()->rank != 0) + continue; + } + else if (line->data.type == AbstractTracePlotLineModel::PseudoChannel1Line) + { + if (transaction.lock()->rank != 1) + continue; + } + else if (line->data.type != AbstractTracePlotLineModel::DataBusLine) continue; drawPhaseSymbol(spanOnDataBus->Begin(), spanOnDataBus->End(), line->data.yVal, false, PhaseSymbol::Hexagon, @@ -116,9 +129,8 @@ void Phase::draw(QPainter *painter, const QwtScaleMap &xMap, } } -void Phase::drawPhaseSymbol(traceTime begin, traceTime end, double y, - bool drawtext, PhaseSymbol symbol, QPainter *painter, const QwtScaleMap &xMap, - const QwtScaleMap &yMap, QColor textColor) const +void Phase::drawPhaseSymbol(traceTime begin, traceTime end, double y, bool drawtext, PhaseSymbol symbol, + QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, QColor textColor) const { double yVal = yMap.transform(y); double symbolHeight = yMap.transform(0) - yMap.transform(hexagonHeight); @@ -126,19 +138,23 @@ void Phase::drawPhaseSymbol(traceTime begin, traceTime end, double y, // Increase display size of phases with zero span traceTime offset = (begin == end) ? static_cast(0.05 * clk) : 0; - if (symbol == PhaseSymbol::Hexagon) { + if (symbol == PhaseSymbol::Hexagon) + { QPoint hexFrom(static_cast(xMap.transform(begin)), static_cast(yVal)); QPoint hexTo(static_cast(xMap.transform(end + offset)), static_cast(yVal)); drawHexagon(painter, hexFrom, hexTo, symbolHeight); - } else { + } + else + { QPoint upperLeft(static_cast(xMap.transform(begin)), static_cast(yVal - symbolHeight / 2)); QPoint bottomRight(static_cast(xMap.transform(end)), static_cast(yVal + symbolHeight / 2)); painter->drawRect(QRect(upperLeft, bottomRight)); } if (drawtext) - drawText(painter, Name(), QPoint(static_cast(xMap.transform(begin)), - static_cast(yVal + symbolHeight / 2)), TextPositioning::bottomRight, textColor); + drawText(painter, Name(), + QPoint(static_cast(xMap.transform(begin)), static_cast(yVal + symbolHeight / 2)), + TextPositioning::bottomRight, textColor); } void Phase::drawPhaseDependencies(traceTime begin, traceTime end, double y, @@ -265,14 +281,15 @@ QColor Phase::getColor(const TraceDrawingProperties &drawingProperties) const { switch (drawingProperties.colorGrouping) { - case ColorGrouping::PhaseType: - return getPhaseColor(); - case ColorGrouping::Thread: - return ColorGenerator::getColor(static_cast(transaction.lock()->thread)); - case ColorGrouping::AlphaTransaction: - return ColorGenerator::getAlphaColored(transaction.lock()->id); - case ColorGrouping::Transaction: default: - return ColorGenerator::getColor(transaction.lock()->id); + case ColorGrouping::PhaseType: + return getPhaseColor(); + case ColorGrouping::Thread: + return ColorGenerator::getColor(static_cast(transaction.lock()->thread)); + case ColorGrouping::AlphaTransaction: + return ColorGenerator::getAlphaColored(transaction.lock()->id); + case ColorGrouping::Transaction: + default: + return ColorGenerator::getColor(transaction.lock()->id); } } @@ -296,9 +313,17 @@ bool Phase::isSelected(Timespan timespan, double yVal, const TraceDrawingPropert { for (const auto &line : drawingProperties.getTracePlotLines()) { - if ((line->data.type != AbstractTracePlotLineModel::CommandBusLine) && - (line->data.type != AbstractTracePlotLineModel::RowCommandBusLine) && - (line->data.type != AbstractTracePlotLineModel::ColumnCommandBusLine)) + if (line->data.type == AbstractTracePlotLineModel::RowCommandBusLine) + { + if (isColumnCommand()) + continue; + } + else if (line->data.type == AbstractTracePlotLineModel::ColumnCommandBusLine) + { + if (!isColumnCommand()) + continue; + } + else if (line->data.type != AbstractTracePlotLineModel::CommandBusLine) continue; if (fabs(yVal - line->data.yVal) <= hexagonHeight / 2) @@ -311,7 +336,17 @@ bool Phase::isSelected(Timespan timespan, double yVal, const TraceDrawingPropert { for (const auto &line : drawingProperties.getTracePlotLines()) { - if (line->data.type != AbstractTracePlotLineModel::DataBusLine) + if (line->data.type == AbstractTracePlotLineModel::PseudoChannel0Line) + { + if (transaction.lock()->rank != 0) + continue; + } + else if (line->data.type == AbstractTracePlotLineModel::PseudoChannel1Line) + { + if (transaction.lock()->rank != 1) + continue; + } + else if (line->data.type != AbstractTracePlotLineModel::DataBusLine) continue; if (fabs(yVal - line->data.yVal) <= hexagonHeight / 2) diff --git a/DRAMSys/traceAnalyzer/businessObjects/traceplotlinemodel.cpp b/DRAMSys/traceAnalyzer/businessObjects/traceplotlinemodel.cpp index dde50281..2439c43c 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/traceplotlinemodel.cpp +++ b/DRAMSys/traceAnalyzer/businessObjects/traceplotlinemodel.cpp @@ -45,7 +45,8 @@ AbstractTracePlotLineModel::AbstractTracePlotLineModel(const GeneralInfo &genera : QAbstractItemModel(parent), internalSelectionModel(new QItemSelectionModel(this, this)), rootNode(std::make_shared()), numberOfRanks(generalInfo.numberOfRanks), groupsPerRank(generalInfo.groupsPerRank), banksPerGroup(generalInfo.banksPerGroup), - banksPerRank(generalInfo.banksPerRank), commandBusType(getCommandBusType(generalInfo)) + banksPerRank(generalInfo.banksPerRank), commandBusType(getCommandBusType(generalInfo)), + dataBusType(getDataBusType(generalInfo)) { createInitialNodes(); } @@ -72,7 +73,7 @@ void AbstractTracePlotLineModel::createInitialNodes() addTopLevelNode( std::unique_ptr(new Node({LineType::ResponseLine, getLabel(LineType::ResponseLine)}, rootNode.get()))); - for (unsigned int rank = numberOfRanks; rank--;) + for (unsigned int rank = 0; rank < numberOfRanks; rank++) addTopLevelNode(createRankGroupNode(rank)); if (commandBusType == CommandBusType::SingleCommandBus) @@ -88,8 +89,18 @@ void AbstractTracePlotLineModel::createInitialNodes() new Node({LineType::ColumnCommandBusLine, getLabel(LineType::ColumnCommandBusLine)}, rootNode.get()))); } - addTopLevelNode( - std::unique_ptr(new Node({LineType::DataBusLine, getLabel(LineType::DataBusLine)}, rootNode.get()))); + if (dataBusType == DataBusType::LegacyMode) + { + addTopLevelNode( + std::unique_ptr(new Node({LineType::DataBusLine, getLabel(LineType::DataBusLine)}, rootNode.get()))); + } + else // dataBusType == DataBusType::PseudoChannelMode + { + addTopLevelNode(std::unique_ptr( + new Node({LineType::PseudoChannel0Line, getLabel(LineType::PseudoChannel0Line)}, rootNode.get()))); + addTopLevelNode(std::unique_ptr( + new Node({LineType::PseudoChannel1Line, getLabel(LineType::PseudoChannel1Line)}, rootNode.get()))); + } } std::shared_ptr @@ -97,9 +108,9 @@ AbstractTracePlotLineModel::createRankGroupNode(unsigned int rank) const { auto rankGroup = std::unique_ptr(new Node({LineType::RankGroup, getLabel(rank), rank}, rootNode.get())); - for (unsigned int group = groupsPerRank; group--;) + for (unsigned int group = 0; group < groupsPerRank; group++) { - for (unsigned int bank = banksPerGroup; bank--;) + for (unsigned int bank = 0; bank < banksPerGroup; bank++) { unsigned int absoluteRank = rank; unsigned int absoluteGroup = group + rank * groupsPerRank; @@ -336,6 +347,10 @@ QString AbstractTracePlotLineModel::getLabel(LineType type) return "Command Bus [C]"; case LineType::DataBusLine: return "Data Bus"; + case LineType::PseudoChannel0Line: + return "Data Bus [PC0]"; + case LineType::PseudoChannel1Line: + return "Data Bus [PC1]"; default: return ""; } @@ -359,6 +374,14 @@ AbstractTracePlotLineModel::CommandBusType AbstractTracePlotLineModel::getComman return CommandBusType::SingleCommandBus; } +AbstractTracePlotLineModel::DataBusType AbstractTracePlotLineModel::getDataBusType(const GeneralInfo &generalInfo) +{ + if (generalInfo.pseudoChannelMode) + return DataBusType::PseudoChannelMode; + else + return DataBusType::LegacyMode; +} + bool SelectedTracePlotLineModel::removeRows(int row, int count, const QModelIndex &parent) { if (parent != QModelIndex()) diff --git a/DRAMSys/traceAnalyzer/businessObjects/traceplotlinemodel.h b/DRAMSys/traceAnalyzer/businessObjects/traceplotlinemodel.h index a696e1ee..768e7f00 100644 --- a/DRAMSys/traceAnalyzer/businessObjects/traceplotlinemodel.h +++ b/DRAMSys/traceAnalyzer/businessObjects/traceplotlinemodel.h @@ -78,6 +78,8 @@ public: RowCommandBusLine, ColumnCommandBusLine, DataBusLine, + PseudoChannel0Line, + PseudoChannel1Line, RankGroup, BankLine }; @@ -152,6 +154,12 @@ protected: RowColumnCommandBus }; + enum class DataBusType + { + LegacyMode, + PseudoChannelMode + }; + QStringList mimeTypes() const override; QMimeData *mimeData(const QModelIndexList &indexes) const override; bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, @@ -170,6 +178,7 @@ protected: static QString getLabel(unsigned int rank, unsigned int group, unsigned int bank); static CommandBusType getCommandBusType(const GeneralInfo &generalInfo); + static DataBusType getDataBusType(const GeneralInfo &generalInfo); static constexpr auto TRACELINE_MIMETYPE = "application/x-tracelinedata"; @@ -183,6 +192,7 @@ protected: const unsigned int banksPerRank; const CommandBusType commandBusType; + const DataBusType dataBusType; }; class AvailableTracePlotLineModel : public AbstractTracePlotLineModel diff --git a/DRAMSys/traceAnalyzer/data/tracedb.cpp b/DRAMSys/traceAnalyzer/data/tracedb.cpp index 8d2f7b4d..b445e478 100644 --- a/DRAMSys/traceAnalyzer/data/tracedb.cpp +++ b/DRAMSys/traceAnalyzer/data/tracedb.cpp @@ -318,6 +318,8 @@ GeneralInfo TraceDB::getGeneralInfoFromDB() unsigned per2BankOffset = parameter.isValid() ? parameter.toUInt() : 1; parameter = getParameterFromTable("RowColumnCommandBus", "GeneralInfo"); bool rowColumnCommandBus = parameter.isValid() ? parameter.toBool() : false; + parameter = getParameterFromTable("PseudoChannelMode", "GeneralInfo"); + bool pseudoChannelMode = parameter.isValid() ? parameter.toBool() : false; uint64_t numberOfPhases = getNumberOfPhases(); @@ -334,7 +336,7 @@ GeneralInfo TraceDB::getGeneralInfoFromDB() description, unitOfTime, clkPeriod, windowSize, refreshMaxPostponed, refreshMaxPulledin, controllerThread, maxBufferDepth, per2BankOffset, - rowColumnCommandBus}; + rowColumnCommandBus, pseudoChannelMode}; } CommandLengths TraceDB::getCommandLengthsFromDB()