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 f8c75f710205a462515b22e829f5ee860c4e8811..750891d138f1506d9ad557adc9a440708f8382b4 100644
--- a/llvm/projects/hpvm-tensor-rt/dnn_sources/include/utils.h
+++ b/llvm/projects/hpvm-tensor-rt/dnn_sources/include/utils.h
@@ -9,6 +9,7 @@
 #include <bits/stdc++.h>
 #include "../../tensor_runtime/include/tensor.h"
 #include "types.h"
+#include <cmath>
 
 
 std::vector<float> run_accuracies;
@@ -42,9 +43,9 @@ void dumpWeightsToFile(char* file_name, void* weights_ptr){
     abort();
   }
 
-  printf("size_in_bytes = %lu \n", weights->size_in_bytes);
+  //printf("size_in_bytes = %lu \n", weights->size_in_bytes);
   size_t bytes_written = fwrite(weights->host_data, 1, weights->size_in_bytes, fp);
-  printf("bytes_written = %lu \n", bytes_written);
+  //printf("bytes_written = %lu \n", bytes_written);
   fclose(fp);
 }
 
@@ -209,7 +210,7 @@ void* readInputTensor(const char* file_name, int data_type, int dim1_size, int d
     tensor_data[i] = (float) file_data[i] / 255.0f;
   }
 
-  printf("tensor_data[%d] = %f \n", 10, tensor_data[10]);
+  //printf("tensor_data[%d] = %f \n", 10, tensor_data[10]);
 
   // NOTE: Using NCHW format
   struct Tensor* input = (struct Tensor*) create4DTensor(data_type, nchw, dim1_size, dim2_size,
@@ -243,7 +244,7 @@ struct Tensor* readTrainedWeights(const char* file_name, int data_type,
   fseek(file, file_header_size, SEEK_CUR); // Skipping the file header
   size_t bytes_read = fread(tensor_data, 1, size_in_bytes, file);
 
-  printf("size in bytes = %lu, bytes read = %lu \n", size_in_bytes, bytes_read);
+  // printf("size in bytes = %lu, bytes read = %lu \n", size_in_bytes, bytes_read);
 
   fclose(file);
   
@@ -282,7 +283,7 @@ struct Tensor* readInputBatch(const char* file_name, int data_type,
   fseek(file, file_header_size, SEEK_SET); // Skipping the file header
   size_t bytes_read = fread(tensor_data, 1, size_in_bytes, file);
 
-  printf("size in bytes = %lu, bytes read = %lu \n", size_in_bytes, bytes_read);
+  // printf("size in bytes = %lu, bytes read = %lu \n", size_in_bytes, bytes_read);
 
   fclose(file);
   
@@ -311,7 +312,7 @@ uint8_t* readLabels(const char* labels_file, int num_labels){
 
   fclose(file);
   
-  printf("--labels bytes_read = %lu \n", bytes_read);
+  // printf("--labels bytes_read = %lu \n", bytes_read);
   return labels;
 }
 
@@ -335,7 +336,7 @@ uint8_t* readLabelsBatch(const char* labels_file, int start, int end){
 
   fclose(file);
   
-  printf("--labels bytes_read = %lu \n", bytes_read);
+  // printf("--labels bytes_read = %lu \n", bytes_read);
   return labels;
 }
 
@@ -536,4 +537,46 @@ void dumpExecutionAccuracies(){
 
 
 
+float computePSNRViolation(void* gold_ptr, void* approx_ptr, float PSNR_threshold){
+
+  struct Tensor* gold_tensor = (struct Tensor*) gold_ptr;
+  struct Tensor* approx_tensor = (struct Tensor*) approx_ptr;
+
+  size_t* dim_sizes = gold_tensor->dims.dim_sizes;
+  size_t batch_dim = dim_sizes[0];
+  size_t image_size = dim_sizes[1] * dim_sizes[2] * dim_sizes[3];
+  
+  printf("batch_dim = %d, image_size = %d \n", batch_dim, image_size);
+	 
+  float* gold_data = (float*) gold_tensor->host_data;
+  float* approx_data = (float*) approx_tensor->host_data;
+  
+  int num_errors = 0;  
+  for(size_t i = 0; i < batch_dim; i++){
+    float mse_sum = 0.0;
+    float max_val = -999999;     
+    size_t offset = i * image_size;
+    
+    for(size_t j = 0; j < image_size; j++){
+      float diff = gold_data[offset + j] - approx_data[offset + j];
+      float diff_square = diff * diff;
+      mse_sum += diff_square;
+
+      if(max_val < gold_data[offset + j]){
+	max_val = gold_data[offset + j];
+      }   
+    }
+
+    printf ("max_val = %f \n", max_val);
+    mse_sum = mse_sum / image_size;
+    float psnr = 20 * log10(max_val / sqrt(mse_sum));
+
+    printf("PSNR value = %f \n", psnr);
+  }
+
+  return 0.0;  
+}
+
+
+
 #endif