From f3a6bfcb9d9fb819e4a83e27afecd959da5a4db7 Mon Sep 17 00:00:00 2001 From: Garima Dhaked Date: Wed, 2 Sep 2026 04:19:15 -0600 Subject: [PATCH 1/2] Reapply "Dtrace json output of control instrumentation to reduce overhead at hwcontext destructor (#103)" (#107) This reverts commit 8ce682f7bf82747b0f32365b61d170e3d39c55f7. --- .../plugin/aie_dtrace/aie_dtrace_plugin.cpp | 6 ++++ .../aie_dtrace/util/aie_dtrace_util.cpp | 35 +++++++++++++++++++ .../plugin/aie_dtrace/util/aie_dtrace_util.h | 4 +++ .../aie_dtrace/ve2/aie_dtrace_ct_writer.cpp | 12 +++++-- .../plugin/aie_dtrace/ve2/aie_dtrace_ve2.cpp | 3 ++ 5 files changed, 57 insertions(+), 3 deletions(-) diff --git a/profile/plugin/aie_dtrace/aie_dtrace_plugin.cpp b/profile/plugin/aie_dtrace/aie_dtrace_plugin.cpp index 0b7f4faa..3c5f1abc 100644 --- a/profile/plugin/aie_dtrace/aie_dtrace_plugin.cpp +++ b/profile/plugin/aie_dtrace/aie_dtrace_plugin.cpp @@ -4,6 +4,7 @@ #define XDP_PLUGIN_SOURCE #include "xdp/profile/plugin/aie_dtrace/aie_dtrace_plugin.h" +#include "xdp/profile/plugin/aie_dtrace/util/aie_dtrace_util.h" #include "core/common/api/hw_context_int.h" #include "core/common/config_reader.h" @@ -31,6 +32,9 @@ namespace xdp { { AieDtracePlugin::live = true; + if (xrt_core::config::get_aie_dtrace()) + aie::dtrace::initDtraceOutputConfig(); + db->registerPlugin(this); db->registerInfo(info::aie_dtrace); db->getStaticInfo().setAieApplication(); @@ -68,6 +72,8 @@ namespace xdp { if (!xrt_core::config::get_aie_dtrace()) return; + aie::dtrace::initDtraceOutputConfig(); + if (!handle) return; diff --git a/profile/plugin/aie_dtrace/util/aie_dtrace_util.cpp b/profile/plugin/aie_dtrace/util/aie_dtrace_util.cpp index 93352107..89749265 100644 --- a/profile/plugin/aie_dtrace/util/aie_dtrace_util.cpp +++ b/profile/plugin/aie_dtrace/util/aie_dtrace_util.cpp @@ -5,8 +5,43 @@ #include "xdp/profile/plugin/aie_dtrace/util/aie_dtrace_util.h" +#include "core/common/config_reader.h" +#include "core/common/message.h" + +#include + namespace xdp::aie::dtrace { + namespace { + using severity_level = xrt_core::message::severity_level; + + static constexpr unsigned int DEFAULT_COALESCE_RESULT_MEMORY_MB = 256; + } // anonymous namespace + + void + initDtraceOutputConfig() + { + static std::once_flag once; + std::call_once(once, []() { + try { + xrt_core::config::detail::set("Debug.dtrace_output_json_format", "true"); + xrt_core::config::detail::set("Debug.dtrace_coalesce_result", "true"); + xrt_core::config::detail::set("Debug.dtrace_coalesce_result_memory_mb", + std::to_string(DEFAULT_COALESCE_RESULT_MEMORY_MB)); + } + catch (const std::exception& e) { + xrt_core::message::send(severity_level::warning, "XRT", + std::string("AIE dtrace: could not apply default dtrace output settings: ") + + e.what()); + return; + } + + xrt_core::message::send(severity_level::info, "XRT", + "AIE dtrace: enabled JSON dtrace_dump output with coalesced results " + "(dtrace_dump_ctx__.json on hw context teardown)"); + }); + } + std::map> getBandwidthInterfaceTileEventSets(int hwGen) { diff --git a/profile/plugin/aie_dtrace/util/aie_dtrace_util.h b/profile/plugin/aie_dtrace/util/aie_dtrace_util.h index 2a49a334..a8210658 100644 --- a/profile/plugin/aie_dtrace/util/aie_dtrace_util.h +++ b/profile/plugin/aie_dtrace/util/aie_dtrace_util.h @@ -17,6 +17,10 @@ namespace xdp::aie::dtrace { // Shim bandwidth metric sets used for Debug.aie_dtrace (not part of standard aie_profile ini). std::map> getBandwidthInterfaceTileEventSets(int hwGen); + // Enable JSON dtrace_dump output with coalesced results by default. + // Must run before XRT creates the first dtrace module (config keys lock on first read). + void initDtraceOutputConfig(); + } // namespace xdp::aie::dtrace #endif diff --git a/profile/plugin/aie_dtrace/ve2/aie_dtrace_ct_writer.cpp b/profile/plugin/aie_dtrace/ve2/aie_dtrace_ct_writer.cpp index 8de25264..e2404650 100644 --- a/profile/plugin/aie_dtrace/ve2/aie_dtrace_ct_writer.cpp +++ b/profile/plugin/aie_dtrace/ve2/aie_dtrace_ct_writer.cpp @@ -638,9 +638,12 @@ bool AieDtraceCTWriter::writeCTFile(const std::vector& asmFileInfoL ctFile << "{\n"; ctFile << " ts_" << asmFileInfo.asmId << " = timestamp32()\n"; - // Write counter reads using _ as throwaway variable + // Write counter reads. Each counter is assigned a sequential result + // variable (_0, _1, _2, ...) so the dtrace JSON dump emits one key per + // counter ("_0", "_1", ...) in probe order; counter semantics are provided + // by the COUNTER_METADATA block above. for (size_t i = 0; i < asmFileInfo.counters.size(); i++) { - ctFile << " _ = read_reg(" + ctFile << " _" << i << " = read_reg(" << formatAddress(asmFileInfo.counters[i].address) << ")\n"; } @@ -1180,9 +1183,12 @@ bool AieDtraceCTWriter::writeCounterCTFile( ctFile << "{\n"; ctFile << " ts_" << asmFileInfo.asmId << " = timestamp32()\n"; + // Each counter is assigned a sequential result variable (_0, _1, _2, ...) + // so the dtrace JSON dump emits one key per counter ("_0", "_1", ...) in + // probe order; counter semantics live in the COUNTER_METADATA block above. for (size_t i = 0; i < asmFileInfo.counters.size(); i++) { const auto& ctr = asmFileInfo.counters[i]; - ctFile << " _ = read_reg(" << formatAddress(ctr.address) << ")\n"; + ctFile << " _" << i << " = read_reg(" << formatAddress(ctr.address) << ")\n"; } ctFile << "}\n\n"; diff --git a/profile/plugin/aie_dtrace/ve2/aie_dtrace_ve2.cpp b/profile/plugin/aie_dtrace/ve2/aie_dtrace_ve2.cpp index c60d9ac0..ca6748bc 100644 --- a/profile/plugin/aie_dtrace/ve2/aie_dtrace_ve2.cpp +++ b/profile/plugin/aie_dtrace/ve2/aie_dtrace_ve2.cpp @@ -6,6 +6,7 @@ #include "xdp/profile/plugin/aie_dtrace/ve2/aie_dtrace_ve2.h" #include "xdp/profile/plugin/aie_dtrace/ve2/aie_dtrace_ct_writer.h" #include "xdp/profile/plugin/aie_dtrace/ve2/elf_helper.h" +#include "xdp/profile/plugin/aie_dtrace/util/aie_dtrace_util.h" #include "core/common/api/hw_context_int.h" #include "core/common/api/kernel_int.h" @@ -152,6 +153,8 @@ namespace xdp { coreMetricSet)) return; + aie::dtrace::initDtraceOutputConfig(); + std::stringstream genMsg; genMsg << "AIE dtrace: CT generated for kernel '" << kernel_name << "' ("; if (includeBandwidth) From 76d6bf4839de97dc37681e5af4374ccdf2db16ed Mon Sep 17 00:00:00 2001 From: Garima Dhaked Date: Tue, 8 Sep 2026 04:05:31 -0600 Subject: [PATCH 2/2] Honor xrt.ini/env dtrace dump flags instead of always forcing JSON coalesce defaults. initDtraceOutputConfig still fills in missing keys, but leaves values the user already set. Co-authored-by: Cursor --- .../aie_dtrace/util/aie_dtrace_util.cpp | 41 +++++++++++++++---- .../plugin/aie_dtrace/util/aie_dtrace_util.h | 3 +- 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/profile/plugin/aie_dtrace/util/aie_dtrace_util.cpp b/profile/plugin/aie_dtrace/util/aie_dtrace_util.cpp index 89749265..20cf5aac 100644 --- a/profile/plugin/aie_dtrace/util/aie_dtrace_util.cpp +++ b/profile/plugin/aie_dtrace/util/aie_dtrace_util.cpp @@ -23,11 +23,26 @@ namespace xdp::aie::dtrace { { static std::once_flag once; std::call_once(once, []() { + static constexpr const char* k_json = "Debug.dtrace_output_json_format"; + static constexpr const char* k_coalesce = "Debug.dtrace_coalesce_result"; + static constexpr const char* k_coalesce_mb = "Debug.dtrace_coalesce_result_memory_mb"; + try { - xrt_core::config::detail::set("Debug.dtrace_output_json_format", "true"); - xrt_core::config::detail::set("Debug.dtrace_coalesce_result", "true"); - xrt_core::config::detail::set("Debug.dtrace_coalesce_result_memory_mb", - std::to_string(DEFAULT_COALESCE_RESULT_MEMORY_MB)); + const auto ini = xrt_core::config::detail::get_ini_values(); + auto already_set = [&](const char* key) { + if (!xrt_core::config::detail::get_env_value(key).empty()) + return true; + return ini.find(key) != ini.end(); + }; + + // xrt.ini / env win. Fill in only keys the user did not specify. + if (!already_set(k_json)) + xrt_core::config::detail::set(k_json, "true"); + if (!already_set(k_coalesce)) + xrt_core::config::detail::set(k_coalesce, "true"); + if (!already_set(k_coalesce_mb)) + xrt_core::config::detail::set(k_coalesce_mb, + std::to_string(DEFAULT_COALESCE_RESULT_MEMORY_MB)); } catch (const std::exception& e) { xrt_core::message::send(severity_level::warning, "XRT", @@ -36,9 +51,21 @@ namespace xdp::aie::dtrace { return; } - xrt_core::message::send(severity_level::info, "XRT", - "AIE dtrace: enabled JSON dtrace_dump output with coalesced results " - "(dtrace_dump_ctx__.json on hw context teardown)"); + const bool json = xrt_core::config::get_dtrace_output_json_format(); + const bool coalesce = xrt_core::config::get_dtrace_coalesce_result(); + if (json && coalesce) { + xrt_core::message::send(severity_level::info, "XRT", + "AIE dtrace: JSON dtrace_dump with coalesced results " + "(dtrace_dump_ctx__.json on hw context teardown)"); + } + else if (json) { + xrt_core::message::send(severity_level::info, "XRT", + "AIE dtrace: JSON dtrace_dump enabled (per-run dtrace_dump_ctx_*_run_*.json)"); + } + else { + xrt_core::message::send(severity_level::info, "XRT", + "AIE dtrace: Python dtrace_dump enabled (per-run dtrace_dump_ctx_*_run_*.py)"); + } }); } diff --git a/profile/plugin/aie_dtrace/util/aie_dtrace_util.h b/profile/plugin/aie_dtrace/util/aie_dtrace_util.h index a8210658..e9e95c4d 100644 --- a/profile/plugin/aie_dtrace/util/aie_dtrace_util.h +++ b/profile/plugin/aie_dtrace/util/aie_dtrace_util.h @@ -17,7 +17,8 @@ namespace xdp::aie::dtrace { // Shim bandwidth metric sets used for Debug.aie_dtrace (not part of standard aie_profile ini). std::map> getBandwidthInterfaceTileEventSets(int hwGen); - // Enable JSON dtrace_dump output with coalesced results by default. + // Apply JSON + coalesced dtrace_dump defaults when those keys are absent. + // Values already present in xrt.ini or the environment are left unchanged. // Must run before XRT creates the first dtrace module (config keys lock on first read). void initDtraceOutputConfig();