Commit d12d03bc by chengshuyao

Debug memory errors with -fsanitize

parent a21e2bfa
...@@ -171,14 +171,14 @@ public: ...@@ -171,14 +171,14 @@ public:
int order_num; int order_num;
BDD_class(){ BDD_class(){
most_influence = new int [parameter_input_bit_width]; most_influence = new int [parameter_input_bit_width+1];
BDD_width_each_layer = new int [parameter_input_bit_width+1]; BDD_width_each_layer = new int [parameter_input_bit_width+1];
mask_output_data = new bool [parameter_max_samples*2]; mask_output_data = new bool [parameter_max_samples*2];
hash_simplify_list = new int [parameter_max_BDD_width]; hash_simplify_list = new int [parameter_max_BDD_width];
BDD_mask_this = new BDD_node_mask[parameter_max_BDD_width]; BDD_mask_this = new BDD_node_mask[parameter_max_BDD_width];
BDD_mask_next = new BDD_node_mask[parameter_max_BDD_width]; BDD_mask_next = new BDD_node_mask[parameter_max_BDD_width];
has_been_unfold = new bool[parameter_input_bit_width+1]; has_been_unfold = new bool[parameter_input_bit_width+1];
amount_turn = new double [parameter_input_bit_width]; amount_turn = new double [parameter_input_bit_width+1];
test_input_data = new bool[parameter_input_bit_width]; test_input_data = new bool[parameter_input_bit_width];
left_son_mask = new bool [parameter_input_bit_width]; left_son_mask = new bool [parameter_input_bit_width];
right_son_mask = new bool [parameter_input_bit_width]; right_son_mask = new bool [parameter_input_bit_width];
...@@ -199,10 +199,6 @@ public: ...@@ -199,10 +199,6 @@ public:
start_node_index = new node_index [parameter_output_bit_width]; start_node_index = new node_index [parameter_output_bit_width];
start_node_index_string = new char [parameter_output_bit_width+1]; start_node_index_string = new char [parameter_output_bit_width+1];
mask_input_data = new bool*[parameter_max_samples*2];
simplify_list = new bool*[parameter_max_BDD_width];
BDD = new BDD_node*[1+parameter_input_bit_width];
amount_turn_output_data = new bool* [parameter_input_bit_width+1];
arr2d_new(mask_input_data, parameter_max_samples*2); arr2d_new(mask_input_data, parameter_max_samples*2);
arr2d_new(simplify_list, parameter_max_BDD_width); arr2d_new(simplify_list, parameter_max_BDD_width);
arr2d_new(BDD, 1+parameter_input_bit_width); arr2d_new(BDD, 1+parameter_input_bit_width);
...@@ -210,37 +206,38 @@ public: ...@@ -210,37 +206,38 @@ public:
}; };
~BDD_class(){ ~BDD_class(){
//delete [] split_nodes_each_layer ; arr_delete (split_nodes_each_layer );
//delete [] accuracy_each_layer ; arr_delete (accuracy_each_layer );
//delete [] BSD_variable_order ; arr_delete (BSD_variable_order );
//delete [] BDD_split_nodes_each_layer ; arr_delete (BDD_split_nodes_each_layer );
//delete [] output_partition_set ; arr_delete (output_partition_set );
//delete [] start_node_index ; //arr_delete (start_node_index );
//delete [] start_node_index_string ; arr_delete (start_node_index_string );
arr_delete (start_node_index_string );
//arr_delete (most_influence) ;
//delete [] BDD_width_each_layer ; arr_delete (most_influence ) ;
//delete [] mask_input_data ; arr_delete ( BDD_width_each_layer ) ;
//delete [] mask_output_data ; arr_delete ( mask_output_data ) ;
//delete [] simplify_list ; arr_delete ( hash_simplify_list ) ;
//delete [] hash_simplify_list ; arr_delete ( BDD_mask_this ) ;
//delete [] BDD ; arr_delete ( BDD_mask_next ) ;
//delete [] BDD_mask_this ; arr_delete ( has_been_unfold ) ;
//delete [] BDD_mask_next ; arr_delete ( amount_turn ) ;
//delete [] has_been_unfold ; arr_delete ( test_input_data ) ;
//delete [] amount_turn_output_data ; arr_delete ( left_son_mask ) ;
//delete [] amount_turn ; arr_delete ( right_son_mask ) ;
//delete [] test_input_data ; arr_delete ( left_mask_output_data ) ;
//delete [] left_son_mask ; arr_delete ( right_mask_output_data ) ;
//delete [] right_son_mask ; arr_delete ( left_mask_output_data_all ) ;
//delete [] left_mask_output_data ; arr_delete ( right_mask_output_data_all ) ;
//delete [] right_mask_output_data ; arr_delete ( all_one_left_list ) ;
//delete [] left_mask_output_data_all ; arr_delete ( all_zero_left_list ) ;
//delete [] right_mask_output_data_all ; arr_delete ( all_one_right_list ) ;
//delete [] all_one_left_list ; arr_delete ( all_zero_right_list ) ;
//delete [] all_zero_left_list ; arr2d_delete(mask_input_data, parameter_max_samples*2);
//delete [] all_one_right_list ; arr2d_delete(simplify_list, parameter_max_BDD_width);
//delete [] all_zero_right_list ; arr2d_delete(BDD, 1+parameter_input_bit_width);
arr2d_delete(amount_turn_output_data, 1+parameter_input_bit_width);
}; };
...@@ -809,8 +806,8 @@ int BDD_class::train_BDD(int start_depth, int how_many_start_nodes, BDD_node* st ...@@ -809,8 +806,8 @@ int BDD_class::train_BDD(int start_depth, int how_many_start_nodes, BDD_node* st
//cout<<"all zero right"<<all_zero_right_list[j] <<endl; //cout<<"all zero right"<<all_zero_right_list[j] <<endl;
//cout<<"all one right"<<all_one_right_list[j] <<endl; //cout<<"all one right"<<all_one_right_list[j] <<endl;
} }
//arr_delete( left_mask_output_data_tmp ); arr_delete( left_mask_output_data_tmp );
//arr_delete( right_mask_output_data_tmp); arr_delete( right_mask_output_data_tmp);
} }
cout<<"Finish all one all zero compare "<<endl; cout<<"Finish all one all zero compare "<<endl;
...@@ -1092,8 +1089,8 @@ int BDD_class::train_BDD(int start_depth, int how_many_start_nodes, BDD_node* st ...@@ -1092,8 +1089,8 @@ int BDD_class::train_BDD(int start_depth, int how_many_start_nodes, BDD_node* st
cout<<"######################################################################"<<endl; cout<<"######################################################################"<<endl;
} }
//arr_delete( root_nodes_leafs); arr_delete( root_nodes_leafs);
//arr_delete( leaf_nodes_roots); arr_delete( leaf_nodes_roots);
return 0; return 0;
}; };
...@@ -1115,7 +1112,7 @@ int BDD_class::BDD_infer(){ ...@@ -1115,7 +1112,7 @@ int BDD_class::BDD_infer(){
bool infer_output_data; bool infer_output_data;
for (int j=0;j<parameter_input_bit_width;j++){ for (int j=0;j<parameter_input_bit_width;j++){
int zi = 0; int zi = 0;
long randint; long randint=0;
zi = j%30; zi = j%30;
if(zi == 0){ if(zi == 0){
randint = gen(); randint = gen();
......
...@@ -12,7 +12,7 @@ extern const int parameter_max_orders = 1; ...@@ -12,7 +12,7 @@ extern const int parameter_max_orders = 1;
extern const int parameter_multi_output_index = 0; //BSD从第几层开始化简,前面若干层展开序确定 extern const int parameter_multi_output_index = 0; //BSD从第几层开始化简,前面若干层展开序确定
extern const int parameter_max_BDD_width = 320000; //BSD每一层最多多少个节点 extern const int parameter_max_BDD_width = 320000; //BSD每一层最多多少个节点
int parameter_early_stop_depth = parameter_input_bit_width; //BSD到第几层终止,输出此时的不准确BSD int parameter_early_stop_depth = parameter_input_bit_width; //BSD到第几层终止,输出此时的不准确BSD
int parameter_early_stop_split_nodes= 1000000; //BSD每一层最多多少个节点 int parameter_early_stop_split_nodes= 10000000; //BSD每一层最多多少个节点
//全局变量 //全局变量
int GLOBAL_which_demo_function; int GLOBAL_which_demo_function;
...@@ -500,6 +500,7 @@ int search_partition(int start_node_number=default_start_node_number,int start_n ...@@ -500,6 +500,7 @@ int search_partition(int start_node_number=default_start_node_number,int start_n
arr_delete( area_parts ); arr_delete( area_parts );
arr_delete( best_area_parts ); arr_delete( best_area_parts );
return 0;
}; };
int BSD_execute(int start_node_number, node_index* start_node_index,int variable_order_number, int* variable_order){ int BSD_execute(int start_node_number, node_index* start_node_index,int variable_order_number, int* variable_order){
...@@ -551,6 +552,7 @@ int BSD_execute(int start_node_number, node_index* start_node_index,int variable ...@@ -551,6 +552,7 @@ int BSD_execute(int start_node_number, node_index* start_node_index,int variable
} }
int reward = search_reward(BSD_features_0); int reward = search_reward(BSD_features_0);
arr_delete(BDD_class_main.start_nodes) ;
return reward; return reward;
}; };
...@@ -570,9 +572,10 @@ int search_reward(BSD_features BSD_features_0){ ...@@ -570,9 +572,10 @@ int search_reward(BSD_features BSD_features_0){
int search_order(int start_node_number = default_start_node_number, int start_node_depth = 0, node_index* start_node_index = default_start_node_index,int search_iterations = parameter_search_iterations, int* start_order = default_start_order){ int search_order(int start_node_number = default_start_node_number, int start_node_depth = 0, node_index* start_node_index = default_start_node_index,int search_iterations = parameter_search_iterations, int* start_order = default_start_order){
multi_variable_order = new int* [parameter_max_orders]; arr2d_new(multi_variable_order,parameter_max_orders);
//multi_variable_order = new int* [parameter_max_orders];
for (int vi=0;vi<parameter_max_orders;vi++){ for (int vi=0;vi<parameter_max_orders;vi++){
multi_variable_order[vi] = new int [parameter_input_bit_width]; multi_variable_order[vi] = new int [parameter_input_bit_width+1];
for (int vj=0;vj<parameter_input_bit_width;vj++) for (int vj=0;vj<parameter_input_bit_width;vj++)
multi_variable_order[vi][vj]=0; multi_variable_order[vi][vj]=0;
} }
...@@ -597,7 +600,7 @@ int search_order(int start_node_number = default_start_node_number, int start_no ...@@ -597,7 +600,7 @@ int search_order(int start_node_number = default_start_node_number, int start_no
//best_variable_order = new int* [parameter_max_orders]; //best_variable_order = new int* [parameter_max_orders];
arr2d_new(best_variable_order,parameter_max_orders); arr2d_new(best_variable_order,parameter_max_orders);
for (int vi=0;vi<parameter_max_orders;vi++){ for (int vi=0;vi<parameter_max_orders;vi++){
best_variable_order[vi] = new int [parameter_input_bit_width]; best_variable_order[vi] = new int [parameter_input_bit_width+1];
for (int vj=0;vj<parameter_input_bit_width;vj++) for (int vj=0;vj<parameter_input_bit_width;vj++)
best_variable_order[vi][vj]=0; best_variable_order[vi][vj]=0;
} }
...@@ -655,7 +658,7 @@ int search_order(int start_node_number = default_start_node_number, int start_no ...@@ -655,7 +658,7 @@ int search_order(int start_node_number = default_start_node_number, int start_no
} }
} }
else{ else{
for(int vi=0;vi<best_area_depth;vi++){ for(int vi=0;vi<max(best_area_depth,parameter_input_bit_width);vi++){
multi_variable_order[vj][vi] = best_variable_order[vj][vi]; multi_variable_order[vj][vi] = best_variable_order[vj][vi];
cout<<multi_variable_order[vj][vi]<<" "; cout<<multi_variable_order[vj][vi]<<" ";
} }
...@@ -808,6 +811,7 @@ int search_order(int start_node_number = default_start_node_number, int start_no ...@@ -808,6 +811,7 @@ int search_order(int start_node_number = default_start_node_number, int start_no
} }
function_top_file << "endmodule"<<endl; function_top_file << "endmodule"<<endl;
function_top_file.close(); function_top_file.close();
arr_delete(start_node_index_string);
#endif #endif
bool accept=0; bool accept=0;
...@@ -957,6 +961,7 @@ int search_order(int start_node_number = default_start_node_number, int start_no ...@@ -957,6 +961,7 @@ int search_order(int start_node_number = default_start_node_number, int start_no
arr_delete( best_rewards) ; arr_delete( best_rewards) ;
arr_delete( best_area_depths); arr_delete( best_area_depths);
arr2d_delete (multi_variable_order,parameter_max_orders); arr2d_delete (multi_variable_order,parameter_max_orders);
arr2d_delete(best_variable_order,parameter_max_orders);
//arr2d_delete (best_variable_order,1); //arr2d_delete (best_variable_order,1);
//delete [] best_variable_order[0]; //delete [] best_variable_order[0];
//for(int i=0;i<parameter_input_bit_width;i++) //for(int i=0;i<parameter_input_bit_width;i++)
......
...@@ -353,11 +353,11 @@ int BDD_class::next_bit_layer_0(int depth){ ...@@ -353,11 +353,11 @@ int BDD_class::next_bit_layer_0(int depth){
int i,j,k; int i,j,k;
int zz; int zz;
int zi; int zi;
bool* should_not_be_unfold = new bool [parameter_input_bit_width]; bool* should_not_be_unfold = new bool [parameter_input_bit_width+1];
random_device rd; random_device rd;
mt19937 gen(rd()); mt19937 gen(rd());
for (zz=0;zz<parameter_input_bit_width;zz++){ for (zz=0;zz<parameter_input_bit_width+1;zz++){
amount_turn[zz] = 0; amount_turn[zz] = 0;
should_not_be_unfold[zz] = 0; should_not_be_unfold[zz] = 0;
} }
...@@ -409,13 +409,14 @@ int BDD_class::next_bit_layer_0(int depth){ ...@@ -409,13 +409,14 @@ int BDD_class::next_bit_layer_0(int depth){
}else{ }else{
//#pragma omp parallel for //#pragma omp parallel for
for(int j=0;j<BSD_samples_influence;j++){ for(int j=0;j<BSD_samples_influence;j++){
bool amount_turn_input_data_ij[parameter_input_bit_width]; bool* amount_turn_input_data_ij = new bool [parameter_input_bit_width+1];
for(int k=0;k<parameter_input_bit_width;k++){ for(int k=0;k<parameter_input_bit_width;k++){
amount_turn_input_data_ij[k] = mask_input_data[j][k]; amount_turn_input_data_ij[k] = mask_input_data[j][k];
} }
amount_turn_input_data_ij[i] = !amount_turn_input_data_ij[i]; amount_turn_input_data_ij[i] = !amount_turn_input_data_ij[i];
bool amount_turn_output_data_ij = io_generator_single(amount_turn_input_data_ij,BDD[depth][which_node_this_layer_array[j]].which_bit_output); bool amount_turn_output_data_ij = io_generator_single(amount_turn_input_data_ij,BDD[depth][which_node_this_layer_array[j]].which_bit_output);
amount_turn_output_data[i][j] = amount_turn_output_data_ij; amount_turn_output_data[i][j] = amount_turn_output_data_ij;
arr_delete(amount_turn_input_data_ij);
} }
} }
} }
...@@ -479,6 +480,7 @@ int BDD_class::next_bit_layer_0(int depth){ ...@@ -479,6 +480,7 @@ int BDD_class::next_bit_layer_0(int depth){
has_been_unfold[most_influence_next] = 1; has_been_unfold[most_influence_next] = 1;
double amount_turn_max_divide_average = amount_turn_static[most_influence_next]/amount_turn_average; double amount_turn_max_divide_average = amount_turn_static[most_influence_next]/amount_turn_average;
double amount_turn_max_ratio = amount_turn[most_influence_next]/(zz+1); double amount_turn_max_ratio = amount_turn[most_influence_next]/(zz+1);
arr_delete( should_not_be_unfold);
//USE_THIS:BEST //USE_THIS:BEST
//if((depth<parameter_input_bit_width-2) ){ //if((depth<parameter_input_bit_width-2) ){
// if((amount_turn_max_divide_average < 4) || (amount_turn_max_ratio < 0.3) || ((amount_turn_max_ratio>0.8)&&((amount_turn_max_ratio<0.999)))){ // if((amount_turn_max_divide_average < 4) || (amount_turn_max_ratio < 0.3) || ((amount_turn_max_ratio>0.8)&&((amount_turn_max_ratio<0.999)))){
......
#include "head.h" #include "head.h"
#include "io_generator/c3540.h" //io_generator中需要包含对PI_WIDTH,PO_WIDTH的全局定义,如: extern const int PI_WIDTH = 36; #include "io_generator/c432.h" //io_generator中需要包含对PI_WIDTH,PO_WIDTH的全局定义,如: extern const int PI_WIDTH = 36;
#include "io_generator_vec/c3540_vec.h" //如果有对应Verilog, 可以在aag_to_rtl里面直接生成2个文件 #include "io_generator_vec/c432_vec.h" //如果有对应Verilog, 可以在aag_to_rtl里面直接生成2个文件
//#include "io_generator/ip-cores/combinational_circuits/c_lod.h" //#include "io_generator/ip-cores/combinational_circuits/c_prefix_arbiter_base.h"
//#include "io_generator/ip-cores/combinational_circuits_vec/c_lod_vec.h" //#include "io_generator/ip-cores/combinational_circuits_vec/c_prefix_arbiter_base_vec.h"
#define INPUT_AIG //io_generator是否可以用uint按位操作进行加速,也即是否包含_vec后缀的另一个io_generator #define INPUT_AIG //io_generator是否可以用uint按位操作进行加速,也即是否包含_vec后缀的另一个io_generator
//#define SINGLE_BITS //io_generator是否包含每一个bit单独的io_generator_o{x} #define SINGLE_BITS //io_generator是否包含每一个bit单独的io_generator_o{x}
#define SEARCH_PARTITION //BSD算法搜索partition策略 //#define SEARCH_PARTITION //BSD算法搜索partition策略
#define ACCURACY_FIRST //精度优先算法: 慢且面积冗余大,在精度是瓶颈时使用,不作为默认选项。 //#define ACCURACY_FIRST //精度优先算法: 慢且面积冗余大,在精度是瓶颈时使用,不作为默认选项。
extern const int parameter_input_bit_width = PI_WIDTH +5 ; extern const int parameter_input_bit_width = PI_WIDTH +5 ;
int parameter_output_bit_width = PO_WIDTH; int parameter_output_bit_width = PO_WIDTH;
extern const int parameter_search_iterations = 10; //最大设计次数 extern const int parameter_search_iterations = 10; //最大设计次数
extern const int parameter_test_ios = 1000000; //测试要求多少样本 extern const int parameter_test_ios = 10000; //测试要求多少样本
extern const int parameter_max_samples = 100000; //BSD每一个节点最多进行多少次采样,至少为64 extern const int parameter_max_samples = 10000; //BSD每一个节点最多进行多少次采样,至少为64
extern const double parameter_early_stop_accuracy = 1; //允许的错误率,如果完全不允许,设为1; extern const double parameter_early_stop_accuracy = 1; //允许的错误率,如果完全不允许,设为1;
//没有特殊需要不要设到<1,会慢一些。 //没有特殊需要不要设到<1,会慢一些。
//0.5以下无意义,建议至少设到0.8吧. //0.5以下无意义,建议至少设到0.8吧.
......
export PATH=/lustre/S/chengshuyao/haoshiming/anaconda3/envs/BSD/bin:/bin:/lustre/S/chengshuyao/haoshiming/anaconda3/envs/BSD/bin:/lustre/S/chengshuyao/haoshiming/anaconda3/envs/BSD/bin/gcc #export PATH=/lustre/S/chengshuyao/haoshiming/anaconda3/envs/BSD/bin:/bin:/lustre/S/chengshuyao/haoshiming/anaconda3/envs/BSD/bin:/lustre/S/chengshuyao/haoshiming/anaconda3/envs/BSD/bin/gcc
export LIBRARY_PATH=/lustre/S/chengshuyao/haoshiming/anaconda3/envs/BSD/bin:/lustre/S/chengshuyao/haoshiming/anaconda3/envs/BSD/lib #export LIBRARY_PATH=/lustre/S/chengshuyao/haoshiming/anaconda3/envs/BSD/bin:/lustre/S/chengshuyao/haoshiming/anaconda3/envs/BSD/lib
export LD_LIBRARY_PATH=/lustre/S/chengshuyao/haoshiming/anaconda3/envs/BSD/bin:/lustre/S/chengshuyao/haoshiming/anaconda3/envs/BSD/lib #export LD_LIBRARY_PATH=/lustre/S/chengshuyao/haoshiming/anaconda3/envs/BSD/bin:/lustre/S/chengshuyao/haoshiming/anaconda3/envs/BSD/lib
#export ASAN_OPTIONS=halt_on_error=0:detect_leaks=1:malloc_context_size=15:log_path=./asan.log
rm rtl/* rm rtl/*
#bash write_vec.sh #bash write_vec.sh
#g++ -fno-omit-frame-pointer -fsanitize=address -g BSD.cpp -O3 -std=c++11 -fopenmp
g++ BSD.cpp -O3 -std=c++11 -fopenmp g++ BSD.cpp -O3 -std=c++11 -fopenmp
./a.out ./a.out
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment