diff --git a/hpvm/include/nvdla/tensorUtils.h b/hpvm/include/nvdla/tensorUtils.h index 19f32c01777ff08c04a8eff725ce753c96af2fff..47441bae9ddade48849b2d17b0e97c183d41f1c3 100644 --- a/hpvm/include/nvdla/tensorUtils.h +++ b/hpvm/include/nvdla/tensorUtils.h @@ -15,41 +15,111 @@ std::string model_params_path = "../../test/dnn_benchmarks/model_params/"; -struct Tensor *readTrainedWeights(const char *file_name, int data_type, - long int dim1_size, long int dim2_size, - long int dim3_size, long int dim4_size) { +__attribute__((noinline)) struct Tensor *readTrainedWeights(const char *file_name, int data_type, + long int dim1_size, long int dim2_size, + long int dim3_size, long int dim4_size) { + + int type_size = 4; // NOTE: Assuming floating point tensors + long int num_elems = dim1_size * dim2_size * dim3_size * dim4_size; + long int size_in_bytes = + type_size * dim1_size * dim2_size * dim3_size * dim4_size; + float *tensor_data = (float *)malloc(sizeof(float) * num_elems); + + int file_header_size = 0; + + FILE *file = fopen(file_name, "rb"); + if (file == NULL) { + printf("Data file %s is not found. Aborting... \n", file_name); + abort(); + } + + fseek(file, file_header_size, SEEK_CUR); // Skipping the file header + size_t bytes_read = fread(tensor_data, 1, size_in_bytes, file); + + fclose(file); + + // Returning a dummy tensor struct Tensor* weightsTensor = new struct Tensor; return weightsTensor; } -struct Tensor *readInputBatch(const char *file_name, long data_type, - long start, long end, - long dim2_size, long dim3_size, long dim4_size) { +__attribute__((noinline)) struct Tensor *readInputBatch(const char *file_name, long data_type, + long start, long end, + long dim2_size, long dim3_size, long dim4_size) { + long int dim1_size = end - start; + // FIXIT: Don't assume floating point types + long int type_size = 4; // NOTE: Assuming floating point tensors + long int num_elems = dim1_size * dim2_size * dim3_size * dim4_size; + long int size_in_bytes = + type_size * dim1_size * dim2_size * dim3_size * dim4_size; + float *tensor_data = (float *)malloc(sizeof(float) * num_elems); + long int file_header_size = + type_size * start * dim2_size * dim3_size * dim4_size; + + FILE *file = fopen(file_name, "rb"); + if (file == NULL) { + printf("Data file %s is not found. Aborting... \n", file_name); + abort(); + } + + fseek(file, file_header_size, SEEK_SET); // Skipping the file header + size_t bytes_read = fread(tensor_data, 1, size_in_bytes, file); + + fclose(file); + // Creating and returning empty tensor struct Tensor* inputTensor = new struct Tensor; return inputTensor; } -uint8_t *readLabels(const char *labels_file, int num_labels) { +__attribute__((noinline)) uint8_t *readLabels(const char *labels_file, int num_labels) { - uint8_t* dummyLabels = (uint8_t*) malloc(sizeof(uint8_t) * num_labels); - return dummyLabels; + uint8_t *labels = (uint8_t *)malloc(sizeof(uint8_t) * num_labels); + FILE *file = fopen(labels_file, "rb"); + if (file == NULL) { + printf("Data file %s is not found. Aborting...\n", labels_file); + abort(); + } + + size_t bytes_read = fread(labels, 1, sizeof(uint8_t) * num_labels, file); + + fclose(file); + + return labels; } -uint32_t *readLabels3(const char *labels_file, int num_labels) { +__attribute__((noinline)) 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"); + if (file == NULL) { + printf("Data file %s is not found. Aborting...\n", labels_file); + abort(); + } - uint32_t* dummyLabels = (uint32_t*) malloc(sizeof(uint32_t) * num_labels); - return dummyLabels; + size_t bytes_read = fread(labels, 1, sizeof(uint32_t) * num_labels, file); + fclose(file); + + return labels; } -uint32_t *readLabelsBatch3(const char *labels_file, int start, int end) { +__attribute__((noinline)) uint32_t *readLabelsBatch3(const char *labels_file, int start, int end) { long int num_labels = end - start; - uint32_t* dummyLabels = (uint32_t*) malloc(sizeof(uint32_t) * num_labels); - return dummyLabels; + uint32_t *labels = (uint32_t *) malloc(sizeof(uint32_t) * num_labels); + FILE *file = fopen(labels_file, "rb"); + if (file == NULL) { + printf("Data file %s is not found. Aborting...\n", labels_file); + abort(); + } + + size_t bytes_read = fread(labels, 1, sizeof(uint32_t) * num_labels, file); + fclose(file); + + return labels; } @@ -63,9 +133,14 @@ float computeAccuracy3(uint32_t *labels, void *result_ptr) { // tensor_runtime.h empty definitions - for NVDLA-based compilation to work (functions not actually used) -void *create4DTensor(int data_type, int data_format, size_t dim1_size, - size_t dim2_size, size_t dim3_size, size_t dim4_size){ +__attribute__((noinline)) void *create4DTensor(int data_type, int data_format, size_t dim1_size, + size_t dim2_size, size_t dim3_size, size_t dim4_size){ + long int type_size = 4; // NOTE: Assuming floating point tensors + long int num_elems = dim1_size * dim2_size * dim3_size * dim4_size; + long int size_in_bytes = + type_size * dim1_size * dim2_size * dim3_size * dim4_size; + struct Tensor* weightsTensor = new struct Tensor; return weightsTensor; }