diff --git a/llvm/projects/soc_simulator/src/driver_new_config.py b/llvm/projects/soc_simulator/src/driver_new_config.py index 115237dac51c96b47d02c84a603d98bdcf0b84a4..20ae136de767a08acfbdca8f48333b0dec8f4a48 100644 --- a/llvm/projects/soc_simulator/src/driver_new_config.py +++ b/llvm/projects/soc_simulator/src/driver_new_config.py @@ -10,18 +10,54 @@ class Driver: FP16 = 0 FP32 = 1 PROMISE = 2 - PERF = 3 results_time_key = "Time" results_energy_key = "Energy" + def __get_str(self, appr): + if appr == Driver.ApproxTypes.FP16: + return "FP16" + elif appr == Driver.ApproxTypes.FP32: + return "FP32" + elif appr == Driver.ApproxTypes.PROMISE: + return "PROMISE" def driver(self): - self.__parse_tensor_layer_file() - self.__parse_tensor_table() - self.__run_simulations() - self.__display_results() + #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() + while line: + print(line) + assert(line == "+++++") + print("CONFIGURATION") + line = config_file.readline().strip() + # configuration data + conf_name = line.split(' ')[0] + assert(conf_name.startswith("conf")) + print(conf_name) + line = config_file.readline().strip() + + # layers + while line != "-----": + print("LAYER", line == "-----") + + layer_data = line.split(' ') + if layer_data[1] == "promise": + print("PROMISE") + elif layer_data[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) + line = config_file.readline().strip() + line = config_file.readline().strip() + config_file.close() def __init__(self, layer_filename, table_filename, config_filename, results_filename): self.__layer_filename = layer_filename @@ -144,6 +180,7 @@ 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 return 0.0, 0.0 @@ -155,7 +192,6 @@ class Driver: # Get h2f/f2h data using the first tensor operation in the layer # (which is why order matters in the tensor table) - print(layer_name, self.__tensor_table[layer_name]) tensor_op_row = self.__tensor_table[layer_name][h2f_f2h_operation_ind] if curr_layer == Driver.ApproxTypes.FP32: time = tensor_op_row["h2f_time"] @@ -189,7 +225,7 @@ class Driver: exit(1) # Run promise simulator # TODO need to print time and energy in the ptm runner so we can pipe it - output = subprocess.Popen(["./ptm", str(rows_a), str(cols_a), str(rows_b), \ + output = subprocess.Popen(["./ptm_new", str(rows_a), str(cols_a), str(rows_b), \ str(cols_b), str(patch_factor), str(swing)], \ stdout = subprocess.PIPE, stderr = subprocess.PIPE).communicate()[0] total_time_energy = output.strip().split(',') @@ -199,100 +235,71 @@ class Driver: return float(total_time_energy[0]), float(total_time_energy[1]) + def __run_gpu_simulation(self, curr_layer, layer_name, tensor_ind): + 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: + 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") - - line = config_file.readline().strip() - - while line: - assert(line.startswith("+++++")) - config_name = config_file.readline().strip().split(' ')[0] # Next line = configuration name - print("CONFIGURATION") - - line = config_file.readline().strip() - layer_ind = 0 # NOTE can also use the leftmost number in the currl ine - + + # 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 - while not line.startswith("-----"): - layer_info = line.split(' ') - layer_data = self.__tensor_layers[layer_ind] + for layer_ind, config_layer in enumerate(config_layers): # level + layer_data = self.__tensor_layers[layer_ind] # layer layer_name = layer_data["Name"] - - if layer_info[1] == "promise": + if Driver.is_promise(config_layer): print("Running layer %s on PROMISE" % layer_name) curr_layer = Driver.ApproxTypes.PROMISE - - swing = int(layer_info[3]) - time, energy = self.__run_promise_simulation(swing, layer_data) - print(time, energy) + # 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 - - elif layer_info[1] == "gpu": - # Parse each individual tensor operation - # TODO not portable bc there can be multiple numbers after each approx later on + 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 - - tensor_ind = 0 - for i in range(2, len(layer_info), 3): - tensor_op = layer_info[i] - approx_type = layer_info[i + 1] - approx_num = layer_info[i + 2] # only matters if perf - - if approx_type == "fp16": + 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 - elif approx_type == "fp32": + else: curr_layer = Driver.ApproxTypes.FP32 - elif approx_type == "perf": - curr_layer = DriverApproxTypes.PERF - else: - assert(False) quant_time, quant_energy = self.__quantize(curr_layer, prev_layer, tensor_ind, layer_data) - time, energy = self.__run_gpu_simulation(curr_layer, layer_name, tensor_ind, approx_num) - total_time += time - total_energy += energy - - tensor_ind += 1 + 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 - - layer_ind += 1 - line = config_file.readline().strip() + self.__aggregate_results[Driver.results_energy_key][self.__config_count] += total_energy + prev_layer = curr_layer self.__config_count += 1 - line = config_file.readline().strip() - + print("\n") config_file.close() - def __run_gpu_simulation(self, curr_layer, layer_name, tensor_ind, approx_num): - tensor_info = self.__tensor_table[layer_name][tensor_ind] - - if curr_layer == Driver.ApproxTypes.FP32: - time = tensor_info["fp32_time"] - energy = tensor_info["fp32_energy"] - - elif curr_layer == Driver.ApproxTypes.FP16: - time = tensor_info["fp16_time"] - energy = tensor_info["fp16_energy"] - - elif curr_layer == Driver.ApproxTypes.PERF: - time = tensor_info["perf%s_energy" % approx_num] - energy = tensor_info["perf%s_energy" % approx_num] - - print("GPU: (%f, %f)" % (time, energy)) - return time, energy - - def __display_results(self): results_file = open(self.__results_filename, "w") attributes_to_print = [Driver.results_time_key, Driver.results_energy_key]