Implement backend manipulation API (#7335)
author이춘석/On-Device Lab(SR)/Staff Engineer/삼성전자 <chunseok.lee@samsung.com>
Tue, 10 Sep 2019 09:36:59 +0000 (18:36 +0900)
committerGitHub Enterprise <noreply-CODE@samsung.com>
Tue, 10 Sep 2019 09:36:59 +0000 (18:36 +0900)
* Implement backend manipulation API

- Implement backend manipulation API

Signed-off-by: Chunseok Lee <chunseok.lee@samsung.com>
* Apply suggestion

* fix format

runtimes/neurun/frontend/api/nnfw_dev.cc
runtimes/neurun/frontend/api/wrapper/nnfw_api.cc
runtimes/neurun/frontend/api/wrapper/nnfw_api.hpp

index 642cb1f..ad53d44 100644 (file)
@@ -176,3 +176,28 @@ NNFW_STATUS nnfw_register_custom_op_info(nnfw_session *session, const char *id,
 {
   return session->register_custom_operation(id, info->eval_function);
 }
+
+/*
+ * Set default backend
+ *
+ * @param[in] session session to which a default backend is set
+ * @param[in] backend default backend
+ */
+NNFW_STATUS nnfw_set_default_backend(nnfw_session *session, NNFW_BACKEND backend)
+{
+  return session->set_default_backend(backend);
+}
+
+/*
+ * Set the operation's backend
+ *
+ * @param[in] session session to be modified
+ * @param[in] op operation to be set
+ * @param[in] backend bakcend on which operation run
+ *
+ * @return NNFW_STATUS_NO_ERROR if successful
+ */
+NNFW_STATUS nnfw_set_op_backend(nnfw_session *session, NNFW_OP op, NNFW_BACKEND backend)
+{
+  return session->set_op_backend(op, backend);
+}
index 5add5e6..eb8aef0 100644 (file)
 #include <dirent.h>
 #include <limits.h>
 #include <stdint.h>
+#include <util/ConfigSource.h>
 
 nnfw_session::nnfw_session()
     : _graph{nullptr}, _execution{nullptr},
-      _kernel_registry{std::make_shared<neurun::backend::custom::KernelRegistry>()}
+      _kernel_registry{std::make_shared<neurun::backend::custom::KernelRegistry>()},
+      _source{nnfw::cpp14::make_unique<neurun::util::GeneralConfigSource>()}
 {
   // DO NOTHING
 }
@@ -79,6 +81,10 @@ NNFW_STATUS nnfw_session::prepare()
 
   try
   {
+    // config_source setting
+    using neurun::util::config_source;
+    config_source(std::move(_source));
+
     auto compiler = nnfw::cpp14::make_unique<neurun::compiler::Compiler>(_graph);
     compiler->compile();
     std::shared_ptr<neurun::exec::IExecutor> executor;
@@ -268,3 +274,96 @@ NNFW_STATUS nnfw_session::register_custom_operation(const std::string &id,
   _kernel_registry->registerKernel(id, eval_func);
   return NNFW_STATUS_NO_ERROR;
 }
+
+static std::string get_backend_string(NNFW_BACKEND backend)
+{
+  static std::unordered_map<NNFW_BACKEND, std::string> backend_map = {
+      {NNFW_BACKEND_ACL_CL, "acl_cl"},
+      {NNFW_BACKEND_ACL_NEON, "acl_neon"},
+      {NNFW_BACKEND_CPU, "cpu"},
+      {NNFW_BACKEND_SRCN, "srcn"},
+  };
+
+  auto b = backend_map.find(backend);
+
+  if (b == backend_map.end())
+  {
+    // this return value is handled by a caller to return error code
+    return std::string("");
+  }
+  else
+  {
+    return b->second;
+  }
+}
+
+static std::string get_op_backend_string(NNFW_OP op)
+{
+  // TODO: Provide complete set of operations
+  static std::unordered_map<NNFW_OP, std::string> operation_map = {
+      {NNFW_OP_TransposeConvNode, "OP_BACKEND_TransposeConvNode"},
+      {NNFW_OP_Conv2DNode, "OP_BACKEND_Conv2DNode"},
+      {NNFW_OP_DepthwiseConv2DNode, "OP_BACKEND_DepthwiseConv2DNode"},
+      {NNFW_OP_MeanNode, "OP_BACKEND_MeanNode"},
+      {NNFW_OP_AvgPool2DNode, "OP_BACKEND_AvgPool2DNode"},
+      {NNFW_OP_MaxPool2DNode, "OP_BACKEND_MaxPool2DNode"},
+  };
+
+  auto n = operation_map.find(op);
+
+  if (n == operation_map.end())
+  {
+    // this return value is handled by a caller to return error code
+    return std::string("");
+  }
+  else
+  {
+    return n->second;
+  }
+}
+
+NNFW_STATUS nnfw_session::set_default_backend(NNFW_BACKEND backend)
+{
+  try
+  {
+    std::string bs = get_backend_string(backend);
+    if (bs.empty())
+    {
+      return NNFW_STATUS_ERROR;
+    }
+    else
+    {
+      _source->set("OP_BACKEND_ALLOPS", bs);
+    }
+  }
+  catch (...)
+  {
+    std::cerr << "Error during nnfw_session::set_default_backend" << std::endl;
+    return NNFW_STATUS_ERROR;
+  }
+  return NNFW_STATUS_NO_ERROR;
+}
+
+NNFW_STATUS nnfw_session::set_op_backend(NNFW_OP op, NNFW_BACKEND backend)
+{
+
+  try
+  {
+    std::string key, value;
+    value = get_backend_string(backend);
+    key = get_op_backend_string(op);
+
+    if (key.empty() || value.empty())
+    {
+      return NNFW_STATUS_ERROR;
+    }
+
+    _source->set(key, value);
+  }
+  catch (...)
+  {
+    std::cerr << "Error during nnfw_session::set_op_backend." << std::endl;
+    return NNFW_STATUS_ERROR;
+  }
+  return NNFW_STATUS_NO_ERROR;
+}
index 914ffea..8cc956e 100644 (file)
@@ -19,6 +19,9 @@
 
 #include "nnfw.h"
 #include "nnfw_dev.h"
+
+#include <util/GeneralConfigSource.h>
+
 #include <string>
 #include <memory>
 
@@ -61,10 +64,14 @@ public:
 
   NNFW_STATUS register_custom_operation(const std::string &id, nnfw_custom_eval eval_func);
 
+  NNFW_STATUS set_default_backend(NNFW_BACKEND backend);
+  NNFW_STATUS set_op_backend(NNFW_OP op, NNFW_BACKEND backend);
+
 private:
   std::shared_ptr<neurun::graph::Graph> _graph;
   std::shared_ptr<neurun::exec::Execution> _execution;
   std::shared_ptr<neurun::backend::custom::KernelRegistry> _kernel_registry;
+  std::unique_ptr<neurun::util::GeneralConfigSource> _source;
 };
 
 #endif // __API_NNFW_INTERNAL_HPP__