| import os |
| import argparse |
| import sys |
| import subprocess |
| import psutil |
|
|
| import os |
| import collections |
| import csv |
|
|
| import numpy as np |
| import pandas as pd |
| import matplotlib |
| from matplotlib import pyplot as plt |
| import matplotlib.ticker as mticker |
| import xlsxwriter |
| import seaborn as sns |
|
|
| from matplotlib.ticker import FormatStrFormatter |
| from matplotlib.legend_handler import HandlerTuple |
|
|
| from subprocess import Popen, PIPE |
|
|
| from scipy.stats import gmean |
|
|
|
|
| prefix = 'run_' |
| parameter_super_list = ['super'] |
|
|
| config_super_list = ['standard', 'async', 'uvm', 'uvm_prefetch', 'uvm_prefetch_async'] |
| workload_super_list = ['gemm'] |
|
|
|
|
| def dict_to_list(input_dict): |
| return_list = [] |
| for elemement in input_dict: |
| return_list.append(elemement) |
| return return_list |
|
|
| def addOptions(parser): |
| parser.add_argument("-i", "--iterations", type=int, default=1, |
| help="Number of iterations") |
| parser.add_argument("-c", "--csv", type=str, default='output.xlsx', |
| help="output trace log file") |
| parser.add_argument("-f", "--figure", type=str, default='micro', |
| help="output pdf file") |
| parser.add_argument("-p", "--profiling", action='store_true', |
| help="whether to run profiling or just parse results") |
|
|
|
|
| def get_config_list(root_directory): |
| config_list = [] |
| for dict in os.listdir(root_directory): |
| if os.path.isdir(dict) and dict in config_super_list: |
| config_list.append(dict) |
| return config_list |
|
|
|
|
| def get_workload_dict(root_directory, config_list): |
| workload_list = [] |
| workload_dict = dict() |
| for config in config_list: |
| config_dir = root_directory + '/' + config |
| |
| for root, directories, files in os.walk(config_dir, topdown=False): |
| for dir in directories: |
| if dir in workload_super_list: |
| if dir not in workload_dict: |
| workload_dict[dir] = dict() |
| workload_dict[dir][config] = os.path.join(root, dir + '_perf') |
| if dir not in workload_list: |
| workload_list.append(dir) |
| |
| return workload_list, workload_dict |
|
|
| def get_run_cmd(bash_file): |
| return_txt = '' |
| text = open(bash_file, "r") |
| for line in text: |
| return_txt += line.rstrip() |
| return return_txt |
| |
| def execute_bashes(workload_dict, iterations, perf_list): |
| for workload in workload_dict: |
| if workload in workload_super_list: |
| for config in workload_dict[workload]: |
| if config in config_super_list: |
| cur_dir = workload_dict[workload][config] |
| pwd = os.getcwd() |
| os.chdir(cur_dir) |
| os.system('make') |
| for para in parameter_super_list: |
| for iter in range(0, iterations): |
| sh_file = './' + prefix + para + '.sh' |
|
|
| perf_cmd = '' |
| for i in range(0, len(perf_list)): |
| perf_cmd += perf_list[i] |
| if i != len(perf_list) - 1: |
| perf_cmd += ',' |
| profile_cmd = 'ncu --metrics ' |
| profile_cmd += perf_cmd |
| profile_cmd += ' --csv --log-file ' + para + '_' + str(iter) + '.profile.csv ' |
| profile_cmd += get_run_cmd(sh_file) |
| os.system(profile_cmd) |
| os.chdir(pwd) |
|
|
| def main(): |
| parser = argparse.ArgumentParser() |
| addOptions(parser) |
| |
| options = parser.parse_args() |
| |
| iterations = options.iterations |
| output_csv_file = options.csv |
| output_figure_file = options.figure |
| profiling = options.profiling |
|
|
| perf_list = [] |
| |
| perf_list.append('smsp__inst_executed.sum') |
| |
| perf_list.append('smsp__sass_thread_inst_executed_op_memory_pred_on.sum') |
| perf_list.append('smsp__sass_thread_inst_executed_op_control_pred_on.sum') |
| perf_list.append('smsp__sass_thread_inst_executed_op_integer_pred_on.sum') |
| perf_list.append('smsp__sass_thread_inst_executed_op_fp16_pred_on.sum') |
| perf_list.append('smsp__sass_thread_inst_executed_op_fp32_pred_on.sum') |
| perf_list.append('smsp__sass_thread_inst_executed_op_fp64_pred_on.sum') |
| |
| perf_list.append('l1tex__t_sectors_pipe_lsu_mem_global_op_ld.sum') |
| perf_list.append('l1tex__t_sectors_pipe_lsu_mem_global_op_ld_lookup_hit.sum') |
| perf_list.append('l1tex__t_sectors_pipe_lsu_mem_global_op_st.sum') |
| perf_list.append('l1tex__t_sectors_pipe_lsu_mem_global_op_st_lookup_hit.sum') |
| |
| root_directory = './' |
| |
| config_list = get_config_list(root_directory) |
| print(config_list) |
| workload_list, workload_dict = get_workload_dict(root_directory, config_list) |
| print(workload_dict) |
|
|
| if profiling: |
| execute_bashes(workload_dict, iterations, perf_list) |
| |
|
|
| if __name__ == '__main__': |
| main() |
|
|
|
|