From ca0ebc0ecb2202f7717ce43f4642c96ad0b4a6be Mon Sep 17 00:00:00 2001 From: predutta Date: Thu, 14 May 2026 16:24:54 -0700 Subject: [PATCH] Master branch fixes for system timeline Signed-off-by: predutta --- profile/plugin/aie_trace/aie_trace_plugin.cpp | 13 ++++++++++++- profile/plugin/aie_trace/aie_trace_plugin.h | 2 +- .../aie_trace/aie_trace_timestamps_writer.cpp | 12 ++++++++++-- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/profile/plugin/aie_trace/aie_trace_plugin.cpp b/profile/plugin/aie_trace/aie_trace_plugin.cpp index c2bda88f..d3997d8f 100644 --- a/profile/plugin/aie_trace/aie_trace_plugin.cpp +++ b/profile/plugin/aie_trace/aie_trace_plugin.cpp @@ -302,10 +302,21 @@ void AieTracePluginUnified::updateAIEDevice(void *handle, bool hw_context_flow) xrt_core::message::send(xrt_core::message::severity_level::warning, "XRT", msg); AIEData.valid = false; + return; } + // System timeline (INI flag): enable only for load_xclbin single-partition designs. + const bool iniEnableTimeline = + xrt_core::config::get_aie_trace_settings_enable_system_timeline(); + const bool vitisLoadXclbin = + (db->getStaticInfo().getAppStyle() == xdp::AppStyle::LOAD_XCLBIN_STYLE); + const auto &overlayCols = AIEData.metadata->getPartitionOverlayStartCols(); + const bool multipartitionDesign = (overlayCols.size() > 1); + const bool enableSystemTimeline = + iniEnableTimeline && vitisLoadXclbin && !multipartitionDesign; + // Support system timeline - if (xrt_core::config::get_aie_trace_settings_enable_system_timeline()) { + if (enableSystemTimeline) { #ifdef _WIN32 std::string deviceName = "win_device"; #else diff --git a/profile/plugin/aie_trace/aie_trace_plugin.h b/profile/plugin/aie_trace/aie_trace_plugin.h index ec2c7c04..2c26141d 100644 --- a/profile/plugin/aie_trace/aie_trace_plugin.h +++ b/profile/plugin/aie_trace/aie_trace_plugin.h @@ -60,7 +60,7 @@ class AieTracePluginUnified : public XDPPlugin { struct AIEData { uint64_t deviceID; bool valid = false; - std::atomic pollAIETimerThreadCtrlBool; + std::atomic pollAIETimerThreadCtrlBool{false}; std::thread pollAIETimerThread; std::unique_ptr offloadManager; std::unique_ptr implementation; diff --git a/profile/writer/aie_trace/aie_trace_timestamps_writer.cpp b/profile/writer/aie_trace/aie_trace_timestamps_writer.cpp index a5963dd2..b66cf2cf 100755 --- a/profile/writer/aie_trace/aie_trace_timestamps_writer.cpp +++ b/profile/writer/aie_trace/aie_trace_timestamps_writer.cpp @@ -82,6 +82,16 @@ void AIETraceTimestampsWriter::writeCVSTimestampFile() void AIETraceTimestampsWriter::writeBinaryTimestampFile() { + // Move (not copy) all data elements to avoid doubling memory usage + std::vector samples = + db->getDynamicInfo().moveAIETimerSamples(mDeviceIndex); + + // XDPPlugin::endWrite() runs from finishFlushAIEDevice and again from ~AieTracePluginUnified + // (writeAll). Timer samples are moved out on the first write; a second write would open with + // trunc and destroy the file. Skip when nothing left to emit. + if (samples.empty()) + return; + std::fstream aStream; std::string binaryFileName = getcurrentFileName(); aStream.open(binaryFileName.c_str(), std::fstream::in | std::fstream::out @@ -97,8 +107,6 @@ void AIETraceTimestampsWriter::writeBinaryTimestampFile() aieClockFreqMhz, PACKETSIZE ); AIEBinaryData::AIEEventTimeStamp timeStampEvent; - // Move (not copy) all data elements to avoid doubling memory usage - std::vector samples = db->getDynamicInfo().moveAIETimerSamples(mDeviceIndex); for (auto& sample : samples) { if (sample.values.size() == 3) { auto column = static_cast(sample.values[0]);