[CORE] Handle request's result
authorJiho Chu <jiho.chu@samsung.com>
Thu, 1 Dec 2022 08:17:32 +0000 (17:17 +0900)
committer문지중/NPU Lab(SR)/삼성전자 <jijoong.moon@samsung.com>
Wed, 14 Dec 2022 08:36:33 +0000 (17:36 +0900)
It handles each request's result code, for both sync and async calls.

Signed-off-by: Jiho Chu <jiho.chu@samsung.com>
include/host/libnpuhost.h
src/core/ne-handler.cc
src/core/ne-handler.h
src/core/ne-host-input-service.cc
src/core/ne-hw-input-service.cc
src/core/ne-inputservice.h
src/core/npu/NPUdrvAPI_emul.cc
src/host/ne-host.cc

index b32c604ec9f61b7bd4be8485b88dd7cc689fe7cd..7c981b3cffaaa5ba7d602c512b4332657d1f7750 100644 (file)
@@ -506,6 +506,14 @@ int createNPU_request (npudev_h dev, uint32_t model_id, int *req_id);
  */
 int removeNPU_request (npudev_h dev, int req_id);
 
+/**
+ * @brief Get request's operation result
+ * @param[in] dev The NPU device handle
+ * @param[in] req_id The request's ID
+ * @return 0 if no error. Otherwise a negative error code
+ */
+int getNPU_requestResult (npudev_h dev, int req_id);
+
 /**
  * @brief Get the request's model id
  * @param[in] dev The NPU device handle
index 69233ae2857c66270ff1850c2e51830f9851790b..0516404edb3c93f83f9fbff83a038a6e54fa1909 100644 (file)
@@ -347,6 +347,16 @@ HostHandler::removeRequest (int req_id) {
   return status;
 }
 
+/**
+ * @brief Get request result
+ * @param[in] req_id The request's ID
+ * @return 0 if no error. Otherwise a negative errno
+ */
+int
+HostHandler::getRequestResult (int req_id) {
+  return device_->getRequestResult (req_id);
+}
+
 /**
  * @brief Get the request's model id
  * @param[in] req_id The request's ID
@@ -1286,6 +1296,27 @@ TrinityVision2::removeRequest (int req_id) {
   return 0;
 }
 
+/**
+ * @brief Get request's result
+ * @param[in] req_id The request's ID
+ * @return 0 if no error. Otherwise a negative errno
+ */
+int
+TrinityVision2::getRequestResult (int req_id) {
+  Request *req = scheduler_->findRequest (req_id);
+  if (req == nullptr) {
+    logerr (TAG, "Unable to find the request with ID (%d)\n", req_id);
+    return -ENOENT;
+  }
+
+  if (req->isSubmitted () && req->getOpmode () != NPUINPUT_HW_RECURRING) {
+    logerr (TAG, "The request is not handled yet\n");
+    return -EBUSY;
+  }
+
+  return req->getResult ();
+}
+
 /**
  * @brief Get the request's model id
  * @param[in] req_id The request's ID
index 3fa441a8e5914ba2f35c2cc79475327af8b795ea..3e44f7b9713ccd3d069122ba1da263094e4f8c14 100644 (file)
@@ -61,6 +61,7 @@ class HostHandler {
 
   int createRequest (uint32_t model_id, int *req_id);
   int removeRequest (int req_id);
+  int getRequestResult (int req_id);
   int getRequestModel (int req_id, uint32_t *model_id);
 
   int setRequestData (int req_id, input_buffers *input, tensors_data_info *in_info,
@@ -139,6 +140,7 @@ class Device {
 
   virtual int createRequest (const Model *model, int *req_id) = 0;
   virtual int removeRequest (int req_id) = 0;
+  virtual int getRequestResult (int req_id) = 0;
   virtual int getRequestModel (int req_id, uint32_t *model_id) = 0;
 
   virtual int setRequestData (int req_id, input_buffers *input, tensors_data_info *in_info,
@@ -198,6 +200,7 @@ class TrinityVision2 : public Device {
 
   int createRequest (const Model *model, int *req_id);
   int removeRequest (int req_id);
+  int getRequestResult (int req_id);
   int getRequestModel (int req_id, uint32_t *model_id);
 
   int setRequestData (int req_id, input_buffers *input, tensors_data_info *in_info,
index f5d2d9331d9b1edfa057ed92b80853bcf2e00702..43380bb74f39d85e6b700762c477b914956a1c81 100644 (file)
@@ -54,7 +54,8 @@ HostInputService::submit (const DriverAPI *api, const Request *req, outputCallba
     return -EINVAL;
   }
 
-  taskFunc func = std::bind (&HostInputService::invoke, this, api, req, callback);
+  taskFunc func =
+      std::bind (&HostInputService::invoke, this, api, const_cast<Request *> (req), callback);
   ThreadTask *task = new ThreadTask (req->getID (), func);
   return ThreadPool::getInstance ().enqueueTask (task);
 }
@@ -140,7 +141,7 @@ invoke_segt (const DriverAPI *api, const Request *req) {
  * @return 0 if no error, otherwise a negative errno
  */
 int
-HostInputService::invoke (const DriverAPI *api, const Request *req, outputCallback callback) {
+HostInputService::invoke (const DriverAPI *api, Request *req, outputCallback callback) {
   device_state_t state;
   const Model *model;
   HWmem *data;
@@ -173,6 +174,8 @@ HostInputService::invoke (const DriverAPI *api, const Request *req, outputCallba
   else /* no inference data; skip */
     ret = 0;
 
+  req->setResult (ret);
+
 handle_callback:
   if (callback != nullptr)
     callback ();
index 0a282677aba6a0f3f7435ed8bafd787eee044c6a..a8f6967ee725e398d67be8231d4f158320ea90ad 100644 (file)
@@ -53,7 +53,7 @@ HwInputService::submit (const DriverAPI *api, const Request *req, outputCallback
     return -EINVAL;
   }
 
-  return invoke (api, req, callback);
+  return invoke (api, const_cast<Request *> (req), callback);
 }
 
 /**
@@ -133,7 +133,7 @@ invoke_segt (const DriverAPI *api, const Request *req) {
  * @return req_id if no error, otherwise a negative errno
  */
 int
-HwInputService::invoke (const DriverAPI *api, const Request *req, outputCallback callback) {
+HwInputService::invoke (const DriverAPI *api, Request *req, outputCallback callback) {
   device_state_t state;
   const Model *model;
   HWmem *data;
@@ -161,6 +161,8 @@ HwInputService::invoke (const DriverAPI *api, const Request *req, outputCallback
   else /* no inference data; skip */
     ret = 0;
 
+  req->setResult (ret);
+
 handle_callback:
   if (callback != nullptr)
     callback ();
index 6c47247378726d994953c5a84184cb8cfa4840df..922cc3df3777fa04f5d58669c9e72840bda4f4b1 100644 (file)
@@ -53,7 +53,7 @@ class HostInputService : public InputService {
 
  private:
   /** do not allow to directly call invoke () */
-  int invoke (const DriverAPI *api, const Request *request, outputCallback callback = nullptr);
+  int invoke (const DriverAPI *api, Request *request, outputCallback callback = nullptr);
   /** singleton pattern */
   static std::unique_ptr<HostInputService> instance_;
   static std::once_flag once_flag_;
@@ -68,7 +68,7 @@ class HwInputService : public InputService {
   int remove (const DriverAPI *api, int request_id);
 
  private:
-  int invoke (const DriverAPI *api, const Request *request, outputCallback callback = nullptr);
+  int invoke (const DriverAPI *api, Request *request, outputCallback callback = nullptr);
   /** singleton pattern */
   static std::unique_ptr<HwInputService> instance_;
   static std::once_flag once_flag_;
index 0d67b543a0b0269f25f8598041299b2e5b232610..fd116ad2d3555eea73f0b382f3e9cd9eba3a6c56 100644 (file)
@@ -242,13 +242,17 @@ class EmulReq {
  public:
   EmulReq (int req_id) : req_id_ (req_id), cout_orig_ (nullptr) {}
 
-  void run_emul (char *prog, char **segt, char *metadata, std::string cmd_path,
-                 std::string prof_path) {
+  int run_emul (char *prog, char **segt, char *metadata, std::string cmd_path,
+                std::string prof_path) {
+    int ret;
+
     setMute (true);
-    run_triv2_emul (prog, segt, metadata, cmd_path.c_str (), prof_path.c_str ());
+    ret = run_triv2_emul (prog, segt, metadata, cmd_path.c_str (), prof_path.c_str ());
     setMute (false);
 
     delete[] segt;
+
+    return ret;
   }
 
   void setMute (bool mute) {
@@ -769,18 +773,19 @@ TrinityEmulAPI::runInput (input_config_t *input_config) const {
 
       if (createDirectory (prof_path)) {
         prof_path += "/req_id_" + std::to_string (req_id);
-        req->run_emul (prog, segt, static_cast<char *> (elem_metadata->getAddr ()), cmd_path,
-                       prof_path);
+        status = req->run_emul (prog, segt, static_cast<char *> (elem_metadata->getAddr ()),
+                                cmd_path, prof_path);
       } else {
         logerr (TAG, "Unable to create a profile directory: %s\n", prof_path.c_str ());
         delete[] segt;
+        status = -EINVAL;
       }
 
       delete req;
     }
   }
 
-  return 0;
+  return status;
 }
 
 /**
index e17d915ca75de5ad5fe74f2415debcce6d091860..3a8d34becca16a552ef2c424f0265d23bbb82e92 100644 (file)
@@ -742,6 +742,19 @@ removeNPU_request (npudev_h dev, int req_id) {
   return host_handler->removeRequest (req_id);
 }
 
+/**
+ * @brief Remove the request instance
+ * @param[in] dev The NPU device handle
+ * @param[in] req_id The request's ID
+ * @return 0 if no error. Otherwise a negative errno
+ */
+int
+getNPU_requestResult (npudev_h dev, int req_id) {
+  INIT_HOST_HANDLER (host_handler, dev);
+
+  return host_handler->getRequestResult (req_id);
+}
+
 /**
  * @brief Get the request's model id
  * @param[in] dev The NPU device handle