Skip to content
Snippets Groups Projects
Commit f19a557c authored by Elizabeth's avatar Elizabeth
Browse files

Fixed bug in new config parsing

parent 848262b4
No related branches found
No related tags found
No related merge requests found
......@@ -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):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment