Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions profile/plugin/aie_dtrace/aie_dtrace_plugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -68,6 +72,8 @@ namespace xdp {
if (!xrt_core::config::get_aie_dtrace())
return;

aie::dtrace::initDtraceOutputConfig();

if (!handle)
return;

Expand Down
62 changes: 62 additions & 0 deletions profile/plugin/aie_dtrace/util/aie_dtrace_util.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,70 @@

#include "xdp/profile/plugin/aie_dtrace/util/aie_dtrace_util.h"

#include "core/common/config_reader.h"
#include "core/common/message.h"

#include <mutex>

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, []() {
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 {
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",
std::string("AIE dtrace: could not apply default dtrace output settings: ")
+ e.what());
return;
}

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_<slot>_<timestamp>.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)");
}
});
}

std::map<std::string, std::vector<XAie_Events>>
getBandwidthInterfaceTileEventSets(int hwGen)
{
Expand Down
5 changes: 5 additions & 0 deletions profile/plugin/aie_dtrace/util/aie_dtrace_util.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@ namespace xdp::aie::dtrace {
// Shim bandwidth metric sets used for Debug.aie_dtrace (not part of standard aie_profile ini).
std::map<std::string, std::vector<XAie_Events>> getBandwidthInterfaceTileEventSets(int hwGen);

// 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();

} // namespace xdp::aie::dtrace

#endif
12 changes: 9 additions & 3 deletions profile/plugin/aie_dtrace/ve2/aie_dtrace_ct_writer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -638,9 +638,12 @@ bool AieDtraceCTWriter::writeCTFile(const std::vector<ASMFileInfo>& 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";
}

Expand Down Expand Up @@ -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";
Expand Down
3 changes: 3 additions & 0 deletions profile/plugin/aie_dtrace/ve2/aie_dtrace_ve2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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)
Expand Down
Loading