diff --git a/llvm/projects/hpvm-tensor-rt/tensor_runtime/include/approx_simulation.h b/llvm/projects/hpvm-tensor-rt/tensor_runtime/include/approx_simulation.h
index 9364516a818f9f4e0b907dd92e76dca04150ff40..66070f3058d840e4dbe25919e33aa8abc060b330 100644
--- a/llvm/projects/hpvm-tensor-rt/tensor_runtime/include/approx_simulation.h
+++ b/llvm/projects/hpvm-tensor-rt/tensor_runtime/include/approx_simulation.h
@@ -303,6 +303,10 @@ void* tensorConvSampSim(void* input_ptr, void* filter_ptr,
   hostToDeviceCopy(input);
   hostToDeviceCopy(filter);
 
+  convertToFP32(input);
+  convertToFP32(filter);
+
+  
   // Zeroing (+Scaling) Filter elements to 'Simulate' input sampling
   sampleFilter(filter, skip_rate, skip_offset);
   
@@ -341,7 +345,7 @@ void* tensorConvSampSim(void* input_ptr, void* filter_ptr,
   DEBUG("**Output Tensor Dims, n = %d, c = %d, h = %d, w = %d \n", n, c, h, w);
 
   Tensor* output;
-  output = (Tensor*) create4DTensor((cudnnDataType_t) input->data_type,
+  output = (Tensor*) create4DTensor((cudnnDataType_t) float_type, 
 				      CUDNN_TENSOR_NCHW, n, c, h, w);
   
 
@@ -646,6 +650,15 @@ bool isPerforation(int swing){
 }
 
 
+bool isSampling(int swing){
+
+  if(swing >= 31 && swing <= 39)
+    return true;
+  else
+    return false;      
+}
+
+
 int getSwing(int swing){
 
   #ifdef PROMISE_TUNER_ENABLED
@@ -670,6 +683,9 @@ int getSwing(int swing){
 
 
 
+
+
+
 class PerfParams{
 
  public:
@@ -728,6 +744,52 @@ PerfParams getPerfParams(int swing){
 
 
 
+
+class SampParams{
+
+ public:  
+  int skip_rate;
+  int skip_offset;
+
+  SampParams(){
+    skip_rate = 1;
+    skip_offset = 0;
+  }
+  
+  SampParams(int skip_rate1, int skip_offset1){
+    skip_rate = skip_rate1;
+    skip_offset = skip_offset1;
+  }
+ 		
+};
+
+
+
+SampParams getSampParams(int swing){
+
+  std::map<int, SampParams> samp_knob_map;
+
+  SampParams params31(2, 0);
+  samp_knob_map[31] = params31;
+
+  SampParams params32(2, 1);
+  samp_knob_map[32] = params32;
+
+  SampParams params33(4, 0);
+  samp_knob_map[33] = params33;
+
+  SampParams params34(4, 1);
+  samp_knob_map[34] = params34;
+
+  return samp_knob_map[swing];
+  
+}
+
+
+
+
+
+
 /***** API for Autotuner Use - Not the ApproxHPVM Wrapper API */
 
 void* ConvLayer_PROMISE(void* input, float i_min, float i_max,
@@ -774,6 +836,20 @@ void* ConvLayer_PROMISE(void* input, float i_min, float i_max,
 
   }
 
+  if(isSampling(swing)){
+ 
+    SampParams params = getSampParams(swing);
+    DEBUG("params.skip_rate = %d, params.skip_offset = %d \n",
+	  params.skip_rate, params.skip_offset);
+    
+    conv_out = tensorConvSampSim(input, filter,
+				 conv_pad_h, conv_pad_w,
+				 conv_stride_h, conv_stride_w, 1, 1,
+				 params.skip_rate, params.skip_offset);
+
+  }
+  
+
   if (isHalfPrecision(swing)){
 
     conv_out = tensorHalfConvolution(input, filter,