Skip to content

Commit aeb8054

Browse files
authored
[PROTON] Add kernel call stack to intra kernel events (#8071)
<img width="2000" height="243" alt="image" src="https://github.com/user-attachments/assets/d577d056-8b03-4528-904c-2638ff294ddc" />
1 parent ddada27 commit aeb8054

File tree

4 files changed

+20
-0
lines changed

4 files changed

+20
-0
lines changed

third_party/proton/common/include/TraceDataIO/TraceWriter.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ const uint64_t kKernelTimeGap = 10000000;
1919
struct KernelMetadata {
2020
std::map<int, std::string> scopeName;
2121
std::string kernelName;
22+
std::vector<std::string> callStack;
2223
};
2324

2425
using KernelTrace = std::pair<std::shared_ptr<CircularLayoutParserResult>,

third_party/proton/common/lib/TraceDataIO/TraceWriter.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,11 @@ void StreamChromeTraceWriter::writeKernel(json &object,
151151
auto result = kernelTrace.first;
152152
auto metadata = kernelTrace.second;
153153

154+
json callStack = json::array();
155+
for (auto const &frame : metadata->callStack) {
156+
callStack.push_back(frame);
157+
}
158+
154159
int curColorIndex = 0;
155160
// scope id -> color index in chrome color
156161
std::map<int, int> scopeColor;
@@ -209,6 +214,8 @@ void StreamChromeTraceWriter::writeKernel(json &object,
209214
args["Unit"] = "GPU cycle";
210215
args["Kernel Gap"] = std::to_string(kKernelTimeGap) + "cycle(ns)";
211216
element["args"] = args;
217+
element["args"]["call_stack"] = callStack;
218+
212219
object["traceEvents"].push_back(element);
213220

214221
eventIdx++;

third_party/proton/csrc/lib/Data/TraceData.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -385,9 +385,19 @@ convertToTimelineTrace(TraceData::Trace *trace,
385385
}
386386
parserResult->blockTraces.push_back(std::move(blockTrace));
387387
}
388+
std::vector<std::string> callStack;
389+
if (!sortedEvents.empty()) {
390+
auto contexts = trace->getContexts(kernelEvent.contextId);
391+
if (!contexts.empty()) {
392+
callStack.resize(contexts.size() - 1);
393+
std::transform(contexts.begin(), contexts.end() - 1, callStack.begin(),
394+
[](const Context &c) { return c.name; });
395+
}
396+
}
388397
metadata->kernelName =
389398
getStringValue(kernelEvent.cycleMetric, CycleMetric::KernelName);
390399
metadata->scopeName = scopeIdToName;
400+
metadata->callStack = std::move(callStack);
391401
if (timeShiftCost > 0)
392402
timeShift(timeShiftCost, parserResult);
393403
results.emplace_back(parserResult, metadata);

third_party/proton/test/test_instrumentation.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -609,3 +609,5 @@ def foo(x, y, size: tl.constexpr):
609609
trace_events = data["traceEvents"]
610610
assert len(trace_events) == 12
611611
assert trace_events[-1]["tid"][0:4] == "warp"
612+
assert trace_events[-1]["args"]["call_stack"][-1] == "foo"
613+
assert trace_events[-1]["args"]["call_stack"][-2] == "test"

0 commit comments

Comments
 (0)