diff --git a/script/check_trace.py b/script/check_trace.py index 1c4c5de88f..085e5acd61 100644 --- a/script/check_trace.py +++ b/script/check_trace.py @@ -26,110 +26,197 @@ import argparse events_count = {} events_order = {} -trace2level = {} -trace2level_filename = 'test/tests_trace_cmp_levels.txt' +trace2info = {} +trace2info_filename = 'test/tests_trace_cmp_levels.txt' -def parse_trace_levels(filename): - f = open(filename) - trace2level = {} +# Parses trace comparison config file and stores the info in a dictionary +def parse_trace_levels(trace_config_filename): + f = open(trace_config_filename) + trace2info = {} for line in f: - item = line.split(' ', 1) - trace2level[item[0]] = eval(item[1]) - return trace2level + if re.match('^# dummy',line): + return trace2info + lis = line.split(' ') + trace_name = lis[0] + comp_level = lis[1] + no_events_cnt = '' + events2ignore = '' + events2chkcnt = '' + events2chkord = '' + events2ch = '' + for l in lis: + if no_events_cnt == ' ': + no_events_cnt = l + if events2ignore == ' ': + events2ignore = l + if events2chkcnt == ' ': + events2chkcnt = l + if events2chkord == ' ': + events2chkord = l + if events2ch == ' ': + events2ch = l + events2chkcnt = l + no_events_cnt = l + if l == '--ignore-count': + no_events_cnt = ' ' + if l == '--ignore-event': + events2ignore = ' ' + if l == '--check-count': + events2chkcnt = ' ' + if l == '--check-order': + events2chkord = ' ' + if l == '--check-events': + events2ch = ' ' -# check trace againt golden reference and returns 0 for match, 1 for mismatch -def check_trace_status(tracename): - trace2level = parse_trace_levels(trace2level_filename) + trace2info[trace_name] = (comp_level,no_events_cnt,events2ignore,events2chkcnt,events2chkord,events2ch) + + return trace2info + +# check trace againt golden reference and returns 0 for pass, 1 for fail +def check_trace_status(tracename, verbose): + trace2info = parse_trace_levels(trace2info_filename) + + if len(trace2info) == 0: + if verbose: + print('PASSED!') + return 0 trace = 'test/' + tracename + '.txt' rtrace = tracename + '.txt' - if os.path.basename(tracename) in trace2level: - trace_level = trace2level[os.path.basename(tracename)] - print 'Trace comparison for ' + os.path.basename(tracename) + ' is at level ' + str(trace_level) + if os.path.basename(tracename) in trace2info.keys(): + (trace_level, no_events_cnt, events2ignore, events2chkcnt, events2chkord, events2ch) = trace2info[os.path.basename(tracename)] + trace_level = trace_level.rstrip('\n') + no_events_cnt = no_events_cnt.rstrip('\n') + events2ignore = events2ignore.rstrip('\n') + events2chkcnt = events2chkcnt.rstrip('\n') + events2chkord = events2chkord.rstrip('\n') + events2ch = events2ch.rstrip('\n') else: - print 'Trace ' + os.path.basename(tracename) + ' not found in ' + trace2level_filename + ', defaulting to level 0' + print('Trace ' + os.path.basename(tracename) + ' not found in ' + trace2info_filename + ', defaulting to level 0 i.e. no trace comparison') return 1 - if trace_level == 1: - cnt_r = gen_events_info(rtrace,'cnt') - cnt = gen_events_info(trace,'cnt') - if cnt_r == cnt: - return 0 - else: - return 1 - elif trace_level == 2: - cnt_r = gen_events_info(rtrace,'or') - cnt = gen_events_info(trace,'or') - if cnt_r == cnt: - return 0 - else: - return 1 - elif trace_level == 3: + if no_events_cnt == '': + no_events_cnt = 'empty-regex' + if events2ignore == '': + events2ignore = 'empty-regex' + if events2chkcnt == '': + events2chkcnt = '' + if events2chkord == '': + events2chkord = '' + + if trace_level == '--check-none': + if verbose: + print('PASSED!') + return 0 + + if trace_level == '--check-diff': if filecmp.cmp(trace,rtrace): + if verbose: + print('PASSED!') return 0 else: + print('FAILED!') + os.system('/usr/bin/diff --brief ' + trace + ' ' + rtrace) return 1 -#Parses roctracer trace file for regression purpose -#and generates events count per event (when cnt is on) or events order per tid (when order is on) -def gen_events_info(tracefile, metric): + cnt_r = gen_events_info(rtrace,trace_level,no_events_cnt,events2ignore,events2chkcnt,events2chkord,verbose) + cnt = gen_events_info(trace,trace_level,no_events_cnt,events2ignore,events2chkcnt,events2chkord,verbose) + if cnt_r == cnt: + if verbose: + print('PASSED!') + return 0 + else: + if verbose: + print('FAILED!') + return 1 + +# Parses roctracer trace file for regression purpose +# and generates events count per event (when cnt is on) or events order per tid (when order is on) +def gen_events_info(tracefile, trace_level, no_events_cnt, events2ignore, events2chkcnt, events2chkord, verbose): + metric = '' + if trace_level == '--check-count' or trace_level == '--check-events': + metric = 'cnt' + if trace_level == '--check-order': + metric = 'or' + events_count = {} events_order = {} - res='' + res = '' + re_no_events_cnt = r'{}'.format(no_events_cnt) + re_events2ignore = r'{}'.format(events2ignore) + re_events2chkcnt = r'{}'.format(events2chkcnt) + re_events2chkord = r'{}'.format(events2chkord) + + test_act_pattern = re.compile(r'\s*(\w+)\s+.*_id\((\d+)\)$') + #' hipSetDevice correlation_id(1) time_ns(1548622357525055:1548622357542015) process_id(126283) thread_id(126283)' + #' hcCommandKernel correlation_id(6) time_ns(1548622661443020:1548622662666935) device_id(0) queue_id(0)' + test_api_cb_pattern = re.compile(r'<(\w+)\s+.*tid\((\d+)\)>') + # + # below is roctx pattern + # + tool_record = re.compile(r'\d+:\d+\s+\d+:(\d+)\s+(\w+)') + # tool_api_record + # 1822810364769411:1822810364771941 116477:116477 hsa_agent_get_info(, 17, 0x7ffeac015fec) = 0 + # tool_gpu_act_record + # 3632773658039902:3632773658046462 0:0 hcCommandMarker:273 + with open(tracefile) as f: for line in f: - event_pattern_s = re.compile(r'# START \((\d+)\) #############################') - ms = event_pattern_s.match(line) - if ms: - start_id = ms.group(1) + line=line.rstrip('\n') + event = '' + test_act_pattern_match = test_act_pattern.match(line) + if test_act_pattern_match: + event = test_act_pattern_match.group(1) + tid = int(test_act_pattern_match.group(2)) + test_api_cb_pattern_match = test_api_cb_pattern.match(line) + if test_api_cb_pattern_match: + event = test_api_cb_pattern_match.group(1) + tid = int(test_api_cb_pattern_match.group(2)) + tool_record_match = tool_record.match(line) + if tool_record_match: + event = tool_record_match.group(2) + tid = int(tool_record_match.group(1)) + if event == '' or event == '(null)': #some traces has these null events continue - event_pattern = re.compile(r'.*<(\w+)\s+id\(\d+\)\s+.*tid\((\d+)\)>') - # event_pattern extracts event(grp1) and tid (grp2) from a line like this: - # - m = event_pattern.match(line) - if m: - event = m.group(1) - tid = m.group(2) - event_pattern2 = re.compile(r'\d+:\d+\s+\d+:(\d+)\s+(\w+)') - # event_pattern2 extracts tid (grp1) and event (grp2) from a line like this: - # 1822810364769411:1822810364771941 116477:116477 hsa_agent_get_info(, 17, 0x7ffeac015fec) = 0 - m2 = event_pattern2.match(line) - if m2: - event = m2.group(2) - tid = m2.group(1) - event_pattern3 = re.compile(r'') - # event_pattern2 extracts rocTX event like: - # - # - m3 = event_pattern3.match(line) - if m3: - event = m3.group(1) - tid = start_id - if metric == 'cnt' and (m or m2 or m3): + + if re.search(re_events2ignore,event): + continue + + if metric == 'cnt' and re.search(re_events2chkcnt,event): if event in events_count: events_count[event] = events_count[event] + 1 else: events_count[event] = 1 - if metric == 'or' and (m or m2 or m3): + + if metric == 'or' and re.search(re_events2chkord,event): if tid in events_order.keys(): - events_order[tid].append(event) + if re.search(re_no_events_cnt,event): + if event != events_order[tid][-1]: #Add event only if it is not last event in the list + events_order[tid].append(event) + else: + events_order[tid].append(event) else: events_order[tid] = [event] if metric == 'cnt': for event,count in events_count.items(): - res = res + event + " : count " + str(count) + '\n' + if re.search(re_no_events_cnt,event): + res = res + event + '\n' + else: + res = res + event + " : count " + str(count) + '\n' if metric == 'or': for tid in sorted (events_order.keys()) : - #res = res + 'Events for tid ' + tid + ' are:\n' + str(events_order[tid]) + '\n' res = res + str(events_order[tid]) + if verbose: + print(res) return res - parser = argparse.ArgumentParser(description='check_trace.py: check a trace aainst golden ref. Returns 0 for success, 1 for failure') requiredNamed = parser.add_argument_group('Required arguments') requiredNamed.add_argument('-in', metavar='file', help='Name of trace to be checked', required=True) +requiredNamed.add_argument('-v', action='store_true', help='debug info', required=False) args = vars(parser.parse_args()) if __name__ == '__main__': - sys.exit(check_trace_status(args['in'])) + sys.exit(check_trace_status(args['in'],args['v'])) + diff --git a/test/MatrixTranspose_test/MatrixTranspose.cpp b/test/MatrixTranspose_test/MatrixTranspose.cpp index 18adbcfb1e..c529404ed1 100644 --- a/test/MatrixTranspose_test/MatrixTranspose.cpp +++ b/test/MatrixTranspose_test/MatrixTranspose.cpp @@ -259,24 +259,24 @@ void api_callback( if (domain == ACTIVITY_DOMAIN_ROCTX) { const roctx_api_data_t* data = (const roctx_api_data_t*)(callback_data); - fprintf(stdout, "\n", data->args.message); + fprintf(stdout, "<%s pid(%d) tid(%d)>\n", data->args.message, GetPid(), GetTid()); return; } if (domain == ACTIVITY_DOMAIN_KFD_API) { const kfd_api_data_t* data = (const kfd_api_data_t*)(callback_data); - fprintf(stdout, "<%s id(%u)\tcorrelation_id(%lu) %s>\n", + fprintf(stdout, "<%s id(%u)\tcorrelation_id(%lu) %s pid(%d) tid(%d)>\n", roctracer_op_string(ACTIVITY_DOMAIN_KFD_API, cid, 0), cid, data->correlation_id, - (data->phase == ACTIVITY_API_PHASE_ENTER) ? "on-enter" : "on-exit"); + (data->phase == ACTIVITY_API_PHASE_ENTER) ? "on-enter" : "on-exit", GetPid(), GetTid()); return; } const hip_api_data_t* data = (const hip_api_data_t*)(callback_data); - SPRINT("<%s id(%u)\tcorrelation_id(%lu) %s> ", + SPRINT("<%s id(%u)\tcorrelation_id(%lu) %s pid(%d) tid(%d)> ", roctracer_op_string(ACTIVITY_DOMAIN_HIP_API, cid, 0), cid, data->correlation_id, - (data->phase == ACTIVITY_API_PHASE_ENTER) ? "on-enter" : "on-exit"); + (data->phase == ACTIVITY_API_PHASE_ENTER) ? "on-enter" : "on-exit", GetPid(), GetTid()); if (data->phase == ACTIVITY_API_PHASE_ENTER) { switch (cid) { case HIP_API_ID_hipMemcpy: @@ -408,3 +408,5 @@ void start_tracing() {} void stop_tracing() {} #endif //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + diff --git a/test/golden_traces/tests_trace_cmp_levels.txt b/test/golden_traces/tests_trace_cmp_levels.txt index 5968512089..31c63628e5 100644 --- a/test/golden_traces/tests_trace_cmp_levels.txt +++ b/test/golden_traces/tests_trace_cmp_levels.txt @@ -1,11 +1,11 @@ -MatrixTranspose_ctest_trace 3 -MatrixTranspose_test_trace 1 -MatrixTranspose_hipaact_test_trace 1 -MatrixTranspose_mgpu_trace 1 -MatrixTranspose_kfd_trace 0 -MatrixTranspose_sys_trace 0 -MatrixTranspose_sys_hsa_trace 0 -MatrixTranspose_hip_period_trace 0 -MatrixTranspose_hip_flush_trace 0 -ctrl_hsa_trace 1 -ctrl_hsa_input_trace 2 +# dummy +MatrixTranspose_ctest_trace --check-diff +MatrixTranspose_test_trace --check-count .* --ignore-count hsaKmt.* +MatrixTranspose_mgpu_trace --check-count .* --ignore-count hsaKmt.* +MatrixTranspose_sys_trace --check-count .* --ignore-count hsa_.* +MatrixTranspose_sys_hsa_trace --check-count .* --ignore-count hsa_.* +MatrixTranspose_hip_period_trace --check-events .* --ignore-event hipMalloc|hipFree +MatrixTranspose_hip_flush_trace --check-order .* +MatrixTranspose_kfd_trace --check-events .* +ctrl_hsa_trace --check-count .* +ctrl_hsa_input_trace --check-count .*