""" NNAPI systrace parser: naming conventions and translations """
# Application phases
PHASE_OVERALL = "PO" # Overall program, e.g., one benchmark case
PHASE_WARMUP = "PWU" # Executions done for warmup
PHASE_BENCHMARK = "PBM" # Executions done to benchmark after warmup
# Main phases
PHASE_INITIALIZATION = "PI" # Initialization - not related to a model
PHASE_PREPARATION = "PP" # Model construction
PHASE_COMPILATION = "PC" # Model compilation
PHASE_EXECUTION = "PE" # Executing the model
PHASE_TERMINATION = "PT" # Tearing down
PHASE_UNSPECIFIED = "PU" # Helper code called from multiple phases
# Subphases of execution
PHASE_INPUTS_AND_OUTPUTS = "PIO" # Setting inputs/outputs and allocating buffers
PHASE_TRANSFORMATION = "PTR" # Transforming data for computation
PHASE_COMPUTATION = "PCO" # Computing operations' outputs
PHASE_RESULTS = "PR" # Reading out results
# Layers
LAYER_APPLICATION = "LA"
LAYER_RUNTIME = "LR"
LAYER_IPC = "LI"
LAYER_DRIVER = "LD"
LAYER_CPU = "LC"
LAYER_OTHER = "LO"
LAYER_UTILITY = "LU" # Code used from multiple layers
LAYER_IGNORE = "LX" # Don't count time
# Markers
MARKER_SWITCH = "[SW]"
MARKER_SUBTRACT = "[SUB]"
layers = [LAYER_APPLICATION, LAYER_RUNTIME, LAYER_IPC, LAYER_DRIVER, LAYER_CPU]
phases = [PHASE_INITIALIZATION, PHASE_PREPARATION, PHASE_COMPILATION,
PHASE_EXECUTION, PHASE_TERMINATION]
subphases = dict(PE=[PHASE_INPUTS_AND_OUTPUTS, PHASE_TRANSFORMATION,
PHASE_COMPUTATION, PHASE_RESULTS],
PO=([PHASE_WARMUP, PHASE_BENCHMARK] + phases),
PWU=[PHASE_EXECUTION],
PBM=[PHASE_EXECUTION])
names = { PHASE_INITIALIZATION : "Initialization", PHASE_PREPARATION : "Preparation",
PHASE_COMPILATION : "Compilation", PHASE_INPUTS_AND_OUTPUTS: "I/O",
PHASE_EXECUTION: "Execution", PHASE_RESULTS: "Results",
PHASE_WARMUP: "Warmup", PHASE_BENCHMARK: "Benchmark",
PHASE_TERMINATION: "Termination",
LAYER_APPLICATION : "Application", LAYER_RUNTIME: "Runtime",
LAYER_IPC: "IPC", LAYER_DRIVER: "Driver", LAYER_CPU: "CPU",
"total": "Total", "NONE": "" }
layer_order = { LAYER_APPLICATION: [LAYER_RUNTIME],
LAYER_RUNTIME: [LAYER_IPC, LAYER_CPU],
LAYER_IPC: [LAYER_DRIVER] }
def make_tag(layer, phase):
return "_".join([layer, phase])
def translate_hidl_mark_to_nn_and_tag(mark):
layer = None
if "::client" in mark:
if "notify" in mark:
# Call "up" into runtime from IPC. Ignore for now to not double-count
layer = LAYER_IGNORE
else:
# Call "down" into IPC
layer = LAYER_IPC
elif "::server" in mark:
if "notify" in mark:
# Call "up" into IPC. Ignore for now to not double-count
layer = LAYER_IGNORE
else:
# Call "down" in to driver
layer = LAYER_DRIVER
elif ("getCapabilities" in mark) or ("getSupportedOperations" in mark):
layer = LAYER_DRIVER
elif "HIDL" not in mark:
layer = LAYER_IGNORE
assert layer, mark
phase = PHASE_INITIALIZATION
if "IAllocator" in mark:
# Used in both preparation and execution phases
phase = "PU"
elif ("getCapabilities" in mark):
phase = PHASE_INITIALIZATION
elif ("prepareModel" in mark) or ("getSupportedOperations" in mark):
phase = PHASE_COMPILATION
elif ("IPreparedModelCallback") in mark:
phase = PHASE_COMPILATION
elif ("execute" in mark) or ("IExecutionCallback" in mark):
phase = PHASE_EXECUTION
return "NN_" + make_tag(layer, phase)
def get_function_name_from_mark(mark):
function = mark.split("|")[2]
if "[NN_" in function:
function = function.replace(MARKER_SUBTRACT, "")
function = function.replace(MARKER_SWITCH, "")
function = function.split("]")[1]
function = function.replace("[", "")
function = function.replace("]", "")
return function