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