diff --git a/llvm/projects/hpvm-tensor-rt/dnn_sources/include/utils.h b/llvm/projects/hpvm-tensor-rt/dnn_sources/include/utils.h index 1eb32c2df8ffd5e5bad18d010686fb446354b723..a627f83e6b2aa9f38b09d82ee94ce35da1a6bafe 100644 --- a/llvm/projects/hpvm-tensor-rt/dnn_sources/include/utils.h +++ b/llvm/projects/hpvm-tensor-rt/dnn_sources/include/utils.h @@ -412,7 +412,7 @@ uint8_t* readLabels(const char* labels_file, int num_labels){ -uint32_t* readLabels2(const char* labels_file, int num_labels){ +uint32_t* readLabels3(const char* labels_file, int num_labels){ uint32_t* labels = (uint32_t*) malloc(sizeof(uint32_t) * num_labels); FILE* file = fopen(labels_file, "rb"); @@ -453,7 +453,7 @@ uint8_t* readLabelsBatch(const char* labels_file, int start, int end){ } -uint32_t* readLabelsBatch2(const char* labels_file, int start, int end){ +uint32_t* readLabelsBatch3(const char* labels_file, int start, int end){ int num_labels = end - start; int file_header_size = sizeof(uint32_t) * start; diff --git a/llvm/projects/hpvm-tensor-rt/dnn_sources/src/lenet_int32.cc b/llvm/projects/hpvm-tensor-rt/dnn_sources/src/lenet_int32.cc index 552826eebfedc0333c3e7a2f5b2cce5753f9e6f4..03a4137004fe063a4536efec8fa7ecf2d8d2b374 100644 --- a/llvm/projects/hpvm-tensor-rt/dnn_sources/src/lenet_int32.cc +++ b/llvm/projects/hpvm-tensor-rt/dnn_sources/src/lenet_int32.cc @@ -72,7 +72,7 @@ int main(){ void* var_17 = tensorRelu(var_16); void* var_18 = tensorSoftmax(var_17); - uint32_t* labels = readLabelsBatch2(labels_path.c_str(),start,end); + uint32_t* labels = readLabelsBatch3(labels_path.c_str(),start,end); float accuracy = computeAccuracy3(labels, var_18); final_accuracy += accuracy; diff --git a/llvm/projects/hpvm-tensor-rt/model_params/alexnet2_cifar10_test/labels32.bin b/llvm/projects/hpvm-tensor-rt/model_params/alexnet2_cifar10_test/labels32.bin new file mode 100644 index 0000000000000000000000000000000000000000..f2d1cdf8748dabd80aca7314824ed7fc0002524d Binary files /dev/null and b/llvm/projects/hpvm-tensor-rt/model_params/alexnet2_cifar10_test/labels32.bin differ diff --git a/llvm/projects/hpvm-tensor-rt/model_params/alexnet_cifar10_test/labels32.bin b/llvm/projects/hpvm-tensor-rt/model_params/alexnet_cifar10_test/labels32.bin new file mode 100644 index 0000000000000000000000000000000000000000..f2d1cdf8748dabd80aca7314824ed7fc0002524d Binary files /dev/null and b/llvm/projects/hpvm-tensor-rt/model_params/alexnet_cifar10_test/labels32.bin differ diff --git a/llvm/test/VISC/DNN_Benchmarks/benchmarks/alexnet/src/alexnet_loop.cpp b/llvm/test/VISC/DNN_Benchmarks/benchmarks/alexnet/src/alexnet_loop.cpp index 7b0fb69dd853dbe678c1dee535d0ba0fdbdebcaa..ee07bdd8f9901f1582d5f7642a2a86c099397a14 100644 --- a/llvm/test/VISC/DNN_Benchmarks/benchmarks/alexnet/src/alexnet_loop.cpp +++ b/llvm/test/VISC/DNN_Benchmarks/benchmarks/alexnet/src/alexnet_loop.cpp @@ -372,7 +372,7 @@ int main(){ std::string dir_prefix = std::string("../../../../../../projects/hpvm-tensor-rt/model_params/alexnet_cifar10_test/"); - std::string labels_path = dir_prefix + std::string("labels.bin"); + std::string labels_path = dir_prefix + std::string("labels32.bin"); //uint8_t* labels = readLabels(labels_path.c_str(),10000); std::string conv2d_1_w_path = dir_prefix + std::string("conv2d_1_w.bin"); void* conv2d_1_w = readTrainedWeights(conv2d_1_w_path.c_str(), 0,64,3,11,11); @@ -436,6 +436,7 @@ int main(){ std::string input_path = dir_prefix + std::string("input.bin"); void* input = create4DTensor(0,nchw,batch_size,3,32,32); + startMemTracking(); for (int i = 0; i < batch_count; i++){ @@ -457,11 +458,11 @@ int main(){ hpvm_request_tensor(result, 0); - uint8_t* labels = readLabelsBatch(labels_path.c_str(),start,end); + uint32_t* labels = readLabelsBatch3(labels_path.c_str(),start,end); - computeAccuracy2(labels, batch_size, result); + computeAccuracy3(labels, result); - llvm_hpvm_invokeRtControl(result, labels); + llvm_hpvm_invokeRtControl2(result, labels); freeBatchMemory(); } diff --git a/llvm/test/VISC/DNN_Benchmarks/benchmarks/alexnet2/src/alexnet2_loop.cpp b/llvm/test/VISC/DNN_Benchmarks/benchmarks/alexnet2/src/alexnet2_loop.cpp index 71ee98ee9adf1d7fded523ad4ec32fc3d3ce27a0..4147adabc31baaa6d5619ef72ab02942b859b9a7 100644 --- a/llvm/test/VISC/DNN_Benchmarks/benchmarks/alexnet2/src/alexnet2_loop.cpp +++ b/llvm/test/VISC/DNN_Benchmarks/benchmarks/alexnet2/src/alexnet2_loop.cpp @@ -420,7 +420,7 @@ int main(){ std::string dir_prefix = std::string("../../../../../../projects/hpvm-tensor-rt/model_params/alexnet2_cifar10_test/"); - std::string labels_path = dir_prefix + std::string("labels.bin"); + std::string labels_path = dir_prefix + std::string("labels32.bin"); std::string conv2d_1_w_path = dir_prefix + std::string("conv2d_1_w.bin"); void* conv2d_1_w = readTrainedWeights(conv2d_1_w_path.c_str(), 0,32,3,3,3); std::string conv2d_1_b_path = dir_prefix + std::string("conv2d_1_b.bin"); @@ -513,11 +513,11 @@ int main(){ hpvm_request_tensor(result, 0); - uint8_t* labels = readLabelsBatch(labels_path.c_str(),start,end); + uint32_t* labels = readLabelsBatch3(labels_path.c_str(),start,end); - computeAccuracy2(labels, batch_size, result); + computeAccuracy3(labels, result); - llvm_hpvm_invokeRtControl(result, labels); + llvm_hpvm_invokeRtControl2(result, labels); freeBatchMemory(); } diff --git a/llvm/test/VISC/DNN_Benchmarks/common/include/tensorUtils.h b/llvm/test/VISC/DNN_Benchmarks/common/include/tensorUtils.h index 8976f7dc8fa5df24536b051a5d436da6555161cf..a627f83e6b2aa9f38b09d82ee94ce35da1a6bafe 100644 --- a/llvm/test/VISC/DNN_Benchmarks/common/include/tensorUtils.h +++ b/llvm/test/VISC/DNN_Benchmarks/common/include/tensorUtils.h @@ -412,7 +412,7 @@ uint8_t* readLabels(const char* labels_file, int num_labels){ -uint32_t* readLabels2(const char* labels_file, int num_labels){ +uint32_t* readLabels3(const char* labels_file, int num_labels){ uint32_t* labels = (uint32_t*) malloc(sizeof(uint32_t) * num_labels); FILE* file = fopen(labels_file, "rb"); @@ -453,7 +453,7 @@ uint8_t* readLabelsBatch(const char* labels_file, int start, int end){ } -uint32_t* readLabelsBatch2(const char* labels_file, int start, int end){ +uint32_t* readLabelsBatch3(const char* labels_file, int start, int end){ int num_labels = end - start; int file_header_size = sizeof(uint32_t) * start; @@ -518,40 +518,75 @@ void computeAccuracy(const char* labels_file, int num_labels, void* result_ptr){ -float computeAccuracy2(uint8_t* labels, int num_labels, - void* result_ptr, unsigned num_classes = 10){ +// NOTE: batch_size and num_classes are Unused arguments +float computeAccuracy2(uint8_t* labels, int batch_size, + void* result_ptr, size_t num_classes = 10){ - unsigned num_zeros = 0; + struct Tensor* result = (struct Tensor*) result_ptr; + + size_t batch_dim = result->dims.dim_sizes[0]; + num_classes = result->dims.dim_sizes[1]; + float* data = (float*) result->host_data; + int num_errors = 0; + + printf("batch_dim = %lu, channels = %lu \n", batch_dim, num_classes); + + for(unsigned int i = 0; i < batch_dim; i++){ + + int chosen = 0; + for (int id = 1; id < num_classes; ++id){ + if (data[i * num_classes + chosen] < data[i * num_classes + id]) chosen = id; + } + + if(chosen != labels[i]) + num_errors++; + + } + + float accuracy = ((batch_dim - num_errors) * 1.0 / batch_dim * 1.0) * 100.0; + printf("****** Accuracy = %f \n\n", accuracy); + + FILE* fp = fopen("final_accuracy", "w+"); + if(fp != NULL){ + + std::ostringstream ss; + ss << std::fixed << accuracy; + std::string print_str = ss.str(); + + fwrite(print_str.c_str(), 1, print_str.length(), fp); + } + + fclose(fp); + + return accuracy; +} + + + +float computeAccuracy3(uint32_t* labels, void* result_ptr){ struct Tensor* result = (struct Tensor*) result_ptr; size_t batch_dim = result->dims.dim_sizes[0]; - size_t channels = result->dims.dim_sizes[1]; + size_t num_classes = result->dims.dim_sizes[1]; float* data = (float*) result->host_data; int num_errors = 0; - printf("batch_dim = %lu, channels = %lu \n", batch_dim, channels); + printf("batch_dim = %lu, num_classes = %lu \n", batch_dim, num_classes); - for(int i = 0; i < num_labels; i++){ + for(int i = 0; i < batch_dim; i++){ int chosen = 0; - //for (int id = 1; id < num_classes; ++id){ - for (int id = 1; id < channels; ++id){ - if (data[i * channels + chosen] < data[i * channels + id]) chosen = id; + for (int id = 1; id < num_classes; ++id){ + if (data[i * num_classes + chosen] < data[i * num_classes + id]) chosen = id; } - if(labels[i] == 0) - num_zeros++; - if(chosen != labels[i]) num_errors++; - - //printf("chosen = %d, label = %d \n", chosen, labels[i]); } float accuracy = ((batch_dim - num_errors) * 1.0 / batch_dim * 1.0) * 100.0; printf("****** Accuracy = %f \n\n", accuracy); - //printf("****** Zero class labels %d \n", num_zeros); FILE* fp = fopen("final_accuracy", "w+"); if(fp != NULL){ @@ -569,6 +604,7 @@ float computeAccuracy2(uint8_t* labels, int num_labels, } + struct ClassProb{ float prob; int index;