From d392d0ab9893bb357a51536ad06c846accfaa4a6 Mon Sep 17 00:00:00 2001 From: Derek Christ Date: Wed, 9 Aug 2023 11:55:10 +0200 Subject: [PATCH] Write GeneralInfo table at the beginning and do not include information in it that is only known at the end of the simulation. These can trivially be calculated by the trace itself and would be redundant information regardless. The TraceAnalyzer gets the number of transactions and the length of the trace by additional SQL queries. This enables us to inspect traces of simulations that were aborted without finishing cleanlywithout finishing cleanly. --- .../apps/traceAnalyzer/data/tracedb.cpp | 30 ++++++++++--- extensions/apps/traceAnalyzer/data/tracedb.h | 5 +-- src/libdramsys/DRAMSys/common/TlmRecorder.cpp | 43 +++++++++---------- src/libdramsys/DRAMSys/common/TlmRecorder.h | 2 - 4 files changed, 46 insertions(+), 34 deletions(-) diff --git a/extensions/apps/traceAnalyzer/data/tracedb.cpp b/extensions/apps/traceAnalyzer/data/tracedb.cpp index e3526b39..ec30ba0b 100644 --- a/extensions/apps/traceAnalyzer/data/tracedb.cpp +++ b/extensions/apps/traceAnalyzer/data/tracedb.cpp @@ -290,11 +290,6 @@ ID TraceDB::getTransactionIDFromPhaseID(ID phaseID) GeneralInfo TraceDB::getGeneralInfoFromDB() { QVariant parameter; - parameter = getParameterFromTable("NumberOfTransactions", "GeneralInfo"); - uint64_t numberOfTransactions = parameter.isValid() ? parameter.toULongLong() : 0; - parameter = getParameterFromTable("TraceEnd", "GeneralInfo"); - traceTime traceEnd = parameter.isValid() ? static_cast(parameter.toULongLong()) : 0; - parameter = getParameterFromTable("NumberOfRanks", "GeneralInfo"); unsigned numberOfRanks = parameter.isValid() ? parameter.toUInt() : 1; parameter = getParameterFromTable("NumberOfBankgroups", "GeneralInfo"); unsigned numberOfBankGroups = parameter.isValid() ? parameter.toUInt() : numberOfRanks; @@ -328,6 +323,8 @@ GeneralInfo TraceDB::getGeneralInfoFromDB() bool pseudoChannelMode = parameter.isValid() && parameter.toBool(); uint64_t numberOfPhases = getNumberOfPhases(); + uint64_t numberOfTransactions = getNumberOfTransactions(); + auto traceEnd = static_cast(getTraceLength()); QString description = (traces + "\n"); description += mcconfig + "\n"; @@ -417,6 +414,26 @@ QVariant TraceDB::getParameterFromTable(const std::string& parameter, const std: } } +uint64_t TraceDB::getTraceLength() +{ + QSqlQuery query(database); + query.prepare("SELECT MAX(PhaseEnd) FROM Phases"); + executeQuery(query); + + query.next(); + return query.value(0).toULongLong(); +} + +uint64_t TraceDB::getNumberOfTransactions() +{ + QSqlQuery query(database); + query.prepare("SELECT COUNT(ID) FROM Transactions"); + executeQuery(query); + + query.next(); + return query.value(0).toULongLong(); +} + uint64_t TraceDB::getNumberOfPhases() { QSqlQuery query(database); @@ -480,7 +497,7 @@ DependencyInfos TraceDB::getDependencyInfos(DependencyInfos::Type infoType) selectTimeDependencyPercentages = QSqlQuery(database); if (!selectTimeDependencyPercentages.prepare(queryTexts.selectTimeDependencyPercentages)) qDebug() << database.lastError().text(); - + executeQuery(selectTimeDependencyPercentages); return parseDependencyInfos(selectTimeDependencyPercentages, infoType); } @@ -714,4 +731,3 @@ void TraceDB::executeScriptFile(const QString& fileName) } } } - diff --git a/extensions/apps/traceAnalyzer/data/tracedb.h b/extensions/apps/traceAnalyzer/data/tracedb.h index 47232ce4..c4e38be6 100644 --- a/extensions/apps/traceAnalyzer/data/tracedb.h +++ b/extensions/apps/traceAnalyzer/data/tracedb.h @@ -145,6 +145,8 @@ private: void executeScriptFile(const QString& fileName); void dropAndCreateTables(); + uint64_t getTraceLength(); + uint64_t getNumberOfTransactions(); uint64_t getNumberOfPhases(); GeneralInfo getGeneralInfoFromDB(); CommandLengths getCommandLengthsFromDB(); @@ -174,6 +176,3 @@ public: } }; #endif // TRACEDB_H - - - diff --git a/src/libdramsys/DRAMSys/common/TlmRecorder.cpp b/src/libdramsys/DRAMSys/common/TlmRecorder.cpp index 9bbb95c5..47644d38 100644 --- a/src/libdramsys/DRAMSys/common/TlmRecorder.cpp +++ b/src/libdramsys/DRAMSys/common/TlmRecorder.cpp @@ -73,6 +73,9 @@ TlmRecorder::TlmRecorder(const std::string& name, const Configuration& config, c executeInitialSqlCommand(); prepareSqlStatements(); + insertGeneralInfo(); + insertCommandLengths(); + PRINTDEBUGMESSAGE(name, "Starting new database transaction"); } @@ -352,7 +355,7 @@ void TlmRecorder::prepareSqlStatements() insertGeneralInfoString = "INSERT INTO GeneralInfo VALUES" - "(:numberOfTransactions, :end, :numberOfRanks, :numberOfBankGroups, :numberOfBanks, :clk, :unitOfTime, " + "(:numberOfRanks, :numberOfBankGroups, :numberOfBanks, :clk, :unitOfTime, " ":mcconfig, :memspec, :traces, :windowSize, :refreshMaxPostponed, :refreshMaxPulledin, :controllerThread, " ":maxBufferDepth, :per2BankOffset, :rowColumnCommandBus, :pseudoChannelMode)"; @@ -388,27 +391,25 @@ void TlmRecorder::insertDebugMessageInDB(const std::string &message, const sc_ti void TlmRecorder::insertGeneralInfo() { - sqlite3_bind_int64(insertGeneralInfoStatement, 1, static_cast(totalNumTransactions)); - sqlite3_bind_int64(insertGeneralInfoStatement, 2, static_cast(simulationTimeCoveredByRecording.value())); - sqlite3_bind_int(insertGeneralInfoStatement, 3, static_cast(config.memSpec->ranksPerChannel)); - sqlite3_bind_int(insertGeneralInfoStatement, 4, static_cast(config.memSpec->bankGroupsPerChannel)); - sqlite3_bind_int(insertGeneralInfoStatement, 5, static_cast(config.memSpec->banksPerChannel)); - sqlite3_bind_int64(insertGeneralInfoStatement, 6, static_cast(config.memSpec->tCK.value())); - sqlite3_bind_text(insertGeneralInfoStatement, 7, "PS", 2, nullptr); + sqlite3_bind_int(insertGeneralInfoStatement, 1, static_cast(config.memSpec->ranksPerChannel)); + sqlite3_bind_int(insertGeneralInfoStatement, 2, static_cast(config.memSpec->bankGroupsPerChannel)); + sqlite3_bind_int(insertGeneralInfoStatement, 3, static_cast(config.memSpec->banksPerChannel)); + sqlite3_bind_int64(insertGeneralInfoStatement, 4, static_cast(config.memSpec->tCK.value())); + sqlite3_bind_text(insertGeneralInfoStatement, 5, "PS", 2, nullptr); - sqlite3_bind_text(insertGeneralInfoStatement, 8, mcconfig.c_str(), static_cast(mcconfig.length()), nullptr); - sqlite3_bind_text(insertGeneralInfoStatement, 9, memspec.c_str(), static_cast(memspec.length()), nullptr); - sqlite3_bind_text(insertGeneralInfoStatement, 10, traces.c_str(), static_cast(traces.length()), nullptr); + sqlite3_bind_text(insertGeneralInfoStatement, 6, mcconfig.c_str(), static_cast(mcconfig.length()), nullptr); + sqlite3_bind_text(insertGeneralInfoStatement, 7, memspec.c_str(), static_cast(memspec.length()), nullptr); + sqlite3_bind_text(insertGeneralInfoStatement, 8, traces.c_str(), static_cast(traces.length()), nullptr); if (config.enableWindowing) - sqlite3_bind_int64(insertGeneralInfoStatement, 11, static_cast((config.memSpec->tCK + sqlite3_bind_int64(insertGeneralInfoStatement, 9, static_cast((config.memSpec->tCK * config.windowSize).value())); else - sqlite3_bind_int64(insertGeneralInfoStatement, 11, 0); - sqlite3_bind_int(insertGeneralInfoStatement, 12, static_cast(config.refreshMaxPostponed)); - sqlite3_bind_int(insertGeneralInfoStatement, 13, static_cast(config.refreshMaxPulledin)); - sqlite3_bind_int(insertGeneralInfoStatement, 14, static_cast(UINT_MAX)); - sqlite3_bind_int(insertGeneralInfoStatement, 15, static_cast(config.requestBufferSize)); - sqlite3_bind_int(insertGeneralInfoStatement, 16, static_cast(config.memSpec->getPer2BankOffset())); + sqlite3_bind_int64(insertGeneralInfoStatement, 9, 0); + sqlite3_bind_int(insertGeneralInfoStatement, 10, static_cast(config.refreshMaxPostponed)); + sqlite3_bind_int(insertGeneralInfoStatement, 11, static_cast(config.refreshMaxPulledin)); + sqlite3_bind_int(insertGeneralInfoStatement, 12, static_cast(UINT_MAX)); + sqlite3_bind_int(insertGeneralInfoStatement, 13, static_cast(config.requestBufferSize)); + sqlite3_bind_int(insertGeneralInfoStatement, 14, static_cast(config.memSpec->getPer2BankOffset())); const MemSpec& memSpec = *config.memSpec; const auto memoryType = memSpec.memoryType; @@ -422,8 +423,8 @@ void TlmRecorder::insertGeneralInfo() return memSpec.pseudoChannelsPerChannel != 1; }(); - sqlite3_bind_int(insertGeneralInfoStatement, 17, static_cast(rowColumnCommandBus)); - sqlite3_bind_int(insertGeneralInfoStatement, 18, static_cast(pseudoChannelMode)); + sqlite3_bind_int(insertGeneralInfoStatement, 15, static_cast(rowColumnCommandBus)); + sqlite3_bind_int(insertGeneralInfoStatement, 16, static_cast(pseudoChannelMode)); executeSqlStatement(insertGeneralInfoStatement); } @@ -519,8 +520,6 @@ void TlmRecorder::closeConnection() storageThread.join(); std::swap(currentDataBuffer, storageDataBuffer); commitRecordedDataToDB(); - insertGeneralInfo(); - insertCommandLengths(); PRINTDEBUGMESSAGE(name, "Number of transactions written to DB: " + std::to_string(totalNumTransactions)); PRINTDEBUGMESSAGE(name, "tlmPhaseRecorder:\tEnd Recording"); diff --git a/src/libdramsys/DRAMSys/common/TlmRecorder.h b/src/libdramsys/DRAMSys/common/TlmRecorder.h index 7a950f2e..0164ed32 100644 --- a/src/libdramsys/DRAMSys/common/TlmRecorder.h +++ b/src/libdramsys/DRAMSys/common/TlmRecorder.h @@ -205,8 +205,6 @@ private: "); \n" " \n" "CREATE TABLE GeneralInfo( \n" - " NumberOfTransactions INTEGER, \n" - " TraceEnd INTEGER, \n" " NumberOfRanks INTEGER, \n" " NumberOfBankgroups INTEGER, \n" " NumberOfBanks INTEGER, \n"