From f19a557c7f895716f315277fb1271e2128496de4 Mon Sep 17 00:00:00 2001 From: Elizabeth <hashim.sharif91@gmail.com> Date: Mon, 14 Oct 2019 12:52:11 -0500 Subject: [PATCH] Fixed bug in new config parsing --- .../soc_simulator/src/driver_new_config.py | 140 +++++++++--------- 1 file changed, 72 insertions(+), 68 deletions(-) diff --git a/llvm/projects/soc_simulator/src/driver_new_config.py b/llvm/projects/soc_simulator/src/driver_new_config.py index 20ae136de7..46af48c737 100644 --- a/llvm/projects/soc_simulator/src/driver_new_config.py +++ b/llvm/projects/soc_simulator/src/driver_new_config.py @@ -10,6 +10,7 @@ class Driver: FP16 = 0 FP32 = 1 PROMISE = 2 + PERF = 3 results_time_key = "Time" results_energy_key = "Energy" @@ -23,14 +24,18 @@ class Driver: return "PROMISE" def driver(self): - #self.__parse_tensor_layer_file() - #self.__parse_tensor_table() + self.__parse_tensor_layer_file() + self.__parse_tensor_table() #self.__run_simulations() #self.__display_results() config_file = open(self.__config_filename, "r") line = config_file.readline().strip() + config_count = 0 + + prev_layer = Driver.ApproxTypes.FP32 + curr_layer = None + while line: - print(line) assert(line == "+++++") print("CONFIGURATION") @@ -42,20 +47,63 @@ class Driver: line = config_file.readline().strip() # layers + layer_count = 0 while line != "-----": print("LAYER", line == "-----") - - layer_data = line.split(' ') - if layer_data[1] == "promise": + print(layer_count, len(self.__tensor_layers)) + if line.find("softmax") != -1: + line = config_file.readline().strip() + continue + layer_table_data = self.__tensor_layers[layer_count] + layer_name = layer_table_data["name"] + + layer_line = line.split(' ') + + if layer_line[1] == "promise": print("PROMISE") - elif layer_data[1] == "gpu": + curr_layer = Driver.ApproxTypes.PROMISE + time, energy = self.__run_promise_simulation(layer_line[3], layer_table_data) + print(time, energy) + self.__aggregate_results[results_time_key][config_count] += time + self.__aggregate_results[results_energy_key][config_count] += energy + + elif layer_line[1] == "gpu": print("GPU") - for i in range(2, len(layer_data), 3): - op_type = layer_data[i] - approx_type = layer_data[i + 1] - op_number = layer_data[i + 2] - print(op_type, approx_type, op_number) + + total_time = 0 + total_energy = 0 + tensor_count = 0 + + for i in range(2, len(layer_line), 3): + op_type = layer_line[i] + approx_type = layer_line[i + 1] + op_number = layer_line[i + 2] + #print(op_type, approx_type, op_number) + + if approx_type == "fp16": + curr_layer = Driver.ApproxTypes.FP16 + elif approx_type == "fp32": + curr_layer = Driver.ApproxTypes.FP32 + elif approx_type == "perf": + curr_layer = Driver.ApproxTypes.PERF + quant_time, quant_energy = self.__quantize(curr_layer, prev_layer, tensor_count, layer_table_data) + if curr_layer == Driver.ApproxTypes.PERF: + conv_time, conv_energy = self.__run_gpu_simulation(curr_layer, layer_name, tensor_count, op_number) # Only need op number for perf + else: + conv_time, conv_energy = self.__run_gpu_simulation(curr_layer, layer_name, tensor_count) + total_time += quant_time + conv_time + total_energy += quant_energy + conv_energy + prev_layer = curr_layer + tensor_count += 1 + + self.__aggregate_results[results_time_key][config_count] += total_time + self.__aggregate_results[results_energy_key][config_count] += total_energy + + layer_count += 1 line = config_file.readline().strip() + prev_layer = curr_layer + + config_count += 1 line = config_file.readline().strip() config_file.close() @@ -182,7 +230,9 @@ class Driver: def __quantize(self, curr_layer, prev_layer, h2f_f2h_operation_ind, layer_data): print(self.__get_str(curr_layer), self.__get_str(prev_layer), h2f_f2h_operation_ind) if curr_layer == prev_layer or curr_layer == Driver.ApproxTypes.PROMISE \ - or prev_layer == Driver.ApproxTypes.PROMISE: # No quantization needed + or prev_layer == Driver.ApproxTypes.PROMISE \ + or curr_layer == Driver.ApproxTypes.PERF \ + or prev_layer == Driver.ApproxTypes.PERF: # No quantization needed return 0.0, 0.0 layer_name = layer_data["Name"] @@ -235,69 +285,23 @@ class Driver: return float(total_time_energy[0]), float(total_time_energy[1]) - def __run_gpu_simulation(self, curr_layer, layer_name, tensor_ind): + def __run_gpu_simulation(self, curr_layer, layer_name, tensor_ind, perf_number = None): tensor_info = self.__tensor_table[layer_name][tensor_ind] if curr_layer == Driver.ApproxTypes.FP32: conversion_time = tensor_info["fp32_time"] conversion_energy = tensor_info["fp32_energy"] - else: + + elif curr_layer == Driver.ApproxTypes.FP16: conversion_time = tensor_info["fp16_time"] conversion_energy = tensor_info["fp16_energy"] - print("GPU: (%f, %f)" % (conversion_time, conversion_energy)) - return (conversion_time, conversion_energy) - - - def __run_simulations(self): - if not os.path.isfile(self.__config_filename): - print("ERROR: %s was not found" % self.__config_filename) - exit(1) - - config_file = open(self.__config_filename, "r") - - # each line = indepedent configuration - # layers are separated by commas - # tensor ops are separated by spaces - for config in config_file: - config_layers = config.strip().split(',') - prev_layer = Driver.ApproxTypes.FP32 - curr_layer = None - - for layer_ind, config_layer in enumerate(config_layers): # level - layer_data = self.__tensor_layers[layer_ind] # layer - layer_name = layer_data["Name"] - if Driver.is_promise(config_layer): - print("Running layer %s on PROMISE" % layer_name) - curr_layer = Driver.ApproxTypes.PROMISE - # Compute - time, energy = self.__run_promise_simulation(config_layer, layer_data) - self.__aggregate_results[Driver.results_time_key][self.__config_count] += time - self.__aggregate_results[Driver.results_energy_key][self.__config_count] += energy - else: - print("Running layer %s on the GPU" % layer_name) - tensor_ops = config_layer.split(' ') - - total_time = 0 - total_energy = 0 - for tensor_ind, tensor_op in enumerate(tensor_ops): # sublevle - tensor_op = int(tensor_op) - if tensor_op == Driver.fp16_swing: - curr_layer = Driver.ApproxTypes.FP16 - else: - curr_layer = Driver.ApproxTypes.FP32 - - quant_time, quant_energy = self.__quantize(curr_layer, prev_layer, tensor_ind, layer_data) - conv_time, conv_energy = self.__run_gpu_simulation(curr_layer, layer_name, tensor_ind) - total_time += quant_time + conv_time - total_energy += quant_energy + conv_energy - prev_layer = curr_layer - self.__aggregate_results[Driver.results_time_key][self.__config_count] += total_time - self.__aggregate_results[Driver.results_energy_key][self.__config_count] += total_energy - prev_layer = curr_layer + elif curr_layer == Driver.ApproxTypes.PERF: + # Then we care abut the following number + conversion_time = tensor_info["perf%d_time" % perf_number] + conversion_energy = tensor_info["perf%d_energy" % perf_number] - self.__config_count += 1 - print("\n") - config_file.close() + print("GPU: (%f, %f)" % (conversion_time, conversion_energy)) + return (conversion_time, conversion_energy) def __display_results(self): -- GitLab