Skip to content
Open
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
22 changes: 19 additions & 3 deletions TraceLens/TreePerf/gpu_event_analyser.py
Original file line number Diff line number Diff line change
Expand Up @@ -226,9 +226,10 @@ def verify_dict_gpu_event_lists(dict_gpu_event_lists):

@staticmethod
def compute_metrics_dict(dict: dict, micro_idle_thresh_us=None):
dict_intervals = {}
for key, events in dict.items():
dict_intervals[key] = [(event["ts"], event["t_end"]) for event in events]
dict_intervals = {
key: GPUEventAnalyser.kernels_to_intervals(events)
for key, events in dict.items()
}

# Merge intervals within each category.
comp_union = GPUEventAnalyser.merge_intervals(dict_intervals["computation"])
Expand Down Expand Up @@ -321,6 +322,21 @@ def compute_metrics_dict(dict: dict, micro_idle_thresh_us=None):
"total_memcpy_time": total_memcpy_time,
}

@staticmethod
def kernels_to_intervals(kernels, filter_func=None):
"""Extract (ts, t_end) tuples from a kernel list, with an optional filter."""
return [
(k["ts"], k["t_end"])
for k in kernels
if filter_func is None or filter_func(k)
]

@staticmethod
def compute_busy_time(intervals):
"""Return the merged busy time (µs) for a list of (ts, t_end) tuples."""
merged = GPUEventAnalyser.merge_intervals(intervals)
return sum(end - start for start, end in merged)

def compute_metrics(self, micro_idle_thresh_us=None):
"""
Compute various metrics from the GPU event data.
Expand Down
22 changes: 7 additions & 15 deletions TraceLens/TreePerf/tree_perf.py
Original file line number Diff line number Diff line change
Expand Up @@ -391,22 +391,14 @@ def compute_perf_metrics(
cpu_op_list = [self.tree.get_UID2event(uid) for uid in cpu_op_uids]
_, list_kernelUIDS = self.loop_and_aggregate_kernels(cpu_op_list)
list_kernels = [self.tree.events_by_uid[uid] for uid in list_kernelUIDS]
busy_kernel_time = 0
if len(list_kernels) > 0:
busy_kernel_time = self.GPUEventAnalyser(list_kernels).compute_metrics()[
"busy_time"
]
_, list_non_data_mov_kernelUIDs = self.loop_and_aggregate_kernels(
cpu_op_list, filter_func=self.non_data_mov_filter
kernel_intervals = self.GPUEventAnalyser.kernels_to_intervals(list_kernels)
busy_kernel_time = self.GPUEventAnalyser.compute_busy_time(kernel_intervals)
non_data_mov_intervals = self.GPUEventAnalyser.kernels_to_intervals(
list_kernels, self.non_data_mov_filter
)
busy_non_data_mov_time = self.GPUEventAnalyser.compute_busy_time(
non_data_mov_intervals
)
list_non_data_mov_kernels = [
self.tree.events_by_uid[uid] for uid in list_non_data_mov_kernelUIDs
]
busy_non_data_mov_time = 0
if len(list_non_data_mov_kernels) > 0:
busy_non_data_mov_time = self.GPUEventAnalyser(
list_non_data_mov_kernels
).compute_metrics()["busy_time"]
event["kernel_details"] = [
{
"name": kernel["name"],
Expand Down
Loading