"""The container of metadata used in profiler parser."""
GIGABYTES = 1024 * 1024 * 1024
class HWTSContainer:
"""
HWTS output container.
Args:
split_list (list): The split list of metadata in HWTS output file.
"""
def __init__(self, split_list):
self._op_name = ''
self._duration = None
self._status = split_list[0]
self._task_id = split_list[6]
self._cycle_counter = float(split_list[7])
self._stream_id = split_list[8]
@property
def status(self):
"""Get the status of the operator, i.e. Start or End."""
return self._status
@property
def task_id(self):
"""Get the task id of the operator."""
return self._task_id
@property
def cycle_counter(self):
"""Get the cycle counter."""
return self._cycle_counter
@property
def stream_id(self):
"""Get the stream id of the operator."""
return self._stream_id
@property
def op_name(self):
"""Get the name of the operator."""
return self._op_name
@op_name.setter
def op_name(self, name):
"""Set the name of the operator."""
self._op_name = name
@property
def duration(self):
"""Get the duration of the operator execution."""
return self._duration
@duration.setter
def duration(self, value):
"""Set the duration of the operator execution."""
self._duration = value
class TimelineContainer:
"""
A container of operator computation metadata.
Args:
split_list (list): The split list of metadata in op_compute output file.
"""
def __init__(self, split_list):
self._op_name = split_list[0]
self._stream_id = str(split_list[1])
self._start_time = float(split_list[2])
self._duration = float(split_list[3])
self._pid = None
if len(split_list) == 5:
self._pid = int(split_list[4])
@property
def op_name(self):
"""Get the name of the operator."""
return self._op_name
@property
def stream_id(self):
"""Get the stream id of the operator."""
return self._stream_id
@property
def start_time(self):
"""Get the execution start time of the operator."""
return self._start_time
@property
def duration(self):
"""Get the duration of the operator execution."""
return self._duration
@property
def pid(self):
"""Get the pid of the operator execution."""
return self._pid
class MemoryGraph:
"""
A container for graph.
Args:
graph_proto (proto): Graph proto, defined in profiler module.
"""
def __init__(self, graph_proto):
self._graph_proto = graph_proto
self.graph_id = graph_proto.graph_id
self.static_mem = graph_proto.static_mem / GIGABYTES
self.fp_start = None
self.bp_end = None
self.lines = []
self.nodes = {}
self.breakdowns = []
def to_dict(self):
"""Convert Graph to dict."""
graph = {
'graph_id': self.graph_id,
'static_mem': self.static_mem,
'nodes': self.nodes,
'fp_start': self.fp_start,
'bp_end': self.bp_end,
'lines': self.lines,
'breakdowns': self.breakdowns
}
return graph
class MemoryNode:
"""
A container for node.
Args:
node_proto (proto): Node proto.
"""
def __init__(self, node_proto):
self._node_proto = node_proto
self.node_id = node_proto.node_id
self.name = node_proto.node_name
self.fullname = ""
self.input_ids = list(node_proto.input_tensor_id)
self.output_ids = list(node_proto.output_tensor_id)
self.workspace_ids = list(node_proto.workspace_tensor_id)
self.inputs = []
self.outputs = []
self.workspaces = []
self.allocations = 0
self.deallocations = 0
self.size = 0
self.mem_change = 0
def to_dict(self):
"""Convert Node to dict."""
node = {
'name': self.name,
'fullname': self.fullname,
'node_id': self.node_id,
'allocations': self.allocations,
'size': self.size,
'allocated': self.mem_change,
'inputs': self.inputs,
'outputs': self.outputs
}
return node
class MemoryTensor:
"""
A container for tensor.
Args:
tensor_proto (proto): Tensor proto.
"""
def __init__(self, tensor_proto):
self._tensor_proto = tensor_proto
self.tensor_id = tensor_proto.tensor_id
self.life_long = tensor_proto.life_long
self.life_start = tensor_proto.life_start
self.life_end = tensor_proto.life_end
self.size = tensor_proto.size / GIGABYTES
self.type = tensor_proto.type
self.shape = ""
self.format = ""
self.dtype = ""
self.source_node = ""
self.name = ""
def to_dict(self):
"""Convert Tensor to a dict."""
tensor = {
'tensor_name': self.name,
'tensor_id': self.tensor_id,
'size': self.size,
'type': self.type,
'shape': self.shape,
'format': self.format,
'data_type': self.dtype,
'life_long': self.life_long,
'life_start': self.life_start,
'life_end': self.life_end
}
return tensor