From d343d5a9a8ccb4d1e64b12a3e6e87ef8ae0929ab Mon Sep 17 00:00:00 2001 From: =?utf8?q?=EC=9D=B4=EC=B6=98=EC=84=9D/On-Device=20Lab=28SR=29/Staff?= =?utf8?q?=20Engineer/=EC=82=BC=EC=84=B1=EC=A0=84=EC=9E=90?= Date: Tue, 10 Sep 2019 18:36:59 +0900 Subject: [PATCH] Implement backend manipulation API (#7335) * Implement backend manipulation API - Implement backend manipulation API Signed-off-by: Chunseok Lee * Apply suggestion * fix format --- runtimes/neurun/frontend/api/nnfw_dev.cc | 25 ++++++ runtimes/neurun/frontend/api/wrapper/nnfw_api.cc | 101 +++++++++++++++++++++- runtimes/neurun/frontend/api/wrapper/nnfw_api.hpp | 7 ++ 3 files changed, 132 insertions(+), 1 deletion(-) diff --git a/runtimes/neurun/frontend/api/nnfw_dev.cc b/runtimes/neurun/frontend/api/nnfw_dev.cc index 642cb1f..ad53d44 100644 --- a/runtimes/neurun/frontend/api/nnfw_dev.cc +++ b/runtimes/neurun/frontend/api/nnfw_dev.cc @@ -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); +} diff --git a/runtimes/neurun/frontend/api/wrapper/nnfw_api.cc b/runtimes/neurun/frontend/api/wrapper/nnfw_api.cc index 5add5e6..eb8aef0 100644 --- a/runtimes/neurun/frontend/api/wrapper/nnfw_api.cc +++ b/runtimes/neurun/frontend/api/wrapper/nnfw_api.cc @@ -25,10 +25,12 @@ #include #include #include +#include nnfw_session::nnfw_session() : _graph{nullptr}, _execution{nullptr}, - _kernel_registry{std::make_shared()} + _kernel_registry{std::make_shared()}, + _source{nnfw::cpp14::make_unique()} { // 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(_graph); compiler->compile(); std::shared_ptr 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 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 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; +} diff --git a/runtimes/neurun/frontend/api/wrapper/nnfw_api.hpp b/runtimes/neurun/frontend/api/wrapper/nnfw_api.hpp index 914ffea..8cc956e 100644 --- a/runtimes/neurun/frontend/api/wrapper/nnfw_api.hpp +++ b/runtimes/neurun/frontend/api/wrapper/nnfw_api.hpp @@ -19,6 +19,9 @@ #include "nnfw.h" #include "nnfw_dev.h" + +#include + #include #include @@ -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 _graph; std::shared_ptr _execution; std::shared_ptr _kernel_registry; + std::unique_ptr _source; }; #endif // __API_NNFW_INTERNAL_HPP__ -- 2.7.4