diff --git a/cnn_mapping/cost_model.py b/cnn_mapping/cost_model.py index a230bc2d9e5cdb3c7826a3aeb98da3f33da6f505..be3c259cc357bf45fcb37802509f391657f487d2 100644 --- a/cnn_mapping/cost_model.py +++ b/cnn_mapping/cost_model.py @@ -971,20 +971,45 @@ def get_cost(resource, point, layer, verbose=False): ''' List of total access of each buffer at level i''' if not isinstance(access_list[i][0], list): buffer_access = list(map(mul, access_list[i], layer_size)) - total_cost += sum(buffer_access) * total_access_cost[i] + total_cost += (sum(buffer_access) * total_access_cost[i][0]) else : for j in range(len(access_list[i])): buffer_access = list(map(mul, access_list[i][j], layer_size)) total_cost += sum(buffer_access) * total_access_cost[i][j] if verbose: - print('access_cost: ', total_access_cost) - print('access_list: ', access_list) + #print("total_access_cost", total_access_cost) + #print("access_list", access_list) + + #print("layer_size",layer_size) + + idx_adjust = 0 + if len(total_access_cost) > 4: + idx_adjust = 1 + + layer_access_cost = total_access_cost[:1 + idx_adjust] + total_access_cost[2 + idx_adjust:] + print('Layer_Access_Cost_[RegisterFile(s),Buffer,DRAM]_(pJ): \n\tifmap: {}\n\tofmap: {}\n\tfilter: {}'\ + .format([item[0] for item in layer_access_cost], [item[1] for item in layer_access_cost], [item[2] for item in layer_access_cost])) + print('PE_Access_Cost_(pJ): \n\tifmap: {}\n\tofmap: {}\n\tfilter: {}'\ + .format(total_access_cost[1 + idx_adjust][0], total_access_cost[1 + idx_adjust][1], total_access_cost[1 + idx_adjust][2])) + + layer_num_access = access_list[:1 + idx_adjust] + access_list[2 + idx_adjust:] + print('Number_of_Accesses_to_[RegisterFile(s),Buffer,DRAM]_in_Layer: \n\tifmap: {}\n\tofmap: {}\n\tfilter: {}'\ + .format([item[0] for item in layer_num_access], [item[1] for item in layer_num_access], [item[2] for item in layer_num_access])) + print("Number_of_Accesses_to_[RegisterFile(s),Buffer,DRAM] PEs in Layer: \n\tifmap: {}\n\tofmap: {}\n\tfilter: {}"\ + .format(access_list[1 + idx_adjust][0], access_list[1 + idx_adjust][1], access_list[1 + idx_adjust][2])) + bank_size_list, block_size_list = get_block_sizes(num_levels, point, layer) - print('bank_size_list: ', bank_size_list) - print('block_size_list: ', block_size_list) - print('layer_size: ', layer_size) - print('total cost: ', total_cost) + + #print("bank_size_list", bank_size_list) + #print("block_size_list", block_size_list) + + print('Memory_Bank_Size_List_When_Parallelized/Unrolled_[RegisterFile(s),Buffer,DRAM]_(bytes): \n\tifmap: {}\n\tofmap: {}\n\tfilter: {}'\ + .format([item[0] for item in bank_size_list], [item[1] for item in bank_size_list], [item[2] for item in bank_size_list])) + print('Memory_Block_Size_List_When_NOT_Parallelized/Unrolled_[RegisterFile(s),Buffer,DRAM]_(bytes): \n\tifmap: {}\n\tofmap: {}\n\tfilter: {}'\ + .format([item[0] for item in block_size_list], [item[1] for item in block_size_list], [item[2] for item in block_size_list])) + print('Layer_Size_(number_of_pixels): \n\tifmap: {}\n\tofmap: {}\n\tfilter: {}'.format(layer_size[0], layer_size[1], layer_size[2])) + #print('total cost: ', total_cost) #return total_cost return total_cost, total_access_cost, access_list,layer_size diff --git a/cnn_mapping/optimizer.py b/cnn_mapping/optimizer.py index 3886d7aa684384eba79e6d04c986b6e4d03075f0..b814e36a2741ae7b4e84422d5b744b68d4bc9525 100644 --- a/cnn_mapping/optimizer.py +++ b/cnn_mapping/optimizer.py @@ -20,9 +20,9 @@ def opt_optimizer(resource, layer, hint=None, verbose=False): # assert total_cost == smallest_cost if verbose: - print("Optimal energy (pJ): ", smallest_cost) - print("Runtime (cycles):", perf) - print("Best mapping_point: ", best_mapping_point.loop_blockings, best_mapping_point.loop_partitionings, best_mapping_point.loop_orders) + print("Optimal_energy_(pJ): ", smallest_cost) + print("Runtime_(cycles):", perf) + #print("Best mapping_point: ", best_mapping_point.loop_blockings, best_mapping_point.loop_partitionings, best_mapping_point.loop_orders) return [smallest_cost, best_mapping_point, perf] def optimizer(resource, layer, hint=None, verbose=False): @@ -49,7 +49,7 @@ def optimizer(resource, layer, hint=None, verbose=False): if verbose: print(smallest_cost) - print("Best mapping_point: ", best_mapping_point.loop_blockings, mapping_point.loop_partitionings, best_mapping_point.loop_orders) + #print("Best mapping_point: ", best_mapping_point.loop_blockings, mapping_point.loop_partitionings, best_mapping_point.loop_orders) return [smallest_cost, best_mapping_point] diff --git a/cnn_mapping/schedule.py b/cnn_mapping/schedule.py index 9ef64450c89e638c43302c85c3dd1736ba07a019..c7f2111fd81e63df481f7292e6659035194aad77 100644 --- a/cnn_mapping/schedule.py +++ b/cnn_mapping/schedule.py @@ -25,8 +25,8 @@ class Schedule(object): self.partition_loops.append(le.loop_table[l]) else: self.partition_loops = partition_loops - - num_levels = len(list(schedule_hint.values())[0][0]) + + num_levels = len(list(schedule_hint.values())[0]) hint_para_index = {} for loop in schedule_hint: for level in range(num_levels): diff --git a/cnn_mapping/utils.py b/cnn_mapping/utils.py index b1d79b8d4da39311c3a67cc6bf003c7d348f2255..7482b3ad02c7d2017e019d78a365cbb92db64167 100644 --- a/cnn_mapping/utils.py +++ b/cnn_mapping/utils.py @@ -20,3 +20,24 @@ def print_loop_nest(point): print(order_lists, para_dims) +def print_best_schedule(point): + loop_orders = list(zip(*point.loop_orders)) + loop_blockings = list(zip(*point.loop_blockings)) + loop_partitionings = list(zip(*point.loop_partitionings)) + para_dims = point.para_loop_dim + num_level = len(loop_orders) + order_lists = [] + for level in range(num_level): + print("\tLevel Number: {}".format(level)) + order_list = [None] * le.NUM + for order in range(le.NUM): + if loop_blockings[level][order] != 1 or loop_partitionings[level][order] != 1 : + order_list[loop_orders[level][order]] = (le.table[order], + loop_blockings[level][order], + loop_partitionings[level][order]) + print("\t\tLoop Name: {}, Loop Bound: {}, Number of Unrolls: {}".format(le.table[order], loop_blockings[level][order], loop_partitionings[level][order])) + + order_lists.append(order_list) + + #print(order_lists) + diff --git a/tools/run_optimizer.py b/tools/run_optimizer.py index e4469e02e2e448e616d8c980fd80cf8d3b102f37..4a406f4038c5b086cb22842c7f6cfce0c915c1ad 100644 --- a/tools/run_optimizer.py +++ b/tools/run_optimizer.py @@ -14,12 +14,15 @@ def basic_optimizer(arch_info, network_info, schedule_info=None, basic=False, ve schedule = cm.Schedule.schedule(schedule_info) if schedule_info != None else None smallest_cost, best_mapping_point, perf = cm.optimizer.opt_optimizer(resource, layer, schedule, verbose) - level_costs = cm.cost_model.get_level_costs(resource, best_mapping_point, layer, verbose) - if verbose or basic: - print("best energy: ", smallest_cost) - print("cost for each level: ", level_costs) #TODO - print("best schedule: ") - print(cm.utils.print_loop_nest(best_mapping_point)) + level_costs = cm.cost_model.get_cost(resource, best_mapping_point, layer, verbose) + #if verbose or basic: + if not verbose: + print("Optimal_energy_(pJ): ", smallest_cost) + + #print("Cost for Each Level (pJ): ", level_costs) #TODO + print("Best_Schedule_(innermost_loop_to_outermost_loop): ") + cm.utils.print_best_schedule(best_mapping_point) + return smallest_cost, perf @@ -173,5 +176,5 @@ if __name__ == "__main__": elif args.type == "mem_explore_4": mem_explore_optimizer_4_level(arch_info, network_info, schedule_info, args.verbose) end = time.time() - print("elapsed time: ", (end-start)) + print("Elapsed Time (s): ", round((end-start), 2))