From f24a8d8120ad7543e2f46627c472921a126347fd Mon Sep 17 00:00:00 2001
From: Elizabeth <hashim.sharif91@gmail.com>
Date: Tue, 8 Oct 2019 18:22:57 -0500
Subject: [PATCH] Removed functionality to opush h2f/f2h conversions to the
 back and added keys for all f2h/h2f conversions

---
 .../build_pldi/table_generator.py             | 59 +++++--------------
 1 file changed, 16 insertions(+), 43 deletions(-)

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 e6c4298f30..5d4aec4b94 100644
--- a/llvm/projects/hpvm-tensor-rt/build_pldi/table_generator.py
+++ b/llvm/projects/hpvm-tensor-rt/build_pldi/table_generator.py
@@ -21,7 +21,6 @@ class TableGenerator:
 
         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
         return os.path.isfile(file_path) and os.access(file_path, os.X_OK) and \
@@ -80,7 +79,6 @@ 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()
@@ -101,16 +99,20 @@ class TableGenerator:
                 line = line.strip()
                 op_name, total_time, total_energy = self.__parse_tensor_operation_line(line)
 
+                # Conv1 --> all approximations --> store f2h and h2f as independent approximations 
+                # Need to store their full names
                 # 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)
-                    # 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)
                         exit(1)
-                    self.__table[orig_op_name][conversion_type]["time"] = total_time
-                    self.__table[orig_op_name][conversion_type]["energy"] = total_energy 
+                    # Need to store f2h and h2f for each type of approximation 
+                    conversion_key = "%s_%s" % (approx_type, conversion_type)
+                    self.__table[orig_op_name][conversion_key]["time"] = total_time
+                    self.__table[orig_op_name][conversion_key]["energy"] = total_energy 
 
                 # Create a new row in the dictionary
                 else:
@@ -147,50 +149,21 @@ class TableGenerator:
                 curr_op = [curr_line] # Join into a string later
                 operation_data = self.__table[curr_line]
 
-                h2f_data = [None] * 2
-                f2h_data = [None] * 2
-                has_h2f_field = False
-                has_f2h_field = False
-
                 # Iterate through time/energy data for each approx type
                 for approx_type in operation_data:
                     op_time = operation_data[approx_type]["time"]
                     op_energy = operation_data[approx_type]["energy"]
 
-                    if approx_type == "h2f":
-                        h2f_data[0] = op_time
-                        h2f_data[1] = op_energy
-                        has_h2f_field = True 
-                    elif approx_type == "f2h":
-                        f2h_data[0] = op_time
-                        f2h_data[1] = op_energy
-                        has_f2h_field = True 
-                    else:
-                        curr_op.append(op_time)
-                        curr_op.append(op_energy)
-
-                        # CRITICAL ASSUMPTION: All ops within a layer have the same # cols
-                        # Only fill out the header once for the layer
-                        if op_in_layer_count == 0:
-                            header.append("%s_time" % approx_type)    
-                            header.append("%s_energy" % approx_type)
-
-                # Guarantee that the quantization data is at the end of the col 
-                # TODO: How essential is this bc it increases the complexity of my code
-                if has_h2f_field:
-                    curr_op.append(' '.join(h2f_data))
-                if has_f2h_field:
-                    curr_op.append(' '.join(f2h_data))
-                ops_in_layer.append(' '.join(curr_op))
+                    # can either just be the approx time or can be the approx type_h2f/f2h field
+                    curr_op.append(op_time)
+                    curr_op.append(op_energy)
 
-            # update header with h2f/f2h cols if they exist
-            if has_h2f_field:
-				header.append("h2f_time")
-				header.append("h2f_energy")
-                
-            if has_f2h_field: 
-                header.append("f2h_time") 
-                header.append("f2h_energy")
+                    # CRITICAL ASSUMPTION: All ops within a layer have the same # cols
+                    # Only fill out the header once for the layer
+                    if op_in_layer_count == 0:
+                        header.append("%s_time" % approx_type)    
+                        header.append("%s_energy" % 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)
-- 
GitLab