diff --git a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/alexnet2_cifar10/alexnet2_cifar10.cpp b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/alexnet2_cifar10/alexnet2_cifar10.cpp
index 35f8188f785d023264c31a20480f661f066fb9f5..ebbfec271686292ced4cf830ae8787303e8cda68 100644
--- a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/alexnet2_cifar10/alexnet2_cifar10.cpp
+++ b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/alexnet2_cifar10/alexnet2_cifar10.cpp
@@ -405,10 +405,30 @@ typedef struct __attribute__((__packed__)) {
   struct ret_t r;
 } RootIn;
 
+void printUsage(const std::string &bin_name) {
+  std::cerr << "Usage: " << bin_name << " [-c CONF_FILE]\n";
+}
+
 const int batch_size = 500, input_size = 5000,
           batch_count = input_size / batch_size;
 
-int main() {
+int main(int argc, char *argv[]) {
+  std::string config_path = "";
+  int flag;
+  while ((flag = getopt(argc, argv, "hc:")) != -1) {
+    switch (flag) {
+    case 'c':
+      config_path = std::string(optarg);
+      break;
+    case 'h':
+      printUsage(argv[0]);
+      return 0;
+    default:
+      printUsage(argv[0]);
+      return 1;
+    }
+  }
+
   std::string dir_prefix = std::string(MODEL_PARAMS_DIR) + "/alexnet2_cifar10/";
   std::string input_path = dir_prefix + std::string("test_input.bin");
   std::string labels_path = dir_prefix + std::string("test_labels.bin");
@@ -488,6 +508,14 @@ int main() {
   args->dense_1_b_bytes = 0;
 
   __hpvm__init();
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
   startMemTracking();
 #pragma clang loop unroll(disable)
   for (int i = 0; i < batch_count; i++) {
diff --git a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/alexnet2_cifar10/alexnet2_cifar10_cudnn.cpp b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/alexnet2_cifar10/alexnet2_cifar10_cudnn.cpp
index 5bcc5b627b546d714404c89d9a775856c647e7bc..44b8e0b37d9e774b939608a0aa5988b9f2ba9565 100644
--- a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/alexnet2_cifar10/alexnet2_cifar10_cudnn.cpp
+++ b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/alexnet2_cifar10/alexnet2_cifar10_cudnn.cpp
@@ -410,10 +410,30 @@ void write_accuracy(float accuracy) {
   fout << std::fixed << accuracy;
 }
 
+void printUsage(const std::string &bin_name) {
+  std::cerr << "Usage: " << bin_name << " [-c CONF_FILE]\n";
+}
+
 const int batch_size = 500, input_size = 5000,
           batch_count = input_size / batch_size;
 
-int main() {
+int main(int argc, char *argv[]) {
+  std::string config_path = "";
+  int flag;
+  while ((flag = getopt(argc, argv, "hc:")) != -1) {
+    switch (flag) {
+    case 'c':
+      config_path = std::string(optarg);
+      break;
+    case 'h':
+      printUsage(argv[0]);
+      return 0;
+    default:
+      printUsage(argv[0]);
+      return 1;
+    }
+  }
+
   std::string dir_prefix = std::string(MODEL_PARAMS_DIR) + "/alexnet2_cifar10/";
   std::string input_path = dir_prefix + std::string("test_input.bin");
   std::string labels_path = dir_prefix + std::string("test_labels.bin");
@@ -493,6 +513,14 @@ int main() {
   args->dense_1_b_bytes = 0;
 
   __hpvm__init();
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
   float total_accuracy = 0;
   startMemTracking();
 #pragma clang loop unroll(disable)
diff --git a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/alexnet_cifar10/alexnet_cifar10.cpp b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/alexnet_cifar10/alexnet_cifar10.cpp
index 51e0dd137db1cd835412bc6ee5694795718e739d..fad49161eb2b6a6c248ba2531bd1c31fe00023b8 100644
--- a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/alexnet_cifar10/alexnet_cifar10.cpp
+++ b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/alexnet_cifar10/alexnet_cifar10.cpp
@@ -356,10 +356,30 @@ typedef struct __attribute__((__packed__)) {
   struct ret_t r;
 } RootIn;
 
+void printUsage(const std::string &bin_name) {
+  std::cerr << "Usage: " << bin_name << " [-c CONF_FILE]\n";
+}
+
 const int batch_size = 500, input_size = 5000,
           batch_count = input_size / batch_size;
 
-int main() {
+int main(int argc, char *argv[]) {
+  std::string config_path = "";
+  int flag;
+  while ((flag = getopt(argc, argv, "hc:")) != -1) {
+    switch (flag) {
+    case 'c':
+      config_path = std::string(optarg);
+      break;
+    case 'h':
+      printUsage(argv[0]);
+      return 0;
+    default:
+      printUsage(argv[0]);
+      return 1;
+    }
+  }
+
   std::string dir_prefix = std::string(MODEL_PARAMS_DIR) + "/alexnet_cifar10/";
   std::string input_path = dir_prefix + std::string("test_input.bin");
   std::string labels_path = dir_prefix + std::string("test_labels.bin");
@@ -430,6 +450,14 @@ int main() {
   args->dense_1_b_bytes = 0;
 
   __hpvm__init();
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
   startMemTracking();
 #pragma clang loop unroll(disable)
   for (int i = 0; i < batch_count; i++) {
diff --git a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/alexnet_cifar10/alexnet_cifar10_cudnn.cpp b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/alexnet_cifar10/alexnet_cifar10_cudnn.cpp
index 74c5420fd9b77aa2deab656204e43b164a241304..1fe72045f0ca22925c6e395ee5a7a2d0d9beef9b 100644
--- a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/alexnet_cifar10/alexnet_cifar10_cudnn.cpp
+++ b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/alexnet_cifar10/alexnet_cifar10_cudnn.cpp
@@ -362,10 +362,30 @@ void write_accuracy(float accuracy) {
   fout << std::fixed << accuracy;
 }
 
+void printUsage(const std::string &bin_name) {
+  std::cerr << "Usage: " << bin_name << " [-c CONF_FILE]\n";
+}
+
 const int batch_size = 500, input_size = 5000,
           batch_count = input_size / batch_size;
 
-int main() {
+int main(int argc, char *argv[]) {
+  std::string config_path = "";
+  int flag;
+  while ((flag = getopt(argc, argv, "hc:")) != -1) {
+    switch (flag) {
+    case 'c':
+      config_path = std::string(optarg);
+      break;
+    case 'h':
+      printUsage(argv[0]);
+      return 0;
+    default:
+      printUsage(argv[0]);
+      return 1;
+    }
+  }
+
   std::string dir_prefix = std::string(MODEL_PARAMS_DIR) + "/alexnet_cifar10/";
   std::string input_path = dir_prefix + std::string("test_input.bin");
   std::string labels_path = dir_prefix + std::string("test_labels.bin");
@@ -436,6 +456,14 @@ int main() {
   args->dense_1_b_bytes = 0;
 
   __hpvm__init();
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
   float total_accuracy = 0;
   startMemTracking();
 #pragma clang loop unroll(disable)
diff --git a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/alexnet_imagenet/alexnet_imagenet.cpp b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/alexnet_imagenet/alexnet_imagenet.cpp
index 16bcecf939051ef7490d58a196a12786b0d4f465..dcb8b4faf825e0814bdaf38a83a2683763fa8cd4 100644
--- a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/alexnet_imagenet/alexnet_imagenet.cpp
+++ b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/alexnet_imagenet/alexnet_imagenet.cpp
@@ -454,10 +454,30 @@ typedef struct __attribute__((__packed__)) {
   struct ret_t r;
 } RootIn;
 
+void printUsage(const std::string &bin_name) {
+  std::cerr << "Usage: " << bin_name << " [-c CONF_FILE]\n";
+}
+
 const int batch_size = 100, input_size = 5000,
           batch_count = input_size / batch_size;
 
-int main() {
+int main(int argc, char *argv[]) {
+  std::string config_path = "";
+  int flag;
+  while ((flag = getopt(argc, argv, "hc:")) != -1) {
+    switch (flag) {
+    case 'c':
+      config_path = std::string(optarg);
+      break;
+    case 'h':
+      printUsage(argv[0]);
+      return 0;
+    default:
+      printUsage(argv[0]);
+      return 1;
+    }
+  }
+
   std::string dir_prefix = std::string(MODEL_PARAMS_DIR) + "/alexnet_imagenet/";
   std::string input_path = dir_prefix + std::string("test_input.bin");
   std::string labels_path = dir_prefix + std::string("test_labels.bin");
@@ -548,6 +568,14 @@ int main() {
   args->dense_3_b_bytes = 0;
 
   __hpvm__init();
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
   startMemTracking();
 #pragma clang loop unroll(disable)
   for (int i = 0; i < batch_count; i++) {
diff --git a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/alexnet_imagenet/alexnet_imagenet_cudnn.cpp b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/alexnet_imagenet/alexnet_imagenet_cudnn.cpp
index 5ddd9694328db6d892c8c23b44b2e165afe77953..64a781102a6f7545a573016df5a49b7b04ca8fd6 100644
--- a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/alexnet_imagenet/alexnet_imagenet_cudnn.cpp
+++ b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/alexnet_imagenet/alexnet_imagenet_cudnn.cpp
@@ -459,10 +459,30 @@ void write_accuracy(float accuracy) {
   fout << std::fixed << accuracy;
 }
 
+void printUsage(const std::string &bin_name) {
+  std::cerr << "Usage: " << bin_name << " [-c CONF_FILE]\n";
+}
+
 const int batch_size = 100, input_size = 5000,
           batch_count = input_size / batch_size;
 
-int main() {
+int main(int argc, char *argv[]) {
+  std::string config_path = "";
+  int flag;
+  while ((flag = getopt(argc, argv, "hc:")) != -1) {
+    switch (flag) {
+    case 'c':
+      config_path = std::string(optarg);
+      break;
+    case 'h':
+      printUsage(argv[0]);
+      return 0;
+    default:
+      printUsage(argv[0]);
+      return 1;
+    }
+  }
+
   std::string dir_prefix = std::string(MODEL_PARAMS_DIR) + "/alexnet_imagenet/";
   std::string input_path = dir_prefix + std::string("test_input.bin");
   std::string labels_path = dir_prefix + std::string("test_labels.bin");
@@ -553,6 +573,14 @@ int main() {
   args->dense_3_b_bytes = 0;
 
   __hpvm__init();
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
   float total_accuracy = 0;
   startMemTracking();
 #pragma clang loop unroll(disable)
diff --git a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/lenet_mnist/lenet_mnist.cpp b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/lenet_mnist/lenet_mnist.cpp
index ee81665ec94a4c9cc634c16bdda5bbea96e120df..63d8bd1cc735f9d9dbfd52ac4ec56aebbb06ceeb 100644
--- a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/lenet_mnist/lenet_mnist.cpp
+++ b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/lenet_mnist/lenet_mnist.cpp
@@ -258,10 +258,30 @@ typedef struct __attribute__((__packed__)) {
   struct ret_t r;
 } RootIn;
 
+void printUsage(const std::string &bin_name) {
+  std::cerr << "Usage: " << bin_name << " [-c CONF_FILE]\n";
+}
+
 const int batch_size = 1000, input_size = 5000,
           batch_count = input_size / batch_size;
 
-int main() {
+int main(int argc, char *argv[]) {
+  std::string config_path = "";
+  int flag;
+  while ((flag = getopt(argc, argv, "hc:")) != -1) {
+    switch (flag) {
+    case 'c':
+      config_path = std::string(optarg);
+      break;
+    case 'h':
+      printUsage(argv[0]);
+      return 0;
+    default:
+      printUsage(argv[0]);
+      return 1;
+    }
+  }
+
   std::string dir_prefix = std::string(MODEL_PARAMS_DIR) + "/lenet_mnist/";
   std::string input_path = dir_prefix + std::string("test_input.bin");
   std::string labels_path = dir_prefix + std::string("test_labels.bin");
@@ -311,6 +331,14 @@ int main() {
   args->dense_2_b_bytes = 0;
 
   __hpvm__init();
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
   startMemTracking();
 #pragma clang loop unroll(disable)
   for (int i = 0; i < batch_count; i++) {
diff --git a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/lenet_mnist/lenet_mnist_cudnn.cpp b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/lenet_mnist/lenet_mnist_cudnn.cpp
index eecc7f5d60cf63b10ea5af098156a0dfa2890f80..558e7effa1cf0d3395e9fc21b26441210a15b033 100644
--- a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/lenet_mnist/lenet_mnist_cudnn.cpp
+++ b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/lenet_mnist/lenet_mnist_cudnn.cpp
@@ -263,10 +263,30 @@ void write_accuracy(float accuracy) {
   fout << std::fixed << accuracy;
 }
 
+void printUsage(const std::string &bin_name) {
+  std::cerr << "Usage: " << bin_name << " [-c CONF_FILE]\n";
+}
+
 const int batch_size = 1000, input_size = 5000,
           batch_count = input_size / batch_size;
 
-int main() {
+int main(int argc, char *argv[]) {
+  std::string config_path = "";
+  int flag;
+  while ((flag = getopt(argc, argv, "hc:")) != -1) {
+    switch (flag) {
+    case 'c':
+      config_path = std::string(optarg);
+      break;
+    case 'h':
+      printUsage(argv[0]);
+      return 0;
+    default:
+      printUsage(argv[0]);
+      return 1;
+    }
+  }
+
   std::string dir_prefix = std::string(MODEL_PARAMS_DIR) + "/lenet_mnist/";
   std::string input_path = dir_prefix + std::string("test_input.bin");
   std::string labels_path = dir_prefix + std::string("test_labels.bin");
@@ -316,6 +336,14 @@ int main() {
   args->dense_2_b_bytes = 0;
 
   __hpvm__init();
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
   float total_accuracy = 0;
   startMemTracking();
 #pragma clang loop unroll(disable)
diff --git a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/mobilenet_cifar10/mobilenet_cifar10.cpp b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/mobilenet_cifar10/mobilenet_cifar10.cpp
index 58051e0993e8b8893a398eee3a0358556a18c2f4..fc7835dedd4967a1fd03b3f878b944173974dd21 100644
--- a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/mobilenet_cifar10/mobilenet_cifar10.cpp
+++ b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/mobilenet_cifar10/mobilenet_cifar10.cpp
@@ -1959,10 +1959,30 @@ typedef struct __attribute__((__packed__)) {
   struct ret_t r;
 } RootIn;
 
+void printUsage(const std::string &bin_name) {
+  std::cerr << "Usage: " << bin_name << " [-c CONF_FILE]\n";
+}
+
 const int batch_size = 500, input_size = 5000,
           batch_count = input_size / batch_size;
 
-int main() {
+int main(int argc, char *argv[]) {
+  std::string config_path = "";
+  int flag;
+  while ((flag = getopt(argc, argv, "hc:")) != -1) {
+    switch (flag) {
+    case 'c':
+      config_path = std::string(optarg);
+      break;
+    case 'h':
+      printUsage(argv[0]);
+      return 0;
+    default:
+      printUsage(argv[0]);
+      return 1;
+    }
+  }
+
   std::string dir_prefix =
       std::string(MODEL_PARAMS_DIR) + "/mobilenet_cifar10/";
 
@@ -2780,6 +2800,14 @@ int main() {
   args->dense_1_b_bytes = 0;
 
   __hpvm__init();
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
   startMemTracking();
 #pragma clang loop unroll(disable)
   for (int i = 0; i < batch_count; i++) {
diff --git a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/mobilenet_cifar10/mobilenet_cifar10_cudnn.cpp b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/mobilenet_cifar10/mobilenet_cifar10_cudnn.cpp
index 482a37d4c4be22eda1079b0a900c762fdb4d1001..70083420c2af4eacee3f8e68b6a96b63c75563ba 100644
--- a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/mobilenet_cifar10/mobilenet_cifar10_cudnn.cpp
+++ b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/mobilenet_cifar10/mobilenet_cifar10_cudnn.cpp
@@ -1964,10 +1964,30 @@ void write_accuracy(float accuracy) {
   fout << std::fixed << accuracy;
 }
 
+void printUsage(const std::string &bin_name) {
+  std::cerr << "Usage: " << bin_name << " [-c CONF_FILE]\n";
+}
+
 const int batch_size = 500, input_size = 5000,
           batch_count = input_size / batch_size;
 
-int main() {
+int main(int argc, char *argv[]) {
+  std::string config_path = "";
+  int flag;
+  while ((flag = getopt(argc, argv, "hc:")) != -1) {
+    switch (flag) {
+    case 'c':
+      config_path = std::string(optarg);
+      break;
+    case 'h':
+      printUsage(argv[0]);
+      return 0;
+    default:
+      printUsage(argv[0]);
+      return 1;
+    }
+  }
+
   std::string dir_prefix =
       std::string(MODEL_PARAMS_DIR) + "/mobilenet_cifar10/";
   std::string input_path = dir_prefix + std::string("test_input.bin");
@@ -2785,6 +2805,14 @@ int main() {
   args->dense_1_b_bytes = 0;
 
   __hpvm__init();
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
   float total_accuracy = 0;
   startMemTracking();
 #pragma clang loop unroll(disable)
diff --git a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/resnet18_cifar10/resnet18_cifar10.cpp b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/resnet18_cifar10/resnet18_cifar10.cpp
index a254a625709f13ec08b403c26eac126a09df6daa..4aa288f18e4720ab22de1ead1b91115689cdba8b 100644
--- a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/resnet18_cifar10/resnet18_cifar10.cpp
+++ b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/resnet18_cifar10/resnet18_cifar10.cpp
@@ -1294,10 +1294,30 @@ typedef struct __attribute__((__packed__)) {
   struct ret_t r;
 } RootIn;
 
+void printUsage(const std::string &bin_name) {
+  std::cerr << "Usage: " << bin_name << " [-c CONF_FILE]\n";
+}
+
 const int batch_size = 500, input_size = 5000,
           batch_count = input_size / batch_size;
 
-int main() {
+int main(int argc, char *argv[]) {
+  std::string config_path = "";
+  int flag;
+  while ((flag = getopt(argc, argv, "hc:")) != -1) {
+    switch (flag) {
+    case 'c':
+      config_path = std::string(optarg);
+      break;
+    case 'h':
+      printUsage(argv[0]);
+      return 0;
+    default:
+      printUsage(argv[0]);
+      return 1;
+    }
+  }
+
   std::string dir_prefix = std::string(MODEL_PARAMS_DIR) + "/resnet18_cifar10/";
   std::string input_path = dir_prefix + std::string("test_input.bin");
   std::string labels_path = dir_prefix + std::string("test_labels.bin");
@@ -1526,6 +1546,14 @@ int main() {
   args->dense_1_b_bytes = 0;
 
   __hpvm__init();
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
   startMemTracking();
 #pragma clang loop unroll(disable)
   for (int i = 0; i < batch_count; i++) {
diff --git a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/resnet18_cifar10/resnet18_cifar10_cudnn.cpp b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/resnet18_cifar10/resnet18_cifar10_cudnn.cpp
index da1ce91ba3fdb4dc7d74e6b854dad7fc1c2d412e..064834b707300962250040a29c0dccfb801f8412 100644
--- a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/resnet18_cifar10/resnet18_cifar10_cudnn.cpp
+++ b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/resnet18_cifar10/resnet18_cifar10_cudnn.cpp
@@ -1225,10 +1225,30 @@ void write_accuracy(float accuracy) {
   fout << std::fixed << accuracy;
 }
 
+void printUsage(const std::string &bin_name) {
+  std::cerr << "Usage: " << bin_name << " [-c CONF_FILE]\n";
+}
+
 const int batch_size = 500, input_size = 5000,
           batch_count = input_size / batch_size;
 
-int main() {
+int main(int argc, char *argv[]) {
+  std::string config_path = "";
+  int flag;
+  while ((flag = getopt(argc, argv, "hc:")) != -1) {
+    switch (flag) {
+    case 'c':
+      config_path = std::string(optarg);
+      break;
+    case 'h':
+      printUsage(argv[0]);
+      return 0;
+    default:
+      printUsage(argv[0]);
+      return 1;
+    }
+  }
+
   std::string dir_prefix = std::string(MODEL_PARAMS_DIR) + "/resnet18_cifar10/";
   std::string input_path = dir_prefix + std::string("test_input.bin");
   std::string labels_path = dir_prefix + std::string("test_labels.bin");
@@ -1458,6 +1478,14 @@ int main() {
   args->dense_1_b_bytes = 0;
 
   __hpvm__init();
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
   float total_accuracy = 0;
   startMemTracking();
 #pragma clang loop unroll(disable)
diff --git a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/resnet50_imagenet/resnet50_imagenet.cpp b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/resnet50_imagenet/resnet50_imagenet.cpp
index a3ece5fedec57a73537d870199b6b4270b541b42..28447c6b401c90baf06de3bd8e7f77503623b6d9 100644
--- a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/resnet50_imagenet/resnet50_imagenet.cpp
+++ b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/resnet50_imagenet/resnet50_imagenet.cpp
@@ -5126,10 +5126,30 @@ typedef struct __attribute__((__packed__)) {
   struct ret_t r;
 } RootIn;
 
+void printUsage(const std::string &bin_name) {
+  std::cerr << "Usage: " << bin_name << " [-c CONF_FILE]\n";
+}
+
 const int batch_size = 25, input_size = 5000,
           batch_count = input_size / batch_size;
 
-int main() {
+int main(int argc, char *argv[]) {
+  std::string config_path = "";
+  int flag;
+  while ((flag = getopt(argc, argv, "hc:")) != -1) {
+    switch (flag) {
+    case 'c':
+      config_path = std::string(optarg);
+      break;
+    case 'h':
+      printUsage(argv[0]);
+      return 0;
+    default:
+      printUsage(argv[0]);
+      return 1;
+    }
+  }
+
   std::string dir_prefix =
       std::string(MODEL_PARAMS_DIR) + "/resnet50_imagenet/";
   std::string input_path = dir_prefix + std::string("test_input.bin");
@@ -6953,6 +6973,14 @@ int main() {
   args->dense_1_b_bytes = 0;
 
   __hpvm__init();
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
   startMemTracking();
 #pragma clang loop unroll(disable)
   for (int i = 0; i < batch_count; i++) {
diff --git a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/resnet50_imagenet/resnet50_imagenet_cudnn.cpp b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/resnet50_imagenet/resnet50_imagenet_cudnn.cpp
index 03674b50a5b6b9dcde87fd1e32b0520362ca8ca3..1f2903754dd8ed52302990aa05af2fad0e09dabc 100644
--- a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/resnet50_imagenet/resnet50_imagenet_cudnn.cpp
+++ b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/resnet50_imagenet/resnet50_imagenet_cudnn.cpp
@@ -4902,10 +4902,30 @@ void write_accuracy(float accuracy) {
   fout << std::fixed << accuracy;
 }
 
+void printUsage(const std::string &bin_name) {
+  std::cerr << "Usage: " << bin_name << " [-c CONF_FILE]\n";
+}
+
 const int batch_size = 50, input_size = 5000,
           batch_count = input_size / batch_size;
 
-int main() {
+int main(int argc, char *argv[]) {
+  std::string config_path = "";
+  int flag;
+  while ((flag = getopt(argc, argv, "hc:")) != -1) {
+    switch (flag) {
+    case 'c':
+      config_path = std::string(optarg);
+      break;
+    case 'h':
+      printUsage(argv[0]);
+      return 0;
+    default:
+      printUsage(argv[0]);
+      return 1;
+    }
+  }
+
   std::string dir_prefix =
       std::string(MODEL_PARAMS_DIR) + "/resnet50_imagenet/";
   std::string input_path = dir_prefix + std::string("test_input.bin");
@@ -6730,6 +6750,14 @@ int main() {
   args->dense_1_b_bytes = 0;
 
   __hpvm__init();
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
   float total_accuracy = 0;
   startMemTracking();
 #pragma clang loop unroll(disable)
diff --git a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/vgg16_cifar10/vgg16_cifar10.cpp b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/vgg16_cifar10/vgg16_cifar10.cpp
index cad22649fdfe4fd6271f5202aa524cea2f3f1383..3651eb176ea947882569cb5409706989289d103c 100644
--- a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/vgg16_cifar10/vgg16_cifar10.cpp
+++ b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/vgg16_cifar10/vgg16_cifar10.cpp
@@ -821,10 +821,30 @@ typedef struct __attribute__((__packed__)) {
   struct ret_t r;
 } RootIn;
 
+void printUsage(const std::string &bin_name) {
+  std::cerr << "Usage: " << bin_name << " [-c CONF_FILE]\n";
+}
+
 const int batch_size = 500, input_size = 5000,
           batch_count = input_size / batch_size;
 
-int main() {
+int main(int argc, char *argv[]) {
+  std::string config_path = "";
+  int flag;
+  while ((flag = getopt(argc, argv, "hc:")) != -1) {
+    switch (flag) {
+    case 'c':
+      config_path = std::string(optarg);
+      break;
+    case 'h':
+      printUsage(argv[0]);
+      return 0;
+    default:
+      printUsage(argv[0]);
+      return 1;
+    }
+  }
+
   std::string dir_prefix = std::string(MODEL_PARAMS_DIR) + "/vgg16_cifar10/";
   std::string input_path = dir_prefix + std::string("test_input.bin");
   std::string labels_path = dir_prefix + std::string("test_labels.bin");
@@ -983,6 +1003,14 @@ int main() {
   args->dense_2_b_bytes = 0;
 
   __hpvm__init();
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
   startMemTracking();
 #pragma clang loop unroll(disable)
   for (int i = 0; i < batch_count; i++) {
diff --git a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/vgg16_cifar10/vgg16_cifar10_cudnn.cpp b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/vgg16_cifar10/vgg16_cifar10_cudnn.cpp
index 662520282892f852fd8f634061cc0f6f72e465f9..f2f6557614fceb32f205287cd1490fbad3ed004a 100644
--- a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/vgg16_cifar10/vgg16_cifar10_cudnn.cpp
+++ b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/vgg16_cifar10/vgg16_cifar10_cudnn.cpp
@@ -826,10 +826,30 @@ void write_accuracy(float accuracy) {
   fout << std::fixed << accuracy;
 }
 
+void printUsage(const std::string &bin_name) {
+  std::cerr << "Usage: " << bin_name << " [-c CONF_FILE]\n";
+}
+
 const int batch_size = 500, input_size = 5000,
           batch_count = input_size / batch_size;
 
-int main() {
+int main(int argc, char *argv[]) {
+  std::string config_path = "";
+  int flag;
+  while ((flag = getopt(argc, argv, "hc:")) != -1) {
+    switch (flag) {
+    case 'c':
+      config_path = std::string(optarg);
+      break;
+    case 'h':
+      printUsage(argv[0]);
+      return 0;
+    default:
+      printUsage(argv[0]);
+      return 1;
+    }
+  }
+
   std::string dir_prefix = std::string(MODEL_PARAMS_DIR) + "/vgg16_cifar10/";
   std::string input_path = dir_prefix + std::string("test_input.bin");
   std::string labels_path = dir_prefix + std::string("test_labels.bin");
@@ -989,6 +1009,14 @@ int main() {
   args->dense_2_b_bytes = 0;
 
   __hpvm__init();
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
   float total_accuracy = 0;
   startMemTracking();
 #pragma clang loop unroll(disable)
diff --git a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/vgg16_cifar100/vgg16_cifar100.cpp b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/vgg16_cifar100/vgg16_cifar100.cpp
index 54417171fbcda003e27d7662a11f35499f7c0cc8..2315433e100db05ef6f2a209ba41d22aeac3f656 100644
--- a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/vgg16_cifar100/vgg16_cifar100.cpp
+++ b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/vgg16_cifar100/vgg16_cifar100.cpp
@@ -821,10 +821,30 @@ typedef struct __attribute__((__packed__)) {
   struct ret_t r;
 } RootIn;
 
+void printUsage(const std::string &bin_name) {
+  std::cerr << "Usage: " << bin_name << " [-c CONF_FILE]\n";
+}
+
 const int batch_size = 500, input_size = 5000,
           batch_count = input_size / batch_size;
 
-int main() {
+int main(int argc, char *argv[]) {
+  std::string config_path = "";
+  int flag;
+  while ((flag = getopt(argc, argv, "hc:")) != -1) {
+    switch (flag) {
+    case 'c':
+      config_path = std::string(optarg);
+      break;
+    case 'h':
+      printUsage(argv[0]);
+      return 0;
+    default:
+      printUsage(argv[0]);
+      return 1;
+    }
+  }
+
   std::string dir_prefix = std::string(MODEL_PARAMS_DIR) + "/vgg16_cifar100/";
   std::string input_path = dir_prefix + std::string("test_input.bin");
   std::string labels_path = dir_prefix + std::string("test_labels.bin");
@@ -983,6 +1003,14 @@ int main() {
   args->dense_2_b_bytes = 0;
 
   __hpvm__init();
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
   startMemTracking();
 #pragma clang loop unroll(disable)
   for (int i = 0; i < batch_count; i++) {
diff --git a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/vgg16_cifar100/vgg16_cifar100_cudnn.cpp b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/vgg16_cifar100/vgg16_cifar100_cudnn.cpp
index 9f989e361051a8623657d11224cbb898f061032e..6d5957bb5318694bacfe51ecfbb76436a5d310bd 100644
--- a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/vgg16_cifar100/vgg16_cifar100_cudnn.cpp
+++ b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/vgg16_cifar100/vgg16_cifar100_cudnn.cpp
@@ -826,10 +826,30 @@ void write_accuracy(float accuracy) {
   fout << std::fixed << accuracy;
 }
 
+void printUsage(const std::string &bin_name) {
+  std::cerr << "Usage: " << bin_name << " [-c CONF_FILE]\n";
+}
+
 const int batch_size = 500, input_size = 5000,
           batch_count = input_size / batch_size;
 
-int main() {
+int main(int argc, char *argv[]) {
+  std::string config_path = "";
+  int flag;
+  while ((flag = getopt(argc, argv, "hc:")) != -1) {
+    switch (flag) {
+    case 'c':
+      config_path = std::string(optarg);
+      break;
+    case 'h':
+      printUsage(argv[0]);
+      return 0;
+    default:
+      printUsage(argv[0]);
+      return 1;
+    }
+  }
+
   std::string dir_prefix = std::string(MODEL_PARAMS_DIR) + "/vgg16_cifar100/";
   std::string input_path = dir_prefix + std::string("test_input.bin");
   std::string labels_path = dir_prefix + std::string("test_labels.bin");
@@ -988,6 +1008,14 @@ int main() {
   args->dense_2_b_bytes = 0;
 
   __hpvm__init();
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
   float total_accuracy = 0;
   startMemTracking();
 #pragma clang loop unroll(disable)
diff --git a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/vgg16_imagenet/vgg16_imagenet.cpp b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/vgg16_imagenet/vgg16_imagenet.cpp
index 12f7870a152d8f42fa01b90429bc1102059861ae..7a9534b7fed94cfd6652bd9a972767dd0ba76bfe 100644
--- a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/vgg16_imagenet/vgg16_imagenet.cpp
+++ b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/vgg16_imagenet/vgg16_imagenet.cpp
@@ -869,10 +869,30 @@ typedef struct __attribute__((__packed__)) {
   struct ret_t r;
 } RootIn;
 
+void printUsage(const std::string &bin_name) {
+  std::cerr << "Usage: " << bin_name << " [-c CONF_FILE]\n";
+}
+
 const int batch_size = 10, input_size = 5000,
           batch_count = input_size / batch_size;
 
-int main() {
+int main(int argc, char *argv[]) {
+  std::string config_path = "";
+  int flag;
+  while ((flag = getopt(argc, argv, "hc:")) != -1) {
+    switch (flag) {
+    case 'c':
+      config_path = std::string(optarg);
+      break;
+    case 'h':
+      printUsage(argv[0]);
+      return 0;
+    default:
+      printUsage(argv[0]);
+      return 1;
+    }
+  }
+
   std::string dir_prefix = std::string(MODEL_PARAMS_DIR) + "/vgg16_imagenet/";
   std::string input_path = dir_prefix + std::string("test_input.bin");
   std::string labels_path = dir_prefix + std::string("test_labels.bin");
@@ -1043,6 +1063,14 @@ int main() {
   args->dense_3_b_bytes = 0;
 
   __hpvm__init();
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
   startMemTracking();
 #pragma clang loop unroll(disable)
   for (int i = 0; i < batch_count; i++) {
diff --git a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/vgg16_imagenet/vgg16_imagenet_cudnn.cpp b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/vgg16_imagenet/vgg16_imagenet_cudnn.cpp
index 189460c928d65ed989201dc715df5cbe0ccd5bde..40bac1f901985099dd73103f9a6589a862b84ade 100644
--- a/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/vgg16_imagenet/vgg16_imagenet_cudnn.cpp
+++ b/hpvm/test/dnn_benchmarks/hpvm-c/benchmarks/vgg16_imagenet/vgg16_imagenet_cudnn.cpp
@@ -874,10 +874,30 @@ void write_accuracy(float accuracy) {
   fout << std::fixed << accuracy;
 }
 
+void printUsage(const std::string &bin_name) {
+  std::cerr << "Usage: " << bin_name << " [-c CONF_FILE]\n";
+}
+
 const int batch_size = 25, input_size = 5000,
           batch_count = input_size / batch_size;
 
-int main() {
+int main(int argc, char *argv[]) {
+  std::string config_path = "";
+  int flag;
+  while ((flag = getopt(argc, argv, "hc:")) != -1) {
+    switch (flag) {
+    case 'c':
+      config_path = std::string(optarg);
+      break;
+    case 'h':
+      printUsage(argv[0]);
+      return 0;
+    default:
+      printUsage(argv[0]);
+      return 1;
+    }
+  }
+
   std::string dir_prefix = std::string(MODEL_PARAMS_DIR) + "/vgg16_imagenet/";
   std::string input_path = dir_prefix + std::string("test_input.bin");
   std::string labels_path = dir_prefix + std::string("test_labels.bin");
@@ -1049,6 +1069,14 @@ int main() {
   args->dense_3_b_bytes = 0;
 
   __hpvm__init();
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
+  if (config_path != "") {
+    llvm_hpvm_initializeRuntimeController(config_path.c_str());
+  }
+
   float total_accuracy = 0;
   startMemTracking();
 #pragma clang loop unroll(disable)