Commit c433861a by chengshuyao

Debug long vec inputs

parent 8425b9be
...@@ -1113,20 +1113,21 @@ int BDD_class::BDD_infer(){ ...@@ -1113,20 +1113,21 @@ int BDD_class::BDD_infer(){
bool* test_input_data = new bool [parameter_input_bit_width]; bool* test_input_data = new bool [parameter_input_bit_width];
bool test_output_data; bool test_output_data;
bool infer_output_data; bool infer_output_data;
for (int j=0;j<parameter_input_bit_width;j++){
int zi = 0;
long randint=0; long randint=0;
zi = j%30; for (int j=0;j<parameter_input_bit_width;j++){
if(zi == 0){ //int zi = 0;
randint = gen(); //zi = j%30;
} //if(zi == 0){
test_input_data[j] = bool((int(randint >> (zi)))%2); // randint = gen();
//}
//test_input_data[j] = bool((int(randint >> (zi)))%2);
test_input_data[j] = test_input_bits[long(zj)*long(parameter_input_bit_width)+j];
} }
for(int j=0;j<start_depth;j++){ for(int j=0;j<start_depth;j++){
test_input_data[most_influence[j]] = BDD[start_depth][test_bit].mask[most_influence[j]]; test_input_data[most_influence[j]] = BDD[start_depth][test_bit].mask[most_influence[j]];
} }
test_output_data = io_generator_single(test_input_data,BDD[start_depth][test_bit].which_bit_output); test_output_data = io_generator_single(test_input_data,BDD[start_depth][test_bit].which_bit_output);
infer_output_data = cal_infer_result(test_input_data,test_bit,0); infer_output_data = cal_infer_result(test_input_data,test_bit,0);
error_all[zj] = (test_output_data != infer_output_data); error_all[zj] = (test_output_data != infer_output_data);
/////if((zj<1000) && (error_all[zj])){ /////if((zj<1000) && (error_all[zj])){
......
...@@ -95,6 +95,8 @@ int BSD_execute(int start_node_number, node_index* start_node_index,int variable ...@@ -95,6 +95,8 @@ int BSD_execute(int start_node_number, node_index* start_node_index,int variable
bool * test_input_bits;
bool * train_input_bits = new bool [long(parameter_max_samples)*long(parameter_input_bit_width)];
class BSD_features{ class BSD_features{
...@@ -177,6 +179,16 @@ void set_default(){ ...@@ -177,6 +179,16 @@ void set_default(){
lineCount ++; lineCount ++;
} }
} }
random_device rd;
mt19937 gen(rd());
test_input_bits = new bool [long(parameter_test_ios)*long(parameter_input_bit_width)];
#pragma omp parallel for
for (long j=0;j<long(parameter_test_ios)*long(parameter_input_bit_width)/31;j++){
long randint = gen();
for (int zi=0;zi<31;zi++)
test_input_bits[j] = bool((int(randint >> (zi)))%2);
}
cout<<"Finish default setup";
//io generator来自真值表,不来自写好的文件 //io generator来自真值表,不来自写好的文件
//char* truth_table_name = new char [100]; //char* truth_table_name = new char [100];
//int truth_table_input_width; //int truth_table_input_width;
...@@ -667,16 +679,16 @@ double search_order(int start_node_number = default_start_node_number, int start ...@@ -667,16 +679,16 @@ double search_order(int start_node_number = default_start_node_number, int start
if(i==0){ if(i==0){
for(int vi=0;vi<best_area_depth;vi++){ for(int vi=0;vi<best_area_depth;vi++){
multi_variable_order[vj][vi] = start_order[vi]; multi_variable_order[vj][vi] = start_order[vi];
cout<<multi_variable_order[vj][vi]<<" "; //cout<<multi_variable_order[vj][vi]<<" ";
} }
} }
else{ else{
for(int vi=0;vi<max(best_area_depth,parameter_input_bit_width);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]<<" ";
} }
} }
cout<<endl; //cout<<endl;
} }
cout<<endl; cout<<endl;
...@@ -892,10 +904,10 @@ double search_order(int start_node_number = default_start_node_number, int start ...@@ -892,10 +904,10 @@ double search_order(int start_node_number = default_start_node_number, int start
best_partition_parts = partition_parts; best_partition_parts = partition_parts;
for(int vi=0;vi<parameter_input_bit_width;vi++){ for(int vi=0;vi<parameter_input_bit_width;vi++){
best_variable_order[replace_order][vi] = multi_variable_order[order_num][vi]; best_variable_order[replace_order][vi] = multi_variable_order[order_num][vi];
cout<<best_variable_order[replace_order][vi]<<" "; //cout<<best_variable_order[replace_order][vi]<<" ";
best_BDD_split_nodes[vi] = BSD_features_0.BSD_area_layers[vi]; best_BDD_split_nodes[vi] = BSD_features_0.BSD_area_layers[vi];
} }
cout<<endl; //cout<<endl;
} }
best_reward_max = 0; best_reward_max = 0;
best_order_num = 0; best_order_num = 0;
...@@ -924,10 +936,10 @@ double search_order(int start_node_number = default_start_node_number, int start ...@@ -924,10 +936,10 @@ double search_order(int start_node_number = default_start_node_number, int start
best_partition_parts = partition_parts; best_partition_parts = partition_parts;
for(int vi=0;vi<parameter_input_bit_width;vi++){ for(int vi=0;vi<parameter_input_bit_width;vi++){
best_variable_order[replace_order][vi] = multi_variable_order[order_num][vi]; best_variable_order[replace_order][vi] = multi_variable_order[order_num][vi];
cout<<best_variable_order[replace_order][vi]<<" "; //cout<<best_variable_order[replace_order][vi]<<" ";
best_BDD_split_nodes[vi] = BSD_features_0.BSD_area_layers[vi]; best_BDD_split_nodes[vi] = BSD_features_0.BSD_area_layers[vi];
} }
cout<<endl; //cout<<endl;
best_reward_max = 0; best_reward_max = 0;
best_order_num = 0; best_order_num = 0;
for(int zi=0;zi<parameter_max_orders;zi++){ for(int zi=0;zi<parameter_max_orders;zi++){
...@@ -970,10 +982,10 @@ double search_order(int start_node_number = default_start_node_number, int start ...@@ -970,10 +982,10 @@ double search_order(int start_node_number = default_start_node_number, int start
} }
cout<<"Best Order: "; cout<<"Best Order: ";
for (int vj=0;vj<parameter_input_bit_width;vj++){ for (int vj=0;vj<parameter_input_bit_width;vj++){
cout<<best_variable_order[best_order_num][vj]; //cout<<best_variable_order[best_order_num][vj];
//cout<<start_order[vj]<<" "; //cout<<start_order[vj]<<" ";
} }
cout<<endl; //cout<<endl;
//cout<<"Best Design Area: "<<BSD_features_0.BSD_area<<endl; //cout<<"Best Design Area: "<<BSD_features_0.BSD_area<<endl;
cout<<endl; cout<<endl;
} }
......
...@@ -47,36 +47,49 @@ int BDD_class::next_bit_layer_0(int depth){ ...@@ -47,36 +47,49 @@ int BDD_class::next_bit_layer_0(int depth){
int which_node_this_layer = 0; int which_node_this_layer = 0;
int which_node_this_layer_sample = 0; int which_node_this_layer_sample = 0;
int which_node_this_layer_array[BSD_samples_influence]; int which_node_this_layer_array[BSD_samples_influence];
//#pragma omp parallel for //#pragma omp parallel for
for (int i=0;i<BSD_samples_influence;i++){ for (int i=0;i<BSD_samples_influence;i++){
int which_node_this_layer = gen()%BDD_width_each_layer[depth]; int which_node_this_layer = gen()%BDD_width_each_layer[depth];
//for (j=0;j<parameter_input_bit_width;j++){
// int zi = 0;
// long randint;
// zi = j%30;
// if(zi == 0){
// randint = gen();
// }
// if(depth == 0){
// mask_input_data[i][j] = bool((randint >> (zi))%2);
// }
// else{
// if(has_been_unfold[j]){
// mask_input_data[i][j] = BDD_mask_this[which_node_this_layer].mask[j];
// }else{
// mask_input_data[i][j] = bool((randint >> (zi))%2);
// }
//
// }
//}
for (j=0;j<parameter_input_bit_width;j++){ for (j=0;j<parameter_input_bit_width;j++){
int zi = 0;
long randint;
zi = j%30;
if(zi == 0){
randint = gen();
}
if(depth == 0){ if(depth == 0){
mask_input_data[i][j] = bool((randint >> (zi))%2); mask_input_data[i][j] = train_input_bits[i*parameter_input_bit_width+j];
} }
else{ else{
if(has_been_unfold[j]){ if(has_been_unfold[j]){
mask_input_data[i][j] = BDD_mask_this[which_node_this_layer].mask[j]; mask_input_data[i][j] = BDD_mask_this[which_node_this_layer].mask[j];
}else{ }else{
mask_input_data[i][j] = bool((randint >> (zi))%2); mask_input_data[i][j] = train_input_bits[i*parameter_input_bit_width+j];
} }
} }
} }
which_node_this_layer_array[i] = which_node_this_layer; which_node_this_layer_array[i] = which_node_this_layer;
} }
#pragma omp parallel for
for (i=0;i<parameter_input_bit_width+1;i++){ for (i=0;i<parameter_input_bit_width+1;i++){
if(has_been_unfold[i] || should_not_be_unfold[i]){ if(has_been_unfold[i] || should_not_be_unfold[i]){
}else{ }else{
#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 = new bool [parameter_input_bit_width+1]; 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++){
...@@ -109,7 +122,8 @@ int BDD_class::next_bit_layer_0(int depth){ ...@@ -109,7 +122,8 @@ int BDD_class::next_bit_layer_0(int depth){
//else //else
// amount_turn[i] = 0; // amount_turn[i] = 0;
if((amount_turn[i] > 40) && ((zz*BSD_samples_influence-amount_turn[i])>40)){ //if((amount_turn[i] > 1) && ((zz*BSD_samples_influence-amount_turn[i])>1)){
if((amount_turn[i] > 4) ){
finish_influence_sample = 1; finish_influence_sample = 1;
} }
......
// 修改BSD的采样函数:给mask_input_data[BSD_samples-1:0][parameter_input_bit_width-1:0]赋值。
// 目前的赋值是均匀随机函数。
int BDD_class::set_random_input_data(bool** mask_input_data){
int i,j;
random_device rd;
mt19937 gen(rd());
#pragma omp parallel for
for (long j=0;j<long(BSD_samples)*long(parameter_input_bit_width)/31;j++){
long randint = gen();
for (int zi=0;zi<31;zi++)
train_input_bits[j] = bool((int(randint >> (zi)))%2);
}
for (int i=0;i<BSD_samples;i++){
//对于特定的case,可以直接加到文件里面:sample_input.set
if(i<parameter_io_file_lines){
for(int j=0;j<parameter_input_bit_width;j++){
mask_input_data[i][j] = file_inputs[i][j];
}
}else{
long randint;
for(int j=0;j<parameter_input_bit_width;j++){
//int zj = i*parameter_input_bit_width + j;
//int zi = 0;
////下面是采样分布函数,目前是均匀随机
//zi = j%30;
//if(zi == 0){
// randint = gen();
//}
//mask_input_data[i][j] = bool((randint >> (zi))%2);
mask_input_data[i][j] = train_input_bits[i*parameter_input_bit_width+j];
}
}
}
return 0;
};
int BDD_class::set_random_input_data(bool** mask_input_data){ #include "sample.h"
int i,j;
random_device rd;
mt19937 gen(rd());
//#pragma omp parallel for
// for (int zj=0;zj<BSD_samples*parameter_input_bit_width;zj++){
// int i = int(zj/parameter_input_bit_width);
// int j = int(zj%parameter_input_bit_width);
for (int i=0;i<BSD_samples;i++){
if(i<parameter_io_file_lines){
for(int j=0;j<parameter_input_bit_width;j++){
mask_input_data[i][j] = file_inputs[i][j];
}
}else{
for(int j=0;j<parameter_input_bit_width;j++){
int zj = i*parameter_input_bit_width + j;
int zi = 0;
long randint;
zi = j%30;
if(zi == 0){
randint = gen();
}
mask_input_data[i][j] = bool((randint >> (zi))%2);
}
}
}
return 0;
};
int BDD_class::mask_random_input_data(int depth,bool* mask,int amount,bool** mask_input_data){ int BDD_class::mask_random_input_data(int depth,bool* mask,int amount,bool** mask_input_data){
int i,j; int i,j;
//#pragma omp parallel for //#pragma omp parallel for
......
#include "head.h" #include "head.h"
//#include "io_generator/c432.h" //io_generator中需要包含对PI_WIDTH,PO_WIDTH的全局定义,如: extern const int PI_WIDTH = 36;
#include "io_generator/rob_bsd.h" //io_generator中需要包含对PI_WIDTH,PO_WIDTH的全局定义,如: extern const int PI_WIDTH = 36; #include "io_generator/rob_bsd.h" //io_generator中需要包含对PI_WIDTH,PO_WIDTH的全局定义,如: extern const int PI_WIDTH = 36;
//#include "io_generator_vec/c1908_vec.h" //如果有对应Verilog, 可以在aag_to_rtl里面直接生成2个文件 //#include "io_generator_vec/c432_vec.h" //如果有对应Verilog, 可以在aag_to_rtl里面直接生成2个文件
//#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}
...@@ -16,8 +17,8 @@ int parameter_output_bit_width = PO_WIDTH; ...@@ -16,8 +17,8 @@ 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 = 100000; //测试要求多少样本 extern const int parameter_test_ios = 1000000; //测试要求多少样本
extern const int parameter_max_samples = 1000; //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吧.
......
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