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 a5f313fa..137a8039 100644 --- a/profile/plugin/aie_dtrace/ve2/aie_dtrace_ct_writer.cpp +++ b/profile/plugin/aie_dtrace/ve2/aie_dtrace_ct_writer.cpp @@ -636,9 +636,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"; } @@ -1156,9 +1159,12 @@ bool AieDtraceCTWriter::writeBandwidthCTFile( 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 cfab9211..b59c6226 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" @@ -134,6 +135,8 @@ namespace xdp { if (!ctWriter.generateBandwidthCT(outputPath, hwctx, it->second, bandwidthMetricSet, bandwidthChannel)) return; + aie::dtrace::initDtraceOutputConfig(); + xrt_core::message::send(severity_level::debug, "XRT", "AIE dtrace: Bandwidth CT generated for kernel '" + kernel_name + "' with metric set '" + bandwidthMetricSet + "'");