diff --git a/llvm/projects/hpvm-tensor-rt/build_pldi/table_generator.py b/llvm/projects/hpvm-tensor-rt/build_pldi/table_generator.py index 71f88fed3ec46c32732c7f7f90095cff95c91c75..7c85f2adb487144927da142d0e96cc50a7ec504b 100644 --- a/llvm/projects/hpvm-tensor-rt/build_pldi/table_generator.py +++ b/llvm/projects/hpvm-tensor-rt/build_pldi/table_generator.py @@ -19,6 +19,8 @@ class TableGenerator: self.__profiler_binary_name = profiler_binary_name self.__results_dir_name = "%s_results" % self.__dir_name + self.__table_filename = "%s_tensors.txt" % self.__network_name + def __is_binary(self, file_path): # Binary name must start with the network name as per our naming standards @@ -78,6 +80,7 @@ class TableGenerator: underscore_ind = op_name.find("_") return op_name[ : underscore_ind], op_name[underscore_ind + 1 : ] + def generate_table(self): self.__table = self.__build_nested_default_dict() self.__build_internal_table() @@ -86,25 +89,22 @@ class TableGenerator: def __build_internal_table(self): for results_file_name in os.listdir(self.__results_dir_name): - print(results_file_name, self.__network_name) # Ignore if it's not a results file - if results_file_name.startswith(self.__network_name): + if results_file_name == self.__table_filename or \ + not results_file_name.startswith(self.__network_name): continue approx_type = self.__get_approximation_type(results_file_name) - print(approx_type) results_file = open(os.path.join(self.__results_dir_name, results_file_name), "r") for line in results_file: line = line.strip() op_name, total_time, total_energy = self.__parse_tensor_operation_line(line) - print(op_name, total_time, total_energy) # Handle _f2h and _h2f output for tensor operation # Store as columns of original operation rather than independent rows if any(op_name.endswith(prec_conv) for prec_conv in TableGenerator.precision_conversions): orig_op_name, conversion_type = self.__get_original_operation_name(op_name) - print("f2h/h2f", orig_op_name, conversion_type) # Error bc original op name should ALWAYS be in the table if orig_op_name not in self.__table: print("ERROR: Conversion found but original %s is not in the table" % orig_op_name) @@ -120,15 +120,13 @@ class TableGenerator: results_file.close() def __output_table(self): - # Copy ops file to results directory to use as empty table - table_filename = "%s_tensors.txt" % self.__network_name - table_file_path = os.path.join(self.__results_dir_name, table_filename) + table_file_path = os.path.join(self.__results_dir_name, self.__table_filename) # TODO un hard code this soc_operations_file_name = os.path.join("/home/nvidia/soc_simulator", "%s_cifar10" % self.__network_name, "%s_ops.txt" % self.__network_name) # Don't need to copy the file over --> can use the original file as a reference soc_operations_file = open(soc_operations_file_name, "r") - table_file = open(table_filename, "w") + table_file = open(self.__table_filename, "w") # Read header line to get layer name and # operations in layer # Get ops in each layer using the dict @@ -141,17 +139,18 @@ class TableGenerator: while curr_line: # First line is always the layers line (#layer_name,num_ops) layer_name, num_ops = self.__parse_layer_info_line(curr_line) - + print("FIRST LINE", layer_name, num_ops) + # Get each operation in the layer ops_in_layer = [] - header = [] + header = ["**", layer_name, str(num_ops), "_"] for op_in_layer_count in range(num_ops): # Each line consists of operation name curr_line = soc_operations_file.readline().strip() - curr_op = [curr_line] # Join into a string later operation_data = self.__table[curr_line] + # Iterate through time/energy data for each approx type for approx_type in operation_data: curr_op.append(operation_data[approx_type]["time"]) @@ -161,12 +160,12 @@ class TableGenerator: # Only fill out the header once for the layer if op_in_layer_count == 0: header.append(approx_type) - + ops_in_layer.append(' '.join(curr_op)) # Getting all operation rows and then writing everything because # calls to write() are slow (memory vs time tradeoff) - print("%s" % ' '.join(header)) - print("%s" % '\n'.join(ops_in_layer)) + #print("%s" % ' '.join(header)) + #print("%s" % '\n'.join(ops_in_layer)) table_file.write("%s\n" % ' '.join(header)) table_file.write("%s\n" % '\n'.join(ops_in_layer)) @@ -174,7 +173,8 @@ class TableGenerator: def __parse_layer_info_line(self, layer_info_line): #layer_name,num_ops comma_ind = layer_info_line.find(",") - return layer_info_line[layer_info_line.find("#") : comma_ind], int(layer_info_line[comma_ind + 1 : ]) + return layer_info_line[layer_info_line.find("#") + 1 : comma_ind], \ + int(layer_info_line[comma_ind + 1 : ]) def __generate_header(self, table): # <approx type time/energy> <conversion type at very end>